The administrator and developer perspective on nextlevelbuilder/ui-ux-pro-max-skill. This document covers the architecture of the package, the platform-config JSON schema that drives every install, the install pipeline, security review of a skill pack that runs with the host AI's tool grants, and the developer-internals needed to extend the skill with new platforms or new reference data.
The repository is split into a small Node/TypeScript CLI (cli/src/) and a much larger asset payload (cli/assets/ shipped to npm, mirrored in src/ui-ux-pro-max/ as the source-of-truth tree). The CLI's only job is to copy the asset payload into the right folder for the user's AI assistant. The actual design intelligence — 33 CSV reference files, 3 Python search scripts, and a SKILL.md flavored per platform — lives entirely in the asset payload and runs only when an AI agent invokes it post-install.
Note
"Multi-platform" in this codebase means multiple AI coding assistants (Claude Code, Cursor, Windsurf, Copilot, plus 14 others), not multiple operating systems. Eighteen platforms are supported as of v2.5.0; each platform contributes one JSON config under
cli/assets/templates/platforms/.
1. Architecture Overview
The system has four layers, each with a single responsibility. The boundaries between them are sharp and the code surface is small (~50 KB of TypeScript), making this an unusually predictable codebase to audit.
+----------------------------------------------------------+
| uipro-cli (Node 18+) |
| cli/src/index.ts (commander root) |
| init / update / uninstall / versions |
| | |
| +----------------+----------------+ |
| v v v |
| detectAIType templateInstall GitHub fetch |
| (utils/detect) (utils/template) (utils/github, |
| --legacy only) |
| | |
| v |
| File writer (cp / mkdir / cleanup) |
| writes to <root>/<platform>/skills/... |
+----------------------------------------------------------+
|
v
+----------------------------------------------------------+
| Asset payload (cli/assets/...) |
| templates/ |
| base/skill-content.md (shared SKILL.md template) |
| base/quick-reference.md (shared QR cheat sheet) |
| platforms/<18 JSONs> (per-platform config) |
| data/ |
| *.csv (15 root tables) + stacks/*.csv (16 stacks) |
| scripts/ |
| core.py / design_system.py / search.py |
+----------------------------------------------------------+
|
v (after install)
+----------------------------------------------------------+
| Host AI assistant (Claude / Cursor / ...) |
| Loads .<root>/skills/ui-ux-pro-max/SKILL.md |
| Invokes data/*.csv via scripts/search.py at design time |
+----------------------------------------------------------+
Component inventory
| Component | Path | Role |
|---|---|---|
| CLI entry | cli/src/index.ts |
Commander setup; defines init, versions, update, uninstall |
| Init command | cli/src/commands/init.ts |
Pick path (template/legacy), call writer, print summary |
| Update command | cli/src/commands/update.ts |
Calls getLatestRelease() then re-runs init with force=true |
| Uninstall command | cli/src/commands/uninstall.ts |
Resolve AI_FOLDERS[ai], recursively remove skills/ui-ux-pro-max/ |
| Versions command | cli/src/commands/versions.ts |
List GitHub releases newest-first |
| Type definitions | cli/src/types/index.ts |
AIType union, AI_TYPES allow-list, AI_FOLDERS map, PlatformConfig interface |
| Detect | cli/src/utils/detect.ts |
Scan cwd for marker folders, return detected list and a single suggestion |
| Extract | cli/src/utils/extract.ts |
ZIP extraction (PowerShell on Windows, unzip elsewhere); folder copy with filter; temp-dir lifecycle |
| GitHub | cli/src/utils/github.ts |
fetch-based REST client with rate-limit guards |
| Logger | cli/src/utils/logger.ts |
Chalk-themed info / success / warn / error / title / dim |
| Template | cli/src/utils/template.ts |
Load platform JSON, render base templates, write SKILL.md, copy data + scripts |
| Skill manifest | skill.json |
Top-level manifest (name, version, platforms, install command) |
| Source-of-truth tree | src/ui-ux-pro-max/... |
Mirror of cli/assets/..., kept in sync via _sync_all.py |
Technology stack
| Layer | Technology | Version (from cli/package.json) |
|---|---|---|
| Runtime | Node.js | >=18 |
| Language | TypeScript | ^5.7.2 (devDep) |
| Build | bun | implicit (bun build src/index.ts --outdir dist --target node) |
| CLI parser | commander |
^12.1.0 |
| Color/styling | chalk |
^5.3.0 |
| Spinner | ora |
^8.1.1 |
| Prompts | prompts |
^2.4.2 |
| Skill scripts | Python 3 | runtime-required on the user's machine |
Note
The package ships executable Python scripts inside the npm package. The CLI does not run Python — the AI agent invokes the scripts through its tool-call surface after install. This matters for security review (section 7).
Data flow — default install path
- User runs
npx uipro-cli init [--ai <type>] [--global]. index.tsparses flags viacommanderand dispatches toinitCommand(commands/init.ts).- If
--aiis omitted,detectAIType()walks the cwd for marker folders and shows an interactive picker. templateInstall()callsgeneratePlatformFiles()(orgenerateAllPlatformFiles()for--ai all).loadPlatformConfig(aiType)readscli/assets/templates/platforms/<platform>.json.renderSkillFile()readscli/assets/templates/base/skill-content.mdand (optionally)quick-reference.md, applies the per-platform JSON, and substitutes{{TITLE}},{{DESCRIPTION}},{{SCRIPT_PATH}},{{SKILL_OR_WORKFLOW}},{{QUICK_REFERENCE}}placeholders.- The renderer writes
SKILL.mdto<effectiveDir>/<root>/<skillPath>/<filename>. copyDataAndScripts()recursively copiescli/assets/data/andcli/assets/scripts/into the same skill folder.- The CLI prints the list of folders it touched and a "Next steps" message ("Restart your AI coding assistant").
Data flow — --legacy ZIP path
- Same parse + detect.
tryGitHubInstall()callsgetLatestRelease(), thengetAssetUrl(). If no uploaded ZIP exists, falls back tohttps://github.com/nextlevelbuilder/ui-ux-pro-max-skill/archive/refs/tags/<tag>.zip.downloadRelease(url, zipPath)writes the asset to amkdtemptemp dir (tmpdir() + 'uipro-').installFromZip()callsextractZip()(PowerShellExpand-Archiveon Windows,unzip -oelsewhere), thenfindExtractedRoot()(use the single subdir if there is one, else the temp dir).copyFolders()walksAI_FOLDERS[aiType], deduplicates, copies recursively while filteringEXCLUDED_FILES = ['settings.local.json'].- On copy failure, falls back to
xcopy(Windows) orcp -r(Unix); silently skips unreadable folders. cleanup(tempDir)removes the temp dir on success or error.
Warning
Any failure inside
tryGitHubInstall(rate limit, download failure, network error) degrades silently to template install. The user sees aspinner.warn(...)with the failure category, then the install proceeds via the bundled assets. This is intentional —--legacyis a fallback, not a required path — but it does mean a--legacyinvocation may produce the same files as the default. If you depend on--legacyfor pinning, check the install summary line (Installed from GitHub release!vsInstalled from bundled assets!vsGenerated from templates!).
Dual asset tree
The repo maintains two asset trees in lockstep:
| Tree | Purpose |
|---|---|
cli/assets/... |
The npm-published payload (declared in cli/package.json's files: ["dist", "assets"]) |
src/ui-ux-pro-max/... |
The source-of-truth tree under the project root |
A _sync_all.py script (present in both cli/assets/scripts/ and src/ui-ux-pro-max/scripts/) keeps them aligned. Drift between the two trees is the most likely maintenance bug — flag any PR that changes one without the other.
Note
This dual-tree layout is a mid-life refactor artifact: an earlier version shipped from
src/ui-ux-pro-max/directly; the current version ships fromcli/assets/for npm. Both are kept alive so contributors don't break either workflow.
2. System Requirements
| Component | Minimum | Notes |
|---|---|---|
| Node.js | 18.x | Enforced indirectly by commander@^12.1.0 (engines.node: ">=18") and ora@^8.1.1 (engines.node: ">=18") |
| Operating system | Windows / macOS / Linux | Cross-platform tested; PowerShell required on Windows for ZIP extract; unzip required on Unix for ZIP extract |
| Python | 3.x at runtime | Only required at skill-execution time inside the AI assistant. Not required to install. |
| Disk | ~5 MB per AI platform installed | CSVs + scripts + markdown templates |
| Network | optional | Default install path is offline; --legacy, update, and versions use HTTPS to api.github.com |
| User permission | non-admin | Writes only inside cwd or homedir() |
Dependencies
Runtime dependencies (cli/package.json):
{
"commander": "^12.1.0",
"chalk": "^5.3.0",
"ora": "^8.1.1",
"prompts": "^2.4.2"
}
Dev dependencies (build only):
{
"@types/bun": "^1.1.14",
"@types/node": "^22.10.1",
"@types/prompts": "^2.4.9",
"typescript": "^5.7.2"
}
What's published to npm
cli/package.json declares:
{
"name": "uipro-cli",
"version": "2.5.0",
"type": "module",
"bin": { "uipro": "./dist/index.js" },
"files": ["dist", "assets"]
}
The dist/ folder is a single bundled JS file produced by bun build src/index.ts --outdir dist --target node. The assets/ folder ships verbatim — that is the entire skill payload.
Important
If the
assets/folder is missing from a published version, every install will fail withUnknown AI typeerrors at template-load time. Always validate the npm tarball contains the asset tree before pushing a release.
3. Configuration Reference
There is no user-editable configuration. All "configuration" is one of two things: (a) CLI flags, (b) per-platform JSON configs that ship with the package.
CLI flags (full reference)
Defined in cli/src/index.ts.
| Command | Flag | Type | Default | Description | Source |
|---|---|---|---|---|---|
init |
-a, --ai <type> |
enum | undefined | AI assistant type (member of AI_TYPES) |
cli/src/index.ts:30 |
init |
-f, --force |
bool | false |
Overwrite existing files | cli/src/index.ts:31 |
init |
-o, --offline |
bool | false |
Skip GitHub download, use bundled assets only (no effect on default template path) | cli/src/index.ts:32 |
init |
-g, --global |
bool | false |
Install to home directory (~/) instead of cwd |
cli/src/index.ts:33 |
update |
-a, --ai <type> |
enum | undefined | Same allow-list as init |
cli/src/index.ts:54 |
uninstall |
-a, --ai <type> |
enum | undefined | Same allow-list as init |
cli/src/index.ts:69 |
uninstall |
-g, --global |
bool | false |
Uninstall from home directory | cli/src/index.ts:70 |
The versions command takes no flags; it lists releases from https://api.github.com/repos/nextlevelbuilder/ui-ux-pro-max-skill/releases.
Allow-list of <type> values
From cli/src/types/index.ts:
export const AI_TYPES: AIType[] = [
'claude', 'cursor', 'windsurf', 'antigravity', 'copilot',
'roocode', 'kiro', 'codex', 'qoder', 'gemini',
'trae', 'opencode', 'continue', 'codebuddy', 'droid',
'kilocode', 'warp', 'augment',
'all',
];
If --ai is given but not in this list, cli/src/index.ts prints Invalid AI type: <foo> and Valid types: ..., then process.exit(1).
AI_FOLDERS map (which root folders each platform owns)
From cli/src/types/index.ts:
export const AI_FOLDERS: Record<Exclude<AIType, 'all'>, string[]> = {
claude: ['.claude'],
cursor: ['.cursor', '.shared'],
windsurf: ['.windsurf', '.shared'],
antigravity: ['.agents', '.shared'],
copilot: ['.github', '.shared'],
kiro: ['.kiro', '.shared'],
codex: ['.codex'],
roocode: ['.roo', '.shared'],
qoder: ['.qoder', '.shared'],
gemini: ['.gemini', '.shared'],
trae: ['.trae', '.shared'],
opencode: ['.opencode', '.shared'],
continue: ['.continue'],
codebuddy: ['.codebuddy'],
droid: ['.factory'],
kilocode: ['.kilocode', '.shared'],
warp: ['.warp', '.shared'],
augment: ['.augment', '.shared'],
};
Note
The
.sharedfolder is included for backward compatibility with the older ZIP-based install layout. Newer platforms (kilocode,warp,augment) include it as a no-op souninstallremoves the same set across versions. Five platforms (claude,codex,continue,codebuddy,droid) own a single root folder with no.sharedcompanion.
Platform-config JSON schema (the flagship config reference)
Every platform contributes one file under cli/assets/templates/platforms/<platform>.json. The schema is encoded in PlatformConfig (cli/src/types/index.ts) and consumed by cli/src/utils/template.ts.
| Field | Type | Required | Purpose |
|---|---|---|---|
platform |
string | yes | Internal name (matches the JSON filename without extension) |
displayName |
string | yes | Human-readable label shown in install logs |
installType |
'full' | 'reference' |
yes | full = ship complete SKILL.md + assets; reference = lighter pointer file |
folderStructure.root |
string | yes | The top-level dotted folder (e.g. .claude) |
folderStructure.skillPath |
string | yes | Relative path under root where the skill lives (e.g. skills/ui-ux-pro-max) |
folderStructure.filename |
string | yes | Name of the rendered skill file (typically SKILL.md) |
scriptPath |
string | yes | Path the SKILL.md uses when invoking Python scripts (e.g. python3 skills/ui-ux-pro-max/scripts/...) |
frontmatter |
Record<string,string> | null |
yes | YAML frontmatter block to prepend; null for platforms that don't accept frontmatter |
sections.quickReference |
bool | yes | Whether to inline base/quick-reference.md |
title |
string | yes | Title injected into {{TITLE}} placeholder |
description |
string | yes | Injected into {{DESCRIPTION}} placeholder |
skillOrWorkflow |
string | yes | The word the platform uses ("skill" / "workflow" / "agent") |
Eighteen platform config files
| File | Platform | Notes |
|---|---|---|
agent.json |
Antigravity | Mapped from aiType: 'antigravity' via AI_TO_PLATFORM |
augment.json |
Augment | |
claude.json |
Claude Code | |
codebuddy.json |
CodeBuddy | |
codex.json |
Codex | |
continue.json |
Continue | |
copilot.json |
GitHub Copilot | Lives under .github/prompts/ rather than .github/skills/ |
cursor.json |
Cursor | |
droid.json |
Droid (Factory) | Lives under .factory/ |
gemini.json |
Gemini CLI | |
kilocode.json |
KiloCode | |
kiro.json |
Kiro | Lives under .kiro/steering/ (per getAITypeDescription) |
opencode.json |
OpenCode | |
qoder.json |
Qoder | |
roocode.json |
RooCode | |
trae.json |
Trae | |
warp.json |
Warp | |
windsurf.json |
Windsurf | Earlier versions shipped without YAML frontmatter (issue #204, fixed) |
Frontmatter rendering rules
renderFrontmatter in cli/src/utils/template.ts:
- If
frontmatterisnull, emit nothing. - Otherwise emit
---\n, then eachkey: valueline, then---\n\n. - If a value contains
:,", or a newline, wrap in double quotes and escape inner quotes with\\".
Placeholder substitution
renderSkillFile performs a fixed set of replacements against base/skill-content.md:
| Placeholder | Replaced with |
|---|---|
{{TITLE}} |
config.title |
{{DESCRIPTION}} |
config.description |
{{SCRIPT_PATH}} |
config.scriptPath |
{{SKILL_OR_WORKFLOW}} |
config.skillOrWorkflow |
{{QUICK_REFERENCE}} |
inline content of base/quick-reference.md if sections.quickReference is true, else empty |
When --global is used, an extra rewrite kicks in:
content = content.replace(
/python3 skills\//g,
`python3 ~/${config.folderStructure.root}/skills/`
);
This makes script paths absolute under ~/<root>/, which is needed when the skill lives in the user's home directory rather than the project tree.
Excluded files during ZIP install
cli/src/utils/extract.ts:
const EXCLUDED_FILES = ['settings.local.json'];
Anything matching this list is filtered out by cp(...) during --legacy install. Add new entries here if a future platform ships a private settings file that must never be copied.
4. Deployment & Scaling
The CLI is single-process, single-shot. There is no daemon, no service, no long-running state. Each init run is a stateless transformation: read assets + JSON + flags → write files.
Build & release pipeline
Defined in cli/package.json:
{
"scripts": {
"build": "bun build src/index.ts --outdir dist --target node",
"dev": "bun run src/index.ts",
"prepublishOnly": "bun run build"
}
}
Steps to cut a release:
- Update version in
cli/package.jsonandskill.json. - Run
_sync_all.py(incli/assets/scripts/orsrc/ui-ux-pro-max/scripts/) to ensure both asset trees match. cd cli && bun run buildproducescli/dist/index.js.npm publishfromcli/. TheprepublishOnlyhook re-runsbun run builddefensively.- Tag the corresponding GitHub release. The auto-archive URL is what
getAssetUrl()falls back to when no uploaded ZIP asset exists.
Important
Issue #202 reported that
plugin.jsonversion was stuck at 2.0.1 while GitHub releases showed v2.5.0. The lesson: bump every versioned manifest in lockstep —cli/package.json,skill.json, and any platform JSON that includes a version string — and tag a Git release that matches all of them.
Distribution channels
| Channel | Surface | Audience |
|---|---|---|
| npm | uipro-cli |
Developers running npx uipro-cli init |
| GitHub releases | tarball/ZIP per tag | --legacy install path; versions / update callers |
| GitHub repo | source clone | Forks and contributors |
Scaling considerations
There is nothing to scale on the runtime side — every install is a local file copy. What does scale is support load:
- Issues with ratio "command not found / unknown option" tend to be caused by stale
npxcaches (#215). Document thenpx clear-npx-cacheremedy upfront. - Platform-detection misses ("nothing happened") are usually marker-folder mismatches (e.g. user has
.claude-code/instead of.claude/) — extenddetectAIType()and theAI_FOLDERSmap. - Per-platform SKILL.md issues (e.g. windsurf without frontmatter, #204) require a release that updates only the affected platform JSON and republishes.
Uninstall behavior
cli/src/commands/uninstall.ts:
- Determine
baseDir:homedir()if--global, elseprocess.cwd(). - Detect existing installs via
detectAIType(baseDir). - Prompt the user with the detected list (or
'all detected'). - For each chosen platform, walk
AI_FOLDERS[ai]andrm(skills/ui-ux-pro-max, { recursive: true, force: true }). - Skip
ENOENT(folder not present); re-throw any other error. - Print the list of removed paths.
5. Operations
Day-to-day operational concerns for someone who has the package installed and is keeping it healthy.
Routine maintenance checklist
- [ ] After each release, run
npx uipro-cli@latest updateon the workstations that use the skill - [ ] Verify the install:
ls -la .<tool>/skills/ui-ux-pro-max/should showSKILL.md,data/,scripts/ - [ ] If using
--global, confirm~/.<tool>/skills/ui-ux-pro-max/is intact - [ ] If you maintain a fork, run
_sync_all.pyafter any data edit socli/assets/andsrc/ui-ux-pro-max/stay aligned - [ ] Watch GitHub issues for new platform-detection requests (
detectAITypeupdates)
Operational error reference
Eight error classes are thrown explicitly in the codebase. Documented as Type / Message / Source / Operational response.
| Type | Message | Source | Response |
|---|---|---|---|
GitHubDownloadError |
No ZIP asset found in latest release |
cli/src/commands/init.ts:49 |
Drop --legacy; default path is unaffected |
Error |
Failed to extract zip: ${error} |
cli/src/utils/extract.ts:22 |
Install unzip or use Windows host with PowerShell |
GitHubRateLimitError |
GitHub API rate limit exceeded. Resets at ${resetDate} |
cli/src/utils/github.ts:27 |
Wait or set GITHUB_TOKEN; or drop --legacy |
GitHubRateLimitError |
GitHub API rate limit exceeded (429 Too Many Requests) |
cli/src/utils/github.ts:30 |
Same |
GitHubDownloadError |
Failed to fetch releases: ${response.status} ${response.statusText} |
cli/src/utils/github.ts:47 |
Retry; transient |
GitHubDownloadError |
Failed to fetch latest release: ${response.status} ${response.statusText} |
cli/src/utils/github.ts:66 |
Retry; consider drop---legacy |
GitHubDownloadError |
Failed to download: ${response.status} ${response.statusText} |
cli/src/utils/github.ts:83 |
Drop --legacy |
Error |
Unknown AI type: ${aiType} |
cli/src/utils/template.ts:66 |
Check --ai <type> against allow-list |
Logging
cli/src/utils/logger.ts:
export const logger = {
info: (msg) => console.log(chalk.blue('info'), msg),
success: (msg) => console.log(chalk.green('success'), msg),
warn: (msg) => console.log(chalk.yellow('warn'), msg),
error: (msg) => console.log(chalk.red('error'), msg),
title: (msg) => console.log(chalk.bold.cyan(`\n${msg}\n`)),
dim: (msg) => console.log(chalk.dim(msg)),
};
There is no log file. All output goes to stdout/stderr. The ora spinner adds ephemeral progress lines. CI consumers should set FORCE_COLOR=0 if they need uncolored output.
Tip
If you wrap the CLI in another tool, parse the install summary line —
Generated from templates!vsInstalled from GitHub release!vsInstalled from bundled assets!— to know which install path actually ran. This is the single source of truth in the absence of a structured log.
Common operational questions
Note
Issue #181 ("How should Claude Code use this skill?") and #266 (sub-skill name frontmatter mismatch) are repeat-pattern questions. Answer them by pointing to (a) restart-after-install, (b)
npx uipro-cli@latest init --forceto overwrite stale frontmatter, (c) the per-platform JSON config undercli/assets/templates/platforms/.
Backup & restore
Nothing to back up at the package level — the package is reproducible from npm. If users have customized their installed skill files (against advice in the User Guide), back up the .<tool>/skills/ui-ux-pro-max/ folder before re-running init.
6. Performance
Performance is an install-time concern only. Once installed, the AI agent owns runtime behavior.
Install timing
| Path | Typical wall-clock |
|---|---|
Default template install (init) |
< 2 seconds (no network, local file copy of ~5 MB) |
init --ai all |
~ 10 seconds (18 platforms × ~0.5 s each, dominated by recursive cp calls) |
--legacy install with cached temp ZIP |
~ 5 seconds |
--legacy install over cold network |
5–30 seconds depending on link quality |
versions command |
1–3 seconds (single GitHub list call) |
update command |
1 second metadata + same as init --force |
Tip
Issue #260 ("UI/UX Pro Max Installer 很慢" — slow installer) typically traces to either (a) the user is on
--legacyand their network is slow, or (b) their npm cache is cold. The default template path on a warm cache is sub-second.
Bottlenecks and mitigations
fetchto GitHub: only relevant for--legacy,update,versions. Avoid by sticking with the default install.- Recursive copy: dominates install time when
--ai allis used. Mitigation: ask users whether they really needallor just their primary AI tool. - PowerShell
Expand-Archive: slow on large ZIPs in older PowerShell versions. Mitigation: use the default template path on Windows.
Memory / disk footprint
- Installed skill folder per platform: ~5 MB.
--ai all: ~90 MB total written across 18 platform folders (most identical assets duplicated under each<root>/skills/ui-ux-pro-max/).- npm package: ~500 KB compressed.
Network considerations
The default install does zero network calls. The user's npm/npx infrastructure handles fetching the package itself; the CLI then runs entirely against bundled assets. Air-gapped environments work without configuration once the npm package has been mirrored.
7. Security
Skill packs run inside the AI assistant's process and inherit its tool grants — file read/write, shell execution, network, and any MCP server the assistant has attached. That makes a skill a meaningful supply-chain dependency. The points below are the threat model for ui-ux-pro-max-skill specifically.
Trust boundary
The skill ships three trust-relevant artifacts:
SKILL.md— instructions read by the AI at inference time. A malicious instruction file can manipulate the model into running arbitrary commands, exfiltrating files, or producing biased output. Review before installing into a privileged environment.scripts/*.py— Python scripts the AI invokes via tool-call. They run in the AI's tool sandbox (or unsandboxed, depending on the host). Read all three before installing into a privileged environment.data/*.csv— reference data. Lower risk because they're read by the Python scripts, not executed; still worth diffing against past versions to spot unexpected changes.
Caution
A skill pack runs with the AI's full tool grants. If your AI has shell access, the skill can ask the AI to run shell commands on your machine. Always review
SKILL.mdand the Python scripts before installing in a sensitive environment, and never install from an untrusted fork.
Supply-chain considerations
- npm package integrity: the package is published as
uipro-clito the public npm registry. Verify the publisher and version pin where it matters:npx uipro-cli@2.5.0rather thannpx uipro-cli. - Bundled Python: the package ships
.pyfiles inside an npm package. Auditors who only scan JS dependencies will miss these — call them out explicitly in security review. - No checksum verification: the CLI does not verify a hash of the bundled assets it installs. A tampered npm tarball would install without alerting the user.
- Dual asset tree drift:
cli/assets/andsrc/ui-ux-pro-max/can drift. The npm-published copy iscli/assets/; thesrc/tree is for development. A user who clones the repo and installs from a checkout sees a different artifact than a user who runsnpx. - Issue #161 ("UI UX Pro Max is a scam, don't buy it") was a closed report; the repo is MIT-licensed and free to use, no purchase required. Treat unverified accusations cautiously but verify the package origin and license yourself.
Data residency
The CLI does not transmit user prompts or designs anywhere. Data residency concerns are entirely about what your AI assistant does with the prompts you send — that's a property of the AI host, not of this skill pack. The skill itself is a passive read.
Path-traversal & file-write surface
cli/src/utils/extract.ts and template.ts write to process.cwd() or homedir(). Inputs that influence paths:
--ai <type>is checked againstAI_TYPES— bounded set, no traversal possible.--globaltoggles a fixedhomedir()call.config.folderStructure.root,skillPath,filenamecome from package-internal JSONs, not user input — no traversal possible from outside.config.scriptPathis interpolated into SKILL.md text, not a filesystem path.
Conclusion: there is no user-controlled path that the CLI uses for filesystem writes. The blast radius is bounded to either cwd or homedir.
Shell-injection surface
cli/src/utils/extract.ts uses child_process.exec for ZIP extraction:
if (isWindows) {
await execAsync(`powershell -Command "Expand-Archive -Path '${zipPath}' -DestinationPath '${destDir}' -Force"`);
} else {
await execAsync(`unzip -o "${zipPath}" -d "${destDir}"`);
}
zipPath is tempDir + 'release.zip' (CLI-controlled, mkdtemp output). destDir is tempDir from createTempDir(). Both come from mkdtemp(join(tmpdir(), 'uipro-')) — not user-controlled. There is no user-controlled string passed to exec.
The xcopy and cp -r fallbacks in copyFolders interpolate sourcePath and targetPath, which are join(sourceDir, folder) and join(targetDir, folder). folder comes from AI_FOLDERS[aiType] — bounded set, internally controlled.
Warning
Although the current code has no user-controlled exec inputs, any future change that lets the user pick a custom destination path or platform name must be plumbed through
child_process.execFile(with argv array) instead ofexec(with a shell string). The currentexeccalls are safe only because their inputs are package-internal.
License
Both cli/package.json and skill.json declare "license": "MIT". The repository ships a LICENSE file at the root.
Audit log
Maintain an audit trail when installing in regulated environments:
- Pin the version:
npx uipro-cli@<exact-version> init - Capture the install summary line (
Generated from templates!) - Hash the resulting
.<tool>/skills/ui-ux-pro-max/SKILL.mdand Python scripts - Compare against a known-good baseline at re-install time
8. Developer Internals
How to read the codebase, how the SKILL.md trigger pattern is implemented, and how to extend the skill with new platforms or new reference data.
Repository layout
ui-ux-pro-max-skill/
├── CLAUDE.md # repo's own AI context
├── LICENSE # MIT
├── README.md # public-facing pitch
├── skill.json # top-level manifest (name, version, platforms)
├── .gitignore
├── cli/ # The CLI package (published to npm)
│ ├── README.md
│ ├── package.json # bin: uipro -> dist/index.js
│ ├── package-lock.json
│ ├── bun.lock
│ ├── tsconfig.json
│ ├── .gitignore / .npmignore
│ ├── src/ # TypeScript sources (HIGH priority modules)
│ │ ├── index.ts # commander root
│ │ ├── commands/ # init.ts, uninstall.ts, update.ts, versions.ts
│ │ ├── types/ # index.ts (AIType, AI_TYPES, AI_FOLDERS, PlatformConfig)
│ │ └── utils/ # detect.ts, extract.ts, github.ts, logger.ts, template.ts
│ └── assets/ # The npm-shipped asset payload
│ ├── data/ # 15 root CSVs + stacks/ (16 stack CSVs) + _sync_all.py
│ ├── scripts/ # core.py, design_system.py, search.py
│ └── templates/
│ ├── base/ # quick-reference.md, skill-content.md
│ └── platforms/ # 18 platform JSONs
├── docs/ # 三个 data-scripts-templates 的区别.md
├── preview/ # xiaomaomi-app.html (skill output sample)
├── screenshots/ # website.png
└── src/ui-ux-pro-max/ # Source-of-truth tree (mirror of cli/assets/)
├── data/ # mirrors cli/assets/data/
├── scripts/ # mirrors cli/assets/scripts/
└── templates/ # mirrors cli/assets/templates/
SKILL.md trigger pattern
The skill activates inside the AI assistant via the platform's standard skill-loading mechanism — there is no custom magic phrase. Specifically:
- The AI assistant lists the skill in its skill catalog by reading the YAML frontmatter at the top of
SKILL.md. - The frontmatter is rendered by
renderFrontmatter()from each platform's JSONfrontmatterfield — so trigger metadata (description, intent words) is platform-controlled and varies percli/assets/templates/platforms/<platform>.json. - At inference time, the assistant's own logic decides whether the user's prompt matches the skill's description; if so, it loads
SKILL.mdand follows its body. - The body of
SKILL.md(rendered frombase/skill-content.mdwith{{TITLE}}/{{DESCRIPTION}}/{{SCRIPT_PATH}}/{{SKILL_OR_WORKFLOW}}/{{QUICK_REFERENCE}}substituted) instructs the assistant to use the bundled CSVs and Python scripts.
This means there is no codified "activation phrase" inside the package. The phrasing your assistant treats as a trigger is a function of the assistant + the description rendered from the platform JSON. Empirically, design-intent words ("design", "UI", "UX", "layout", "color", "typography", "audit", "wireframe", or naming a stack) reliably activate the skill across all 18 supported platforms.
Asset organization principles
The asset payload is grouped by what kind of intelligence it provides, not by which feature uses it. This is intentional — any feature (design, audit, palette pick) can read any CSV.
data/*.csv— flat tag-indexed reference tables, one concept per filedata/stacks/*.csv— same shape but indexed by tech stack, used to translate a chosen design into idiomatic codescripts/*.py— composition layer (core.pyshared,design_system.pyfor full-system synthesis,search.pyfor ad-hoc fuzzy lookup)templates/base/*.md— the SKILL.md body shared across platformstemplates/platforms/*.json— per-platform deltas (frontmatter, scriptPath, title, description)
Adding a new AI platform
A working recipe — every step is required, none can be skipped:
- Choose a folder convention for the new platform (e.g.
.newtool/). - Edit
cli/src/types/index.ts:- Add the new value to the
AITypeunion. - Add it to the
AI_TYPESarray (before'all'). - Add an entry to
AI_FOLDERSwith at least one folder; include.sharedif the platform's earlier installs depended on it (most don't anymore).
- Add the new value to the
- Edit
cli/src/utils/detect.ts:- Add a marker-folder check that pushes the new value into
detectedwhen the marker is present.
- Add a marker-folder check that pushes the new value into
- Edit
cli/src/utils/detect.tsgetAITypeDescription:- Add a
casereturning the human-readable label (used in install logs and prompts).
- Add a
- Edit
cli/src/utils/template.tsAI_TO_PLATFORM:- Add a mapping from the new
AITypevalue to the platform JSON filename.
- Add a mapping from the new
- Create
cli/assets/templates/platforms/<platform>.json:- Fill in every field of the
PlatformConfigschema (see section 3). - For
frontmatter, copy the closest existing platform's frontmatter and adjust per the platform's docs.
- Fill in every field of the
- Mirror the JSON to
src/ui-ux-pro-max/templates/platforms/<platform>.json(the dual-tree convention). - Test locally:
cd cli && bun run dev init --ai newtool, then verify the rendered.newtool/skills/ui-ux-pro-max/SKILL.mdmatches the platform's expectations. - Add a row to
skill.json'splatformsarray. - Build, version-bump, and release per section 4.
Important
All five edits to TypeScript files are required. Forgetting
getAITypeDescriptionproduces a fallthrough to the defaultcase 'all'label and confuses install logs. ForgettingAI_TO_PLATFORMproducesUnknown AI type: <foo>fromtemplate.ts:66.
Adding a new reference category
To add a new CSV (e.g. data/animations.csv):
- Create the CSV under
cli/assets/data/animations.csvwith columns the search scripts can index (consultscripts/core.pyfor the load convention). - Mirror to
src/ui-ux-pro-max/data/animations.csv. - If the new file has stack-specific entries, also create per-stack files under
data/stacks/<stack>-animations.csvand mirror. - Run
_sync_all.pyto confirm both trees agree. - If
SKILL.mdshould mention the new category by name (it usually doesn't —search.pyfuzzy-matches by file), editcli/assets/templates/base/skill-content.md. - No code change is needed to
cli/src/; the CLI just copies the asset tree.
Adding a new search script
- Create
cli/assets/scripts/<name>.pyand mirror tosrc/ui-ux-pro-max/scripts/<name>.py. - Reuse
core.py's loader if reading CSVs. - Document the script's input/output contract in a comment block.
- Update SKILL.md if the AI needs explicit guidance on when to invoke the new script.
Note
The bundled Python scripts shouldn't depend on third-party packages — users won't have run
pip installfor the skill. Stick to the standard library.
Build & test
cd cli
bun install
bun run dev init --ai claude # local dry-run
bun run build # produces dist/index.js
The repo has no test suite shipped at v2.5.0. Verification is manual: run bun run dev init --ai <each platform> against a clean test directory and confirm the resulting tree matches expectations.
Coding conventions
- TypeScript strict-mode (per
tsconfig.json). - ESM only (
"type": "module"inpackage.json); imports use.jsextensions even in.tssource per Node ESM rules. #!/usr/bin/env nodeshebang on the entry point.process.exit(1)for fatal errors after logging vialogger.error.- No global state; every command takes its options object and returns.
- Custom error classes for GitHub-related failures (
GitHubRateLimitError,GitHubDownloadError) extendErrordirectly.
Improvements & technical debt
- Dual-asset-tree drift is the highest-risk maintenance issue. Consider eliminating one tree entirely and adapting the npm publish to read from
src/ui-ux-pro-max/directly, or vice versa. - No checksum verification of the bundled assets at install time. A SHA-256 manifest baked into the package would catch tampered installs.
- No automated tests for the platform-config rendering logic. A snapshot test per platform JSON would catch frontmatter-rendering regressions like issue #204 before release.
- Issue #267 ("Hard-coded
.claude/paths and unknownopencode.jsonconfig keys, 89 warnings") points to portability gaps in how some platform JSONs reference.claude/paths even when installed for a different platform — worth a top-down audit of everytemplates/platforms/*.jsonfor hard-coded folder references. - Issue #270 ("Is it support Figma mcp?") is a feature request for Figma MCP integration — would let the skill pull live design tokens from Figma rather than relying solely on bundled CSVs.
Contributing guide
Pull requests should follow the dual-tree contract: any change to cli/assets/... requires the matching change to src/ui-ux-pro-max/... and vice versa. Run _sync_all.py before commit. Add a paragraph to the PR description specifying:
- Which platforms are affected
- Whether the change touches
SKILL.mdrendering (in which case existing users need to--forcereinstall) - Whether the change is purely additive (safe) or removes/renames something (breaking)
9. Integration Points
How the skill connects to other systems — both inbound (what calls it) and outbound (what it calls).
Inbound integrations (who installs the skill)
| Caller | Mechanism | Notes |
|---|---|---|
| Human at a terminal | npx uipro-cli init |
The dominant install path |
| CI / scripted setup | npm install -g uipro-cli && uipro init --ai <type> --force |
Use --force to make idempotent |
| Dotfiles / dev-container provisioner | Same as scripted | Pin the version: uipro-cli@2.5.0 |
| AI assistant itself | indirectly, via the user prompting "install ui-ux-pro-max" | The assistant runs the same npx invocation |
Outbound integrations (what the CLI itself calls)
| System | Purpose | When |
|---|---|---|
api.github.com/repos/nextlevelbuilder/ui-ux-pro-max-skill/releases |
List/get releases | versions, update, and --legacy init |
api.github.com/.../releases/latest |
Get latest release | update, --legacy init |
github.com/.../archive/refs/tags/<tag>.zip (auto-archive fallback) |
Download release source | --legacy init when no uploaded ZIP asset exists |
Local filesystem (cwd or homedir) |
Write skill files | every init |
tmpdir() (os.tmpdir) |
Stage extraction | --legacy init |
PowerShell (Windows) / unzip (Unix) |
ZIP extraction | --legacy init |
xcopy (Windows) / cp -r (Unix) |
Folder copy fallback | when fs.cp fails |
Outbound integrations (what the installed skill itself calls — by way of the AI agent)
| System | Purpose | Invoked by |
|---|---|---|
| Local Python 3 interpreter | Run core.py, design_system.py, search.py |
The AI agent's tool-call surface |
Local CSVs in data/*.csv |
Read reference data | The Python scripts |
The skill itself does not make outbound network calls. All design intelligence is computed locally from bundled CSVs by Python scripts the AI invokes via its tool-call surface.
MCP (Model Context Protocol) integrations
None at present. Issue #270 is open requesting Figma MCP support. If this lands, the integration point will be a new MCP server config in the per-platform JSON config (or an external config consumed by the agent).
Compatible AI host configurations
| Host | Skill location after install | Skill discovery mechanism |
|---|---|---|
| Claude Code | <root>/.claude/skills/ui-ux-pro-max/SKILL.md |
Claude Code skill loader |
| Cursor | <root>/.cursor/skills/ui-ux-pro-max/... (+ .shared/) |
Cursor's prompt/rule loader |
| Windsurf | <root>/.windsurf/skills/ui-ux-pro-max/... (+ .shared/) |
Windsurf's skill loader |
| GitHub Copilot | <root>/.github/prompts/... (per getAITypeDescription) |
Copilot's .github/prompts convention |
| Kiro | <root>/.kiro/steering/... (per getAITypeDescription) |
Kiro's steering-file convention |
| Codex | <root>/.codex/skills/... |
Codex skill loader |
| RooCode | <root>/.roo/skills/... (+ .shared/) |
RooCode skill loader |
| Qoder | <root>/.qoder/skills/... (+ .shared/) |
Qoder skill loader |
| Gemini CLI | <root>/.gemini/skills/... (+ .shared/) |
Gemini CLI skill loader |
| Trae | <root>/.trae/skills/... (+ .shared/) |
Trae skill loader |
| OpenCode | <root>/.opencode/skills/... (+ .shared/) |
OpenCode skill loader |
| Continue | <root>/.continue/skills/... |
Continue's skill convention |
| CodeBuddy | <root>/.codebuddy/skills/... |
CodeBuddy skill loader |
| Droid (Factory) | <root>/.factory/skills/... |
Factory skill loader |
| KiloCode | <root>/.kilocode/skills/... (+ .shared/) |
KiloCode skill loader |
| Warp | <root>/.warp/skills/... (+ .shared/) |
Warp skill loader |
| Augment | <root>/.augment/skills/... (+ .shared/) |
Augment skill loader |
| Antigravity | <root>/.agents/skills/... (+ .shared/) |
Antigravity skill loader |
Composition with other skill packs
The skill is purely additive — installing it alongside other skill packs (e.g. another design pack, a testing skill, or a security skill) is safe because it occupies its own skills/ui-ux-pro-max/ subfolder under each platform root. The host AI's skill resolver will surface multiple skills based on prompt intent; UI/UX Pro Max activates only on design-related prompts.
Tip
If you're shipping your own skill pack and want to follow this repo's conventions, the pattern worth copying is the platform-config JSON schema: declare per-platform deltas as JSON, render a shared template, ship one folder per platform. It scales linearly with new platforms and contains the per-platform complexity inside data, not code.
External brand surfaces
| Surface | URL |
|---|---|
| Project homepage | https://uupm.cc |
| Repository | https://github.com/nextlevelbuilder/ui-ux-pro-max-skill |
| npm package | https://www.npmjs.com/package/uipro-cli |
| Releases | https://github.com/nextlevelbuilder/ui-ux-pro-max-skill/releases |