CodeVetter · Repo Unpack · Extension points
nextlevelbuilder/ui-ux-pro-max-skill
Extension is deliberately data-driven: new search domains register in CSV_CONFIG, new stacks in STACK_CONFIG + STACK_CURRENT_* tables, new product categories as aligned rows across products/colors/ui-reasoning.csv, new decision-rule signals in CONDITION_SIGNALS, new dial tiers in DIAL_TIERS, new AI platforms via AI_TYPES + AI_TO_PLATFORM + a templates/platforms/*.json file, and new sub-skills via the subSkills array in sync-assets.mjs. Smoke tests and validators auto-enumerate these registries, so additions are picked up without wiring — but several guards (192-row parity, expected domain/stack counts, identity uniqueness) will fail CI if invariants are missed.
- New search domain = one CSV_CONFIG entry (file + search_cols + output_cols); --domain choices, smoke-domains.sh enumeration, and domain auto-detection all derive from it, though _DOMAIN_TIEBREAK_ORDER, _DOMAIN_QUERY_REWRITES, and _SEARCH_THRESHOLDS may need matching entries.
- New stack = a data/stacks/<name>.csv plus a STACK_CONFIG entry; STACK_CURRENT_VERSIONS, STACK_CURRENT_APPLICABILITY, _STACK_QUERY_NAMES, and STACK_OFFICIAL_HOSTS in validate_data.py form the freshness/identity contract the validator enforces.
- New product category requires exactly-aligned rows in products.csv, colors.csv, and ui-reasoning.csv — validate_data.py hard-fails unless each has exactly 192 rows with identical label sets.
- Decision-rule grammar extension points: add an if_* key to CONDITION_SIGNALS (regex-compiled signal phrases) or a prefix to ACTION_PREFIXES/TOKEN_ACTION_PREFIXES; apply_decision_rules produces only deterministic mutations (style_ids, constraints, pattern, mode) — data can never execute.
- Style taxonomy extension: new styles get a kebab-case Style ID, a Status in {active,supplemental,deprecated}, and optional Parent Style ID or Replacement Domain/ID redirect; _check_style_contract enforces identity uniqueness, parent cycles, and vocabulary vocabularies (Performance/Accessibility/mode fields).
- Design dials extend via DIAL_TIERS buckets — variance injects style_keywords ahead of reasoning priorities, motion maps to an Intensity Tier in motion.csv, density swaps the spacing dict written into MASTER.md.
- New AI platform = add the type to AI_TYPES + AI_FOLDERS + AI_TO_PLATFORM + getAITypeDescription, then drop a templates/platforms/<name>.json declaring folderStructure/scriptPath/frontmatter — the installer, dry-run planner, and uninstaller all derive paths from that JSON.
- Template rendering is placeholder substitution on templates/base/skill-content.md ({{TITLE}}, {{DESCRIPTION}}, {{SCRIPT_PATH}}, {{SKILL_OR_WORKFLOW}}, {{QUICK_REFERENCE}}); new platforms reuse the same base — per-platform divergence lives only in the JSON config.
- New bundled sub-skill = create .claude/skills/<name>/ and add the name to the subSkills array in sync-assets.mjs; the bundled-skill CI contract auto-derives its allowlist from the directory listing.
- Catalog refresh scripts are CLI-arg driven (--input, --package-json, --curated-csv, --output, --verified-at, --expected-count) so a new upstream catalog can be added by scripting the same validate->normalize->manifest-write pattern used for Phosphor icons.
- Gallery filter dimensions are computed from data via getUniqueValues over any StyleData key, so a new CSV column can become a filter facet with a small FilterBar change. (inferred)