- add CSV structural validation and all-domain smoke tests
- repair malformed CSV rows in source and bundled CLI assets
- run data validation in CI and prepublish checks
- add npm build wrapper with TypeScript fallback when Bun is unavailable
- fix CLI asset resolution for TypeScript fallback builds
PR #296 (feat/emil-motion-principles) independently registers a "motion"
domain key in CSV_CONFIG/detect_domain for motion-principles.csv (37
design-principle rows). Both PRs adding the same dict key would cause
one to silently overwrite the other's domain registration if merged
independently, per the automated review on this PR.
The two domains are complementary, not duplicate (design principles vs.
ready-to-use GSAP code snippets), so this renames this PR's domain from
"motion" to "gsap" - a more precise name given every row is GSAP-specific
implementation code. The --motion CLI dial and its "Subtle/Standard/
Complex" tiers are unaffected (unrelated to the domain key; only the
`--domain gsap` search endpoint and its internal lookup changed). No
regressions: --design-system output with no dials set remains
byte-identical to before this feature.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
cli/assets had fallen out of sync with src/ui-ux-pro-max ahead of this
change (unrelated to the motion-domain feature) - colors.csv, products.csv,
google-fonts.csv, draft.csv, several platform templates, and sub-skill
scripts/tests had all drifted. Ran the project's own `sync-assets.mjs`
to bring cli/assets back in line with the source of truth per the
documented Sync Rules; `--check` now reports assets as in sync.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Adds a new searchable `motion` domain (motion.csv, 16 GSAP animation
skeletons across hover/scroll-reveal/stagger/page-transition/parallax/
loading, each tagged Subtle/Standard/Complex) plus three optional 1-10
dials on `--design-system` — --variance, --motion, --density — inspired
by taste-skill's DESIGN_VARIANCE/MOTION_INTENSITY/VISUAL_DENSITY sliders.
- --variance biases style search/selection toward centered-minimal (low)
or bold-asymmetric (high) categories
- --motion attaches a matching GSAP snippet (code + framework notes +
do/don't) from motion.csv
- --density overrides the --space-* token scale in ASCII/markdown/MASTER.md
output (spacious <-> dense/dashboard)
All three dials are optional and additive; output with no dials set is
byte-identical to before (verified via regression diff). Synced into
.claude/skills/ui-ux-pro-max and cli/assets alongside src/ui-ux-pro-max
(source of truth) so all three installed copies stay consistent.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Adds WPF, WinUI 3, UWP, Avalonia, and Uno Platform stacks (17 -> 22 total),
each with its own guidelines CSV, registered in core.py and synced to cli/assets.
- New stack CSVs in src/ and cli/assets/data/stacks/
- search.py / core.py registry updated
- smoke-stacks.sh: EXPECTED_STACK_COUNT 21 -> 22 with a smoke-test workflow
- platform template descriptions and README bumped to 22 technology stacks
The bin mapping was "./dist/index.js". On publish, npm normalizes bin
values and the leading ./ triggers a warning -- on the npm version in the
release runner it reports `bin[uipro] script name dist/index.js was
invalid and removed`, i.e. the published package ships with no `uipro`
command, so `npx uipro-cli init` would not work even once publishing
succeeds (see #353).
Change the value to the canonical `dist/index.js` (exactly what
`npm pkg fix` produces). src/index.ts already has the
`#!/usr/bin/env node` shebang, which bun build preserves, so the bin is
executable.
Verified: `npm publish --dry-run` no longer emits the bin warning, and
dist/index.js is included in the tarball; typecheck passes.
Addresses the package-metadata half of #353. Actually landing on npm
still requires a release run with a token that has publish rights for
uipro-cli.
design_system.py prints box-drawing characters and swatches (--, OK marks,
block swatches), but unlike search.py it never reconfigured stdout. On a
non-UTF-8 Windows console (cp1252/gbk) running the CLI crashes with
UnicodeEncodeError, the same failure reported in #112 for search.py.
Mirror the wrapper search.py already uses: re-wrap stdout/stderr in a
UTF-8 TextIOWrapper when the console encoding is not UTF-8. Applied to
the source of truth and the synced cli/assets copy.
Verified: the CLI runs clean under PYTHONIOENCODING=cp1252 (exit 0, no
UnicodeEncodeError) while still emitting the box/swatch output;
check:assets passes.
Related to #112 (search.py is already fixed on main; this covers the
remaining design_system.py instance).
* fix(cli): install all 7 skills via uipro init, not just the orchestrator
`uipro init` rendered only the orchestrator (ui-ux-pro-max) and never
delivered the 6 sibling skills (banner-design, brand, design,
design-system, slides, ui-styling), so users got 1 of 7 skills (#362).
- sync-assets.mjs: bundle the 6 sub-skills into cli/assets/skills/ as
static copies (source of truth: .claude/skills/), with sync + check
coverage. Excludes ui-styling/canvas-fonts (~5.8MB of TTF) and
__pycache__/.pyc cruft — a skill registers from its SKILL.md, not its
fonts — so the bundle adds ~0.9MB, not ~6.6MB.
- template.ts: after rendering the orchestrator, install each bundled
sub-skill as a sibling. The skills parent is derived from the
platform's skillPath (skills/ for most, prompts/ for copilot,
steering/ for kiro) rather than hardcoded.
- uninstall.ts: remove the sub-skills too.
Verified: check:assets in sync, tsc passes, and a per-platform install
harness delivers all 7 skills to the correct parent dir with no fonts.
Closes#362
* fix(cli): filter excluded files from target side of check:assets
check:assets filtered sourceFiles with isExcludedAssetFile but not
targetFiles, so a stray cli/assets/scripts/__pycache__/*.pyc (generated
by a local Python run) was reported as an "extra asset file" and failed
the gate. Apply the same predicate to targetFiles in both the
dirsToSync and sub-skill loops.
Verified: check:assets now passes with __pycache__/*.pyc present in the
target tree; typecheck passes.
* fix(cli): uninstall from each platform's real skills dir, not hardcoded skills/
removeSkillDir() hardcoded <folder>/skills/<name>, but the installer
places skills under each platform config's skillPath parent — copilot in
.github/prompts/, kiro in .kiro/steering/. So uninstall left those
platforms' skills (orchestrator + sub-skills) behind.
Derive the install parent from loadPlatformConfig(aiType).folderStructure
(same source the installer uses), and keep the legacy <folder>/skills/
cleanup (incl. .shared/) for older installs. Deduped via a Set.
Verified: typecheck passes; an install+uninstall harness removes all 7
skills with zero leftovers for claude (.claude/skills), copilot
(.github/prompts) and kiro (.kiro/steering).
* fix(cli): re-sync bundled sub-skills after #385 stripped ckm- names
#385 merged to main and removed the ckm- prefix from the six
.claude/skills/*/SKILL.md name fields. This branch's bundled copies
under cli/assets/skills/ still carried the old ckm- names, so after the
PR merges with main the source no longer matched the bundle and the
check-asset-sync CI gate failed (stale asset file: skills/*/SKILL.md).
Merge main and regenerate the bundle so cli/assets/skills matches the
current .claude/skills source of truth. check:assets and typecheck pass.
persist_design_system crashed with AttributeError: 'NoneType' object has
no attribute 'lower' when the design_system dict carries an explicit
project_name of None (the default of generate(query, project_name=None)).
dict.get("project_name", "default") only substitutes the default for a
MISSING key, not a present-but-None value, so project_name.lower() blew
up.
Coalesce falsy values (None/""/missing) to "default" before slugifying.
Applied to both the source of truth and the bundled cli/assets copy.
The "search blindness" half of #159 (core.py tokenize length filter) is
already resolved on main (`len(w) >= 2`), so this targets the remaining
crash only.
Closes#159
Co-authored-by: YangKuoshih <155388493+YangKuoshih@users.noreply.github.com>
On Windows, an older install (or a git checkout that materialized the
repo's symlinked data/scripts as plain "pointer" files) leaves a regular
file at <skill>/data or <skill>/scripts. copyDataAndScripts then calls
mkdir on that path, which throws EEXIST; under `uipro init --ai all` the
per-platform error is swallowed, leaving e.g. codex with the stale
pointer files and no real directories.
Add ensureCleanDir(): before mkdir, lstat the target and remove it if it
is not already a directory. Existing real directories are preserved
(re-install is unaffected). Verified with a repro harness.
Closes#237
* fix CLI asset sync
* fix(cli): normalize line endings in asset sync/check
check:assets hashed raw bytes, so identical CSV/JSON/py content with
CRLF vs LF (git autocrlf on checkout) was reported as stale drift,
blocking the release guard on Windows/mixed checkouts.
- fileHash now normalizes CRLF->LF before hashing, so check:assets
compares content, not line endings.
- sync:assets writes LF-normalized copies instead of a raw byte copy,
so re-syncing is deterministic across platforms.
All synced assets are text (csv/json/md/py); no binaries affected.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* ci: enforce CLI asset sync on PRs
Adds a Check asset sync workflow that runs `npm run check:assets` on any
PR touching src/ui-ux-pro-max/** or cli/assets/**, so the bundled CLI
assets can't silently drift from the source of truth.
The check uses only node builtins (no install step) and normalizes
line endings before hashing, so it hard-fails on real content drift
without the CRLF/LF soft-fail hack other approaches needed.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
* fix: V-001 security vulnerability
Automated security fix generated by Orbis Security AI
* feat(cli): add optional GitHub token support with proper UX and docs
- Rename env var from GITHUB_TOKEN to UI_PRO_MAX_GITHUB_TOKEN (primary),
with GITHUB_TOKEN as fallback — avoids silently attaching CI workflow
credentials that GitHub Actions injects automatically
- Add whitespace trim guard to prevent malformed Authorization headers
- Add getGitHubTokenGuidance() helper exported from github.ts so rate-limit
errors and spinner warnings tell users exactly how to fix the problem
- Thread optional token param through fetchReleases, getLatestRelease,
downloadRelease signatures
- Add --token flag to init, versions, update commands (Commander.js wiring)
- Update rate-limit catch in tryGitHubInstall to show token guidance
- Document token options (flag, env var, fallback) in cli/README.md with
CI warning about GITHUB_TOKEN scope
Supersedes the narrower env-only approach in PR #294 and incorporates the
safeguards requested during review of closed PR #186.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Breaking changes fixed:
- Row 8/9: icon format corrected from 'lucide:home' (v3) to 'i-lucide-home' (v4 Iconify i-prefix)
- Row 18: useOverlay API updated from .open(Component, {props}) to .create(Component).open({props})
New v4 guidelines added (rows 51-70):
- Auto-registered modules: do not re-add @nuxt/icon @nuxt/fonts @nuxtjs/color-mode
- Official nuxi init templates for project bootstrapping
- Local Iconify JSON install for SSR reliability
- Global icon overrides via appConfig.ui.icons
- New form components: UFileUpload, UInputDate, UInputTags, UColorPicker
- New data components: UTree, UMarquee
- UContextMenu for right-click menus
- Awaiting overlay result Promise for confirmation dialogs
- UCommandPalette grouped items and extractShortcuts
- UHeader/UFooter/UPageAside layout components
- ClientOnly pattern for color mode hydration safety
- Generated theme file (.nuxt/ui/) for slot discovery
- defineShortcuts whenever condition guard
- UApp locale prop for i18n (50+ built-in locales)
Sync cli/assets to match src.
The --force option was accepted by Commander but ignored: writeFile()
always overwrote existing files silently. Users expecting protection
against accidental overwrites had no way to preserve existing configs.
- generatePlatformFiles: check file existence before writing; skip with
a clear message when file exists and force=false
- generateAllPlatformFiles / templateInstall: propagate force parameter
- initCommand: pass options.force through to templateInstall
Behavior change:
uipro init --ai claude → skips if SKILL.md already exists
uipro init --ai claude --force → overwrites regardless
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Both files were stuck at v2.2.1 while plugin.json, skill.json and
cli/package.json had moved to v2.5.0. Claude marketplace reads
marketplace.json for version and palette count — the stale entry
showed outdated data (96 palettes vs actual 161, 13 stacks vs 15).
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
- Merged STACK_CONFIG: kept main's full stack list + added angular & laravel from PR
- Updated platform templates: 161 palettes, 16 stacks across all descriptions
- Listed all 16 stacks in claude.json frontmatter description
- Warn when --global and --legacy are used together (init.ts)
- Update metadata across all platform templates (161 palettes, 15 stacks)
- Bump skill.json version from 2.0.0 to 2.5.0
- Re-throw non-ENOENT errors in uninstall.ts removeSkillDir
- Hoist detectAIType call to avoid double invocation in uninstall
- Add clarifying comment for .shared in AI_FOLDERS mapping
Align npm package version with GitHub release v2.5.0.
All 16 AI types (including trae, opencode, droid, continue,
codebuddy) are now available after npm publish.
Closes#199, #195, #172, #132
Antigravity now defaults to .agents/skills/ directory. Update
AI_FOLDERS mapping and detection logic with backward compat
for existing .agent/ directories.
Closes#196
Add required name and description frontmatter to windsurf, kiro,
cursor, copilot, and roocode platform templates. Update agent.json
frontmatter with current capability counts.
Closes#204, #188, #43
Upgrade the design system terminal output from basic ASCII to Unicode box-drawing characters,
add ANSI true color swatches with graceful fallback, expand the color palette from 5 to 10
colors (Primary, On Primary, Secondary, Accent, Background, Foreground, Muted, Border,
Destructive, Ring) with CSS variable names, and surface Light/Dark mode support from styles.csv.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add support for Factory's Droid AI assistant, allowing users to install
the skill via 'uipro init --ai droid' to .factory/skills/ directory.
Changes:
- Add droid.json platform config (src and cli/assets)
- Add 'droid' to AIType and AI_TYPES array
- Add .factory directory detection
- Add droid to AI_TO_PLATFORM mapping
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Force UTF-8 encoding for stdout/stderr in search.py to handle
emoji characters (⚡, ✓) on Windows systems that default to cp1252.
Fixes UnicodeEncodeError: 'charmap' codec can't encode character
- Bump CLI version to 2.2.3
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Remove .shared folder dependency - all platforms now self-contained
- Each platform installation includes its own data/ and scripts/
- Update platform configs: reference → full install type
- Simplify template.ts: remove ensureSharedExists logic
- Update Cursor to Skill Mode (auto-activate)
- Update README to reflect Cursor in Skill Mode
- Bump CLI version to 2.2.2
Fixes issue where users couldn't find search.py in shared folder.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Remove folders that were only used as reference/examples:
- .cursor/, .windsurf/, .kiro/, .roo/, .github/
- .agent/, .opencode/
These folders are no longer needed since CLI generates
all necessary files for users via `uipro init`.
Update CLAUDE.md architecture section accordingly.
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
- Remove Manual Installation section from README
- Add 67 styles table with # | Style | Best For format
- Update Supported Stacks table with all 13 stacks
- Simplify Usage section: group by Skill mode vs Workflow mode
- Fix counts: 57 font pairings (was 56), 99 UX guidelines (was 98)
- Change Windsurf from Workflow to Skill mode
- Update CLAUDE.md: remove prompt domain, add missing stacks
- Bump CLI version to 2.2.1
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
BREAKING CHANGES:
- Moved canonical data/scripts to src/ui-ux-pro-max/
- Removed duplicate folders (.codex/, .gemini/, .trae/, .codebuddy/, .continue/, skills/, .qoder/)
- CLI now uses template system instead of copying pre-built folders
New features:
- Merged prompts.csv into styles.csv with 4 new columns:
- AI Prompt Keywords
- CSS/Technical Keywords
- Implementation Checklist
- Design System Variables
- All 67 styles now have complete prompt data
- Added Astro stack (53 guidelines)
- Added 10 new 2025 UI trend styles
CLI changes:
- New template rendering system (cli/src/utils/template.ts)
- Reduced cli/assets from ~34MB to ~564KB
- Assets now contain only: data/, scripts/, templates/
File structure:
- src/ui-ux-pro-max/ - Single source of truth
- .claude/skills/ - Symlinks to src/ for development
- .shared/ - Symlink to src/ui-ux-pro-max/
Bumped CLI version: 2.1.3 → 2.2.0
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
- Added YAML frontmatter with description field to .agent/workflows/ui-ux-pro-max.md
- Synced to cli/assets/.agent/workflows/ui-ux-pro-max.md for offline installation
- Fixes bug where Antigravity couldn't recognize workflow without description
- Extract newline character to variable before using in f-string
- Fixes SyntaxError on Python 3.11 and earlier versions
- Synced fix to all 11 design_system.py locations
- Bump CLI version to 2.1.2
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Remove hardcoded version string (was stuck at 1.9.0)
- Read version from package.json at runtime using ESM imports
- Bump version to 2.1.0
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add --persist flag to save design system to design-system/MASTER.md
- Add --page flag to create page-specific override files in design-system/pages/
- MASTER.md includes hierarchical override logic header, color palette, typography, spacing, shadows, component specs, and anti-patterns
- Page override files are templates for documenting deviations from Master
- Updated documentation for all AI assistants (Claude, Cursor, Windsurf, Kiro, Qoder, Roo)
- Updated README.md with usage examples
This enables persistent design context across chat sessions using a 'Master + Overrides' pattern where page-specific rules override the global design system.
## Major Features
- Add --design-system flag for AI-powered design recommendations
- 100 industry-specific reasoning rules in ui-reasoning.csv
- Multi-domain parallel search (product, style, color, landing, typography)
- Anti-patterns to avoid for each industry
## New Files
- data/ui-reasoning.csv - 100 UI category rules with style priority, effects, anti-patterns
- scripts/design_system.py - Reasoning engine with BM25 ranking
## Workflow Updates
- All agent workflows updated with new design system generation step
- Step 2 now requires --design-system for comprehensive recommendations
- Updated example workflow with beauty spa case study
## CLI Updates
- Version bumped to 2.0.0
- Added Qoder and Roo Code support
- Synced all agent folders to cli/assets/
## README Updates
- Added version badges and PayPal donation button
- New "What's New in v2.0" section with architecture diagram
- Updated CLI installation instructions
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>