Skip to content

The nuiitivet-app skill

nuiitivet-app is an AI skill — a bundle of instructions you install into your assistant so it writes idiomatic Nuiitivet code. It is the authoring leg of the AI pair-programming loop.

Why it exists

Nuiitivet's surface resembles Flutter (widgets), SwiftUI/Compose (modifiers), and Rx/WPF (Observable), so an assistant readily writes valid Python that follows those other frameworks' habits — setState, SizedBox/Padding wrappers, subscribe() to push values — instead of Nuiitivet's idioms. The skill front-loads the correct idioms and ships a linter that flags the leaks.

Install

The skill follows the Agent Skills open standard (a SKILL.md plus its references and linter script), so the same directory works across assistants — only the destination differs. Three ways to install it:

Bundled with the package

The pip package carries the skills, so what this installs always matches the nuiitivet version you have — re-run it after upgrading nuiitivet. Omit the skill name to install both skills. The defaults target Claude's skills directories; point --dest at any other assistant's.

# project-local (default) — for Claude, .claude/skills/
python -m nuiitivet.skills install nuiitivet-app

# or personal (available in every project) — for Claude, ~/.claude/skills/
python -m nuiitivet.skills install --user nuiitivet-app

# or another assistant's skills directory — e.g. GitHub Copilot
python -m nuiitivet.skills install --dest .github/skills nuiitivet-app

Copy by hand

The skill lives in the Nuiitivet repository at skills/nuiitivet-app/ — copy the directory into your assistant's skills directory. The examples below use Claude's (.claude/skills/); for another assistant only the destination changes, e.g. .github/skills/ for GitHub Copilot:

# without a checkout
npx degit yuksblog/nuiitivet/skills/nuiitivet-app .claude/skills/nuiitivet-app

# from a checkout — project-local (checked in with your repo)
cp -r path/to/nuiitivet/skills/nuiitivet-app .claude/skills/nuiitivet-app

# or personal (available in every project)
cp -r path/to/nuiitivet/skills/nuiitivet-app ~/.claude/skills/nuiitivet-app

Claude Code plugin

One command pair installs both skills and wires up the dev bridge MCP server:

/plugin marketplace add yuksblog/nuiitivet
/plugin install nuiitivet

What it front-loads

SKILL.md opens with seven core rules the assistant must not violate:

  1. One import rootimport nuiitivet.material as nv; reach every symbol through nv.
  2. UI components subclass nv.ComposableWidget and define build(self) — no StatelessWidget/StatefulWidget, no createState/initState.
  3. State is Observable, and the UI binds to it — never push — no setState, no subscribe() just to shove a value into a widget.
  4. Size, spacing, and alignment are widget parameters, not wrapper widgets — no Padding/SizedBox/EdgeInsets. (Container does exist as a plain layout box; background/border/clipping are modifiers, not its job.)
  5. Decoration and behavior attach via .modifier(...) chained with | — do not wrap a widget to decorate it.
  6. The app root is a factory, not an instance — pass App(Window(content=build_root)), never App(Window(content=build_root())); per-tree init goes in the factory or __init__, not main().
  7. The one-line mental model — logic → UI is declarative (Observable binding); UI → logic is imperative (event handlers).

It links to topical references (layout, state, navigation, anti-patterns) the assistant reads on demand. Running the app under hot reload and driving it while you debug is the companion nuiitivet-debug skill's job, not this one.

The idioms linter

The skill ships a linter that flags foreign-framework patterns and points at the correct Nuiitivet idiom (warnings only — it does not edit code):

python skills/nuiitivet-app/scripts/check_idioms.py <files-or-dirs>

The skill instructs the assistant to run it as the final step of any edit and resolve every finding by hand.

See also