imhcode 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/ISSUE_TEMPLATE/bug_report.md +41 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +39 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +29 -0
- package/.github/copilot-instructions.md +43 -0
- package/.github/workflows/framework-validator.yml +53 -0
- package/.gitignore.template +15 -0
- package/AGENTS.md +69 -0
- package/CLAUDE.md +27 -0
- package/README.md +63 -0
- package/SETUP.md +81 -0
- package/USER_MANUAL.md +70 -0
- package/agents/android-executor/SYSTEM.md +32 -0
- package/agents/android-executor/agent.yml +53 -0
- package/agents/debugger/SYSTEM.md +32 -0
- package/agents/debugger/agent.yml +56 -0
- package/agents/designer/SYSTEM.md +32 -0
- package/agents/designer/agent.yml +59 -0
- package/agents/devops-executor/SYSTEM.md +32 -0
- package/agents/devops-executor/agent.yml +56 -0
- package/agents/flutter-executor/SYSTEM.md +32 -0
- package/agents/flutter-executor/agent.yml +54 -0
- package/agents/ios-executor/SYSTEM.md +32 -0
- package/agents/ios-executor/agent.yml +53 -0
- package/agents/java-executor/SYSTEM.md +32 -0
- package/agents/java-executor/agent.yml +57 -0
- package/agents/laravel-executor/SYSTEM.md +32 -0
- package/agents/laravel-executor/agent.yml +59 -0
- package/agents/nextjs-executor/SYSTEM.md +32 -0
- package/agents/nextjs-executor/agent.yml +60 -0
- package/agents/planner/SYSTEM.md +32 -0
- package/agents/planner/agent.yml +56 -0
- package/agents/python-executor/SYSTEM.md +32 -0
- package/agents/python-executor/agent.yml +58 -0
- package/agents/react-executor/SYSTEM.md +32 -0
- package/agents/react-executor/agent.yml +58 -0
- package/agents/react-native-executor/SYSTEM.md +32 -0
- package/agents/react-native-executor/agent.yml +53 -0
- package/agents/security-auditor/SYSTEM.md +32 -0
- package/agents/security-auditor/agent.yml +56 -0
- package/agents/seo-optimizer/SYSTEM.md +32 -0
- package/agents/seo-optimizer/agent.yml +54 -0
- package/agents/systems-executor/SYSTEM.md +32 -0
- package/agents/systems-executor/agent.yml +54 -0
- package/agents/tester/SYSTEM.md +32 -0
- package/agents/tester/agent.yml +58 -0
- package/agents/vue-executor/SYSTEM.md +32 -0
- package/agents/vue-executor/agent.yml +58 -0
- package/agents/web3-executor/SYSTEM.md +32 -0
- package/agents/web3-executor/agent.yml +55 -0
- package/bin/imhcode.js +1634 -0
- package/dist/orchestrator/builder.d.ts +23 -0
- package/dist/orchestrator/builder.d.ts.map +1 -0
- package/dist/orchestrator/builder.js +231 -0
- package/dist/orchestrator/builder.js.map +1 -0
- package/dist/orchestrator/executor.d.ts +43 -0
- package/dist/orchestrator/executor.d.ts.map +1 -0
- package/dist/orchestrator/executor.js +356 -0
- package/dist/orchestrator/executor.js.map +1 -0
- package/dist/orchestrator/index.d.ts +35 -0
- package/dist/orchestrator/index.d.ts.map +1 -0
- package/dist/orchestrator/index.js +490 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/orchestrator/loader.d.ts +33 -0
- package/dist/orchestrator/loader.d.ts.map +1 -0
- package/dist/orchestrator/loader.js +203 -0
- package/dist/orchestrator/loader.js.map +1 -0
- package/dist/orchestrator/registry.d.ts +63 -0
- package/dist/orchestrator/registry.d.ts.map +1 -0
- package/dist/orchestrator/registry.js +181 -0
- package/dist/orchestrator/registry.js.map +1 -0
- package/dist/orchestrator/schema.d.ts +132 -0
- package/dist/orchestrator/schema.d.ts.map +1 -0
- package/dist/orchestrator/schema.js +101 -0
- package/dist/orchestrator/schema.js.map +1 -0
- package/dist/orchestrator/session.d.ts +25 -0
- package/dist/orchestrator/session.d.ts.map +1 -0
- package/dist/orchestrator/session.js +80 -0
- package/dist/orchestrator/session.js.map +1 -0
- package/dist/orchestrator/types.d.ts +91 -0
- package/dist/orchestrator/types.d.ts.map +1 -0
- package/dist/orchestrator/types.js +7 -0
- package/dist/orchestrator/types.js.map +1 -0
- package/package.json +95 -0
- package/skills/AnimatePresence/SKILL.md +3 -0
- package/skills/accessibility/SKILL.md +146 -0
- package/skills/agent-architecture-audit/SKILL.md +256 -0
- package/skills/agent-eval/SKILL.md +145 -0
- package/skills/agent-introspection-debugging/SKILL.md +153 -0
- package/skills/agentic-engineering/SKILL.md +63 -0
- package/skills/ai-regression-testing/SKILL.md +385 -0
- package/skills/android-clean-architecture/SKILL.md +339 -0
- package/skills/animated-component-libraries/SKILL.md +8 -0
- package/skills/animejs/SKILL.md +8 -0
- package/skills/api-connector-builder/SKILL.md +120 -0
- package/skills/api-design/SKILL.md +523 -0
- package/skills/apple/SKILL.md +158 -0
- package/skills/apple/metadata.json +16 -0
- package/skills/architecture-decision-records/SKILL.md +179 -0
- package/skills/article-writing/SKILL.md +79 -0
- package/skills/automation-audit-ops/SKILL.md +142 -0
- package/skills/awwwards/SKILL.md +162 -0
- package/skills/awwwards/metadata.json +16 -0
- package/skills/babylonjs-engine/SKILL.md +8 -0
- package/skills/backend-patterns/SKILL.md +561 -0
- package/skills/baqir-docs/SKILL.md +3 -0
- package/skills/barba-js/SKILL.md +8 -0
- package/skills/benchmark/SKILL.md +93 -0
- package/skills/best-practice/SKILL.md +7 -0
- package/skills/best-practice/assets/claude-memory/claude-memory-monorepo.jpg +0 -0
- package/skills/best-practice/assets/claude-power-ups/dial-the-model-1.png +0 -0
- package/skills/best-practice/assets/claude-power-ups/dial-the-model-2.png +0 -0
- package/skills/best-practice/assets/claude-power-ups/dial-the-model-3.png +0 -0
- package/skills/best-practice/assets/claude-power-ups/powerup-menu.png +0 -0
- package/skills/best-practice/claude-cli-startup-flags.md +231 -0
- package/skills/best-practice/claude-commands.md +132 -0
- package/skills/best-practice/claude-mcp.md +132 -0
- package/skills/best-practice/claude-memory.md +121 -0
- package/skills/best-practice/claude-power-ups.md +66 -0
- package/skills/best-practice/claude-settings.md +1170 -0
- package/skills/best-practice/claude-skills.md +58 -0
- package/skills/best-practice/claude-subagents.md +56 -0
- package/skills/blender-motion-state-inspection/SKILL.md +164 -0
- package/skills/bootstrap-patterns/SKILL.md +316 -0
- package/skills/brand-guidelines/LICENSE.txt +202 -0
- package/skills/brand-guidelines/SKILL.md +73 -0
- package/skills/brand-voice/SKILL.md +97 -0
- package/skills/brand-voice/references/voice-profile-schema.md +55 -0
- package/skills/browser-qa/SKILL.md +87 -0
- package/skills/canary-watch/SKILL.md +107 -0
- package/skills/canvas-design/LICENSE.txt +202 -0
- package/skills/canvas-design/SKILL.md +8 -0
- package/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/skills/caveman/SKILL.md +74 -0
- package/skills/changelog-generator/SKILL.md +104 -0
- package/skills/cisco-ios-patterns/SKILL.md +163 -0
- package/skills/ckm:design-system/SKILL.md +3 -0
- package/skills/ckm:slides/SKILL.md +3 -0
- package/skills/claude-red/SKILL.md +35 -0
- package/skills/click-path-audit/SKILL.md +244 -0
- package/skills/clickhouse-io/SKILL.md +439 -0
- package/skills/codebase-onboarding/SKILL.md +233 -0
- package/skills/coding-standards/SKILL.md +549 -0
- package/skills/compose-multiplatform-patterns/SKILL.md +299 -0
- package/skills/computational-architecture/SKILL.md +31 -0
- package/skills/content-engine/SKILL.md +131 -0
- package/skills/content-research-writer/SKILL.md +538 -0
- package/skills/continuous-agent-loop/SKILL.md +45 -0
- package/skills/cost-aware-llm-pipeline/SKILL.md +183 -0
- package/skills/cpp-coding-standards/SKILL.md +723 -0
- package/skills/crosspost/SKILL.md +111 -0
- package/skills/css-container-queries/SKILL.md +132 -0
- package/skills/customer-billing-ops/SKILL.md +140 -0
- package/skills/customs-trade-compliance/SKILL.md +263 -0
- package/skills/dart-flutter-patterns/SKILL.md +563 -0
- package/skills/dashboard-builder/SKILL.md +108 -0
- package/skills/data-scraper-agent/SKILL.md +764 -0
- package/skills/database-migrations/SKILL.md +429 -0
- package/skills/deep-research/SKILL.md +159 -0
- package/skills/defi-amm-security/SKILL.md +166 -0
- package/skills/deployment-patterns/SKILL.md +427 -0
- package/skills/design-auditor/README.md +504 -0
- package/skills/design-auditor/README_KR.md +327 -0
- package/skills/design-auditor/SKILL.md +8 -0
- package/skills/design-auditor/references/animation.md +300 -0
- package/skills/design-auditor/references/color.md +241 -0
- package/skills/design-auditor/references/corner-radius.md +331 -0
- package/skills/design-auditor/references/elevation.md +249 -0
- package/skills/design-auditor/references/ethics.md +877 -0
- package/skills/design-auditor/references/figma-mcp.md +377 -0
- package/skills/design-auditor/references/heuristics.md +730 -0
- package/skills/design-auditor/references/i18n.md +254 -0
- package/skills/design-auditor/references/iconography.md +201 -0
- package/skills/design-auditor/references/microcopy.md +227 -0
- package/skills/design-auditor/references/navigation.md +311 -0
- package/skills/design-auditor/references/spacing.md +313 -0
- package/skills/design-auditor/references/states.md +254 -0
- package/skills/design-auditor/references/tokens.md +286 -0
- package/skills/design-auditor/references/typography.md +273 -0
- package/skills/design-system/SKILL.md +82 -0
- package/skills/design-tokens-system/SKILL.md +156 -0
- package/skills/development-workflows/SKILL.md +7 -0
- package/skills/development-workflows/cross-model-workflow/assets/cross-model-workflow.png +0 -0
- package/skills/development-workflows/cross-model-workflow/cross-model-workflow.md +55 -0
- package/skills/development-workflows/rpi/.claude/agents/code-reviewer.md +21 -0
- package/skills/development-workflows/rpi/.claude/agents/constitutional-validator.md +288 -0
- package/skills/development-workflows/rpi/.claude/agents/documentation-analyst-writer.md +64 -0
- package/skills/development-workflows/rpi/.claude/agents/product-manager.md +15 -0
- package/skills/development-workflows/rpi/.claude/agents/requirement-parser.md +238 -0
- package/skills/development-workflows/rpi/.claude/agents/senior-software-engineer.md +15 -0
- package/skills/development-workflows/rpi/.claude/agents/technical-cto-advisor.md +201 -0
- package/skills/development-workflows/rpi/.claude/agents/ux-designer.md +14 -0
- package/skills/development-workflows/rpi/.claude/commands/rpi/implement.md +634 -0
- package/skills/development-workflows/rpi/.claude/commands/rpi/plan.md +416 -0
- package/skills/development-workflows/rpi/.claude/commands/rpi/research.md +381 -0
- package/skills/development-workflows/rpi/rpi-workflow.md +101 -0
- package/skills/development-workflows/rpi/rpi-workflow.svg +178 -0
- package/skills/django-celery/SKILL.md +457 -0
- package/skills/django-patterns/SKILL.md +734 -0
- package/skills/django-security/SKILL.md +593 -0
- package/skills/django-tdd/SKILL.md +729 -0
- package/skills/dmux-workflows/SKILL.md +7 -0
- package/skills/docker-patterns/SKILL.md +364 -0
- package/skills/documentation-lookup/SKILL.md +90 -0
- package/skills/domain-name-brainstormer/SKILL.md +212 -0
- package/skills/dribbble/SKILL.md +160 -0
- package/skills/dribbble/metadata.json +16 -0
- package/skills/e2e-testing/SKILL.md +326 -0
- package/skills/empirical-research/SKILL.md +22 -0
- package/skills/error-handling/SKILL.md +376 -0
- package/skills/eval-harness/SKILL.md +270 -0
- package/skills/evm-token-decimals/SKILL.md +130 -0
- package/skills/fastapi-patterns/SKILL.md +327 -0
- package/skills/finance-billing-ops/SKILL.md +127 -0
- package/skills/flox-environments/SKILL.md +496 -0
- package/skills/flutter-dart-code-review/SKILL.md +435 -0
- package/skills/foundation-models-on-device/SKILL.md +243 -0
- package/skills/framer/SKILL.md +159 -0
- package/skills/framer/metadata.json +16 -0
- package/skills/frontend-design/LICENSE.txt +21 -0
- package/skills/frontend-design/README.md +71 -0
- package/skills/frontend-design/SKILL.md +115 -0
- package/skills/frontend-design-direction/SKILL.md +92 -0
- package/skills/frontend-patterns/SKILL.md +7 -0
- package/skills/frontend-slides/SKILL.md +184 -0
- package/skills/frontend-slides/STYLE_PRESETS.md +330 -0
- package/skills/frontend-slides/animation-patterns.md +122 -0
- package/skills/frontend-slides/html-template.md +419 -0
- package/skills/frontend-slides/scripts/export-pdf.sh +418 -0
- package/skills/frontend-slides/scripts/extract-pptx.py +96 -0
- package/skills/frontend-slides/viewport-base.css +153 -0
- package/skills/gateguard/SKILL.md +125 -0
- package/skills/git-workflow/SKILL.md +715 -0
- package/skills/github-ops/SKILL.md +144 -0
- package/skills/golang-patterns/SKILL.md +674 -0
- package/skills/golang-testing/SKILL.md +720 -0
- package/skills/graphify/__init__.py +28 -0
- package/skills/graphify/__main__.py +2899 -0
- package/skills/graphify/analyze.py +608 -0
- package/skills/graphify/benchmark.py +152 -0
- package/skills/graphify/build.py +366 -0
- package/skills/graphify/cache.py +244 -0
- package/skills/graphify/callflow_html.py +2014 -0
- package/skills/graphify/cluster.py +267 -0
- package/skills/graphify/dedup.py +414 -0
- package/skills/graphify/detect.py +1018 -0
- package/skills/graphify/export.py +1264 -0
- package/skills/graphify/extract.py +6646 -0
- package/skills/graphify/global_graph.py +155 -0
- package/skills/graphify/google_workspace.py +223 -0
- package/skills/graphify/hooks.py +304 -0
- package/skills/graphify/ingest.py +331 -0
- package/skills/graphify/llm.py +1111 -0
- package/skills/graphify/manifest.py +4 -0
- package/skills/graphify/prs.py +746 -0
- package/skills/graphify/report.py +203 -0
- package/skills/graphify/security.py +242 -0
- package/skills/graphify/serve.py +899 -0
- package/skills/graphify/skill-aider.md +1229 -0
- package/skills/graphify/skill-claw.md +1229 -0
- package/skills/graphify/skill-codex.md +1290 -0
- package/skills/graphify/skill-copilot.md +1317 -0
- package/skills/graphify/skill-droid.md +1285 -0
- package/skills/graphify/skill-kiro.md +1228 -0
- package/skills/graphify/skill-opencode.md +1340 -0
- package/skills/graphify/skill-pi.md +1228 -0
- package/skills/graphify/skill-trae.md +1254 -0
- package/skills/graphify/skill-vscode.md +258 -0
- package/skills/graphify/skill-windows.md +1434 -0
- package/skills/graphify/skill.md +1086 -0
- package/skills/graphify/transcribe.py +184 -0
- package/skills/graphify/tree_html.py +580 -0
- package/skills/graphify/validate.py +72 -0
- package/skills/graphify/watch.py +728 -0
- package/skills/graphify/wiki.py +259 -0
- package/skills/growth-marketing/SKILL.md +26 -0
- package/skills/gsap-scrolltrigger/SKILL.md +8 -0
- package/skills/healthcare-cdss-patterns/SKILL.md +245 -0
- package/skills/healthcare-emr-patterns/SKILL.md +159 -0
- package/skills/healthcare-phi-compliance/SKILL.md +145 -0
- package/skills/hexagonal-architecture/SKILL.md +276 -0
- package/skills/hipaa-compliance/SKILL.md +78 -0
- package/skills/homelab-network-setup/SKILL.md +129 -0
- package/skills/imhcode/SKILL.md +183 -0
- package/skills/imhcode-brainstorm/SKILL.md +37 -0
- package/skills/imhcode-codebase-knowledge/SKILL.md +37 -0
- package/skills/imhcode-codebase-knowledge/assets/templates/ARCHITECTURE.md +49 -0
- package/skills/imhcode-codebase-knowledge/assets/templates/CONCERNS.md +56 -0
- package/skills/imhcode-codebase-knowledge/assets/templates/CONVENTIONS.md +52 -0
- package/skills/imhcode-codebase-knowledge/assets/templates/INTEGRATIONS.md +48 -0
- package/skills/imhcode-codebase-knowledge/assets/templates/STACK.md +56 -0
- package/skills/imhcode-codebase-knowledge/assets/templates/STRUCTURE.md +44 -0
- package/skills/imhcode-codebase-knowledge/assets/templates/TESTING.md +57 -0
- package/skills/imhcode-codebase-knowledge/references/inquiry-checkpoints.md +70 -0
- package/skills/imhcode-codebase-knowledge/references/stack-detection.md +131 -0
- package/skills/imhcode-codebase-knowledge/scripts/scan.py +712 -0
- package/skills/imhcode-dispatch/SKILL.md +31 -0
- package/skills/imhcode-saas-architect/SKILL.md +55 -0
- package/skills/imhcode-security/SKILL.md +42 -0
- package/skills/imhcode-sprint-planner/SKILL.md +42 -0
- package/skills/inventory-demand-planning/SKILL.md +247 -0
- package/skills/investor-materials/SKILL.md +96 -0
- package/skills/investor-outreach/SKILL.md +91 -0
- package/skills/ios-icon-gen/SKILL.md +157 -0
- package/skills/ios-icon-gen/scripts/generate_icons.swift +258 -0
- package/skills/ios-icon-gen/scripts/iconify_gen.sh +235 -0
- package/skills/java-coding-standards/SKILL.md +383 -0
- package/skills/jpa-patterns/SKILL.md +151 -0
- package/skills/kotlin-ktor-patterns/SKILL.md +689 -0
- package/skills/kotlin-patterns/SKILL.md +711 -0
- package/skills/laravel-patterns/SKILL.md +415 -0
- package/skills/laravel-plugin-discovery/SKILL.md +229 -0
- package/skills/laravel-security/SKILL.md +285 -0
- package/skills/laravel-tdd/SKILL.md +283 -0
- package/skills/laravel-verification/SKILL.md +179 -0
- package/skills/lightweight-3d-effects/SKILL.md +8 -0
- package/skills/linear/SKILL.md +156 -0
- package/skills/linear/metadata.json +16 -0
- package/skills/liquid-glass-design/SKILL.md +279 -0
- package/skills/llm-trading-agent-security/SKILL.md +146 -0
- package/skills/locomotive-scroll/SKILL.md +8 -0
- package/skills/logistics-exception-management/SKILL.md +222 -0
- package/skills/lottie-animations/SKILL.md +8 -0
- package/skills/make-interfaces-feel-better/SKILL.md +151 -0
- package/skills/mcp-server-patterns/SKILL.md +69 -0
- package/skills/meeting-insights-analyzer/SKILL.md +327 -0
- package/skills/micro-interactions/SKILL.md +178 -0
- package/skills/mle-workflow/SKILL.md +346 -0
- package/skills/mobbin/SKILL.md +157 -0
- package/skills/mobbin/metadata.json +16 -0
- package/skills/mobile-app-design/README.md +302 -0
- package/skills/mobile-app-design/SKILL.md +330 -0
- package/skills/mobile-app-design/examples/design-system-config.ts +685 -0
- package/skills/mobile-app-design/examples/form-validation-example.tsx +501 -0
- package/skills/mobile-app-design/examples/optimized-list-example.tsx +384 -0
- package/skills/mobile-app-design/examples/profile-screen-example.tsx +450 -0
- package/skills/mobile-app-design/references/accessibility-checklist.md +525 -0
- package/skills/mobile-app-design/references/android-guidelines.md +582 -0
- package/skills/mobile-app-design/references/common-mistakes.md +834 -0
- package/skills/mobile-app-design/references/ios-guidelines.md +421 -0
- package/skills/mobile-app-design/references/performance-patterns.md +705 -0
- package/skills/mobile-app-design/references/platform-differences.md +353 -0
- package/skills/mobile-app-design/references/ui-libraries.md +729 -0
- package/skills/mobile-app-design/scripts/accessibility-audit.sh +281 -0
- package/skills/mobile-app-design/scripts/check-contrast.py +188 -0
- package/skills/mobile-app-design/scripts/validate-touch-targets.sh +228 -0
- package/skills/mobile-app-ui-design/INDEX.md +131 -0
- package/skills/mobile-app-ui-design/README.md +135 -0
- package/skills/mobile-app-ui-design/SKILL.md +7 -0
- package/skills/mobile-app-ui-design/references/industry-conventions.md +151 -0
- package/skills/modern-web-design/SKILL.md +8 -0
- package/skills/motion-advanced/SKILL.md +596 -0
- package/skills/motion-design/SKILL.md +21 -0
- package/skills/motion-foundations/SKILL.md +299 -0
- package/skills/motion-framer/SKILL.md +8 -0
- package/skills/motion-patterns/SKILL.md +435 -0
- package/skills/motion-ui/SKILL.md +575 -0
- package/skills/mysql-patterns/SKILL.md +412 -0
- package/skills/nestjs-patterns/SKILL.md +230 -0
- package/skills/network-config-validation/SKILL.md +210 -0
- package/skills/nextjs-turbopack/SKILL.md +44 -0
- package/skills/nodejs-keccak256/SKILL.md +102 -0
- package/skills/nothing-design/SKILL.md +177 -0
- package/skills/nothing-design/references/components.md +153 -0
- package/skills/nothing-design/references/platform-mapping.md +64 -0
- package/skills/nothing-design/references/tokens.md +142 -0
- package/skills/nuxt4-patterns/SKILL.md +100 -0
- package/skills/openclaw-persona-forge/SKILL.md +288 -0
- package/skills/openclaw-persona-forge/gacha.py +224 -0
- package/skills/openclaw-persona-forge/gacha.sh +5 -0
- package/skills/openclaw-persona-forge/references/avatar-style.md +124 -0
- package/skills/openclaw-persona-forge/references/boundary-rules.md +53 -0
- package/skills/openclaw-persona-forge/references/error-handling.md +53 -0
- package/skills/openclaw-persona-forge/references/identity-tension.md +48 -0
- package/skills/openclaw-persona-forge/references/naming-system.md +39 -0
- package/skills/openclaw-persona-forge/references/output-template.md +166 -0
- package/skills/orchestration-workflow/SKILL.md +199 -0
- package/skills/orchestration-workflow/orchestration-workflow.gif +0 -0
- package/skills/orchestration-workflow/orchestration-workflow.md +199 -0
- package/skills/orchestration-workflow/orchestration-workflow.svg +78 -0
- package/skills/orchestration-workflow/output.md +13 -0
- package/skills/orchestration-workflow/weather.svg +6 -0
- package/skills/pixijs-2d/SKILL.md +8 -0
- package/skills/plan-orchestrate/SKILL.md +262 -0
- package/skills/plankton-code-quality/SKILL.md +236 -0
- package/skills/postgres-patterns/SKILL.md +147 -0
- package/skills/ppt-mckinsey/SKILL.md +27 -0
- package/skills/prisma-patterns/SKILL.md +371 -0
- package/skills/product-capability/SKILL.md +141 -0
- package/skills/product-lens/SKILL.md +92 -0
- package/skills/production-audit/SKILL.md +206 -0
- package/skills/project-flow-ops/SKILL.md +111 -0
- package/skills/prompt-optimizer/SKILL.md +398 -0
- package/skills/python-patterns/SKILL.md +750 -0
- package/skills/python-testing/SKILL.md +816 -0
- package/skills/pytorch-patterns/SKILL.md +396 -0
- package/skills/quarkus-patterns/SKILL.md +722 -0
- package/skills/radix-ui-primitives/SKILL.md +86 -0
- package/skills/react-native-best-practices/SKILL.md +83 -0
- package/skills/react-native-brownfield-migration/SKILL.md +115 -0
- package/skills/react-spring-physics/SKILL.md +8 -0
- package/skills/react-three-fiber/SKILL.md +8 -0
- package/skills/recsys-pipeline-architect/SKILL.md +114 -0
- package/skills/redis-patterns/SKILL.md +403 -0
- package/skills/remotion-video-creation/SKILL.md +43 -0
- package/skills/remotion-video-creation/rules/3d.md +86 -0
- package/skills/remotion-video-creation/rules/animations.md +29 -0
- package/skills/remotion-video-creation/rules/assets/charts-bar-chart.tsx +173 -0
- package/skills/remotion-video-creation/rules/assets/text-animations-typewriter.tsx +100 -0
- package/skills/remotion-video-creation/rules/assets/text-animations-word-highlight.tsx +108 -0
- package/skills/remotion-video-creation/rules/assets.md +78 -0
- package/skills/remotion-video-creation/rules/audio.md +172 -0
- package/skills/remotion-video-creation/rules/calculate-metadata.md +104 -0
- package/skills/remotion-video-creation/rules/can-decode.md +75 -0
- package/skills/remotion-video-creation/rules/charts.md +58 -0
- package/skills/remotion-video-creation/rules/compositions.md +146 -0
- package/skills/remotion-video-creation/rules/display-captions.md +126 -0
- package/skills/remotion-video-creation/rules/extract-frames.md +229 -0
- package/skills/remotion-video-creation/rules/fonts.md +152 -0
- package/skills/remotion-video-creation/rules/get-audio-duration.md +58 -0
- package/skills/remotion-video-creation/rules/get-video-dimensions.md +68 -0
- package/skills/remotion-video-creation/rules/get-video-duration.md +58 -0
- package/skills/remotion-video-creation/rules/gifs.md +138 -0
- package/skills/remotion-video-creation/rules/images.md +130 -0
- package/skills/remotion-video-creation/rules/import-srt-captions.md +67 -0
- package/skills/remotion-video-creation/rules/lottie.md +67 -0
- package/skills/remotion-video-creation/rules/measuring-dom-nodes.md +34 -0
- package/skills/remotion-video-creation/rules/measuring-text.md +143 -0
- package/skills/remotion-video-creation/rules/sequencing.md +106 -0
- package/skills/remotion-video-creation/rules/tailwind.md +11 -0
- package/skills/remotion-video-creation/rules/text-animations.md +20 -0
- package/skills/remotion-video-creation/rules/timing.md +179 -0
- package/skills/remotion-video-creation/rules/transcribe-captions.md +19 -0
- package/skills/remotion-video-creation/rules/transitions.md +122 -0
- package/skills/remotion-video-creation/rules/trimming.md +52 -0
- package/skills/remotion-video-creation/rules/videos.md +171 -0
- package/skills/repo-scan/SKILL.md +78 -0
- package/skills/responsive-email-templates/SKILL.md +110 -0
- package/skills/rive-interactive/SKILL.md +8 -0
- package/skills/rust-patterns/SKILL.md +499 -0
- package/skills/rust-testing/SKILL.md +500 -0
- package/skills/scroll-reveal-libraries/SKILL.md +8 -0
- package/skills/security-bounty-hunter/SKILL.md +99 -0
- package/skills/security-review/SKILL.md +503 -0
- package/skills/security-review/cloud-infrastructure-security.md +361 -0
- package/skills/security-scan/SKILL.md +165 -0
- package/skills/seo/SKILL.md +154 -0
- package/skills/seo-growth/SKILL.md +34 -0
- package/skills/shadcn-ui-patterns/SKILL.md +123 -0
- package/skills/spline-interactive/SKILL.md +8 -0
- package/skills/springboot-patterns/SKILL.md +314 -0
- package/skills/springboot-security/SKILL.md +272 -0
- package/skills/springboot-tdd/SKILL.md +158 -0
- package/skills/strategic-compact/SKILL.md +131 -0
- package/skills/stripe/SKILL.md +168 -0
- package/skills/stripe/metadata.json +16 -0
- package/skills/swift-actor-persistence/SKILL.md +143 -0
- package/skills/swift-concurrency-6-2/SKILL.md +216 -0
- package/skills/swiftui-patterns/SKILL.md +259 -0
- package/skills/systematic-debugging/CREATION-LOG.md +119 -0
- package/skills/systematic-debugging/SKILL.md +296 -0
- package/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
- package/skills/systematic-debugging/condition-based-waiting.md +115 -0
- package/skills/systematic-debugging/defense-in-depth.md +122 -0
- package/skills/systematic-debugging/find-polluter.sh +63 -0
- package/skills/systematic-debugging/root-cause-tracing.md +169 -0
- package/skills/systematic-debugging/test-academic.md +14 -0
- package/skills/systematic-debugging/test-pressure-1.md +58 -0
- package/skills/systematic-debugging/test-pressure-2.md +68 -0
- package/skills/systematic-debugging/test-pressure-3.md +69 -0
- package/skills/tailwindcss-v4/SKILL.md +107 -0
- package/skills/tdd-workflow/SKILL.md +463 -0
- package/skills/team-builder/SKILL.md +168 -0
- package/skills/test-driven-development/SKILL.md +371 -0
- package/skills/test-driven-development/testing-anti-patterns.md +299 -0
- package/skills/theme-factory/LICENSE.txt +202 -0
- package/skills/theme-factory/SKILL.md +59 -0
- package/skills/theme-factory/theme-showcase.pdf +0 -0
- package/skills/theme-factory/themes/arctic-frost.md +19 -0
- package/skills/theme-factory/themes/botanical-garden.md +19 -0
- package/skills/theme-factory/themes/desert-rose.md +19 -0
- package/skills/theme-factory/themes/forest-canopy.md +19 -0
- package/skills/theme-factory/themes/golden-hour.md +19 -0
- package/skills/theme-factory/themes/midnight-galaxy.md +19 -0
- package/skills/theme-factory/themes/modern-minimalist.md +19 -0
- package/skills/theme-factory/themes/ocean-depths.md +19 -0
- package/skills/theme-factory/themes/sunset-boulevard.md +19 -0
- package/skills/theme-factory/themes/tech-innovation.md +19 -0
- package/skills/threejs-webgl/SKILL.md +8 -0
- package/skills/trailofbits-auditing/SKILL.md +30 -0
- package/skills/twitter-algorithm-optimizer/SKILL.md +327 -0
- package/skills/typeui-cli/SKILL.md +90 -0
- package/skills/typeui-main/DESIGN.md +114 -0
- package/skills/typeui-main/LICENSE.md +9 -0
- package/skills/typeui-main/README.md +84 -0
- package/skills/typeui-main/REGISTRY.md +60 -0
- package/skills/typeui-main/SKILL.md +114 -0
- package/skills/typeui-main/package-lock.json +2123 -0
- package/skills/typeui-main/package.json +56 -0
- package/skills/typeui-main/skills/typeui-cli/SKILL.md +90 -0
- package/skills/typeui-main/src/cli.ts +282 -0
- package/skills/typeui-main/src/config.ts +28 -0
- package/skills/typeui-main/src/domain/designSystemSchema.ts +77 -0
- package/skills/typeui-main/src/generation/existingDesignSystem.ts +228 -0
- package/skills/typeui-main/src/generation/randomDesignSystem.ts +348 -0
- package/skills/typeui-main/src/generation/runDesignGeneration.ts +31 -0
- package/skills/typeui-main/src/generation/runGeneration.ts +36 -0
- package/skills/typeui-main/src/generation/runPull.ts +62 -0
- package/skills/typeui-main/src/io/updateSkillFile.ts +118 -0
- package/skills/typeui-main/src/prompts/designSystem.ts +755 -0
- package/skills/typeui-main/src/prompts/registry.ts +72 -0
- package/skills/typeui-main/src/registry/registryClient.ts +246 -0
- package/skills/typeui-main/src/renderers/claudeRenderer.ts +10 -0
- package/skills/typeui-main/src/renderers/codexRenderer.ts +10 -0
- package/skills/typeui-main/src/renderers/cursorRenderer.ts +10 -0
- package/skills/typeui-main/src/renderers/index.ts +14 -0
- package/skills/typeui-main/src/renderers/openCodeRenderer.ts +10 -0
- package/skills/typeui-main/src/renderers/shared.ts +252 -0
- package/skills/typeui-main/src/skillMetadata.ts +19 -0
- package/skills/typeui-main/src/types.ts +204 -0
- package/skills/typeui-main/src/ui/banner.ts +20 -0
- package/skills/typeui-main/test/existingDesignSystem.test.ts +67 -0
- package/skills/typeui-main/test/orchestrator.test.ts +113 -0
- package/skills/typeui-main/test/randomDesignSystem.test.ts +20 -0
- package/skills/typeui-main/test/registryClient.test.ts +408 -0
- package/skills/typeui-main/test/renderers.test.ts +41 -0
- package/skills/typeui-main/test/runDesignGeneration.test.ts +52 -0
- package/skills/typeui-main/test/runPull.test.ts +92 -0
- package/skills/typeui-main/test/skillMetadata.test.ts +11 -0
- package/skills/typeui-main/test/updateSkillFile.test.ts +160 -0
- package/skills/typeui-main/tsconfig.json +16 -0
- package/skills/ui-demo/SKILL.md +465 -0
- package/skills/ui-to-vue/SKILL.md +134 -0
- package/skills/ui-ux-pro-max/.claude/skills/banner-design/SKILL.md +192 -0
- package/skills/ui-ux-pro-max/.claude/skills/banner-design/references/banner-sizes-and-styles.md +118 -0
- package/skills/ui-ux-pro-max/.claude/skills/brand/SKILL.md +97 -0
- package/skills/ui-ux-pro-max/.claude/skills/brand/references/approval-checklist.md +169 -0
- package/skills/ui-ux-pro-max/.claude/skills/brand/references/asset-organization.md +157 -0
- package/skills/ui-ux-pro-max/.claude/skills/brand/references/brand-guideline-template.md +140 -0
- package/skills/ui-ux-pro-max/.claude/skills/brand/references/color-palette-management.md +186 -0
- package/skills/ui-ux-pro-max/.claude/skills/brand/references/consistency-checklist.md +94 -0
- package/skills/ui-ux-pro-max/.claude/skills/brand/references/logo-usage-rules.md +185 -0
- package/skills/ui-ux-pro-max/.claude/skills/brand/references/messaging-framework.md +85 -0
- package/skills/ui-ux-pro-max/.claude/skills/brand/references/typography-specifications.md +214 -0
- package/skills/ui-ux-pro-max/.claude/skills/brand/references/update.md +118 -0
- package/skills/ui-ux-pro-max/.claude/skills/brand/references/visual-identity.md +96 -0
- package/skills/ui-ux-pro-max/.claude/skills/brand/references/voice-framework.md +88 -0
- package/skills/ui-ux-pro-max/.claude/skills/brand/scripts/extract-colors.cjs +341 -0
- package/skills/ui-ux-pro-max/.claude/skills/brand/scripts/inject-brand-context.cjs +349 -0
- package/skills/ui-ux-pro-max/.claude/skills/brand/scripts/sync-brand-to-tokens.cjs +266 -0
- package/skills/ui-ux-pro-max/.claude/skills/brand/scripts/validate-asset.cjs +387 -0
- package/skills/ui-ux-pro-max/.claude/skills/brand/templates/brand-guidelines-starter.md +275 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/SKILL.md +302 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/data/cip/deliverables.csv +51 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/data/cip/industries.csv +21 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/data/cip/mockup-contexts.csv +21 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/data/cip/styles.csv +21 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/data/icon/styles.csv +16 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/data/logo/colors.csv +56 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/data/logo/industries.csv +56 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/data/logo/styles.csv +56 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/banner-sizes-and-styles.md +118 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/cip-deliverable-guide.md +95 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/cip-design.md +121 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/cip-prompt-engineering.md +84 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/cip-style-guide.md +68 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/design-routing.md +207 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/icon-design.md +122 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/logo-color-psychology.md +101 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/logo-design.md +92 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/logo-prompt-engineering.md +158 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/logo-style-guide.md +109 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/slides-copywriting-formulas.md +84 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/slides-create.md +4 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/slides-html-template.md +295 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/slides-layout-patterns.md +137 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/slides-strategies.md +94 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/slides.md +42 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/references/social-photos-design.md +329 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/scripts/cip/core.py +215 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/scripts/cip/generate.py +484 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/scripts/cip/render-html.py +424 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/scripts/cip/search.py +127 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/scripts/icon/generate.py +487 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/scripts/logo/core.py +175 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/scripts/logo/generate.py +362 -0
- package/skills/ui-ux-pro-max/.claude/skills/design/scripts/logo/search.py +114 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/SKILL.md +244 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/data/slide-backgrounds.csv +11 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/data/slide-charts.csv +26 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/data/slide-color-logic.csv +14 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/data/slide-copy.csv +26 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/data/slide-layout-logic.csv +16 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/data/slide-layouts.csv +26 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/data/slide-strategies.csv +16 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/data/slide-typography.csv +15 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/references/component-specs.md +236 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/references/component-tokens.md +214 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/references/primitive-tokens.md +203 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/references/semantic-tokens.md +215 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/references/states-and-variants.md +241 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/references/tailwind-integration.md +251 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/references/token-architecture.md +224 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/scripts/embed-tokens.cjs +99 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/scripts/fetch-background.py +317 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/scripts/generate-slide.py +753 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/scripts/generate-tokens.cjs +205 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/scripts/html-token-validator.py +327 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/scripts/search-slides.py +218 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/scripts/slide-token-validator.py +35 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/scripts/slide_search_core.py +453 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/scripts/validate-tokens.cjs +251 -0
- package/skills/ui-ux-pro-max/.claude/skills/design-system/templates/design-tokens-starter.json +143 -0
- package/skills/ui-ux-pro-max/.claude/skills/slides/SKILL.md +42 -0
- package/skills/ui-ux-pro-max/.claude/skills/slides/references/copywriting-formulas.md +84 -0
- package/skills/ui-ux-pro-max/.claude/skills/slides/references/create.md +4 -0
- package/skills/ui-ux-pro-max/.claude/skills/slides/references/html-template.md +295 -0
- package/skills/ui-ux-pro-max/.claude/skills/slides/references/layout-patterns.md +137 -0
- package/skills/ui-ux-pro-max/.claude/skills/slides/references/slide-strategies.md +94 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/LICENSE.txt +202 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/SKILL.md +324 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/DMMono-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Gloock-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Italiana-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Jura-Light.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Jura-Medium.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Jura-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Lora-Bold.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Lora-Italic.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Lora-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Lora-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Outfit-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Tektur-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/references/canvas-design-system.md +320 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/references/shadcn-accessibility.md +471 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/references/shadcn-components.md +424 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/references/shadcn-theming.md +373 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/references/tailwind-customization.md +483 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/references/tailwind-responsive.md +382 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/references/tailwind-utilities.md +455 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/scripts/.coverage +0 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/scripts/requirements.txt +17 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/scripts/shadcn_add.py +292 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/scripts/tailwind_config_gen.py +456 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/scripts/tests/coverage-ui.json +1 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/scripts/tests/requirements.txt +3 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/scripts/tests/test_shadcn_add.py +266 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-styling/scripts/tests/test_tailwind_config_gen.py +336 -0
- package/skills/ui-ux-pro-max/.claude/skills/ui-ux-pro-max/SKILL.md +659 -0
- package/skills/ui-ux-pro-max/.claude-plugin/marketplace.json +35 -0
- package/skills/ui-ux-pro-max/.claude-plugin/plugin.json +11 -0
- package/skills/ui-ux-pro-max/.github/workflows/claude-code-review.yml +44 -0
- package/skills/ui-ux-pro-max/.github/workflows/claude.yml +50 -0
- package/skills/ui-ux-pro-max/.github/workflows/python-package-conda.yml +34 -0
- package/skills/ui-ux-pro-max/CLAUDE.md +98 -0
- package/skills/ui-ux-pro-max/LICENSE +21 -0
- package/skills/ui-ux-pro-max/README.md +513 -0
- package/skills/ui-ux-pro-max/SKILL.md +292 -0
- package/skills/ui-ux-pro-max/cli/README.md +63 -0
- package/skills/ui-ux-pro-max/cli/assets/data/_sync_all.py +414 -0
- package/skills/ui-ux-pro-max/cli/assets/data/app-interface.csv +31 -0
- package/skills/ui-ux-pro-max/cli/assets/data/charts.csv +26 -0
- package/skills/ui-ux-pro-max/cli/assets/data/colors.csv +162 -0
- package/skills/ui-ux-pro-max/cli/assets/data/design.csv +1776 -0
- package/skills/ui-ux-pro-max/cli/assets/data/draft.csv +1779 -0
- package/skills/ui-ux-pro-max/cli/assets/data/google-fonts.csv +1924 -0
- package/skills/ui-ux-pro-max/cli/assets/data/icons.csv +105 -0
- package/skills/ui-ux-pro-max/cli/assets/data/landing.csv +31 -0
- package/skills/ui-ux-pro-max/cli/assets/data/products.csv +162 -0
- package/skills/ui-ux-pro-max/cli/assets/data/react-performance.csv +45 -0
- package/skills/ui-ux-pro-max/cli/assets/data/stacks/angular.csv +51 -0
- package/skills/ui-ux-pro-max/cli/assets/data/stacks/astro.csv +54 -0
- package/skills/ui-ux-pro-max/cli/assets/data/stacks/flutter.csv +53 -0
- package/skills/ui-ux-pro-max/cli/assets/data/stacks/html-tailwind.csv +56 -0
- package/skills/ui-ux-pro-max/cli/assets/data/stacks/jetpack-compose.csv +53 -0
- package/skills/ui-ux-pro-max/cli/assets/data/stacks/laravel.csv +51 -0
- package/skills/ui-ux-pro-max/cli/assets/data/stacks/nextjs.csv +53 -0
- package/skills/ui-ux-pro-max/cli/assets/data/stacks/nuxt-ui.csv +51 -0
- package/skills/ui-ux-pro-max/cli/assets/data/stacks/nuxtjs.csv +59 -0
- package/skills/ui-ux-pro-max/cli/assets/data/stacks/react-native.csv +52 -0
- package/skills/ui-ux-pro-max/cli/assets/data/stacks/react.csv +54 -0
- package/skills/ui-ux-pro-max/cli/assets/data/stacks/shadcn.csv +61 -0
- package/skills/ui-ux-pro-max/cli/assets/data/stacks/svelte.csv +54 -0
- package/skills/ui-ux-pro-max/cli/assets/data/stacks/swiftui.csv +51 -0
- package/skills/ui-ux-pro-max/cli/assets/data/stacks/threejs.csv +54 -0
- package/skills/ui-ux-pro-max/cli/assets/data/stacks/vue.csv +50 -0
- package/skills/ui-ux-pro-max/cli/assets/data/styles.csv +85 -0
- package/skills/ui-ux-pro-max/cli/assets/data/typography.csv +74 -0
- package/skills/ui-ux-pro-max/cli/assets/data/ui-reasoning.csv +162 -0
- package/skills/ui-ux-pro-max/cli/assets/data/ux-guidelines.csv +100 -0
- package/skills/ui-ux-pro-max/cli/assets/scripts/core.py +247 -0
- package/skills/ui-ux-pro-max/cli/assets/scripts/design_system.py +1148 -0
- package/skills/ui-ux-pro-max/cli/assets/scripts/search.py +114 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/base/quick-reference.md +297 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/base/skill-content.md +353 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/agent.json +21 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/augment.json +18 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/claude.json +21 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/codebuddy.json +21 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/codex.json +21 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/continue.json +21 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/copilot.json +21 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/cursor.json +21 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/droid.json +21 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/gemini.json +21 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/kilocode.json +21 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/kiro.json +21 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/opencode.json +21 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/qoder.json +21 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/roocode.json +21 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/trae.json +21 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/warp.json +18 -0
- package/skills/ui-ux-pro-max/cli/assets/templates/platforms/windsurf.json +21 -0
- package/skills/ui-ux-pro-max/cli/bun.lock +77 -0
- package/skills/ui-ux-pro-max/cli/package-lock.json +370 -0
- package/skills/ui-ux-pro-max/cli/package.json +48 -0
- package/skills/ui-ux-pro-max/cli/src/commands/init.ts +216 -0
- package/skills/ui-ux-pro-max/cli/src/commands/uninstall.ts +135 -0
- package/skills/ui-ux-pro-max/cli/src/commands/update.ts +36 -0
- package/skills/ui-ux-pro-max/cli/src/commands/versions.ts +42 -0
- package/skills/ui-ux-pro-max/cli/src/index.ts +83 -0
- package/skills/ui-ux-pro-max/cli/src/types/index.ts +68 -0
- package/skills/ui-ux-pro-max/cli/src/utils/detect.ts +120 -0
- package/skills/ui-ux-pro-max/cli/src/utils/extract.ts +149 -0
- package/skills/ui-ux-pro-max/cli/src/utils/github.ts +104 -0
- package/skills/ui-ux-pro-max/cli/src/utils/logger.ts +11 -0
- package/skills/ui-ux-pro-max/cli/src/utils/template.ts +243 -0
- package/skills/ui-ux-pro-max/cli/tsconfig.json +17 -0
- package/skills/ui-ux-pro-max/data/charts.csv +26 -0
- package/skills/ui-ux-pro-max/data/colors.csv +97 -0
- package/skills/ui-ux-pro-max/data/icons.csv +101 -0
- package/skills/ui-ux-pro-max/data/landing.csv +31 -0
- package/skills/ui-ux-pro-max/data/products.csv +97 -0
- package/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/skills/ui-ux-pro-max/data/styles.csv +68 -0
- package/skills/ui-ux-pro-max/data/typography.csv +58 -0
- package/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/skills/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/skills/ui-ux-pro-max/docs//344/270/211/344/270/252 data-scripts-templates /347/232/204/345/214/272/345/210/253.md" +30 -0
- package/skills/ui-ux-pro-max/preview/xiaomaomi-app.html +411 -0
- package/skills/ui-ux-pro-max/screenshots/website.png +0 -0
- package/skills/ui-ux-pro-max/scripts/core.py +253 -0
- package/skills/ui-ux-pro-max/scripts/design_system.py +1067 -0
- package/skills/ui-ux-pro-max/scripts/search.py +114 -0
- package/skills/ui-ux-pro-max/skill.json +41 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/_sync_all.py +414 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/app-interface.csv +31 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/charts.csv +26 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/colors.csv +162 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/design.csv +1776 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/draft.csv +1779 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/google-fonts.csv +1924 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/icons.csv +106 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/landing.csv +35 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/products.csv +162 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/stacks/angular.csv +51 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/stacks/laravel.csv +51 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/stacks/threejs.csv +54 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/styles.csv +85 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/typography.csv +74 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/ui-reasoning.csv +162 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/scripts/core.py +262 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/scripts/design_system.py +1148 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/scripts/search.py +114 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/base/quick-reference.md +297 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/base/skill-content.md +358 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/agent.json +21 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/augment.json +18 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/claude.json +21 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/codebuddy.json +21 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/codex.json +21 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/continue.json +21 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/copilot.json +21 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/cursor.json +21 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/droid.json +21 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/gemini.json +21 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/kilocode.json +21 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/kiro.json +21 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/opencode.json +21 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/qoder.json +21 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/roocode.json +21 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/trae.json +21 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/warp.json +18 -0
- package/skills/ui-ux-pro-max/src/ui-ux-pro-max/templates/platforms/windsurf.json +21 -0
- package/skills/uncloud/SKILL.md +343 -0
- package/skills/upgrading-react-native/SKILL.md +58 -0
- package/skills/using-git-worktrees/SKILL.md +215 -0
- package/skills/vercel/SKILL.md +161 -0
- package/skills/vercel/metadata.json +16 -0
- package/skills/verification-loop/SKILL.md +126 -0
- package/skills/view-transitions-api/SKILL.md +108 -0
- package/skills/vite-patterns/SKILL.md +449 -0
- package/skills/vue3-composition-patterns/SKILL.md +375 -0
- package/skills/waza-habits/SKILL.md +22 -0
- package/skills/webapp-testing/LICENSE.txt +202 -0
- package/skills/webapp-testing/SKILL.md +96 -0
- package/skills/webapp-testing/examples/console_logging.py +35 -0
- package/skills/webapp-testing/examples/element_discovery.py +40 -0
- package/skills/webapp-testing/examples/static_html_automation.py +33 -0
- package/skills/webapp-testing/scripts/with_server.py +106 -0
- package/src/orchestrator/builder.ts +234 -0
- package/src/orchestrator/executor.ts +386 -0
- package/src/orchestrator/index.ts +535 -0
- package/src/orchestrator/loader.ts +237 -0
- package/src/orchestrator/registry.ts +211 -0
- package/src/orchestrator/schema.ts +141 -0
- package/src/orchestrator/session.ts +128 -0
- package/src/orchestrator/types.ts +109 -0
- package/tsconfig.json +21 -0
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
"""Community detection on NetworkX graphs. Uses Leiden (graspologic) if available, falls back to Louvain (networkx). Splits oversized communities. Returns cohesion scores."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
import contextlib
|
|
4
|
+
import inspect
|
|
5
|
+
import io
|
|
6
|
+
import json
|
|
7
|
+
import sys
|
|
8
|
+
import networkx as nx
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def _suppress_output():
|
|
12
|
+
"""Context manager to suppress stdout/stderr during library calls.
|
|
13
|
+
|
|
14
|
+
graspologic's leiden() emits ANSI escape sequences (progress bars,
|
|
15
|
+
colored warnings) that corrupt PowerShell 5.1's scroll buffer on
|
|
16
|
+
Windows (see issue #19). Redirecting stdout/stderr to devnull during
|
|
17
|
+
the call prevents this without losing any graphify output.
|
|
18
|
+
"""
|
|
19
|
+
return contextlib.redirect_stdout(io.StringIO())
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _partition(G: nx.Graph, resolution: float = 1.0) -> dict[str, int]:
|
|
23
|
+
"""Run community detection. Returns {node_id: community_id}.
|
|
24
|
+
|
|
25
|
+
Tries Leiden (graspologic) first — best quality.
|
|
26
|
+
Falls back to Louvain (built into networkx) if graspologic is not installed.
|
|
27
|
+
|
|
28
|
+
resolution > 1.0 → more, smaller communities.
|
|
29
|
+
resolution < 1.0 → fewer, larger communities.
|
|
30
|
+
|
|
31
|
+
Output from graspologic is suppressed to prevent ANSI escape codes
|
|
32
|
+
from corrupting terminal scroll buffers on Windows PowerShell 5.1.
|
|
33
|
+
"""
|
|
34
|
+
stable = nx.Graph()
|
|
35
|
+
stable.add_nodes_from(sorted(G.nodes(), key=str))
|
|
36
|
+
edge_rows = sorted(
|
|
37
|
+
G.edges(data=True),
|
|
38
|
+
key=lambda row: (
|
|
39
|
+
str(row[0]),
|
|
40
|
+
str(row[1]),
|
|
41
|
+
json.dumps(row[2], sort_keys=True, ensure_ascii=False, default=str),
|
|
42
|
+
),
|
|
43
|
+
)
|
|
44
|
+
for src, tgt, attrs in edge_rows:
|
|
45
|
+
stable.add_edge(src, tgt, **attrs)
|
|
46
|
+
|
|
47
|
+
try:
|
|
48
|
+
from graspologic.partition import leiden
|
|
49
|
+
lsig = inspect.signature(leiden).parameters
|
|
50
|
+
kwargs: dict = {}
|
|
51
|
+
if "random_seed" in lsig:
|
|
52
|
+
kwargs["random_seed"] = 42
|
|
53
|
+
if "trials" in lsig:
|
|
54
|
+
kwargs["trials"] = 1
|
|
55
|
+
if "resolution" in lsig:
|
|
56
|
+
kwargs["resolution"] = resolution
|
|
57
|
+
# Suppress graspologic output to prevent ANSI escape codes from
|
|
58
|
+
# corrupting PowerShell 5.1 scroll buffer (issue #19)
|
|
59
|
+
old_stderr = sys.stderr
|
|
60
|
+
try:
|
|
61
|
+
sys.stderr = io.StringIO()
|
|
62
|
+
with _suppress_output():
|
|
63
|
+
result = leiden(stable, **kwargs)
|
|
64
|
+
finally:
|
|
65
|
+
sys.stderr = old_stderr
|
|
66
|
+
return result
|
|
67
|
+
except ImportError:
|
|
68
|
+
pass
|
|
69
|
+
|
|
70
|
+
# Fallback: networkx louvain (available since networkx 2.7).
|
|
71
|
+
# Inspect kwargs to stay compatible across NetworkX versions — max_level
|
|
72
|
+
# was added in a later release and prevents hangs on large sparse graphs.
|
|
73
|
+
kwargs: dict = {"seed": 42, "threshold": 1e-4, "resolution": resolution}
|
|
74
|
+
if "max_level" in inspect.signature(nx.community.louvain_communities).parameters:
|
|
75
|
+
kwargs["max_level"] = 10
|
|
76
|
+
communities = nx.community.louvain_communities(stable, **kwargs)
|
|
77
|
+
return {node: cid for cid, nodes in enumerate(communities) for node in nodes}
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
_MAX_COMMUNITY_FRACTION = 0.25 # communities larger than 25% of graph get split
|
|
81
|
+
_MIN_SPLIT_SIZE = 10 # only split if community has at least this many nodes
|
|
82
|
+
_COHESION_SPLIT_THRESHOLD = 0.05 # re-split communities with cohesion below this
|
|
83
|
+
_COHESION_SPLIT_MIN_SIZE = 50 # only cohesion-split if community has at least this many nodes
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def cluster(
|
|
87
|
+
G: nx.Graph,
|
|
88
|
+
resolution: float = 1.0,
|
|
89
|
+
exclude_hubs_percentile: float | None = None,
|
|
90
|
+
) -> dict[int, list[str]]:
|
|
91
|
+
"""Run Leiden community detection. Returns {community_id: [node_ids]}.
|
|
92
|
+
|
|
93
|
+
Community IDs are stable across runs: 0 = largest community after splitting.
|
|
94
|
+
Oversized communities (> 25% of graph nodes, min 10) are split by running
|
|
95
|
+
a second Leiden pass on the subgraph.
|
|
96
|
+
|
|
97
|
+
Accepts directed or undirected graphs. DiGraphs are converted to undirected
|
|
98
|
+
internally since Louvain/Leiden require undirected input.
|
|
99
|
+
|
|
100
|
+
resolution: passed to Leiden/Louvain. >1.0 = more smaller communities,
|
|
101
|
+
<1.0 = fewer larger communities. Default 1.0.
|
|
102
|
+
exclude_hubs_percentile: if set (0-100), nodes whose degree exceeds this
|
|
103
|
+
percentile are excluded from partitioning and reattached to their
|
|
104
|
+
majority-vote neighbour community afterwards. Useful for staging/utility
|
|
105
|
+
super-hubs that inflate god-node rankings (#919).
|
|
106
|
+
"""
|
|
107
|
+
if G.number_of_nodes() == 0:
|
|
108
|
+
return {}
|
|
109
|
+
if G.is_directed():
|
|
110
|
+
G = G.to_undirected()
|
|
111
|
+
if G.number_of_edges() == 0:
|
|
112
|
+
return {i: [n] for i, n in enumerate(sorted(G.nodes))}
|
|
113
|
+
|
|
114
|
+
# Compute hub exclusion set before removing anything so degree is based on full graph
|
|
115
|
+
hub_nodes: set[str] = set()
|
|
116
|
+
if exclude_hubs_percentile is not None:
|
|
117
|
+
degrees = sorted(d for _, d in G.degree())
|
|
118
|
+
if degrees:
|
|
119
|
+
idx = max(0, int(len(degrees) * exclude_hubs_percentile / 100) - 1)
|
|
120
|
+
threshold = degrees[idx]
|
|
121
|
+
hub_nodes = {n for n, d in G.degree() if d > threshold}
|
|
122
|
+
|
|
123
|
+
# Leiden warns and drops isolates - handle them separately
|
|
124
|
+
# Also exclude hub nodes from partitioning so they don't pull unrelated
|
|
125
|
+
# subsystems into the same community
|
|
126
|
+
excluded = hub_nodes
|
|
127
|
+
isolates = [n for n in G.nodes() if G.degree(n) == 0 and n not in excluded]
|
|
128
|
+
connected_nodes = [n for n in G.nodes() if G.degree(n) > 0 and n not in excluded]
|
|
129
|
+
connected = G.subgraph(connected_nodes)
|
|
130
|
+
|
|
131
|
+
raw: dict[int, list[str]] = {}
|
|
132
|
+
if connected.number_of_nodes() > 0:
|
|
133
|
+
partition = _partition(connected, resolution=resolution)
|
|
134
|
+
for node, cid in partition.items():
|
|
135
|
+
raw.setdefault(cid, []).append(node)
|
|
136
|
+
|
|
137
|
+
# Each isolate becomes its own single-node community
|
|
138
|
+
next_cid = max(raw.keys(), default=-1) + 1
|
|
139
|
+
for node in isolates:
|
|
140
|
+
raw[next_cid] = [node]
|
|
141
|
+
next_cid += 1
|
|
142
|
+
|
|
143
|
+
# Reattach excluded hubs by majority-vote neighbour community
|
|
144
|
+
if hub_nodes:
|
|
145
|
+
node_community: dict[str, int] = {n: cid for cid, nodes in raw.items() for n in nodes}
|
|
146
|
+
for hub in sorted(hub_nodes):
|
|
147
|
+
votes: dict[int, int] = {}
|
|
148
|
+
for nb in G.neighbors(hub):
|
|
149
|
+
cid = node_community.get(nb)
|
|
150
|
+
if cid is not None:
|
|
151
|
+
votes[cid] = votes.get(cid, 0) + 1
|
|
152
|
+
if votes:
|
|
153
|
+
best = min(votes, key=lambda c: (-votes[c], c))
|
|
154
|
+
raw.setdefault(best, []).append(hub)
|
|
155
|
+
node_community[hub] = best
|
|
156
|
+
else:
|
|
157
|
+
raw[next_cid] = [hub]
|
|
158
|
+
node_community[hub] = next_cid
|
|
159
|
+
next_cid += 1
|
|
160
|
+
|
|
161
|
+
# Split oversized communities
|
|
162
|
+
max_size = max(_MIN_SPLIT_SIZE, int(G.number_of_nodes() * _MAX_COMMUNITY_FRACTION))
|
|
163
|
+
final_communities: list[list[str]] = []
|
|
164
|
+
for nodes in raw.values():
|
|
165
|
+
if len(nodes) > max_size:
|
|
166
|
+
final_communities.extend(_split_community(G, nodes))
|
|
167
|
+
else:
|
|
168
|
+
final_communities.append(nodes)
|
|
169
|
+
|
|
170
|
+
# Second pass: re-split low-cohesion communities caused by doc-hub nodes
|
|
171
|
+
# that bridge otherwise-unrelated subsystems (e.g. CLAUDE.md connected to everything).
|
|
172
|
+
second_pass: list[list[str]] = []
|
|
173
|
+
for nodes in final_communities:
|
|
174
|
+
if len(nodes) >= _COHESION_SPLIT_MIN_SIZE and cohesion_score(G, nodes) < _COHESION_SPLIT_THRESHOLD:
|
|
175
|
+
splits = _split_community(G, nodes)
|
|
176
|
+
second_pass.extend(splits if len(splits) > 1 else [nodes])
|
|
177
|
+
else:
|
|
178
|
+
second_pass.append(nodes)
|
|
179
|
+
final_communities = second_pass
|
|
180
|
+
|
|
181
|
+
# Re-index by size descending for deterministic ordering
|
|
182
|
+
final_communities.sort(key=len, reverse=True)
|
|
183
|
+
return {i: sorted(nodes) for i, nodes in enumerate(final_communities)}
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def _split_community(G: nx.Graph, nodes: list[str]) -> list[list[str]]:
|
|
187
|
+
"""Run a second Leiden pass on a community subgraph to split it further."""
|
|
188
|
+
subgraph = G.subgraph(nodes)
|
|
189
|
+
if subgraph.number_of_edges() == 0:
|
|
190
|
+
# No edges - split into individual nodes
|
|
191
|
+
return [[n] for n in sorted(nodes)]
|
|
192
|
+
try:
|
|
193
|
+
sub_partition = _partition(subgraph)
|
|
194
|
+
sub_communities: dict[int, list[str]] = {}
|
|
195
|
+
for node, cid in sub_partition.items():
|
|
196
|
+
sub_communities.setdefault(cid, []).append(node)
|
|
197
|
+
if len(sub_communities) <= 1:
|
|
198
|
+
return [sorted(nodes)]
|
|
199
|
+
return [sorted(v) for v in sub_communities.values()]
|
|
200
|
+
except Exception:
|
|
201
|
+
return [sorted(nodes)]
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
def cohesion_score(G: nx.Graph, community_nodes: list[str]) -> float:
|
|
205
|
+
"""Ratio of actual intra-community edges to maximum possible."""
|
|
206
|
+
n = len(community_nodes)
|
|
207
|
+
if n <= 1:
|
|
208
|
+
return 1.0
|
|
209
|
+
subgraph = G.subgraph(community_nodes)
|
|
210
|
+
actual = subgraph.number_of_edges()
|
|
211
|
+
possible = n * (n - 1) / 2
|
|
212
|
+
return actual / possible if possible > 0 else 0.0
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def score_all(G: nx.Graph, communities: dict[int, list[str]]) -> dict[int, float]:
|
|
216
|
+
return {cid: cohesion_score(G, nodes) for cid, nodes in communities.items()}
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def remap_communities_to_previous(
|
|
220
|
+
communities: dict[int, list[str]],
|
|
221
|
+
previous_node_community: dict[str, int],
|
|
222
|
+
) -> dict[int, list[str]]:
|
|
223
|
+
"""Remap community IDs to maximize overlap with a previous assignment.
|
|
224
|
+
|
|
225
|
+
Uses greedy one-to-one matching by intersection size, then assigns fresh IDs
|
|
226
|
+
to unmatched communities in deterministic order (size desc, lexical tie-break).
|
|
227
|
+
"""
|
|
228
|
+
if not communities:
|
|
229
|
+
return {}
|
|
230
|
+
|
|
231
|
+
new_sets = {cid: set(nodes) for cid, nodes in communities.items()}
|
|
232
|
+
old_sets: dict[int, set[str]] = {}
|
|
233
|
+
for node, old_cid in previous_node_community.items():
|
|
234
|
+
old_sets.setdefault(old_cid, set()).add(node)
|
|
235
|
+
|
|
236
|
+
overlaps: list[tuple[int, int, int]] = []
|
|
237
|
+
for old_cid, old_nodes in old_sets.items():
|
|
238
|
+
for new_cid, new_nodes in new_sets.items():
|
|
239
|
+
overlap = len(old_nodes & new_nodes)
|
|
240
|
+
if overlap > 0:
|
|
241
|
+
overlaps.append((overlap, old_cid, new_cid))
|
|
242
|
+
overlaps.sort(key=lambda x: (-x[0], x[1], x[2]))
|
|
243
|
+
|
|
244
|
+
new_to_final: dict[int, int] = {}
|
|
245
|
+
used_old_ids: set[int] = set()
|
|
246
|
+
matched_new_ids: set[int] = set()
|
|
247
|
+
for _overlap, old_cid, new_cid in overlaps:
|
|
248
|
+
if old_cid in used_old_ids or new_cid in matched_new_ids:
|
|
249
|
+
continue
|
|
250
|
+
new_to_final[new_cid] = old_cid
|
|
251
|
+
used_old_ids.add(old_cid)
|
|
252
|
+
matched_new_ids.add(new_cid)
|
|
253
|
+
|
|
254
|
+
unmatched = [cid for cid in communities if cid not in matched_new_ids]
|
|
255
|
+
unmatched.sort(key=lambda cid: (-len(communities[cid]), tuple(sorted(communities[cid]))))
|
|
256
|
+
next_id = 0
|
|
257
|
+
for new_cid in unmatched:
|
|
258
|
+
while next_id in used_old_ids:
|
|
259
|
+
next_id += 1
|
|
260
|
+
new_to_final[new_cid] = next_id
|
|
261
|
+
used_old_ids.add(next_id)
|
|
262
|
+
next_id += 1
|
|
263
|
+
|
|
264
|
+
remapped: dict[int, list[str]] = {}
|
|
265
|
+
for new_cid, nodes in communities.items():
|
|
266
|
+
remapped[new_to_final[new_cid]] = sorted(nodes)
|
|
267
|
+
return dict(sorted(remapped.items(), key=lambda kv: kv[0]))
|
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
"""Entity deduplication pipeline for graphify knowledge graphs.
|
|
2
|
+
|
|
3
|
+
Pipeline: exact normalization → entropy gate → MinHash/LSH blocking →
|
|
4
|
+
Jaro-Winkler verification → same-community boost → union-find merge.
|
|
5
|
+
"""
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
import math
|
|
8
|
+
import re
|
|
9
|
+
from collections import defaultdict
|
|
10
|
+
|
|
11
|
+
from datasketch import MinHash, MinHashLSH
|
|
12
|
+
from rapidfuzz.distance import JaroWinkler
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
# ── helpers ───────────────────────────────────────────────────────────────────
|
|
16
|
+
|
|
17
|
+
def _norm(label: str) -> str:
|
|
18
|
+
"""Lowercase + collapse non-alphanumeric runs to space."""
|
|
19
|
+
return re.sub(r"[^a-z0-9]+", " ", label.lower()).strip()
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _entropy(label: str) -> float:
|
|
23
|
+
"""Shannon entropy in bits/char of the normalised label."""
|
|
24
|
+
s = _norm(label)
|
|
25
|
+
if not s:
|
|
26
|
+
return 0.0
|
|
27
|
+
freq: dict[str, int] = defaultdict(int)
|
|
28
|
+
for ch in s:
|
|
29
|
+
freq[ch] += 1
|
|
30
|
+
n = len(s)
|
|
31
|
+
return -sum((c / n) * math.log2(c / n) for c in freq.values())
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def _shingles(text: str, k: int = 3) -> set[str]:
|
|
35
|
+
"""Return k-gram character shingles of text."""
|
|
36
|
+
if len(text) < k:
|
|
37
|
+
return {text}
|
|
38
|
+
return {text[i : i + k] for i in range(len(text) - k + 1)}
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _make_minhash(text: str, num_perm: int = 128) -> MinHash:
|
|
42
|
+
# Strip spaces so "graph extractor" and "graphextractor" share shingles
|
|
43
|
+
m = MinHash(num_perm=num_perm)
|
|
44
|
+
for shingle in _shingles(text.replace(" ", "")):
|
|
45
|
+
m.update(shingle.encode("utf-8"))
|
|
46
|
+
return m
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
# Matches labels whose trailing token is a version/variant suffix:
|
|
50
|
+
# digits optionally followed by letters (chip SKUs: ASR1603, M1, Cortex-A55)
|
|
51
|
+
# or 2+ letters (codename revisions: cranelr vs cranel).
|
|
52
|
+
# Requires the stem to end in a letter so plain words don't accidentally match.
|
|
53
|
+
_VARIANT_SUFFIX = re.compile(r"^(.*[a-z])([0-9]+[a-z]*|[a-z]{2,})$")
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _is_variant_pair(a: str, b: str) -> bool:
|
|
57
|
+
"""True if a and b are sibling model/SKU variants (same stem, different suffix).
|
|
58
|
+
|
|
59
|
+
Only applied to short labels (< 12 chars); long labels go through JW normally.
|
|
60
|
+
"""
|
|
61
|
+
if a == b:
|
|
62
|
+
return False
|
|
63
|
+
if max(len(a), len(b)) >= 12:
|
|
64
|
+
return False
|
|
65
|
+
ma, mb = _VARIANT_SUFFIX.match(a), _VARIANT_SUFFIX.match(b)
|
|
66
|
+
if not (ma and mb):
|
|
67
|
+
return False
|
|
68
|
+
return ma.group(1) == mb.group(1) and ma.group(2) != mb.group(2)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _short_label_blocked(a: str, b: str, jw_score: float) -> bool:
|
|
72
|
+
"""Block fuzzy merge for short labels unless it's a same-length single-char substitution.
|
|
73
|
+
|
|
74
|
+
Insertions/deletions on short strings (cranel/cranelr, M1/M1 Pro) produce
|
|
75
|
+
high Jaro-Winkler scores due to the prefix bonus but are almost never true
|
|
76
|
+
duplicates — they're abbreviations or variants.
|
|
77
|
+
"""
|
|
78
|
+
if max(len(a), len(b)) >= 12:
|
|
79
|
+
return False
|
|
80
|
+
from rapidfuzz.distance import DamerauLevenshtein
|
|
81
|
+
# Allow only same-length single-char substitutions (true typos like "Extractor"/"Extractar").
|
|
82
|
+
# Block length-differing pairs regardless of score.
|
|
83
|
+
if jw_score >= 97.0 and len(a) == len(b) and DamerauLevenshtein.distance(a, b) <= 1:
|
|
84
|
+
return False
|
|
85
|
+
return True
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
# ── union-find ────────────────────────────────────────────────────────────────
|
|
89
|
+
|
|
90
|
+
class _UF:
|
|
91
|
+
def __init__(self) -> None:
|
|
92
|
+
self._parent: dict[str, str] = {}
|
|
93
|
+
|
|
94
|
+
def find(self, x: str) -> str:
|
|
95
|
+
self._parent.setdefault(x, x)
|
|
96
|
+
while self._parent[x] != x:
|
|
97
|
+
self._parent[x] = self._parent[self._parent[x]]
|
|
98
|
+
x = self._parent[x]
|
|
99
|
+
return x
|
|
100
|
+
|
|
101
|
+
def union(self, x: str, y: str) -> None:
|
|
102
|
+
self._parent.setdefault(x, x)
|
|
103
|
+
self._parent.setdefault(y, y)
|
|
104
|
+
rx, ry = self.find(x), self.find(y)
|
|
105
|
+
if rx != ry:
|
|
106
|
+
self._parent[ry] = rx
|
|
107
|
+
|
|
108
|
+
def components(self) -> dict[str, list[str]]:
|
|
109
|
+
groups: dict[str, list[str]] = defaultdict(list)
|
|
110
|
+
for x in self._parent:
|
|
111
|
+
groups[self.find(x)].append(x)
|
|
112
|
+
return dict(groups)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
# ── constants ─────────────────────────────────────────────────────────────────
|
|
116
|
+
|
|
117
|
+
_ENTROPY_THRESHOLD = 2.5
|
|
118
|
+
_LSH_THRESHOLD = 0.7
|
|
119
|
+
_MERGE_THRESHOLD = 92.0 # rapidfuzz normalized_similarity * 100
|
|
120
|
+
_COMMUNITY_BOOST = 5.0 # score bonus when both nodes share community
|
|
121
|
+
_NUM_PERM = 128
|
|
122
|
+
_CHUNK_SUFFIX = re.compile(r"_c\d+$")
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
# ── main entry point ──────────────────────────────────────────────────────────
|
|
126
|
+
|
|
127
|
+
def deduplicate_entities(
|
|
128
|
+
nodes: list[dict],
|
|
129
|
+
edges: list[dict],
|
|
130
|
+
*,
|
|
131
|
+
communities: dict[str, int],
|
|
132
|
+
dedup_llm_backend: str | None = None,
|
|
133
|
+
) -> tuple[list[dict], list[dict]]:
|
|
134
|
+
"""Deduplicate near-identical entities in a knowledge graph.
|
|
135
|
+
|
|
136
|
+
Args:
|
|
137
|
+
nodes: list of node dicts with at minimum {"id": str, "label": str}
|
|
138
|
+
edges: list of edge dicts with {"source": str, "target": str, ...}
|
|
139
|
+
communities: mapping of node_id -> community_id (from cluster())
|
|
140
|
+
dedup_llm_backend: if set, use LLM to resolve ambiguous pairs
|
|
141
|
+
|
|
142
|
+
Returns:
|
|
143
|
+
(deduped_nodes, deduped_edges) with edges rewired to survivors
|
|
144
|
+
"""
|
|
145
|
+
# Guard: cross-project dedup is not supported — nodes from different repos
|
|
146
|
+
# share label names by coincidence and must never be merged by string similarity.
|
|
147
|
+
# If you need to dedup a global graph, run deduplicate_entities per-repo first.
|
|
148
|
+
repos_seen = {n.get("repo") for n in nodes if n.get("repo")}
|
|
149
|
+
if len(repos_seen) > 1:
|
|
150
|
+
raise ValueError(
|
|
151
|
+
f"deduplicate_entities: nodes span multiple repos {sorted(repos_seen)!r}. "
|
|
152
|
+
f"Cross-project dedup is disabled — run dedup per-repo before merging."
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
if len(nodes) <= 1:
|
|
156
|
+
return nodes, edges
|
|
157
|
+
|
|
158
|
+
# Pre-deduplicate: keep first occurrence of each id
|
|
159
|
+
seen_ids: dict[str, dict] = {}
|
|
160
|
+
for node in nodes:
|
|
161
|
+
nid = node.get("id", "")
|
|
162
|
+
if nid and nid not in seen_ids:
|
|
163
|
+
seen_ids[nid] = node
|
|
164
|
+
unique_nodes = list(seen_ids.values())
|
|
165
|
+
|
|
166
|
+
if len(unique_nodes) <= 1:
|
|
167
|
+
return unique_nodes, edges
|
|
168
|
+
|
|
169
|
+
# ── pass 1: exact normalization ───────────────────────────────────────────
|
|
170
|
+
norm_to_nodes: dict[str, list[dict]] = defaultdict(list)
|
|
171
|
+
for node in unique_nodes:
|
|
172
|
+
key = _norm(node.get("label", node.get("id", "")))
|
|
173
|
+
if key:
|
|
174
|
+
norm_to_nodes[key].append(node)
|
|
175
|
+
|
|
176
|
+
uf = _UF()
|
|
177
|
+
exact_merges = 0
|
|
178
|
+
for key, group in norm_to_nodes.items():
|
|
179
|
+
if len(group) <= 1:
|
|
180
|
+
continue
|
|
181
|
+
# Partition by source_file — only merge within the same file in Pass 1.
|
|
182
|
+
# Cross-file matches fall through to Pass 2 fuzzy matching.
|
|
183
|
+
by_file: dict[str, list[dict]] = defaultdict(list)
|
|
184
|
+
for node in group:
|
|
185
|
+
sf = node.get("source_file") or ""
|
|
186
|
+
by_file[sf].append(node)
|
|
187
|
+
for file_group in by_file.values():
|
|
188
|
+
if len(file_group) > 1:
|
|
189
|
+
winner = _pick_winner(file_group)
|
|
190
|
+
for node in file_group:
|
|
191
|
+
uf.union(winner["id"], node["id"])
|
|
192
|
+
exact_merges += len(file_group) - 1
|
|
193
|
+
|
|
194
|
+
# ── pass 2: MinHash/LSH + Jaro-Winkler (high-entropy nodes only) ─────────
|
|
195
|
+
candidates: list[dict] = []
|
|
196
|
+
seen_norms: set[str] = set()
|
|
197
|
+
for node in unique_nodes:
|
|
198
|
+
key = _norm(node.get("label", node.get("id", "")))
|
|
199
|
+
if key and key not in seen_norms:
|
|
200
|
+
seen_norms.add(key)
|
|
201
|
+
if _entropy(node.get("label", "")) >= _ENTROPY_THRESHOLD:
|
|
202
|
+
candidates.append(node)
|
|
203
|
+
|
|
204
|
+
fuzzy_merges = 0
|
|
205
|
+
if len(candidates) >= 2:
|
|
206
|
+
lsh = MinHashLSH(threshold=_LSH_THRESHOLD, num_perm=_NUM_PERM)
|
|
207
|
+
minhashes: dict[str, MinHash] = {}
|
|
208
|
+
|
|
209
|
+
for node in candidates:
|
|
210
|
+
norm_label = _norm(node.get("label", node.get("id", "")))
|
|
211
|
+
m = _make_minhash(norm_label)
|
|
212
|
+
minhashes[node["id"]] = m
|
|
213
|
+
try:
|
|
214
|
+
lsh.insert(node["id"], m)
|
|
215
|
+
except ValueError:
|
|
216
|
+
pass # duplicate key in LSH — already inserted
|
|
217
|
+
|
|
218
|
+
for node in candidates:
|
|
219
|
+
node_id = node["id"]
|
|
220
|
+
norm_label = _norm(node.get("label", node.get("id", "")))
|
|
221
|
+
neighbors = lsh.query(minhashes[node_id])
|
|
222
|
+
|
|
223
|
+
for neighbor_id in neighbors:
|
|
224
|
+
if neighbor_id == node_id:
|
|
225
|
+
continue
|
|
226
|
+
if uf.find(node_id) == uf.find(neighbor_id):
|
|
227
|
+
continue
|
|
228
|
+
|
|
229
|
+
neighbor = next((n for n in candidates if n["id"] == neighbor_id), None)
|
|
230
|
+
if neighbor is None:
|
|
231
|
+
continue
|
|
232
|
+
|
|
233
|
+
neighbor_norm = _norm(neighbor.get("label", neighbor.get("id", "")))
|
|
234
|
+
score = JaroWinkler.normalized_similarity(norm_label, neighbor_norm) * 100
|
|
235
|
+
|
|
236
|
+
if _is_variant_pair(norm_label, neighbor_norm):
|
|
237
|
+
continue
|
|
238
|
+
if _short_label_blocked(norm_label, neighbor_norm, score):
|
|
239
|
+
continue
|
|
240
|
+
|
|
241
|
+
c1 = communities.get(node_id)
|
|
242
|
+
c2 = communities.get(neighbor_id)
|
|
243
|
+
if (c1 is not None and c2 is not None and c1 == c2
|
|
244
|
+
and min(len(norm_label), len(neighbor_norm)) >= 12):
|
|
245
|
+
score += _COMMUNITY_BOOST
|
|
246
|
+
|
|
247
|
+
if score >= _MERGE_THRESHOLD:
|
|
248
|
+
all_group = norm_to_nodes.get(norm_label, [node]) + \
|
|
249
|
+
norm_to_nodes.get(neighbor_norm, [neighbor])
|
|
250
|
+
winner = _pick_winner(all_group)
|
|
251
|
+
uf.union(winner["id"], node_id)
|
|
252
|
+
uf.union(winner["id"], neighbor_id)
|
|
253
|
+
fuzzy_merges += 1
|
|
254
|
+
|
|
255
|
+
# ── pass 3: LLM tiebreaker for ambiguous pairs (opt-in) ──────────────────
|
|
256
|
+
if dedup_llm_backend is not None:
|
|
257
|
+
_llm_tiebreak(candidates, uf, communities, backend=dedup_llm_backend)
|
|
258
|
+
|
|
259
|
+
# ── build remap table from union-find components ──────────────────────────
|
|
260
|
+
components = uf.components()
|
|
261
|
+
remap: dict[str, str] = {}
|
|
262
|
+
|
|
263
|
+
for root, members in components.items():
|
|
264
|
+
if len(members) == 1:
|
|
265
|
+
continue
|
|
266
|
+
group_nodes = [n for n in unique_nodes if n["id"] in members]
|
|
267
|
+
winner = _pick_winner(group_nodes) if group_nodes else {"id": root}
|
|
268
|
+
winner_id = winner["id"]
|
|
269
|
+
for member in members:
|
|
270
|
+
if member != winner_id:
|
|
271
|
+
remap[member] = winner_id
|
|
272
|
+
|
|
273
|
+
# ── apply remap ───────────────────────────────────────────────────────────
|
|
274
|
+
if not remap:
|
|
275
|
+
return unique_nodes, edges
|
|
276
|
+
|
|
277
|
+
total = len(remap)
|
|
278
|
+
msg = f"[graphify] Deduplicated {total} node(s)"
|
|
279
|
+
if exact_merges:
|
|
280
|
+
msg += f" ({exact_merges} exact"
|
|
281
|
+
if fuzzy_merges:
|
|
282
|
+
msg += f", {fuzzy_merges} fuzzy"
|
|
283
|
+
msg += ")"
|
|
284
|
+
print(msg + ".", flush=True)
|
|
285
|
+
|
|
286
|
+
deduped_nodes = [n for n in unique_nodes if n["id"] not in remap]
|
|
287
|
+
deduped_edges = []
|
|
288
|
+
for edge in edges:
|
|
289
|
+
e = dict(edge)
|
|
290
|
+
# Tolerate "from"/"to" keys from LLM backends that don't follow the
|
|
291
|
+
# schema exactly — build_from_json normalises later but dedup runs
|
|
292
|
+
# first so bracket access would KeyError here (#803).
|
|
293
|
+
# Use explicit key presence check (not `or`) so empty-string src/tgt
|
|
294
|
+
# aren't silently replaced by the fallback key.
|
|
295
|
+
src = e["source"] if "source" in e else e.get("from")
|
|
296
|
+
tgt = e["target"] if "target" in e else e.get("to")
|
|
297
|
+
if src is None or tgt is None:
|
|
298
|
+
continue
|
|
299
|
+
e["source"] = remap.get(src, src)
|
|
300
|
+
e["target"] = remap.get(tgt, tgt)
|
|
301
|
+
# Remove legacy keys so they don't leak into edge attrs in graph.json.
|
|
302
|
+
e.pop("from", None)
|
|
303
|
+
e.pop("to", None)
|
|
304
|
+
if e["source"] != e["target"]:
|
|
305
|
+
deduped_edges.append(e)
|
|
306
|
+
|
|
307
|
+
return deduped_nodes, deduped_edges
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
def _pick_winner(nodes: list[dict]) -> dict:
|
|
311
|
+
"""Pick the canonical survivor: prefer no chunk suffix, then shorter ID."""
|
|
312
|
+
if not nodes:
|
|
313
|
+
raise ValueError("Cannot pick winner from empty list")
|
|
314
|
+
|
|
315
|
+
def _score(n: dict) -> tuple[int, int]:
|
|
316
|
+
has_suffix = bool(_CHUNK_SUFFIX.search(n["id"]))
|
|
317
|
+
return (1 if has_suffix else 0, len(n["id"]))
|
|
318
|
+
|
|
319
|
+
return min(nodes, key=_score)
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
def _llm_tiebreak(
|
|
323
|
+
candidates: list[dict],
|
|
324
|
+
uf: _UF,
|
|
325
|
+
communities: dict[str, int],
|
|
326
|
+
*,
|
|
327
|
+
backend: str,
|
|
328
|
+
batch_size: int = 30,
|
|
329
|
+
low: float = 75.0,
|
|
330
|
+
high: float = 92.0,
|
|
331
|
+
) -> None:
|
|
332
|
+
"""Batch-resolve ambiguous pairs (score in [low, high)) via LLM."""
|
|
333
|
+
try:
|
|
334
|
+
from graphify.llm import BACKENDS, _format_backend_env_keys, _get_backend_api_key
|
|
335
|
+
if backend not in BACKENDS:
|
|
336
|
+
print(f"[graphify] --dedup-llm: unknown backend {backend!r}, skipping LLM tiebreaker.", flush=True)
|
|
337
|
+
return
|
|
338
|
+
if not _get_backend_api_key(backend):
|
|
339
|
+
env_keys = _format_backend_env_keys(backend)
|
|
340
|
+
print(f"[graphify] --dedup-llm: {env_keys} not set, skipping LLM tiebreaker.", flush=True)
|
|
341
|
+
return
|
|
342
|
+
except ImportError:
|
|
343
|
+
return
|
|
344
|
+
|
|
345
|
+
ambiguous: list[tuple[dict, dict, float]] = []
|
|
346
|
+
for i, node in enumerate(candidates):
|
|
347
|
+
norm_i = _norm(node.get("label", node.get("id", "")))
|
|
348
|
+
for j in range(i + 1, len(candidates)):
|
|
349
|
+
neighbor = candidates[j]
|
|
350
|
+
if uf.find(node["id"]) == uf.find(neighbor["id"]):
|
|
351
|
+
continue
|
|
352
|
+
norm_j = _norm(neighbor.get("label", neighbor.get("id", "")))
|
|
353
|
+
score = JaroWinkler.normalized_similarity(norm_i, norm_j) * 100
|
|
354
|
+
if _is_variant_pair(norm_i, norm_j):
|
|
355
|
+
continue
|
|
356
|
+
if _short_label_blocked(norm_i, norm_j, score):
|
|
357
|
+
continue
|
|
358
|
+
c1 = communities.get(node["id"])
|
|
359
|
+
c2 = communities.get(neighbor["id"])
|
|
360
|
+
if (c1 is not None and c2 is not None and c1 == c2
|
|
361
|
+
and min(len(norm_i), len(norm_j)) >= 12):
|
|
362
|
+
score += _COMMUNITY_BOOST
|
|
363
|
+
if low <= score < high:
|
|
364
|
+
ambiguous.append((node, neighbor, score))
|
|
365
|
+
|
|
366
|
+
if not ambiguous:
|
|
367
|
+
return
|
|
368
|
+
|
|
369
|
+
try:
|
|
370
|
+
from graphify.llm import _call_llm
|
|
371
|
+
except ImportError as exc:
|
|
372
|
+
# F-038: previously this silent fallback hid the fact that `_call_llm`
|
|
373
|
+
# didn't exist in `graphify.llm` at all, so `--dedup-llm` was a no-op.
|
|
374
|
+
# Surface the import failure so future regressions are visible.
|
|
375
|
+
print(
|
|
376
|
+
f"[graphify] --dedup-llm: cannot import _call_llm ({exc}); skipping LLM tiebreaker.",
|
|
377
|
+
flush=True,
|
|
378
|
+
)
|
|
379
|
+
return
|
|
380
|
+
|
|
381
|
+
for batch_start in range(0, len(ambiguous), batch_size):
|
|
382
|
+
batch = ambiguous[batch_start : batch_start + batch_size]
|
|
383
|
+
pairs_text = "\n".join(
|
|
384
|
+
f"{i+1}. \"{a['label']}\" vs \"{b['label']}\""
|
|
385
|
+
for i, (a, b, _) in enumerate(batch)
|
|
386
|
+
)
|
|
387
|
+
prompt = (
|
|
388
|
+
"For each pair below, answer only 'yes' or 'no': are they the same real-world concept?\n\n"
|
|
389
|
+
f"{pairs_text}\n\n"
|
|
390
|
+
"Reply with one line per pair: '1. yes', '2. no', etc."
|
|
391
|
+
)
|
|
392
|
+
try:
|
|
393
|
+
response = _call_llm(prompt, backend=backend, max_tokens=200)
|
|
394
|
+
lines = response.strip().splitlines()
|
|
395
|
+
for line in lines:
|
|
396
|
+
line = line.strip()
|
|
397
|
+
if not line:
|
|
398
|
+
continue
|
|
399
|
+
parts = line.split(".", 1)
|
|
400
|
+
if len(parts) != 2:
|
|
401
|
+
continue
|
|
402
|
+
try:
|
|
403
|
+
idx = int(parts[0].strip()) - 1
|
|
404
|
+
except ValueError:
|
|
405
|
+
continue
|
|
406
|
+
if 0 <= idx < len(batch):
|
|
407
|
+
answer = parts[1].strip().lower()
|
|
408
|
+
if answer.startswith("yes"):
|
|
409
|
+
a, b, _ = batch[idx]
|
|
410
|
+
winner = _pick_winner([a, b])
|
|
411
|
+
uf.union(winner["id"], a["id"])
|
|
412
|
+
uf.union(winner["id"], b["id"])
|
|
413
|
+
except Exception as exc:
|
|
414
|
+
print(f"[graphify] --dedup-llm batch failed: {exc}", flush=True)
|