The two repos that own a theme developer's local toolchain.numu-theme (CLI)#
numu-theme init <name> # scaffold a fresh theme
numu-theme dev [--watch] # local dev server with HMR
numu-theme check # validate theme.json + schemas
numu-theme lint [--strict] [--json] [--rules id1,id2]
numu-theme build # produce dist/
numu-theme push # upload dist/ to your dev sandbox
numu-theme submit # submit dist/ to the marketplace for review
numu-theme install <theme-id> # install a published theme into your test store
numu-theme login # marketplace auth
numu-theme status # current login + active theme + build status
numu-theme doctor # diagnose common setup issues
numu-theme add-section <name> # scaffold a new section (+ optional --from-library)
numu-theme add-block <section> <name>
numu-theme pull <theme-id> # download published theme source
numu-theme delete <theme-id> # soft-delete a draft / unpublish
@numueg/theme-plugin (Vite plugin)#
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import numuTheme from "@numueg/theme-plugin";
export default defineConfig({
plugins: [react(), numuTheme()],
});
1.
Contract validation ā checks src/main.tsx exports mount; checks React/SDK are externalized
2.
Schema codegen ā reads schemas/sections/*.json ā writes typed declarations to src/__generated__/sections.d.ts
3.
Dev-server middleware ā serves /theme.js, /theme.css, /sections.json so the customizer can load your local build
4.
Federation externals ā auto-injects react, react-dom, @numueg/theme-sdk into rollupOptions.external
5.
Asset pipeline ā content-hashes assets/* and emits a manifest
6.
Manifest emission ā writes dist/manifest.json summarizing the bundle
How they fit#
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā theme repo ā
ā ā
ā āāāāāāāāāāāāāāāāā ā
ā ā CLI commands ā ā high-level UX ā
ā ā init, dev, ā ā
ā ā build, lint, ā ā
ā ā submit, ⦠ā ā
ā āāāāāāāāā¬āāāāāāāā ā
ā ā spawns Vite with plugin ā
ā ā¼ ā
ā āāāāāāāāāāāāāāāāā ā
ā ā Vite + plugin ā ā low-level build pipeline ā
ā ā contract, ā ā
ā ā codegen, ā ā
ā ā externals, ā ā
ā ā assets ā ā
ā āāāāāāāāā¬āāāāāāāā ā
ā ā ā
ā ā¼ ā
ā dist/ ā
ā theme.js, theme.css, manifest.json ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
You only directly invoke the CLI. The plugin is implicit ā numu-theme init scaffolds a vite.config.ts with it pre-wired.Installing the CLI#
Global (recommended for daily use)#
Per-project via npx#
While the CLI is pre-publish, install from source:Bundled section library#
numu-theme add-section --from-library <slug> clones a production-grade section into your theme. Current entries (15):hero-with-cta announcement-bar
featured-products countdown-timer
image-with-text featured-blog-posts
newsletter-signup contact-map
multi-column collection-list
testimonials video-embed
faq-accordion rich-text
logo-cloud
Lint rules#
numu-theme lint runs 10 static-analysis checks:| id | What it catches |
|---|
manifest-required-fields | id/name/version/author on theme.json |
schema-registry-sync | preset sections ā schema files |
locale-parity | missing keys in non-default locales |
preset-schema-conformance | preset settings only use schema-declared ids |
unused-settings | settings_schema entries no theme reads |
img-missing-alt | <img> tags missing alt |
hardcoded-text | 3+-word JSX text not behind t() |
inline-color-literal | hex/rgb literals in style props |
forbidden-script-tag | <script> in component sources |
use-app-no-availability-check | useApp() callers without .available branch |
Flags: --strict (warnings ā errors), --json (machine-readable), --rules id1,id2,... (subset). Modified atĀ 2026-09-24 13:03:12