@nerdev/skillset 0.2.1
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/LICENSE +21 -0
- package/README.md +351 -0
- package/bin/skillset.mjs +205 -0
- package/curations/README.md +53 -0
- package/curations/TEMPLATE/WHY.md +23 -0
- package/curations/TEMPLATE/overlay/SKILL.md +6 -0
- package/curations/impeccable/WHY.md +34 -0
- package/curations/impeccable/overlay/SKILL.md +116 -0
- package/package.json +43 -0
- package/scripts/ste-gate.mjs +39 -0
- package/scripts/ste-lint.py +201 -0
- package/scripts/sync.mjs +174 -0
- package/skills/ai-agent/agent-docs-writer/SKILL.md +105 -0
- package/skills/ai-agent/agent-docs-writer/references/principles.md +73 -0
- package/skills/ai-agent/agent-docs-writer/templates/AGENTS.template.md +44 -0
- package/skills/ai-agent/agent-docs-writer/templates/README.template.md +19 -0
- package/skills/ai-agent/ultra-context-engine/SKILL.md +941 -0
- package/skills/architecture/blueprint/SKILL.md +191 -0
- package/skills/architecture/code-tour/SKILL.md +204 -0
- package/skills/architecture/progress-guard/SKILL.md +148 -0
- package/skills/architecture/search-first/SKILL.md +97 -0
- package/skills/backend/api-design/SKILL.md +456 -0
- package/skills/backend/auth/SKILL.md +596 -0
- package/skills/backend/database/SKILL.md +431 -0
- package/skills/backend/realtime/SKILL.md +670 -0
- package/skills/backend/security/SKILL.md +590 -0
- package/skills/business/brag/SKILL.md +177 -0
- package/skills/business/brag/assets/music/README.md +20 -0
- package/skills/business/brag/assets/music/cues/happy-beats-business-moves-vol-1-by-ende-dot-app.music-cues.json +3846 -0
- package/skills/business/brag/assets/music/cues/happy-beats-business-moves-vol-1-by-ende-dot-app.music-cues.md +35 -0
- package/skills/business/brag/assets/music/cues/happy-beats-business-moves-vol-10-by-ende-dot-app.music-cues.json +1826 -0
- package/skills/business/brag/assets/music/cues/happy-beats-business-moves-vol-10-by-ende-dot-app.music-cues.md +35 -0
- package/skills/business/brag/assets/music/cues/happy-beats-business-moves-vol-11-by-ende-dot-app.music-cues.json +2266 -0
- package/skills/business/brag/assets/music/cues/happy-beats-business-moves-vol-11-by-ende-dot-app.music-cues.md +35 -0
- package/skills/business/brag/assets/music/cues/happy-beats-business-moves-vol-12-by-ende-dot-app.music-cues.json +2806 -0
- package/skills/business/brag/assets/music/cues/happy-beats-business-moves-vol-12-by-ende-dot-app.music-cues.md +35 -0
- package/skills/business/brag/assets/music/cues/happy-beats-business-moves-vol-9-by-ende-dot-app.music-cues.json +2796 -0
- package/skills/business/brag/assets/music/cues/happy-beats-business-moves-vol-9-by-ende-dot-app.music-cues.md +35 -0
- package/skills/business/brag/assets/music/happy-beats-business-moves-vol-1-by-ende-dot-app.mp3 +0 -0
- package/skills/business/brag/assets/music/happy-beats-business-moves-vol-10-by-ende-dot-app.mp3 +0 -0
- package/skills/business/brag/assets/music/happy-beats-business-moves-vol-11-by-ende-dot-app.mp3 +0 -0
- package/skills/business/brag/assets/music/happy-beats-business-moves-vol-12-by-ende-dot-app.mp3 +0 -0
- package/skills/business/brag/assets/music/happy-beats-business-moves-vol-9-by-ende-dot-app.mp3 +0 -0
- package/skills/business/brag/assets/sfx/casino/card-fan-1.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-fan-2.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-place-1.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-place-2.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-place-3.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-place-4.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-shove-1.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-shove-2.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-shove-3.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-shove-4.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-shuffle.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-slide-1.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-slide-2.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-slide-3.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-slide-4.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-slide-5.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-slide-6.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-slide-7.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-slide-8.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/cards-pack-open-1.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/cards-pack-open-2.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chip-lay-1.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chip-lay-2.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chip-lay-3.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chips-collide-1.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chips-collide-2.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chips-collide-3.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chips-collide-4.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chips-handle-1.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chips-handle-2.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chips-handle-3.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chips-handle-4.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chips-handle-6.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chips-stack-1.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chips-stack-2.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chips-stack-3.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chips-stack-4.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chips-stack-5.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chips-stack-6.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/dice-grab-1.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/dice-grab-2.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/dice-shake-1.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/dice-shake-2.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/dice-shake-3.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/dice-throw-1.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/dice-throw-2.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/dice-throw-3.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/die-throw-1.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/die-throw-2.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/die-throw-3.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/die-throw-4.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_carpet_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_carpet_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_carpet_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_concrete_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_concrete_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_concrete_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_concrete_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_concrete_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_grass_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_grass_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_grass_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_grass_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_grass_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_snow_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_snow_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_snow_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_snow_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_snow_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_wood_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_wood_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_wood_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_wood_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_wood_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactBell_heavy_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactBell_heavy_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactBell_heavy_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactGeneric_light_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactGeneric_light_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactGeneric_light_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactGeneric_light_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactGeneric_light_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactGlass_heavy_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactGlass_light_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactGlass_light_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactGlass_light_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactGlass_medium_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactGlass_medium_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactGlass_medium_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactMetal_heavy_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactMetal_heavy_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactMetal_heavy_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactMetal_light_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactMetal_light_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactMetal_medium_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactMetal_medium_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactMetal_medium_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactMetal_medium_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactMetal_medium_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactMining_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlank_medium_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlank_medium_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlank_medium_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlank_medium_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlank_medium_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlate_heavy_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlate_heavy_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlate_heavy_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlate_heavy_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlate_heavy_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlate_light_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlate_light_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlate_light_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlate_light_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlate_light_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlate_medium_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlate_medium_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlate_medium_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlate_medium_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlate_medium_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPunch_heavy_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPunch_heavy_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPunch_heavy_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPunch_heavy_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPunch_heavy_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPunch_medium_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPunch_medium_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPunch_medium_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPunch_medium_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPunch_medium_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactSoft_heavy_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactSoft_heavy_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactSoft_heavy_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactSoft_heavy_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactSoft_heavy_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactSoft_medium_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactSoft_medium_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactSoft_medium_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactSoft_medium_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactSoft_medium_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactTin_medium_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactTin_medium_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactTin_medium_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactTin_medium_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactTin_medium_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactWood_heavy_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactWood_heavy_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactWood_heavy_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactWood_heavy_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactWood_heavy_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactWood_light_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactWood_light_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactWood_light_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactWood_light_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactWood_light_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactWood_medium_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactWood_medium_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactWood_medium_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactWood_medium_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactWood_medium_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/bong_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/click_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/click_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/click_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/click_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/click_005.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/drop_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/drop_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/drop_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/error_005.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/error_006.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/glitch_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/glitch_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/select_008.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/switch_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/switch_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/switch_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/switch_005.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/switch_006.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/switch_007.ogg +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-001.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-002.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-003.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-004.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-005.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-006.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-007.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-008.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-009.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-010.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-011.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-012.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-013.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-014.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-015.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-016.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-017.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-018.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-019.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-020.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-021.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-022.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-023.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-024.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-025.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-026.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-027.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-028.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-029.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-030.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-031.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-032.wav +0 -0
- package/skills/business/brag/assets/sfx/sfx-analysis.json +15584 -0
- package/skills/business/brag/assets/sfx/sfx-analysis.md +75 -0
- package/skills/business/brag/assets/sfx/ui/click1.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/click2.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/click3.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/click4.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/click5.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/mouseclick1.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/rollover1.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/rollover2.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/rollover4.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/rollover5.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch1.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch10.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch11.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch12.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch13.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch14.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch15.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch16.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch17.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch18.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch19.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch2.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch20.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch21.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch22.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch23.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch24.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch25.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch26.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch27.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch28.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch29.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch3.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch30.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch31.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch32.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch33.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch34.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch35.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch36.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch37.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch38.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch4.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch5.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch6.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch7.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch8.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch9.ogg +0 -0
- package/skills/business/brag/references/audio.md +307 -0
- package/skills/business/brag/references/step-1-inspect.md +133 -0
- package/skills/business/brag/references/step-2-plan.md +234 -0
- package/skills/business/brag/references/step-3-compose.md +210 -0
- package/skills/business/brag/references/step-4-deliver.md +168 -0
- package/skills/business/brag/references/tones.md +231 -0
- package/skills/business/brag/scripts/analyze_music_cues.py +309 -0
- package/skills/business/brag/scripts/pyproject.toml +14 -0
- package/skills/business/brag/scripts/uv.lock +819 -0
- package/skills/business/copywriting/SKILL.md +178 -0
- package/skills/business/customer-research/SKILL.md +259 -0
- package/skills/business/freelancing/SKILL.md +679 -0
- package/skills/business/launch/SKILL.md +273 -0
- package/skills/business/marketing-psychology/SKILL.md +364 -0
- package/skills/business/pricing/SKILL.md +233 -0
- package/skills/business/resume-revamp-jake-ats/SKILL.md +64 -0
- package/skills/business/startup-founder/SKILL.md +400 -0
- package/skills/business/startup-founder/references/funding.md +48 -0
- package/skills/business/startup-founder/references/further-reading.md +132 -0
- package/skills/business/startup-founder/references/gtm-tools.md +57 -0
- package/skills/business/startup-founder/references/legal-india.md +36 -0
- package/skills/business/startup-founder/references/marketing/README.md +16 -0
- package/skills/business/startup-founder/references/marketing/cold-email.md +172 -0
- package/skills/business/startup-founder/references/marketing/competitors.md +245 -0
- package/skills/business/startup-founder/references/marketing/customer-research.md +276 -0
- package/skills/business/startup-founder/references/marketing/free-tools.md +168 -0
- package/skills/business/startup-founder/references/marketing/launch.md +343 -0
- package/skills/business/startup-founder/references/marketing/marketing-plan.md +270 -0
- package/skills/business/startup-founder/references/marketing/pricing.md +237 -0
- package/skills/business/startup-founder/references/marketing/product-marketing.md +250 -0
- package/skills/business/startup-founder/references/validation.md +267 -0
- package/skills/devops/deployments/SKILL.md +339 -0
- package/skills/devops/git-ci/SKILL.md +372 -0
- package/skills/devops/performance/SKILL.md +523 -0
- package/skills/devops/testing/SKILL.md +558 -0
- package/skills/engineering/code-review/SKILL.md +149 -0
- package/skills/engineering/coding-standards/SKILL.md +229 -0
- package/skills/engineering/product-engineering/SKILL.md +219 -0
- package/skills/engineering/senior-engineer-prompts/SKILL.md +145 -0
- package/skills/engineering/tdd-workflow/SKILL.md +178 -0
- package/skills/engineering/verification-loop/SKILL.md +199 -0
- package/skills/nerdev/nerdev-abstraction/SKILL.md +412 -0
- package/skills/nerdev/nerdev-docs/SKILL.md +527 -0
- package/skills/nerdev/nerdev-docs/templates/adr-template.md +39 -0
- package/skills/nerdev/nerdev-docs/templates/contributing-template.md +140 -0
- package/skills/nerdev/nerdev-docs/templates/deploy-template.md +426 -0
- package/skills/nerdev/nerdev-docs/templates/design-template.md +105 -0
- package/skills/nerdev/nerdev-docs/templates/incident-template.md +66 -0
- package/skills/nerdev/nerdev-monorepo/SKILL.md +522 -0
- package/skills/quality/output-skill/SKILL.md +49 -0
- package/skills/quality/unslop/SKILL.md +67 -0
- package/skills/ui/animaxxing/SKILL.md +58 -0
- package/skills/ui/animaxxing/agents/openai.yaml +7 -0
- package/skills/ui/animaxxing/references/effect-restoration.md +26 -0
- package/skills/ui/animaxxing/references/motion-vocabulary.md +142 -0
- package/skills/ui/animaxxing/references/recipes/blast-off.md +119 -0
- package/skills/ui/animaxxing/references/recipes/particle-effects.md +718 -0
- package/skills/ui/animaxxing/references/recipes/particle-field.md +428 -0
- package/skills/ui/animaxxing/references/recipes/route-letters.md +205 -0
- package/skills/ui/animaxxing/references/recipes/speak-in.md +181 -0
- package/skills/ui/animaxxing/references/recipes/split-entrances.md +345 -0
- package/skills/ui/animaxxing/references/recipes/wave.md +144 -0
- package/skills/ui/animaxxing/references/text-stability.md +68 -0
- package/skills/ui/animaxxing/references/verification.md +44 -0
- package/skills/ui/ask-animation/SKILL.md +178 -0
- package/skills/ui/ask-base-ui/SKILL.md +400 -0
- package/skills/ui/ask-cmdk/SKILL.md +315 -0
- package/skills/ui/ask-command-menu/SKILL.md +262 -0
- package/skills/ui/ask-drawer/SKILL.md +235 -0
- package/skills/ui/ask-form/SKILL.md +229 -0
- package/skills/ui/ask-gsap/SKILL.md +435 -0
- package/skills/ui/ask-modal/SKILL.md +145 -0
- package/skills/ui/ask-motion/SKILL.md +339 -0
- package/skills/ui/ask-rhf/SKILL.md +388 -0
- package/skills/ui/ask-sonner/API.md +64 -0
- package/skills/ui/ask-sonner/SKILL.md +88 -0
- package/skills/ui/ask-table/SKILL.md +253 -0
- package/skills/ui/ask-tanstack-table/SKILL.md +490 -0
- package/skills/ui/ask-toast/SKILL.md +163 -0
- package/skills/ui/ask-vaul/SKILL.md +291 -0
- package/skills/ui/ask-virtual-list/SKILL.md +304 -0
- package/skills/ui/ask-virtuoso/SKILL.md +332 -0
- package/skills/ui/email-craft/SKILL.md +258 -0
- package/skills/ui/frontend-craftsmanship/SKILL.md +462 -0
- package/skills/ui/gsap-astro/SKILL.md +56 -0
- package/skills/ui/gsap-astro/agents/openai.yaml +7 -0
- package/skills/ui/gsap-astro/references/client-router-navigation.md +139 -0
- package/skills/ui/gsap-astro/references/initialization.md +87 -0
- package/skills/ui/gsap-astro/references/motion-system.md +152 -0
- package/skills/ui/gsap-astro/references/scripts-and-islands.md +65 -0
- package/skills/ui/gsap-astro/references/verification.md +44 -0
- package/skills/ui/gsap-core/SKILL.md +254 -0
- package/skills/ui/gsap-frameworks/SKILL.md +266 -0
- package/skills/ui/gsap-nextjs/SKILL.md +51 -0
- package/skills/ui/gsap-nextjs/agents/openai.yaml +7 -0
- package/skills/ui/gsap-nextjs/references/app-router-navigation.md +189 -0
- package/skills/ui/gsap-nextjs/references/initialization.md +87 -0
- package/skills/ui/gsap-nextjs/references/motion-system.md +158 -0
- package/skills/ui/gsap-nextjs/references/verification.md +40 -0
- package/skills/ui/gsap-nuxt/SKILL.md +56 -0
- package/skills/ui/gsap-nuxt/agents/openai.yaml +7 -0
- package/skills/ui/gsap-nuxt/references/initialization.md +87 -0
- package/skills/ui/gsap-nuxt/references/motion-system.md +161 -0
- package/skills/ui/gsap-nuxt/references/navigation.md +145 -0
- package/skills/ui/gsap-nuxt/references/page-transitions.md +107 -0
- package/skills/ui/gsap-nuxt/references/verification.md +42 -0
- package/skills/ui/gsap-performance/SKILL.md +79 -0
- package/skills/ui/gsap-plugins/SKILL.md +433 -0
- package/skills/ui/gsap-react/SKILL.md +136 -0
- package/skills/ui/gsap-react-router/SKILL.md +55 -0
- package/skills/ui/gsap-react-router/agents/openai.yaml +7 -0
- package/skills/ui/gsap-react-router/references/initialization.md +87 -0
- package/skills/ui/gsap-react-router/references/motion-system.md +158 -0
- package/skills/ui/gsap-react-router/references/react-router-navigation.md +165 -0
- package/skills/ui/gsap-react-router/references/route-lifetime.md +74 -0
- package/skills/ui/gsap-react-router/references/verification.md +42 -0
- package/skills/ui/gsap-scrolltrigger/SKILL.md +296 -0
- package/skills/ui/gsap-sveltekit/SKILL.md +54 -0
- package/skills/ui/gsap-sveltekit/agents/openai.yaml +7 -0
- package/skills/ui/gsap-sveltekit/references/initialization.md +87 -0
- package/skills/ui/gsap-sveltekit/references/motion-system.md +156 -0
- package/skills/ui/gsap-sveltekit/references/page-lifetime.md +63 -0
- package/skills/ui/gsap-sveltekit/references/sveltekit-navigation.md +160 -0
- package/skills/ui/gsap-sveltekit/references/verification.md +41 -0
- package/skills/ui/gsap-tanstack-router/SKILL.md +56 -0
- package/skills/ui/gsap-tanstack-router/agents/openai.yaml +7 -0
- package/skills/ui/gsap-tanstack-router/references/initialization.md +87 -0
- package/skills/ui/gsap-tanstack-router/references/motion-system.md +160 -0
- package/skills/ui/gsap-tanstack-router/references/route-lifetime.md +66 -0
- package/skills/ui/gsap-tanstack-router/references/tanstack-navigation.md +156 -0
- package/skills/ui/gsap-tanstack-router/references/verification.md +41 -0
- package/skills/ui/gsap-timeline/SKILL.md +107 -0
- package/skills/ui/gsap-utils/SKILL.md +284 -0
- package/skills/ui/gsap-vanilla/SKILL.md +63 -0
- package/skills/ui/gsap-vanilla/agents/openai.yaml +7 -0
- package/skills/ui/gsap-vanilla/references/cross-document-navigation.md +54 -0
- package/skills/ui/gsap-vanilla/references/initialization.md +87 -0
- package/skills/ui/gsap-vanilla/references/motion-system.md +150 -0
- package/skills/ui/gsap-vanilla/references/page-load.md +96 -0
- package/skills/ui/gsap-vanilla/references/spa-navigation.md +70 -0
- package/skills/ui/gsap-vanilla/references/verification.md +41 -0
- package/skills/ui/house-style/SKILL.md +366 -0
- package/skills/ui/imagegen/SKILL.md +49 -0
- package/skills/ui/imagegen/references/brandkit.md +48 -0
- package/skills/ui/imagegen/references/image-to-code.md +56 -0
- package/skills/ui/imagegen/references/mobile.md +58 -0
- package/skills/ui/imagegen/references/web.md +63 -0
- package/skills/ui/impeccable/SKILL.md +116 -0
- package/skills/ui/impeccable/reference/adapt.md +318 -0
- package/skills/ui/impeccable/reference/adapt.native.md +58 -0
- package/skills/ui/impeccable/reference/android.md +46 -0
- package/skills/ui/impeccable/reference/animate.md +89 -0
- package/skills/ui/impeccable/reference/audit.md +137 -0
- package/skills/ui/impeccable/reference/audit.native.md +139 -0
- package/skills/ui/impeccable/reference/bolder.md +33 -0
- package/skills/ui/impeccable/reference/clarify.md +94 -0
- package/skills/ui/impeccable/reference/colorize.md +86 -0
- package/skills/ui/impeccable/reference/craft-floor.md +44 -0
- package/skills/ui/impeccable/reference/craft.md +5 -0
- package/skills/ui/impeccable/reference/critique.md +806 -0
- package/skills/ui/impeccable/reference/degraded/asset-producer.md +37 -0
- package/skills/ui/impeccable/reference/degraded/documenter.md +24 -0
- package/skills/ui/impeccable/reference/degraded/finish-reviewer.md +38 -0
- package/skills/ui/impeccable/reference/degraded/manual-edit-applier.md +92 -0
- package/skills/ui/impeccable/reference/delight.md +70 -0
- package/skills/ui/impeccable/reference/distill.md +111 -0
- package/skills/ui/impeccable/reference/doctor.md +54 -0
- package/skills/ui/impeccable/reference/document.md +416 -0
- package/skills/ui/impeccable/reference/extract.md +69 -0
- package/skills/ui/impeccable/reference/generate.md +101 -0
- package/skills/ui/impeccable/reference/harden.md +345 -0
- package/skills/ui/impeccable/reference/hooks.md +111 -0
- package/skills/ui/impeccable/reference/init.md +131 -0
- package/skills/ui/impeccable/reference/ios.md +51 -0
- package/skills/ui/impeccable/reference/layout.md +84 -0
- package/skills/ui/impeccable/reference/live-setup.md +104 -0
- package/skills/ui/impeccable/reference/live.md +325 -0
- package/skills/ui/impeccable/reference/new-work.md +145 -0
- package/skills/ui/impeccable/reference/onboard.md +234 -0
- package/skills/ui/impeccable/reference/operate.md +61 -0
- package/skills/ui/impeccable/reference/optimize.md +258 -0
- package/skills/ui/impeccable/reference/overdrive.md +127 -0
- package/skills/ui/impeccable/reference/polish.md +105 -0
- package/skills/ui/impeccable/reference/quieter.md +99 -0
- package/skills/ui/impeccable/reference/routing.md +24 -0
- package/skills/ui/impeccable/reference/shape.md +59 -0
- package/skills/ui/impeccable/reference/typeset.md +80 -0
- package/skills/ui/impeccable/reference/visualize.md +46 -0
- package/skills/ui/impeccable/scripts/VERSION +1 -0
- package/skills/ui/impeccable/scripts/command-metadata.json +98 -0
- package/skills/ui/impeccable/scripts/data/font-index-failures.json +121 -0
- package/skills/ui/impeccable/scripts/data/font-index.json +1 -0
- package/skills/ui/impeccable/scripts/impeccable +206 -0
- package/skills/ui/impeccable/scripts/impeccable.cmd +214 -0
- package/skills/ui/impeccable/scripts/live-browser-dom.js +167 -0
- package/skills/ui/impeccable/scripts/live-browser-ignores.js +242 -0
- package/skills/ui/impeccable/scripts/live-browser-session.js +144 -0
- package/skills/ui/impeccable/scripts/live-browser.js +13510 -0
- package/skills/ui/impeccable/scripts/modern-screenshot.umd.js +14 -0
- package/skills/ui/motion/SKILL.md +207 -0
- package/skills/ui/pick-ui-library/SKILL.md +85 -0
- package/skills/ui/product-messaging/SKILL.md +163 -0
- package/skills/ui/product-site/SKILL.md +465 -0
- package/skills/ui/prototype/PICKER.md +197 -0
- package/skills/ui/prototype/SKILL.md +98 -0
- package/skills/ui/refero-design/SKILL.md +534 -0
- package/skills/ui/refero-design/agents/openai.yaml +4 -0
- package/skills/ui/refero-design/references/anti-ai-slop.md +292 -0
- package/skills/ui/refero-design/references/color.md +563 -0
- package/skills/ui/refero-design/references/copywriting.md +222 -0
- package/skills/ui/refero-design/references/craft-details.md +525 -0
- package/skills/ui/refero-design/references/example-workflow.md +264 -0
- package/skills/ui/refero-design/references/icons.md +166 -0
- package/skills/ui/refero-design/references/mcp-tools.md +258 -0
- package/skills/ui/refero-design/references/motion.md +504 -0
- package/skills/ui/refero-design/references/typography.md +737 -0
- package/skills/ui/refero-design/references/visual-workflow.md +105 -0
- package/skills/ui/style-animaxxing/SKILL.md +48 -0
- package/skills/ui/style-animaxxing/agents/openai.yaml +7 -0
- package/skills/ui/style-animaxxing/references/motion-vocabulary.md +51 -0
- package/skills/ui/style-animaxxing/references/tokens.md +288 -0
- package/skills/ui/style-animaxxing/references/typography-and-layout.md +149 -0
- package/skills/ui/style-animaxxing/references/verification.md +38 -0
- package/skills/ui/typography-picker/SKILL.md +305 -0
- package/skills/ui/ui-core/SKILL.md +345 -0
- package/skills/ui/ui-core/references/accessibility.md +85 -0
- package/skills/ui/ui-core/references/build.md +666 -0
- package/skills/ui/ui-core/references/copy.md +70 -0
- package/skills/ui/ui-core/references/dark-mode.md +76 -0
- package/skills/ui/ui-core/references/direction.md +99 -0
- package/skills/ui/ui-core/references/redesign.md +74 -0
- package/skills/ui/ui-core/references/responsive.md +77 -0
- package/skills/ui/ui-core/references/styles.md +42 -0
- package/skills/ui/ui-core/references/system.md +190 -0
- package/skills/ui/ui-core/references/verify.md +37 -0
- package/skills/ui/ui-engineering/SKILL.md +436 -0
- package/skills/ui/ui-engineering/references/avatars.md +74 -0
- package/skills/ui/ui-engineering/references/card-patterns.md +66 -0
- package/skills/ui/ui-engineering/references/floating-actions.md +65 -0
- package/skills/ui/ui-engineering/references/navigation.md +81 -0
- package/skills/ui/ui-engineering/references/overlays.md +74 -0
- package/skills/ui/ui-engineering/references/pagination.md +71 -0
- package/skills/ui/ui-engineering/references/progress-indicators.md +77 -0
- package/skills/ui/ui-engineering/references/quality-bar.md +293 -0
- package/skills/ui/ui-engineering/references/search.md +68 -0
- package/skills/ui/ui-engineering/references/tailwind-architecture.md +81 -0
- package/skills/ui/ui-theme-picker/SKILL.md +522 -0
- package/skills/ui/ui-theme-picker/references/component-sources.md +223 -0
- package/skills/ui/ui-theme-picker/references/styles.md +298 -0
- package/skills/ui/vitepress-docs/SKILL.md +439 -0
- package/skills/ui/vitepress-docs/references/components.md +333 -0
- package/skills/ui/vitepress-docs/references/layout.md +128 -0
- package/skills/ui/vitepress-docs/references/tokens.md +87 -0
- package/skills/ui/vitepress-docs/references/typography.md +76 -0
- package/skills/workflow/careful/SKILL.md +48 -0
- package/skills/workflow/context-restore/SKILL.md +69 -0
- package/skills/workflow/context-save/SKILL.md +96 -0
- package/skills/workflow/health/SKILL.md +99 -0
- package/skills/workflow/learn/SKILL.md +95 -0
- package/skills/workflow/office-hours/SKILL.md +136 -0
- package/skills/workflow/ship/SKILL.md +95 -0
- package/vendor.json +80 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
# Impeccable launcher. Runs the platform binary shipped next to this script:
|
|
3
|
+
# <this dir>/bin/<os>-<arch>/impeccable
|
|
4
|
+
# Order: $IMPECCABLE_BIN, the sibling binary, ~/.impeccable/bin/impeccable,
|
|
5
|
+
# the version-pinned cache, then `impeccable` on PATH. Never needs Node.
|
|
6
|
+
# The unversioned home binary and the PATH candidate are validated with the
|
|
7
|
+
# engine-probe handshake first: the retired 3.x npm CLI also installed a bin
|
|
8
|
+
# named `impeccable`, and exec'ing it would fail every verb with
|
|
9
|
+
# "Unknown command". Trusted candidates (IMPECCABLE_BIN, the sibling binary,
|
|
10
|
+
# the version-pinned cache) are exec'd without a probe: hooks run them on
|
|
11
|
+
# every edit and must stay fast.
|
|
12
|
+
set -eu
|
|
13
|
+
|
|
14
|
+
# True when the candidate answers the engine handshake (prints
|
|
15
|
+
# "impeccable-engine <version>", exit 0). Quiet and fast (<100ms).
|
|
16
|
+
# IMPECCABLE_LAUNCHER_PROBE marks the child as a probe: a copy of this
|
|
17
|
+
# launcher reached recursively (e.g. symlinked onto PATH as `impeccable`)
|
|
18
|
+
# then skips its own probes and refuses to download, so probing stays cheap
|
|
19
|
+
# and can never loop.
|
|
20
|
+
probe_ok() {
|
|
21
|
+
case "$(IMPECCABLE_LAUNCHER_PROBE=1 "$1" engine-probe 2>/dev/null || true)" in
|
|
22
|
+
impeccable-engine*) return 0 ;;
|
|
23
|
+
esac
|
|
24
|
+
return 1
|
|
25
|
+
}
|
|
26
|
+
probing=${IMPECCABLE_LAUNCHER_PROBE:-}
|
|
27
|
+
|
|
28
|
+
dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
|
|
29
|
+
|
|
30
|
+
# What the binary needs to know about its home: the skill directory (for
|
|
31
|
+
# reference/*.md and command-metadata.json) and how to name itself in the
|
|
32
|
+
# commands it prints. Exported BEFORE any exec below, including the
|
|
33
|
+
# IMPECCABLE_BIN override: an engine binary reached with no IMPECCABLE_SKILL_DIR
|
|
34
|
+
# cannot find reference/*.md (so native platform refs never inline) or read its
|
|
35
|
+
# own version (so UPDATE_AVAILABLE never fires). Setting it here covers every
|
|
36
|
+
# candidate the launcher can exec.
|
|
37
|
+
: "${IMPECCABLE_SKILL_DIR:=$(CDPATH= cd -- "$dir/.." && pwd)}"
|
|
38
|
+
: "${IMPECCABLE_SELF:=$0}"
|
|
39
|
+
export IMPECCABLE_SKILL_DIR IMPECCABLE_SELF
|
|
40
|
+
|
|
41
|
+
if [ -n "${IMPECCABLE_BIN:-}" ] && [ -x "${IMPECCABLE_BIN}" ]; then
|
|
42
|
+
exec "${IMPECCABLE_BIN}" "$@"
|
|
43
|
+
fi
|
|
44
|
+
|
|
45
|
+
case "$(uname -s 2>/dev/null || echo unknown)" in
|
|
46
|
+
Darwin) os=darwin ;;
|
|
47
|
+
Linux) os=linux ;;
|
|
48
|
+
MINGW*|MSYS*|CYGWIN*|Windows_NT) os=windows ;;
|
|
49
|
+
*) os=unknown ;;
|
|
50
|
+
esac
|
|
51
|
+
case "$(uname -m 2>/dev/null || echo unknown)" in
|
|
52
|
+
arm64|aarch64) arch=arm64 ;;
|
|
53
|
+
x86_64|amd64) arch=x64 ;;
|
|
54
|
+
*) arch=unknown ;;
|
|
55
|
+
esac
|
|
56
|
+
|
|
57
|
+
bin="$dir/bin/$os-$arch/impeccable"
|
|
58
|
+
[ "$os" = windows ] && bin="$bin.exe"
|
|
59
|
+
|
|
60
|
+
if [ -x "$bin" ]; then
|
|
61
|
+
exec "$bin" "$@"
|
|
62
|
+
fi
|
|
63
|
+
if [ -f "$bin" ]; then
|
|
64
|
+
# Lost the executable bit in transit (zip extraction, some copiers).
|
|
65
|
+
chmod +x "$bin" 2>/dev/null && exec "$bin" "$@"
|
|
66
|
+
fi
|
|
67
|
+
# On Windows (an MSYS/Git Bash shell) the cached names carry .exe so this
|
|
68
|
+
# launcher and impeccable.cmd share one cache.
|
|
69
|
+
exe=""
|
|
70
|
+
[ "$os" = windows ] && exe=".exe"
|
|
71
|
+
home_bin="${HOME:-/nonexistent}/.impeccable/bin/impeccable$exe"
|
|
72
|
+
if [ -z "$probing" ] && [ -x "$home_bin" ] && probe_ok "$home_bin"; then
|
|
73
|
+
exec "$home_bin" "$@"
|
|
74
|
+
fi
|
|
75
|
+
# Version-pinned user cache, filled by the download below or by `impeccable update`.
|
|
76
|
+
version=""
|
|
77
|
+
[ -f "$dir/VERSION" ] && version=$(tr -d '[:space:]' < "$dir/VERSION")
|
|
78
|
+
cache_root="${IMPECCABLE_HOME:-${HOME:-/nonexistent}/.impeccable}"
|
|
79
|
+
cached="$cache_root/bin/$version/impeccable$exe"
|
|
80
|
+
if [ -n "$version" ] && [ -x "$cached" ]; then
|
|
81
|
+
exec "$cached" "$@"
|
|
82
|
+
fi
|
|
83
|
+
if [ -z "$probing" ] && command -v impeccable >/dev/null 2>&1 && probe_ok impeccable; then
|
|
84
|
+
exec impeccable "$@"
|
|
85
|
+
fi
|
|
86
|
+
|
|
87
|
+
# Last resort: fetch this version's binary for the current platform from the
|
|
88
|
+
# public release channel into the user cache. Needs network; sandboxes without
|
|
89
|
+
# egress preinstall the binary on PATH instead.
|
|
90
|
+
setup_help() {
|
|
91
|
+
echo "Engine $version setup needs network access and write permission to $cache_root/bin/$version." >&2
|
|
92
|
+
echo "Run this launcher ($0) with engine-probe in a terminal that has those permissions, then retry the original command." >&2
|
|
93
|
+
echo "Alternatively, set IMPECCABLE_HOME to a writable cache location, or IMPECCABLE_BIN to a preinstalled engine binary." >&2
|
|
94
|
+
}
|
|
95
|
+
fetch_url() {
|
|
96
|
+
if command -v curl >/dev/null 2>&1; then
|
|
97
|
+
curl -fsSL --retry 2 -o "$tmp" "$1" 2>/dev/null
|
|
98
|
+
elif command -v wget >/dev/null 2>&1; then
|
|
99
|
+
wget -q -O "$tmp" "$1" 2>/dev/null
|
|
100
|
+
else
|
|
101
|
+
return 1
|
|
102
|
+
fi
|
|
103
|
+
}
|
|
104
|
+
check_download() {
|
|
105
|
+
download_file=${1:-$tmp}
|
|
106
|
+
if [ ! -f "$download_file" ]; then
|
|
107
|
+
rm -f "$tmp.sha256"
|
|
108
|
+
echo "impeccable: download completed but the file was removed before execution: $url; check your antivirus quarantine or logs. Refusing to continue; do not disable protection." >&2
|
|
109
|
+
exit 127
|
|
110
|
+
fi
|
|
111
|
+
if [ ! -s "$download_file" ]; then
|
|
112
|
+
rm -f "$download_file" "$tmp.sha256"
|
|
113
|
+
echo "impeccable: downloaded file is empty: $url; refusing the unverified download" >&2
|
|
114
|
+
exit 127
|
|
115
|
+
fi
|
|
116
|
+
}
|
|
117
|
+
if [ -n "$probing" ]; then
|
|
118
|
+
# Inside another launcher's probe: no download, fail fast and quiet.
|
|
119
|
+
exit 127
|
|
120
|
+
fi
|
|
121
|
+
if [ -n "$version" ] && [ "$os" != unknown ] && [ "$arch" != unknown ]; then
|
|
122
|
+
base="${IMPECCABLE_DOWNLOAD_BASE:-https://github.com/pbakaus/impeccable/releases/download}"
|
|
123
|
+
asset="impeccable-$os-$arch"
|
|
124
|
+
[ "$os" = windows ] && asset="$asset.exe"
|
|
125
|
+
url="$base/engine-v$version/$asset"
|
|
126
|
+
tmp="$cache_root/bin/$version/.impeccable.part.$$"
|
|
127
|
+
if ! mkdir -p "$cache_root/bin/$version" 2>/dev/null; then
|
|
128
|
+
echo "impeccable: engine $version is not installed; cannot create cache directory: $cache_root/bin/$version" >&2
|
|
129
|
+
setup_help
|
|
130
|
+
exit 127
|
|
131
|
+
fi
|
|
132
|
+
# Check the actual staging file, not just directory existence: a cache from
|
|
133
|
+
# an earlier run can be readable but no longer writable inside a sandbox.
|
|
134
|
+
if ! (umask 077; : > "$tmp") 2>/dev/null; then
|
|
135
|
+
echo "impeccable: engine $version is not installed; cannot write to cache directory: $cache_root/bin/$version" >&2
|
|
136
|
+
setup_help
|
|
137
|
+
exit 127
|
|
138
|
+
fi
|
|
139
|
+
fetched=0
|
|
140
|
+
if fetch_url "$url"; then
|
|
141
|
+
fetched=1
|
|
142
|
+
elif [ "$os" = windows ] && [ "$arch" = arm64 ]; then
|
|
143
|
+
# Windows on ARM runs x64 binaries; fall back when no arm64 asset exists.
|
|
144
|
+
url="$base/engine-v$version/impeccable-windows-x64.exe"
|
|
145
|
+
fetch_url "$url" && fetched=1
|
|
146
|
+
fi
|
|
147
|
+
if [ "$fetched" = 1 ]; then
|
|
148
|
+
check_download
|
|
149
|
+
# Fail closed: a freshly downloaded binary runs only after verifying
|
|
150
|
+
# against its .sha256 sidecar. A sidecar that cannot be fetched, or a
|
|
151
|
+
# machine with no sha256 tool, refuses the download instead of exec'ing
|
|
152
|
+
# an unverified binary. (A binary already on PATH or in the cache that
|
|
153
|
+
# passes engine-probe is unaffected.)
|
|
154
|
+
sidecar_ok=0
|
|
155
|
+
if command -v curl >/dev/null 2>&1; then
|
|
156
|
+
curl -fsSL --retry 2 -o "$tmp.sha256" "$url.sha256" 2>/dev/null && sidecar_ok=1
|
|
157
|
+
elif command -v wget >/dev/null 2>&1; then
|
|
158
|
+
wget -q -O "$tmp.sha256" "$url.sha256" 2>/dev/null && sidecar_ok=1
|
|
159
|
+
fi
|
|
160
|
+
check_download
|
|
161
|
+
expected=""
|
|
162
|
+
[ "$sidecar_ok" = 1 ] && expected=$(cut -d' ' -f1 < "$tmp.sha256")
|
|
163
|
+
actual=""
|
|
164
|
+
if command -v shasum >/dev/null 2>&1; then
|
|
165
|
+
if digest=$(shasum -a 256 "$tmp" 2>/dev/null); then actual=${digest%% *}; fi
|
|
166
|
+
elif command -v sha256sum >/dev/null 2>&1; then
|
|
167
|
+
if digest=$(sha256sum "$tmp" 2>/dev/null); then actual=${digest%% *}; fi
|
|
168
|
+
fi
|
|
169
|
+
check_download
|
|
170
|
+
rm -f "$tmp.sha256"
|
|
171
|
+
if [ -z "$expected" ] || [ -z "$actual" ]; then
|
|
172
|
+
rm -f "$tmp"
|
|
173
|
+
echo "impeccable: cannot verify $url against $url.sha256 (sidecar unavailable or hashing failed); refusing the unverified download" >&2
|
|
174
|
+
exit 127
|
|
175
|
+
fi
|
|
176
|
+
if [ "$actual" != "$expected" ]; then
|
|
177
|
+
rm -f "$tmp"
|
|
178
|
+
echo "impeccable: checksum mismatch downloading $url" >&2
|
|
179
|
+
exit 127
|
|
180
|
+
fi
|
|
181
|
+
check_download
|
|
182
|
+
if ! chmod +x "$tmp" 2>/dev/null; then
|
|
183
|
+
check_download
|
|
184
|
+
rm -f "$tmp"
|
|
185
|
+
echo "impeccable: could not make the verified download executable: $url" >&2
|
|
186
|
+
exit 127
|
|
187
|
+
fi
|
|
188
|
+
check_download
|
|
189
|
+
if ! mv -f "$tmp" "$cached" 2>/dev/null; then
|
|
190
|
+
check_download
|
|
191
|
+
rm -f "$tmp"
|
|
192
|
+
echo "impeccable: could not cache the verified download: $url" >&2
|
|
193
|
+
exit 127
|
|
194
|
+
fi
|
|
195
|
+
check_download "$cached"
|
|
196
|
+
exec "$cached" "$@"
|
|
197
|
+
fi
|
|
198
|
+
rm -f "$tmp" 2>/dev/null
|
|
199
|
+
echo "impeccable: could not download engine $version from $url; check network access, the release URL, and curl or wget availability." >&2
|
|
200
|
+
setup_help
|
|
201
|
+
exit 127
|
|
202
|
+
fi
|
|
203
|
+
|
|
204
|
+
echo "impeccable: no engine binary for $os-$arch found (looked in $bin, $cached, PATH)." >&2
|
|
205
|
+
echo "Download impeccable-$os-$arch from https://github.com/pbakaus/impeccable/releases (tag engine-v$version) into $cache_root/bin/$version/impeccable$exe (then chmod +x), or set IMPECCABLE_BIN to a preinstalled engine binary. Docs: https://impeccable.style" >&2
|
|
206
|
+
exit 127
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
@echo off
|
|
2
|
+
setlocal
|
|
3
|
+
rem Impeccable launcher (Windows). Runs bin\windows-<arch>\impeccable.exe next
|
|
4
|
+
rem to this file, else a cached or freshly downloaded engine binary.
|
|
5
|
+
rem
|
|
6
|
+
rem Structure notes (this file is exercised by dry parsing and string-level
|
|
7
|
+
rem tests, not yet on a real Windows machine):
|
|
8
|
+
rem - No multi-line parenthesized blocks: cmd expands %var% at block parse
|
|
9
|
+
rem time, which made the old download path read back empty %url%/%cached%.
|
|
10
|
+
rem Linear goto flow keeps every expansion on its own line, and avoids
|
|
11
|
+
rem delayed expansion eating ! characters in user arguments.
|
|
12
|
+
rem - The unversioned user binary and the PATH candidate are validated with
|
|
13
|
+
rem the engine-probe handshake (see :probe) so the retired 3.x npm CLI,
|
|
14
|
+
rem whose bin is also named impeccable, is never exec'd. IMPECCABLE_BIN,
|
|
15
|
+
rem the sibling binary, and the version-pinned cache stay trusted.
|
|
16
|
+
rem - Downloads are verified against the .sha256 sidecar via certutil and
|
|
17
|
+
rem fail closed: a missing sidecar or hash tool refuses the download. On
|
|
18
|
+
rem ARM64 the arm64 asset is tried first and the x64 asset is the
|
|
19
|
+
rem fallback (Windows on ARM runs x64 binaries).
|
|
20
|
+
if not defined IMPECCABLE_SKILL_DIR set "IMPECCABLE_SKILL_DIR=%~dp0.."
|
|
21
|
+
if not defined IMPECCABLE_SELF set "IMPECCABLE_SELF=%~f0"
|
|
22
|
+
set "arch=x64"
|
|
23
|
+
if /I "%PROCESSOR_ARCHITECTURE%"=="ARM64" set "arch=arm64"
|
|
24
|
+
|
|
25
|
+
if not defined IMPECCABLE_BIN goto no_env_bin
|
|
26
|
+
if not exist "%IMPECCABLE_BIN%" goto no_env_bin
|
|
27
|
+
set "run=%IMPECCABLE_BIN%"
|
|
28
|
+
goto run
|
|
29
|
+
:no_env_bin
|
|
30
|
+
|
|
31
|
+
set "bin=%~dp0bin\windows-%arch%\impeccable.exe"
|
|
32
|
+
if not exist "%bin%" goto no_sibling
|
|
33
|
+
set "run=%bin%"
|
|
34
|
+
goto run
|
|
35
|
+
:no_sibling
|
|
36
|
+
|
|
37
|
+
set "home_bin=%USERPROFILE%\.impeccable\bin\impeccable.exe"
|
|
38
|
+
if not exist "%home_bin%" goto no_home_bin
|
|
39
|
+
if defined IMPECCABLE_LAUNCHER_PROBE goto no_home_bin
|
|
40
|
+
call :probe "%home_bin%"
|
|
41
|
+
if not "%probe_ok%"=="1" goto no_home_bin
|
|
42
|
+
set "run=%home_bin%"
|
|
43
|
+
goto run
|
|
44
|
+
:no_home_bin
|
|
45
|
+
|
|
46
|
+
set "version="
|
|
47
|
+
if exist "%~dp0VERSION" set /p version=<"%~dp0VERSION"
|
|
48
|
+
if not defined IMPECCABLE_HOME set "IMPECCABLE_HOME=%USERPROFILE%\.impeccable"
|
|
49
|
+
set "cached=%IMPECCABLE_HOME%\bin\%version%\impeccable.exe"
|
|
50
|
+
if not defined version goto no_cache
|
|
51
|
+
if not exist "%cached%" goto no_cache
|
|
52
|
+
set "run=%cached%"
|
|
53
|
+
goto run
|
|
54
|
+
:no_cache
|
|
55
|
+
|
|
56
|
+
if defined IMPECCABLE_LAUNCHER_PROBE goto download
|
|
57
|
+
where impeccable >nul 2>nul
|
|
58
|
+
if errorlevel 1 goto download
|
|
59
|
+
call :probe impeccable
|
|
60
|
+
if not "%probe_ok%"=="1" goto download
|
|
61
|
+
impeccable %*
|
|
62
|
+
exit /b
|
|
63
|
+
|
|
64
|
+
:download
|
|
65
|
+
rem Last resort: fetch this version's binary from the release channel into
|
|
66
|
+
rem the version-pinned user cache, verify it, then run it. Never inside
|
|
67
|
+
rem another launcher's probe: fail fast and quiet instead.
|
|
68
|
+
if defined IMPECCABLE_LAUNCHER_PROBE exit /b 127
|
|
69
|
+
if not defined version goto fail
|
|
70
|
+
where curl.exe >nul 2>nul
|
|
71
|
+
if errorlevel 1 goto curl_missing
|
|
72
|
+
if not defined IMPECCABLE_DOWNLOAD_BASE set "IMPECCABLE_DOWNLOAD_BASE=https://github.com/pbakaus/impeccable/releases/download"
|
|
73
|
+
if exist "%IMPECCABLE_HOME%\bin\%version%\" goto cache_ready
|
|
74
|
+
mkdir "%IMPECCABLE_HOME%\bin\%version%" >nul 2>nul
|
|
75
|
+
if errorlevel 1 goto cache_directory_failed
|
|
76
|
+
:cache_ready
|
|
77
|
+
rem Check the staging file too: an existing directory may be read-only.
|
|
78
|
+
rem Redirection failures do not reliably update ERRORLEVEL in cmd.exe;
|
|
79
|
+
rem branch on the command's failure directly. Never treat a directory as a
|
|
80
|
+
rem staging file (later del cleanup would prompt to delete its contents).
|
|
81
|
+
if exist "%cached%.part\" goto cache_write_failed
|
|
82
|
+
(type nul >"%cached%.part") 2>nul || goto cache_write_failed
|
|
83
|
+
set "asset=impeccable-windows-%arch%.exe"
|
|
84
|
+
set "url=%IMPECCABLE_DOWNLOAD_BASE%/engine-v%version%/%asset%"
|
|
85
|
+
curl.exe -fsSL -o "%cached%.part" "%url%" >nul 2>nul
|
|
86
|
+
if not errorlevel 1 goto verify
|
|
87
|
+
if not "%arch%"=="arm64" goto download_failed
|
|
88
|
+
set "asset=impeccable-windows-x64.exe"
|
|
89
|
+
set "url=%IMPECCABLE_DOWNLOAD_BASE%/engine-v%version%/%asset%"
|
|
90
|
+
curl.exe -fsSL -o "%cached%.part" "%url%" >nul 2>nul
|
|
91
|
+
if errorlevel 1 goto download_failed
|
|
92
|
+
|
|
93
|
+
:verify
|
|
94
|
+
call :check_download
|
|
95
|
+
if errorlevel 1 exit /b 127
|
|
96
|
+
rem Mirrors the sh launcher and fails closed: a freshly downloaded binary
|
|
97
|
+
rem runs only after verifying against its .sha256 sidecar. A sidecar that
|
|
98
|
+
rem cannot be fetched, or an empty certutil result, refuses the download
|
|
99
|
+
rem instead of running an unverified binary.
|
|
100
|
+
curl.exe -fsSL -o "%cached%.sha256" "%url%.sha256" >nul 2>nul
|
|
101
|
+
if errorlevel 1 goto verify_refuse
|
|
102
|
+
set "expected="
|
|
103
|
+
set /p expected=<"%cached%.sha256"
|
|
104
|
+
for /f "tokens=1" %%h in ("%expected%") do set "expected=%%h"
|
|
105
|
+
call :check_download
|
|
106
|
+
if errorlevel 1 exit /b 127
|
|
107
|
+
set "actual="
|
|
108
|
+
rem Reuse the sidecar staging file after reading expected. Check certutil's
|
|
109
|
+
rem status before parsing: its error text on stdout is not a digest.
|
|
110
|
+
certutil -hashfile "%cached%.part" SHA256 >"%cached%.sha256" 2>nul
|
|
111
|
+
if errorlevel 1 goto verify_refuse
|
|
112
|
+
call :check_download
|
|
113
|
+
if errorlevel 1 exit /b 127
|
|
114
|
+
for /f "usebackq skip=1 delims=" %%h in ("%cached%.sha256") do if not defined actual set "actual=%%h"
|
|
115
|
+
del "%cached%.sha256" >nul 2>nul
|
|
116
|
+
if not defined expected goto verify_refuse
|
|
117
|
+
if not defined actual goto verify_refuse
|
|
118
|
+
set "actual=%actual: =%"
|
|
119
|
+
if /I "%actual%"=="%expected%" goto place
|
|
120
|
+
del "%cached%.part" >nul 2>nul
|
|
121
|
+
echo impeccable: checksum mismatch downloading %url% 1>&2
|
|
122
|
+
exit /b 127
|
|
123
|
+
|
|
124
|
+
:verify_refuse
|
|
125
|
+
call :check_download
|
|
126
|
+
if errorlevel 1 exit /b 127
|
|
127
|
+
del "%cached%.part" >nul 2>nul
|
|
128
|
+
del "%cached%.sha256" >nul 2>nul
|
|
129
|
+
echo impeccable: cannot verify %url% against %url%.sha256; refusing the unverified download 1>&2
|
|
130
|
+
exit /b 127
|
|
131
|
+
|
|
132
|
+
:check_download
|
|
133
|
+
set "download_file=%~1"
|
|
134
|
+
if not defined download_file set "download_file=%cached%.part"
|
|
135
|
+
if not exist "%download_file%" goto download_missing
|
|
136
|
+
for %%f in ("%download_file%") do if %%~zf==0 goto download_empty
|
|
137
|
+
exit /b 0
|
|
138
|
+
|
|
139
|
+
:download_missing
|
|
140
|
+
del "%cached%.sha256" >nul 2>nul
|
|
141
|
+
echo impeccable: download completed but the file was removed before execution: %url%; check your antivirus quarantine or logs. Refusing to continue; do not disable protection. 1>&2
|
|
142
|
+
exit /b 127
|
|
143
|
+
|
|
144
|
+
:download_empty
|
|
145
|
+
del "%download_file%" >nul 2>nul
|
|
146
|
+
del "%cached%.sha256" >nul 2>nul
|
|
147
|
+
echo impeccable: downloaded file is empty: %url%; refusing the unverified download 1>&2
|
|
148
|
+
exit /b 127
|
|
149
|
+
|
|
150
|
+
:place
|
|
151
|
+
call :check_download
|
|
152
|
+
if errorlevel 1 exit /b 127
|
|
153
|
+
move /y "%cached%.part" "%cached%" >nul 2>nul
|
|
154
|
+
if errorlevel 1 goto place_failed
|
|
155
|
+
call :check_download "%cached%"
|
|
156
|
+
if errorlevel 1 exit /b 127
|
|
157
|
+
set "run=%cached%"
|
|
158
|
+
goto run
|
|
159
|
+
|
|
160
|
+
:place_failed
|
|
161
|
+
call :check_download
|
|
162
|
+
if errorlevel 1 exit /b 127
|
|
163
|
+
del "%cached%.part" >nul 2>nul
|
|
164
|
+
echo impeccable: could not cache the verified download: %url% 1>&2
|
|
165
|
+
exit /b 127
|
|
166
|
+
|
|
167
|
+
:run
|
|
168
|
+
"%run%" %*
|
|
169
|
+
exit /b
|
|
170
|
+
|
|
171
|
+
:probe
|
|
172
|
+
rem Sets probe_ok=1 when %1 answers the engine handshake: prints
|
|
173
|
+
rem "impeccable-engine <version>" and exits 0. The 3.x npm CLI answers any
|
|
174
|
+
rem unknown verb with "Unknown command", exit 1, so it never passes.
|
|
175
|
+
set "probe_ok="
|
|
176
|
+
set "probe_tmp=%TEMP%\impeccable-probe-%RANDOM%%RANDOM%.txt"
|
|
177
|
+
set "IMPECCABLE_LAUNCHER_PROBE=1"
|
|
178
|
+
"%~1" engine-probe >"%probe_tmp%" 2>nul
|
|
179
|
+
set "probe_err=%ERRORLEVEL%"
|
|
180
|
+
set "IMPECCABLE_LAUNCHER_PROBE="
|
|
181
|
+
if not "%probe_err%"=="0" goto probe_done
|
|
182
|
+
findstr /b /c:"impeccable-engine" "%probe_tmp%" >nul 2>nul
|
|
183
|
+
if not errorlevel 1 set "probe_ok=1"
|
|
184
|
+
:probe_done
|
|
185
|
+
del "%probe_tmp%" >nul 2>nul
|
|
186
|
+
exit /b 0
|
|
187
|
+
|
|
188
|
+
:cache_directory_failed
|
|
189
|
+
echo impeccable: engine %version% is not installed; cannot create cache directory: "%IMPECCABLE_HOME%\bin\%version%" 1>&2
|
|
190
|
+
goto setup_failed
|
|
191
|
+
|
|
192
|
+
:cache_write_failed
|
|
193
|
+
echo impeccable: engine %version% is not installed; cannot write to cache directory: "%IMPECCABLE_HOME%\bin\%version%" 1>&2
|
|
194
|
+
goto setup_failed
|
|
195
|
+
|
|
196
|
+
:curl_missing
|
|
197
|
+
echo impeccable: cannot download engine %version%; curl.exe is unavailable. 1>&2
|
|
198
|
+
goto setup_failed
|
|
199
|
+
|
|
200
|
+
:download_failed
|
|
201
|
+
del "%cached%.part" >nul 2>nul
|
|
202
|
+
echo impeccable: could not download engine %version% from %url%; check network access and the release URL. 1>&2
|
|
203
|
+
|
|
204
|
+
:setup_failed
|
|
205
|
+
echo Engine %version% setup needs network access and write permission to "%IMPECCABLE_HOME%\bin\%version%". 1>&2
|
|
206
|
+
echo Run this launcher ("%~f0") with engine-probe in a terminal that has those permissions, then retry the original command. 1>&2
|
|
207
|
+
echo Alternatively, set IMPECCABLE_HOME to a writable cache location, or IMPECCABLE_BIN to a preinstalled engine binary. 1>&2
|
|
208
|
+
exit /b 127
|
|
209
|
+
|
|
210
|
+
:fail
|
|
211
|
+
del "%cached%.part" >nul 2>nul
|
|
212
|
+
echo impeccable: no engine binary found (looked in %bin%, %cached%, PATH). 1>&2
|
|
213
|
+
echo Download impeccable-windows-%arch%.exe from https://github.com/pbakaus/impeccable/releases (tag engine-v%version%) and save it as %cached%, or set IMPECCABLE_BIN to a preinstalled engine binary. Docs: https://impeccable.style 1>&2
|
|
214
|
+
exit /b 127
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-side DOM helpers for Impeccable live mode.
|
|
3
|
+
*
|
|
4
|
+
* Kept separate from live-browser.js so future browser script parts can share
|
|
5
|
+
* chrome mounting, lookup, focus, and picker helpers without depending on the
|
|
6
|
+
* full overlay UI bundle.
|
|
7
|
+
*/
|
|
8
|
+
(function (root) {
|
|
9
|
+
'use strict';
|
|
10
|
+
if (!root) return;
|
|
11
|
+
|
|
12
|
+
function createLiveBrowserDomHelpers({
|
|
13
|
+
prefix,
|
|
14
|
+
skipTags,
|
|
15
|
+
document: doc = root.document,
|
|
16
|
+
css = root.CSS,
|
|
17
|
+
crypto = root.crypto,
|
|
18
|
+
} = {}) {
|
|
19
|
+
if (!prefix) throw new Error('prefix required');
|
|
20
|
+
if (!doc) throw new Error('document required');
|
|
21
|
+
const tagsToSkip = skipTags || new Set();
|
|
22
|
+
|
|
23
|
+
function own(el) {
|
|
24
|
+
return el && (el.id?.startsWith(prefix) || el.closest?.('[id^="' + prefix + '"]'));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function pickable(el) {
|
|
28
|
+
if (!el || el.nodeType !== 1) return false;
|
|
29
|
+
if (tagsToSkip.has(String(el.tagName || '').toLowerCase())) return false;
|
|
30
|
+
if (own(el)) return false;
|
|
31
|
+
const r = el.getBoundingClientRect();
|
|
32
|
+
return r.width >= 20 && r.height >= 20;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function desc(el) {
|
|
36
|
+
if (!el) return '';
|
|
37
|
+
let s = el.tagName.toLowerCase();
|
|
38
|
+
if (el.id) s += '#' + el.id;
|
|
39
|
+
else if (el.classList.length) s += '.' + [...el.classList].slice(0, 2).join('.');
|
|
40
|
+
return s;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function rectIsUsableAnchor(rect) {
|
|
44
|
+
return !!rect && rect.width > 0.5 && rect.height > 0.5;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function makeFrozenAnchor(el) {
|
|
48
|
+
if (!el || !el.getBoundingClientRect) return null;
|
|
49
|
+
const r = el.getBoundingClientRect();
|
|
50
|
+
if (!rectIsUsableAnchor(r)) return null;
|
|
51
|
+
const rect = {
|
|
52
|
+
x: r.x, y: r.y,
|
|
53
|
+
top: r.top, left: r.left,
|
|
54
|
+
right: r.right, bottom: r.bottom,
|
|
55
|
+
width: r.width, height: r.height,
|
|
56
|
+
};
|
|
57
|
+
return {
|
|
58
|
+
__impeccableFrozenAnchor: true,
|
|
59
|
+
tagName: el.tagName || 'DIV',
|
|
60
|
+
id: el.id || '',
|
|
61
|
+
classList: el.classList ? [...el.classList] : [],
|
|
62
|
+
hasAttribute: () => false,
|
|
63
|
+
getBoundingClientRect: () => rect,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function hasFrameworkHmrOwnership(el) {
|
|
68
|
+
for (let node = el; node; node = node.parentElement) {
|
|
69
|
+
let keys = [];
|
|
70
|
+
try { keys = Object.getOwnPropertyNames(node); } catch {}
|
|
71
|
+
if (keys.some((key) => (
|
|
72
|
+
key.startsWith('__reactFiber$')
|
|
73
|
+
|| key.startsWith('__reactProps$')
|
|
74
|
+
|| key.startsWith('__reactContainer$')
|
|
75
|
+
|| key === '_reactRootContainer'
|
|
76
|
+
|| key === '__vueParentComponent'
|
|
77
|
+
|| key === '__vue_app__'
|
|
78
|
+
|| key === '__vnode'
|
|
79
|
+
|| key === '__svelte_meta'
|
|
80
|
+
))) {
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function id8() {
|
|
88
|
+
if (crypto?.randomUUID) return crypto.randomUUID().replace(/-/g, '').slice(0, 8);
|
|
89
|
+
return (Math.random().toString(16).slice(2) + Date.now().toString(16)).slice(0, 8);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function cssId(id) {
|
|
93
|
+
if (css?.escape) return css.escape(id);
|
|
94
|
+
return String(id).replace(/([ !"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, '\\$1');
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function liveUiRoot() {
|
|
98
|
+
const uiRoot = root.__IMPECCABLE_LIVE_UI_ROOT__;
|
|
99
|
+
if (uiRoot && typeof uiRoot.appendChild === 'function') return uiRoot;
|
|
100
|
+
return doc.body;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function uiAppend(el) {
|
|
104
|
+
liveUiRoot().appendChild(el);
|
|
105
|
+
return el;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function uiAppendStyle(styleEl) {
|
|
109
|
+
const uiRoot = liveUiRoot();
|
|
110
|
+
if (uiRoot && uiRoot !== doc.body) uiRoot.appendChild(styleEl);
|
|
111
|
+
else doc.head.appendChild(styleEl);
|
|
112
|
+
return styleEl;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function uiGetById(id) {
|
|
116
|
+
const uiRoot = liveUiRoot();
|
|
117
|
+
if (uiRoot?.getElementById) {
|
|
118
|
+
const found = uiRoot.getElementById(id);
|
|
119
|
+
if (found) return found;
|
|
120
|
+
}
|
|
121
|
+
if (uiRoot?.querySelector) {
|
|
122
|
+
const found = uiRoot.querySelector('#' + cssId(id));
|
|
123
|
+
if (found) return found;
|
|
124
|
+
}
|
|
125
|
+
return doc.getElementById(id);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function activeElementDeep() {
|
|
129
|
+
let active = doc.activeElement;
|
|
130
|
+
while (active?.shadowRoot?.activeElement) active = active.shadowRoot.activeElement;
|
|
131
|
+
return active;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function defangOutsideHandlers(rootEl, { setPointerEvents = true } = {}) {
|
|
135
|
+
if (!rootEl) return;
|
|
136
|
+
if (setPointerEvents) {
|
|
137
|
+
rootEl.style.setProperty('pointer-events', 'auto', 'important');
|
|
138
|
+
}
|
|
139
|
+
const stop = (e) => e.stopPropagation();
|
|
140
|
+
rootEl.addEventListener('pointerdown', stop);
|
|
141
|
+
rootEl.addEventListener('mousedown', stop);
|
|
142
|
+
rootEl.addEventListener('focusin', stop);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return {
|
|
146
|
+
own,
|
|
147
|
+
pickable,
|
|
148
|
+
desc,
|
|
149
|
+
rectIsUsableAnchor,
|
|
150
|
+
makeFrozenAnchor,
|
|
151
|
+
hasFrameworkHmrOwnership,
|
|
152
|
+
id8,
|
|
153
|
+
cssId,
|
|
154
|
+
liveUiRoot,
|
|
155
|
+
uiAppend,
|
|
156
|
+
uiAppendStyle,
|
|
157
|
+
uiGetById,
|
|
158
|
+
activeElementDeep,
|
|
159
|
+
defangOutsideHandlers,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
root.__IMPECCABLE_LIVE_DOM__ = {
|
|
164
|
+
version: 1,
|
|
165
|
+
createLiveBrowserDomHelpers,
|
|
166
|
+
};
|
|
167
|
+
})(typeof window !== 'undefined' ? window : globalThis);
|