Agent skill

Core API Change

by libnativeapi in libnativeapi/nativeapi

Carry a change to the C++ public API in core/ all the way downstream — design check, header edit, six platform implementations, C ABI + Rust/Dart/C/JS/Python regeneration, per-binding verification…

MITAuto-check passedMobile

Install Core API Change

skills CLI
$ npx skills add libnativeapi/nativeapi --skill core-api-change -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install libnativeapi/nativeapi core-api-change --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/libnativeapi/nativeapi.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/core-api-change .claude/skills/core-api-change && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
core-api-change
GitHub stars
157
Token cost
~2.5k tokens
SKILL.md length
1,092 words
Files
1
Skills in repo
5
Repo updated
First seen
Licence
MIT

At a glance

Carry a change to the C++ public API in core/ all the way downstream — design check, header edit, six platform implementations, C ABI + Rust/Dart/C/JS/Python regeneration, per-binding verification…

  • Works in 8 steps: Design the signature first → Pre-flight: look before the script commits → Edit core → …
  • Says sync the bindings
  • SKILL.md covers 1. Design the signature first, 2. Pre-flight: look before the…, 3. Edit core and 4. Regenerate, then read the…, plus 4 more sections
  • Calls git, cmake and npm

What it does

Core API Change is an agent skill from libnativeapi/nativeapi. Carry a change to the C++ public API in core/ all the way downstream — design check, header edit, six platform implementations, C ABI + Rust/Dart/C/JS/Python regeneration, per-binding verification, and the commits in core and the workspace. Use this whenever a task adds, renames, removes or reshapes anything in core/src/.h ("add SetSkipTaskbar to Window", "expose X to Flutter", "new module for Y"), whenever generated bindings are stale or ./codegen check fails, and whenever the user says "sync the bindings"…

Its SKILL.md is about 2.5k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Mobile, covering Cross-platform mobile apps and Project scaffolding. It works with C#, Python, Rust and Dart. The repository describes itself as: Unified access to native system APIs (windows, tray icons, menus, displays, dialogs, …) for Dart/Flutter, Rust, C, JS/TS and Python, built on one C++ core. The licence is MIT.

When your agent uses it

  • Says sync the bindings
  • Asks why an API is missing from Dart / Rust / C / JS / Python

Example prompts

  • “add SetSkipTaskbar to Window”
  • “expose X to Flutter”
  • “new module for Y”
  • “/core-api-change”

Requirements

  • Python 3
  • Node.js

Workflow steps

8 steps, taken from the step headings in SKILL.md.

  1. Design the signature first
  2. Pre-flight: look before the script commits
  3. Edit core
  4. Regenerate, then read the output
  5. Hand-written layers the generator does not touch
  6. Verify each binding
  7. Commit
  8. Report

What it can do on your machine

Read from SKILL.md and the folder at commit e0ca21a. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • git
    • cmake
    • npm
    • uvx
    • make
    • cargo
    • dart
    • dotnet
    • npx
    • flutter

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use git, npm, uvx and npx, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Core API Change loads about 2.5k tokens when it runs. Until then it costs about 218 tokens; SKILL.md has 1,092 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~218
When it runs · the whole SKILL.md, loaded when a task matches
~2.5k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from libnativeapi/nativeapi at commit e0ca21a, republished under its MIT licence (© libnativeapi). 1,092 words, ~2,506 tokens.

