This is an automated email from the ASF dual-hosted git repository.
junrushao pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tvm-ffi.git
The following commit(s) were added to refs/heads/main by this push:
new 934f2d1 feat: Claude Skill for TVM-FFI Development (#445)
934f2d1 is described below
commit 934f2d187c7fb51ab32b9351f8e56a865241aff4
Author: Junru Shao <[email protected]>
AuthorDate: Sat Feb 14 14:34:30 2026 -0800
feat: Claude Skill for TVM-FFI Development (#445)
---
.claude/skills/devtools/SKILL.md | 257 +++++++++++++++++++++++++++++++++++++++
.markdownlint-cli2.yaml | 3 +
2 files changed, 260 insertions(+)
diff --git a/.claude/skills/devtools/SKILL.md b/.claude/skills/devtools/SKILL.md
new file mode 100644
index 0000000..d97bae2
--- /dev/null
+++ b/.claude/skills/devtools/SKILL.md
@@ -0,0 +1,257 @@
+<!--- Licensed to the Apache Software Foundation (ASF) under one -->
+<!--- or more contributor license agreements. See the NOTICE file -->
+<!--- distributed with this work for additional information -->
+<!--- regarding copyright ownership. The ASF licenses this file -->
+<!--- to you under the Apache License, Version 2.0 (the -->
+<!--- "License"); you may not use this file except in compliance -->
+<!--- with the License. You may obtain a copy of the License at -->
+
+<!--- http://www.apache.org/licenses/LICENSE-2.0 -->
+
+<!--- Unless required by applicable law or agreed to in writing, -->
+<!--- software distributed under the License is distributed on an -->
+<!--- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -->
+<!--- KIND, either express or implied. See the License for the -->
+<!--- specific language governing permissions and limitations -->
+<!--- under the License. -->
+
+---
+name: devtools
+description: Developer reference for Apache TVM-FFI.
+argument-hint: "[lint | cpp | python | docs]"
+---
+
+# TVM-FFI Developer Guide
+
+Condensed reference from `docs/dev/`. Use this when working on the TVM-FFI
codebase.
+
+## Prerequisites
+
+- **Python**: 3.9+ (managed via `uv`; default virtualenv at `.venv`)
+- **Compiler**: C++17-capable toolchain (GCC/Clang on Linux, Apple Clang on
macOS, MSVC on Windows)
+- **Build tools**: CMake 3.18+, Ninja
+- **Source**: Always clone with `--recursive`, or run `git submodule update
--init --recursive`
+
+All Python-related commands below use [`uv`](https://docs.astral.sh/uv/). The
default virtual environment is `.venv` in the repo root.
+
+---
+
+## 1. Run Linters and clang-tidy
+
+### Pre-commit hooks (primary linting workflow)
+
+Install and register git hooks:
+
+```bash
+uv tool install pre-commit
+pre-commit install # register git hooks (runs automatically before
each commit)
+```
+
+Run hooks manually:
+
+```bash
+pre-commit run --all-files # all hooks on every file
+pre-commit run # all hooks on staged files only
+pre-commit run <hook-id> --all-files # single hook, e.g. ruff-check,
clang-format
+```
+
+**Linters by language:**
+
+| Language | Formatter | Linter / Type Checker
|
+|----------|---------------------------------|----------------------------------|
+| Python | `ruff` (format) | `ruff` (lint), `ty` (type
check) |
+| C/C++ | `clang-format` | `clang-tidy` (see below)
|
+| Cython | `double-quote-cython-strings` | `cython-lint`
|
+| CMake | `cmake-format` | `cmake-lint`
|
+| Shell | `shfmt` | `shellcheck`
|
+| YAML | `yamllint` |
|
+| TOML | `taplo-format` |
|
+| Markdown | `markdownlint-cli2` |
|
+| RST | `rstcheck` |
|
+
+**Troubleshooting pre-commit:**
+
+- **Version problems**: Ensure pre-commit 2.18.0+ (`pre-commit --version`).
+- **Stale cache**: Run `pre-commit clean` to clear the hook cache.
+- **Auto-fixed files**: Most formatting hooks fix issues in place. Review
changes, stage with `git add -u`, and commit again.
+
+### clang-tidy (separate from pre-commit)
+
+`clang-tidy` is **not** a pre-commit hook. It runs as a separate CI job and
only checks changed C++ files. To reproduce locally:
+
+```bash
+# Run on specific files
+uv run --no-project --with "clang-tidy==21.1.1" \
+ python tests/lint/clang_tidy_precommit.py \
+ --build-dir=build-pre-commit \
+ --jobs=$(sysctl -n hw.ncpu) \
+ include/tvm/ffi/c_api.h src/some_file.cc
+
+# Run on all C++ sources
+uv run --no-project --with "clang-tidy==21.1.1" \
+ python tests/lint/clang_tidy_precommit.py \
+ --build-dir=build-pre-commit \
+ --jobs=$(sysctl -n hw.ncpu) \
+ ./src/ ./include ./tests
+```
+
+> On macOS, `clang-tidy` is resolved via `xcrun`; the wrapper script handles
this automatically.
+> On Linux, replace `$(sysctl -n hw.ncpu)` with `$(nproc)`.
+
+---
+
+## 2. Build and Test the C++ Package
+
+### Build the C++ library (no Python)
+
+```bash
+cmake . -B build_cpp -DCMAKE_BUILD_TYPE=RelWithDebInfo
+cmake --build build_cpp --parallel --config RelWithDebInfo --target
tvm_ffi_shared
+cmake --install build_cpp --config RelWithDebInfo --prefix ./dist
+```
+
+After installation:
+- Headers: `dist/include/`
+- Libraries: `dist/lib/`
+
+### Build and run C++ tests
+
+Set parallel build level first:
+
+```bash
+export CMAKE_BUILD_PARALLEL_LEVEL=$(sysctl -n hw.ncpu) # macOS
+# export CMAKE_BUILD_PARALLEL_LEVEL=$(nproc) # Linux
+```
+
+Configure, build, and run:
+
+```bash
+cmake . -B build_test -DTVM_FFI_BUILD_TESTS=ON -DCMAKE_BUILD_TYPE=Debug
+cmake --build build_test --clean-first --config Debug --target tvm_ffi_tests
+ctest -V -C Debug --test-dir build_test --output-on-failure
+```
+
+### Key CMake options
+
+| Option | Default | Description
|
+|----------------------------------|---------|----------------------------------------------|
+| `TVM_FFI_BUILD_TESTS` | `OFF` | Enable C++ test targets
|
+| `TVM_FFI_ATTACH_DEBUG_SYMBOLS` | `OFF` | Attach debug symbols in release
mode |
+| `TVM_FFI_USE_LIBBACKTRACE` | `ON` | Enable libbacktrace
|
+| `TVM_FFI_USE_EXTRA_CXX_API` | `ON` | Enable extra C++ API in shared
lib |
+| `TVM_FFI_BACKTRACE_ON_SEGFAULT` | `ON` | Print backtrace on segfault
|
+| `CMAKE_EXPORT_COMPILE_COMMANDS` | `OFF` | Generate
`compile_commands.json` for clangd |
+
+> On Windows, run from a **Developer Command Prompt for VS** or ensure the
MSVC toolchain is on your `PATH`.
+
+---
+
+## 3. Build and Test the Python Package
+
+### Build (editable install)
+
+The Python build uses `scikit-build-core` which drives CMake to compile the
C++ core and Cython extension:
+
+```bash
+uv pip install --force-reinstall --verbose -e .
+```
+
+- `--force-reinstall` forces a full rebuild.
+- `-e` (editable) means pure Python changes are reflected immediately without
rebuilding.
+- **C++/Cython changes always require re-running this command.**
+
+Pass CMake flags via `--config-settings`:
+
+```bash
+uv pip install --force-reinstall --verbose -e . \
+ --config-settings cmake.define.TVM_FFI_ATTACH_DEBUG_SYMBOLS=ON
+```
+
+Verify the install:
+
+```bash
+uv run python -c "import tvm_ffi; print(tvm_ffi.__version__)"
+```
+
+### Run Python tests
+
+Install with test dependencies, then run pytest:
+
+```bash
+uv pip install --force-reinstall --verbose --group test -e .
+uv run pytest -vvs tests/python
+```
+
+### Run Rust tests
+
+Rust tests require the Python package to be installed first (Rust FFI bindings
link against the built shared library):
+
+```bash
+cd rust && cargo test
+```
+
+### Troubleshooting
+
+- **Rebuilding after C++/Cython changes**: Re-run `uv pip install
--force-reinstall -e .`. Editable installs only auto-reflect pure Python
changes.
+- **Submodules missing**: Run `git submodule update --init --recursive` from
the repo root.
+- **Library not found at import time**: Ensure the dynamic loader can find the
shared library. Add the `lib` directory to `LD_LIBRARY_PATH` (Linux),
`DYLD_LIBRARY_PATH` (macOS), or `PATH` (Windows).
+
+---
+
+## 4. Build Documentation Website
+
+Building documentation requires the Python package to be installed first (see
section 3).
+
+### Interactive build (auto-reload)
+
+Serves locally at `http://127.0.0.1:8000` with live reload:
+
+```bash
+uv run --group docs sphinx-autobuild docs docs/_build/html \
+ --ignore docs/reference/cpp/generated
+```
+
+### One-off build
+
+```bash
+uv run --group docs sphinx-build -M html docs docs/_build
+```
+
+### With C++ API reference (requires Doxygen)
+
+```bash
+# Install Doxygen
+brew install doxygen # macOS
+# sudo apt install doxygen # Linux
+
+# Interactive
+BUILD_CPP_DOCS=1 uv run --group docs sphinx-autobuild docs docs/_build/html \
+ --ignore docs/reference/cpp/generated --watch include
+
+# One-off
+BUILD_CPP_DOCS=1 uv run --group docs sphinx-build -M html docs docs/_build
+```
+
+### With Rust API reference (requires cargo)
+
+```bash
+# Interactive
+BUILD_RUST_DOCS=1 uv run --group docs sphinx-autobuild docs docs/_build/html \
+ --ignore docs/reference/rust/generated --watch rust
+
+# One-off
+BUILD_RUST_DOCS=1 uv run --group docs sphinx-build -M html docs docs/_build
+```
+
+### Build all documentation
+
+```bash
+BUILD_CPP_DOCS=1 BUILD_RUST_DOCS=1 uv run --group docs sphinx-build \
+ -M html docs docs/_build
+```
+
+### Cleanup
+
+```bash
+rm -rf docs/_build/ docs/reference/python/generated
docs/reference/cpp/generated docs/reference/rust/generated
+```
diff --git a/.markdownlint-cli2.yaml b/.markdownlint-cli2.yaml
index 8d56f07..f1e9727 100644
--- a/.markdownlint-cli2.yaml
+++ b/.markdownlint-cli2.yaml
@@ -15,5 +15,8 @@
# specific language governing permissions and limitations
# under the License.
+ignores:
+ - ".claude/**"
+
config:
MD013: false