Download SKILL.mdSave it as .claude/skills/core-api-change/SKILL.md (or your agent's skills folder).
name
core-api-change
description
Carry a change to the C++ public API in core/ all the way downstream — design check, header edit, six platform implementations, C ABI + Rust/Dart/C#/JS/Python regeneration, per-binding verification, and the commits in core and the workspace. Use this whenever a task adds, renames, removes or reshapes anything in core/src/*.h ("add SetSkipTaskbar to Window", "expose X to Flutter", "new module for Y"), whenever generated bindings are stale or `./codegen check` fails, and whenever the user says "sync the bindings", "regenerate", "propagate core", or asks why an API is missing from Dart / Rust / C# / JS / Python. Also use it before running `./codegen sync` for any reason — the script commits with `git add -A` in core and stages all of bindings/ in the workspace commit, and this skill is the pre-flight that keeps unrelated work out of those commits.

core-api-change

./codegen sync does the mechanical half: regenerate, rerun bindgen / ffigen, commit core and the workspace. This skill is the other half — the decisions and checks the script cannot make. Work through the phases in order; each one ends in something you can verify before moving on.

1 design  →  2 pre-flight  →  3 core edit  →  4 regenerate + read the output
          →  5 hand-written layers  →  6 verify  →  7 commit  →  8 report

1. Design the signature first

Read specs/api-style.md and run its checklist against the signature before writing any platform code — a signature that changes after six platform files exist is six files of rework. For a new type also read specs/object-model.md (identity vs value object); for a new module, specs/architecture.md §5.

Where neighbouring headers disagree, the spec says which side is the rule. Do not copy the nearest neighbour.

2. Pre-flight: look before the script commits

./codegen sync runs git add -A in core and git add bindings/<lang> in the workspace, where every binding (dart, rust, csharp, js, python) lives. Anything lying around in those trees lands in a commit titled Sync with core <sha>.

bash
make status                                   # dirty files + branch of every submodule
git status --short                            # workspace itself
for r in core; do
  printf '%-18s %s  behind origin/main: %s\n' "$r" \
    "$(git -C "$r" branch --show-current || echo DETACHED)" \
    "$(git -C "$r" rev-list --count HEAD..origin/main 2>/dev/null)"
done
  • A binding is dirty with unrelated work (git status --short bindings/) → do not run sync. Use the manual path in §7. Ask the user only if you cannot tell whether the work is related.
  • A submodule is on a detached HEAD or behind origin/main → check out main and fast-forward first. sync refuses detached HEADs, but it does not notice "on main, 10 commits behind", and committing there moves the workspace pointer backwards.
  • core is dirty with files that are not part of this change → stage narrowly and commit core yourself before sync (it only commits core when core is dirty).

3. Edit core

  1. Header in core/src/<module>.h, with the Doxygen block and — when behaviour differs per platform — the six-line @note Platform availability: block.
  2. All six core/src/platform/<os>/<module>_<os>.{cpp,mm}. A platform that cannot support it still gets a stub (no-op / false / default value); a missing definition is a link error on that platform only, which you will not see locally.
  3. New handle type → append an IdTypeTag<T> entry in core/src/foundation/id_allocator.h. Append only, never renumber.
  4. New header that should cross the ABI → add it to API_HEADERS in tools/codegen/shared/src/lib.rs (kept roughly in dependency order for readability; the generator does not depend on it). If a hand-written file of the same name already exists in a binding, the generator skips it — delete it first.
  5. Build what you can locally:
bash
cmake -S core -B core/build && cmake --build core/build -j
ctest --test-dir core/build --output-on-failure

Only the host platform compiles here. Say so in the report; for the others use the remote-hosts skill or let CI answer.

4. Regenerate, then read the output

bash
./codegen 2>&1 | tee /tmp/codegen.log     # C ABI, then Rust / Dart / C# / JS / Python
grep -i 'skipped' /tmp/codegen.log

The skipped lines are the point of this step. A method whose signature uses a type the generator cannot map is dropped with a warning, not an error — the build stays green and the API is simply absent from every binding. Known baseline (2026-09-17, 8 lines): three ModifierKey operators, RunApp, class Dialog, PositioningStrategy::GetRelativeWindow, Shortcut::GetCallback, KeyboardMonitor::GetInternalEventEmitter. Any line naming your new API means: go back to §1 and change the signature (api-style.md §7 lists what crosses the bridge).

Then read the generated C header for your module (core/src/capi/<module>_c.h):

  • Does the function name read well? An unexpected _with_<param> suffix means you added an overload — rename instead (api-style.md §1.6).
  • Did the getter become a property in the bindings? It only does when it is const, takes no arguments and starts with Get / Is / Has.
  • For events: every payload field you expect is in the C struct. Fields come from GetXxx() const on the event class; unsupported types vanish silently.

Never edit a file that starts with // AUTO-GENERATED. DO NOT EDIT. (# AUTO-GENERATED. in Python) — change the header or the generator and rerun.

Show full SKILL.md (499 more words)Show less

5. Hand-written layers the generator does not touch

Files without the banner are never overwritten, so they are also never updated:

RepoHand-writtenWhen to touch it
bindings/dartnativeapi/lib/nativeapi.dart (exports), lib/src/widgets/, CHANGELOG.md, examples/flutter_*new module → add the export; user-visible change → CHANGELOG entry
bindings/rustnativeapi/src/lib.rs, examples/rust_*modules.rs is generated now, so a new module needs no manual pub mod; re-exports in lib.rs still do
bindings/csharpexamples/csharp_*, testswhen a rename breaks them
bindings/jslib/runtime.ts, lib/index.ts, src/addon.cc, src/napi_support.*, src/event_loop_*, test/, examples/js_*, examples/deno_*lib/modules.ts and src/generated/ are generated, so a new module needs nothing; a rename breaks the tests and examples
bindings/pythonnativeapi/_library.py, nativeapi/_runtime.py, src/event_loop_*, tests/, examples/python_*nativeapi/__init__.py and _capi.py are generated, so a new module needs nothing; a rename breaks the tests and examples
coreexamples/<module>_example/, <module>_c_example/new module or a behaviour worth demonstrating

A rename or removal in core breaks hand-written callers in these places — grep each binding for the old name.

6. Verify each binding

bash
./codegen check                                         # generated files are current
cargo check --workspace                                 # Rust crates + examples (root workspace)
(cd bindings/dart/nativeapi && dart analyze)
(cd bindings/csharp && dotnet build NativeAPI.slnx)
npm install && (cd bindings/js && npx tsc -p tsconfig.json --noEmit && npm test)   # compiles the addon
cmake -S bindings/python -B bindings/python/build && cmake --build bindings/python/build
(cd bindings/python && uvx ruff check nativeapi tests --select E,F,W,B,UP,I \
  && PYTHONPATH=. uvx --with pytest pytest)

JS and Python have no raw-FFI step of their own: their C-facing code is generated straight from the IR, so ./codegen is all they need. Python's ctypes layer is not checked by a compiler — a signature mismatch surfaces only when the function is called, so run the smoke tests (and the example, for event-loop or callback changes).

flutter analyze may rewrite nativeapi/analysis_options.yaml — revert that before committing. A toolchain that is not installed is a skipped check, not a passed one; list it as skipped in the report.

For anything with visible behaviour, run the relevant example through the gui-test skill rather than trusting the compile.

7. Commit

Clean trees (the normal case):

bash
./codegen sync -m "<imperative core commit message>"

It commits core with your message, then the workspace as Sync with core <sha9>: the core pointer plus everything regenerated under bindings/. The bindings build against core/ directly, so there is no per-binding copy of core to move. It does not push.

A binding has unrelated work — manual path. Same steps, staged narrowly:

  1. Commit core yourself (git -C core add <paths> && git -C core commit -m ...).
  2. ./codegen; rust → rerun bindgen (command in tools/codegen/README.md); dart → ./codegen ffigen. JS and Python need nothing beyond ./codegen.
  3. Workspace: git add core plus only the generated paths under bindings/; commit as Sync with core <sha9>.

Either way: no Co-Authored-By trailers; after staging, read git status --short and git diff --cached --stat in each repo before committing — a file you did not write showing up there is the signal to stop and unstage.

Push only when asked, and in this order so no remote pointer dangles: core → workspace (./codegen sync --push does exactly this).

8. Report

State, per item, what is true rather than what was attempted:

  • the new / changed signatures, and any api-style rule you consciously bent and why;
  • platforms: compiled locally / compiled remotely / stub only / untested;
  • skipped lines: none new, or which;
  • per binding: regenerated, hand-written parts updated, check passed / skipped;
  • commits created (repo + sha) and whether anything is pushed;
  • anything left dirty in a working tree that you deliberately did not commit.

© libnativeapi, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .agents/skills/core-api-change of libnativeapi/nativeapi.

Open the folder on GitHubat commit e0ca21a

Compare with similar skills

Core API Change next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Core API Change compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Core API Change this skilllibnativeapi/nativeapi157—~2.5kAutomated safety check: PassMIT
Flutter Appccplugins/awesome-claude-code-plugins967—~1.1kAutomated safety check: NotesApache-2.0
Frb Upgrade Flutterfzyzcjy/flutter_rust_bridge5.4k—~1.7kAutomated safety check: PassMIT
Frb Lintfzyzcjy/flutter_rust_bridge5.4k—~152Automated safety check: PassMIT
Solidnank1ro/solid165—~3.1kAutomated safety check: PassMIT
Implement Flet Extensionflet-dev/flet17k—~2.1kAutomated safety check: PassApache-2.0

Similar skills

  • Flutter App

    ccplugins/awesome-claude-code-plugins

    Bootstrap a new Flutter mobile app with clean architecture, Riverpod, FVM-pinned SDK, current packages, and no deprecated APIs.

    967 GitHub stars~1.1k tokensUpdated 1 mo ago
    MobileAuto-check: notes
  • Frb Upgrade Flutter

    fzyzcjy/flutter_rust_bridge

    Upgrade flutterrustbridge to a new Flutter stable release. An agent skill from fzyzcjy/flutter_rust_bridge.

    5.4k GitHub stars~1.7k tokensUpdated yesterday
    MobileAuto-check passed
  • Frb Lint

    fzyzcjy/flutter_rust_bridge

    A skill your agent uses when you need to run lint, format, or clippy checks in flutterrustbridge

    5.4k GitHub stars~152 tokensUpdated yesterday
    MobileAuto-check passed
  • Solid

    nank1ro/solid

    PRIORITY — read this skill FIRST before writing Dart code when pubspec.yaml declares solidannotations or solidgenerator.

    165 GitHub stars~3.1k tokensUpdated 1 mo ago
    MobileAuto-check passed
  • Implement a new Flet extension/control that wraps a third-party Flutter package end-to-end, including dependency selection, version pinning, compatibility checks, Python/Flutter integration, docs…

    17k GitHub stars~2.1k tokensUpdated today
    MobileAuto-check passed
  • Puremusic

    qingyueyin/Pure-music

    Pure-music 项目开发指南,覆盖 Windows Flutter/Dart 前端、Rust 后端、音频播放、歌词解析与渲染、桌面歌词、主题背景、设置、FFI、文档和测试。处理此仓库的代码理解、问题诊断、功能开发、缺陷修复、性能优化或代码审查时使用。

    182 GitHub stars~907 tokensUpdated today
    MobileAuto-check passed

More from libnativeapi/nativeapi

  • Remote Hosts

    libnativeapi/nativeapi

    Build, run, and GUI-test on another machine over SSH — the user's Windows laptop today, Linux or other macOS machines tomorrow — with one symmetric CLI for every OS: push scripts, run them either in…

    157 GitHub stars~1.3k tokensUpdated today
    Auto-check passed
  • Flutter UI Probe

    libnativeapi/nativeapi

    Find where widgets are on screen in a running debug Flutter desktop app (macOS, Windows, Linux) by reading its render tree through the VM service — no hard-coded coordinates, no screenshots, works…

    157 GitHub stars~988 tokensUpdated today
    Auto-check passed
  • Record Demo

    libnativeapi/nativeapi

    Record a demo video of a desktop app — launch it, play a scripted scenario with smooth synthetic mouse input, and capture the screen (cursor and click highlights included) straight to an…

    157 GitHub stars~2.9k tokensUpdated today
    Auto-check passed
  • Gui Test

    libnativeapi/nativeapi

    End-to-end test a desktop app (Flutter desktop apps and plain native executables such as C++ examples) by launching the real app, driving it with guarded synthetic mouse input — eased moves, clicks…

    157 GitHub stars~3.5k tokensUpdated today
    Auto-check passed

Questions about Core API Change

What does Core API Change do?

Carry a change to the C++ public API in core/ all the way downstream — design check, header edit, six platform implementations, C ABI + Rust/Dart/C/JS/Python regeneration, per-binding verification…. Core API Change is an agent skill from libnativeapi/nativeapi. Carry a change to the C++ public API in core/ all the way downstream — design check, header edit, six platform implementations, C ABI + Rust/Dart/C/JS/Python regeneration, per-binding verification, and the commits in core and the workspace.

When should I use Core API Change?

Core API Change fits situations like: says sync the bindings; asks why an API is missing from Dart / Rust / C / JS / Python.

How do I install Core API Change in Claude Code?

Run `npx skills add libnativeapi/nativeapi --skill core-api-change -a claude-code`. Or copy the skill folder (.agents/skills/core-api-change in libnativeapi/nativeapi) into .claude/skills/core-api-change in your project. Claude Code loads it when a task matches its description.

How do I install Core API Change in Codex?

Run `npx skills add libnativeapi/nativeapi --skill core-api-change -a codex`. Or copy the skill folder (.agents/skills/core-api-change in libnativeapi/nativeapi) into .agents/skills/core-api-change in your project. Codex loads it when a task matches its description.

Can I use Core API Change in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add libnativeapi/nativeapi --skill core-api-change -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/core-api-change, .gemini/skills/core-api-change, .github/skills/core-api-change and .opencode/skills/core-api-change in your project.

What does Core API Change need to run?

Going by SKILL.md and its folder, Core API Change needs the command-line tools its instructions call (git, cmake, npm, uvx, make and cargo). Our summary lists: Python 3; Node.js.

Does Core API Change access the network?

SKILL.md contains no URLs. Its commands use git, npm, uvx and npx, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Core API Change safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Core API Change use?

Core API Change is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Core API Change use?

About 2.5k tokens (SKILL.md is roughly 10k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Core API Change?

Skills that share tags, products or a category with Core API Change: Flutter App (ccplugins/awesome-claude-code-plugins, 967 stars), Frb Upgrade Flutter (fzyzcjy/flutter_rust_bridge, 5.4k stars), Frb Lint (fzyzcjy/flutter_rust_bridge, 5.4k stars) and Solid (nank1ro/solid, 165 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Core API Change?

libnativeapi (a GitHub organization) maintains it in libnativeapi/nativeapi, which has 157 GitHub stars. The repository holds 5 skills in this directory. The repository was last updated on October 7, 2026.

Source: libnativeapi/nativeapi on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.