@liaozhi/dsh-post-gen 0.1.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/LICENSE +21 -0
- package/README.md +50 -0
- package/assets/skills/poster-1960s-advertising/SKILL.md +20 -0
- package/assets/skills/poster-1960s-advertising/previews/1.jpg +0 -0
- package/assets/skills/poster-1960s-advertising/previews/2.jpg +0 -0
- package/assets/skills/poster-3d-cartoon-character/SKILL.md +20 -0
- package/assets/skills/poster-3d-cartoon-character/previews/1.jpg +0 -0
- package/assets/skills/poster-3d-cartoon-character/previews/2.jpg +0 -0
- package/assets/skills/poster-3d-cartoon-character/previews/3.jpg +0 -0
- package/assets/skills/poster-3d-cartoon-character/previews/4.jpg +0 -0
- package/assets/skills/poster-3d-fridge-magnets/SKILL.md +18 -0
- package/assets/skills/poster-3d-fridge-magnets/previews/1.jpg +0 -0
- package/assets/skills/poster-3d-fridge-magnets/previews/2.jpg +0 -0
- package/assets/skills/poster-3d-fridge-magnets/previews/3.jpg +0 -0
- package/assets/skills/poster-3d-fridge-magnets/previews/4.jpg +0 -0
- package/assets/skills/poster-3d-typographic-sculpture/SKILL.md +28 -0
- package/assets/skills/poster-3d-typographic-sculpture/previews/1.jpg +0 -0
- package/assets/skills/poster-3d-typographic-sculpture/previews/2.jpg +0 -0
- package/assets/skills/poster-3d-typographic-sculpture/previews/3.jpg +0 -0
- package/assets/skills/poster-3d-typographic-sculpture/previews/4.jpg +0 -0
- package/assets/skills/poster-aerial-minimal-solitude/SKILL.md +20 -0
- package/assets/skills/poster-aerial-minimal-solitude/previews/1.jpg +0 -0
- package/assets/skills/poster-aerial-minimal-solitude/previews/2.jpg +0 -0
- package/assets/skills/poster-anime-logo/SKILL.md +20 -0
- package/assets/skills/poster-anime-logo/previews/1.jpg +0 -0
- package/assets/skills/poster-anime-logo/previews/2.jpg +0 -0
- package/assets/skills/poster-ar-hologram-retail/SKILL.md +22 -0
- package/assets/skills/poster-ar-hologram-retail/previews/1.jpg +0 -0
- package/assets/skills/poster-ar-hologram-retail/previews/2.jpg +0 -0
- package/assets/skills/poster-ar-hologram-retail/previews/3.jpg +0 -0
- package/assets/skills/poster-ar-hologram-retail/previews/4.jpg +0 -0
- package/assets/skills/poster-beverage-splash/SKILL.md +20 -0
- package/assets/skills/poster-beverage-splash/previews/1.jpg +0 -0
- package/assets/skills/poster-beverage-splash/previews/2.jpg +0 -0
- package/assets/skills/poster-beverage-splash/previews/3.jpg +0 -0
- package/assets/skills/poster-beverage-splash/previews/4.jpg +0 -0
- package/assets/skills/poster-birdseye-hatch-print/SKILL.md +24 -0
- package/assets/skills/poster-birdseye-hatch-print/previews/1.jpg +0 -0
- package/assets/skills/poster-birdseye-hatch-print/previews/2.jpg +0 -0
- package/assets/skills/poster-blind-emboss-minimal/SKILL.md +22 -0
- package/assets/skills/poster-blind-emboss-minimal/previews/1.jpg +0 -0
- package/assets/skills/poster-blind-emboss-minimal/previews/2.jpg +0 -0
- package/assets/skills/poster-blueprint-diorama-workshop/SKILL.md +24 -0
- package/assets/skills/poster-blueprint-diorama-workshop/previews/1.jpg +0 -0
- package/assets/skills/poster-blueprint-diorama-workshop/previews/2.jpg +0 -0
- package/assets/skills/poster-blueprint-infographic/SKILL.md +20 -0
- package/assets/skills/poster-blueprint-infographic/previews/1.jpg +0 -0
- package/assets/skills/poster-blueprint-infographic/previews/2.jpg +0 -0
- package/assets/skills/poster-blueprint-infographic/previews/3.jpg +0 -0
- package/assets/skills/poster-boardingpass-portal/SKILL.md +22 -0
- package/assets/skills/poster-boardingpass-portal/previews/1.jpg +0 -0
- package/assets/skills/poster-boardingpass-portal/previews/2.jpg +0 -0
- package/assets/skills/poster-boardingpass-portal/previews/3.jpg +0 -0
- package/assets/skills/poster-boardingpass-portal/previews/4.jpg +0 -0
- package/assets/skills/poster-botanical-papercollage/SKILL.md +34 -0
- package/assets/skills/poster-botanical-papercollage/previews/1.jpg +0 -0
- package/assets/skills/poster-botanical-papercollage/previews/2.jpg +0 -0
- package/assets/skills/poster-botanical-papercollage/previews/3.jpg +0 -0
- package/assets/skills/poster-botanical-papercollage/previews/4.jpg +0 -0
- package/assets/skills/poster-brand-guideline-board/SKILL.md +38 -0
- package/assets/skills/poster-brand-guideline-board/previews/1.jpg +0 -0
- package/assets/skills/poster-brand-guideline-board/previews/2.jpg +0 -0
- package/assets/skills/poster-children-illustration/SKILL.md +20 -0
- package/assets/skills/poster-children-illustration/previews/1.jpg +0 -0
- package/assets/skills/poster-children-illustration/previews/2.jpg +0 -0
- package/assets/skills/poster-children-illustration/previews/3.jpg +0 -0
- package/assets/skills/poster-children-illustration/previews/4.jpg +0 -0
- package/assets/skills/poster-cinematic-letter-panels/SKILL.md +26 -0
- package/assets/skills/poster-cinematic-letter-panels/previews/1.jpg +0 -0
- package/assets/skills/poster-cinematic-letter-panels/previews/2.jpg +0 -0
- package/assets/skills/poster-cinematic-letter-panels/previews/3.jpg +0 -0
- package/assets/skills/poster-cinematic-letter-panels/previews/4.jpg +0 -0
- package/assets/skills/poster-cinematic-travel/SKILL.md +24 -0
- package/assets/skills/poster-cinematic-travel/previews/1.jpg +0 -0
- package/assets/skills/poster-cinematic-travel/previews/2.jpg +0 -0
- package/assets/skills/poster-cinematic-travel/previews/3.jpg +0 -0
- package/assets/skills/poster-cinematic-travel/previews/4.jpg +0 -0
- package/assets/skills/poster-city-aerial-night/SKILL.md +22 -0
- package/assets/skills/poster-city-aerial-night/previews/1.jpg +0 -0
- package/assets/skills/poster-city-aerial-night/previews/2.jpg +0 -0
- package/assets/skills/poster-city-aerial-night/previews/3.jpg +0 -0
- package/assets/skills/poster-city-aerial-night/previews/4.jpg +0 -0
- package/assets/skills/poster-city-discovery-infographic/SKILL.md +28 -0
- package/assets/skills/poster-city-discovery-infographic/previews/1.jpg +0 -0
- package/assets/skills/poster-city-discovery-infographic/previews/2.jpg +0 -0
- package/assets/skills/poster-city-discovery-infographic/previews/3.jpg +0 -0
- package/assets/skills/poster-city-discovery-infographic/previews/4.jpg +0 -0
- package/assets/skills/poster-city-infographic-editorial/SKILL.md +26 -0
- package/assets/skills/poster-city-infographic-editorial/previews/1.jpg +0 -0
- package/assets/skills/poster-city-infographic-editorial/previews/2.jpg +0 -0
- package/assets/skills/poster-city-infographic-editorial/previews/3.jpg +0 -0
- package/assets/skills/poster-city-infographic-editorial/previews/4.jpg +0 -0
- package/assets/skills/poster-city-window/SKILL.md +22 -0
- package/assets/skills/poster-city-window/previews/1.jpg +0 -0
- package/assets/skills/poster-city-window/previews/2.jpg +0 -0
- package/assets/skills/poster-city-window/previews/3.jpg +0 -0
- package/assets/skills/poster-city-window/previews/4.jpg +0 -0
- package/assets/skills/poster-collectible-toy/SKILL.md +20 -0
- package/assets/skills/poster-collectible-toy/previews/1.jpg +0 -0
- package/assets/skills/poster-collectible-toy/previews/2.jpg +0 -0
- package/assets/skills/poster-collectible-toy/previews/3.jpg +0 -0
- package/assets/skills/poster-collectible-toy/previews/4.jpg +0 -0
- package/assets/skills/poster-comic-portal/SKILL.md +20 -0
- package/assets/skills/poster-comic-portal/previews/1.jpg +0 -0
- package/assets/skills/poster-comic-portal/previews/2.jpg +0 -0
- package/assets/skills/poster-comic-portal/previews/3.jpg +0 -0
- package/assets/skills/poster-comic-portal/previews/4.jpg +0 -0
- package/assets/skills/poster-comic-style-page/SKILL.md +22 -0
- package/assets/skills/poster-comic-style-page/previews/1.jpg +0 -0
- package/assets/skills/poster-comic-style-page/previews/2.jpg +0 -0
- package/assets/skills/poster-commemorative-coin/SKILL.md +20 -0
- package/assets/skills/poster-commemorative-coin/previews/1.jpg +0 -0
- package/assets/skills/poster-corkboard-moodboard/SKILL.md +22 -0
- package/assets/skills/poster-corkboard-moodboard/previews/1.jpg +0 -0
- package/assets/skills/poster-corkboard-moodboard/previews/2.jpg +0 -0
- package/assets/skills/poster-country-cuisine/SKILL.md +22 -0
- package/assets/skills/poster-country-cuisine/previews/1.jpg +0 -0
- package/assets/skills/poster-country-cuisine/previews/2.jpg +0 -0
- package/assets/skills/poster-country-cuisine/previews/3.jpg +0 -0
- package/assets/skills/poster-country-cuisine/previews/4.jpg +0 -0
- package/assets/skills/poster-country-identity/SKILL.md +22 -0
- package/assets/skills/poster-country-identity/previews/1.jpg +0 -0
- package/assets/skills/poster-country-identity/previews/2.jpg +0 -0
- package/assets/skills/poster-country-identity/previews/3.jpg +0 -0
- package/assets/skills/poster-country-identity/previews/4.jpg +0 -0
- package/assets/skills/poster-crayon-kids/SKILL.md +22 -0
- package/assets/skills/poster-crayon-kids/previews/1.jpg +0 -0
- package/assets/skills/poster-crayon-kids/previews/2.jpg +0 -0
- package/assets/skills/poster-cup-surreal-world/SKILL.md +22 -0
- package/assets/skills/poster-cup-surreal-world/previews/1.jpg +0 -0
- package/assets/skills/poster-cup-surreal-world/previews/2.jpg +0 -0
- package/assets/skills/poster-cup-surreal-world/previews/3.jpg +0 -0
- package/assets/skills/poster-cup-surreal-world/previews/4.jpg +0 -0
- package/assets/skills/poster-dessert-food/SKILL.md +22 -0
- package/assets/skills/poster-dessert-food/previews/1.jpg +0 -0
- package/assets/skills/poster-dessert-food/previews/2.jpg +0 -0
- package/assets/skills/poster-dessert-food/previews/3.jpg +0 -0
- package/assets/skills/poster-diecut-sticker-collage/SKILL.md +24 -0
- package/assets/skills/poster-diecut-sticker-collage/previews/1.jpg +0 -0
- package/assets/skills/poster-diecut-sticker-collage/previews/2.jpg +0 -0
- package/assets/skills/poster-digicam-nostalgia/SKILL.md +20 -0
- package/assets/skills/poster-digicam-nostalgia/previews/1.jpg +0 -0
- package/assets/skills/poster-digicam-nostalgia/previews/2.jpg +0 -0
- package/assets/skills/poster-doodle-product-speech-bubble/SKILL.md +22 -0
- package/assets/skills/poster-doodle-product-speech-bubble/previews/1.jpg +0 -0
- package/assets/skills/poster-doodle-product-speech-bubble/previews/2.jpg +0 -0
- package/assets/skills/poster-doodle-product-speech-bubble/previews/3.jpg +0 -0
- package/assets/skills/poster-doodle-product-speech-bubble/previews/4.jpg +0 -0
- package/assets/skills/poster-doodle-product-world/SKILL.md +22 -0
- package/assets/skills/poster-doodle-product-world/previews/1.jpg +0 -0
- package/assets/skills/poster-doodle-product-world/previews/2.jpg +0 -0
- package/assets/skills/poster-doodle-product-world/previews/3.jpg +0 -0
- package/assets/skills/poster-doodle-product-world/previews/4.jpg +0 -0
- package/assets/skills/poster-doodle-reinterpretation/SKILL.md +22 -0
- package/assets/skills/poster-doodle-reinterpretation/previews/1.jpg +0 -0
- package/assets/skills/poster-double-exposure/SKILL.md +22 -0
- package/assets/skills/poster-double-exposure/previews/1.jpg +0 -0
- package/assets/skills/poster-double-exposure/previews/2.jpg +0 -0
- package/assets/skills/poster-dual-half-travel/SKILL.md +18 -0
- package/assets/skills/poster-dual-half-travel/previews/1.jpg +0 -0
- package/assets/skills/poster-dual-half-travel/previews/2.jpg +0 -0
- package/assets/skills/poster-dual-world-watercolor/SKILL.md +22 -0
- package/assets/skills/poster-dual-world-watercolor/previews/1.jpg +0 -0
- package/assets/skills/poster-dual-world-watercolor/previews/2.jpg +0 -0
- package/assets/skills/poster-editorial-travel-illustration/SKILL.md +20 -0
- package/assets/skills/poster-editorial-travel-illustration/previews/1.jpg +0 -0
- package/assets/skills/poster-editorial-travel-illustration/previews/2.jpg +0 -0
- package/assets/skills/poster-editorial-travel-illustration/previews/3.jpg +0 -0
- package/assets/skills/poster-enamel-magnet/SKILL.md +22 -0
- package/assets/skills/poster-enamel-magnet/previews/1.jpg +0 -0
- package/assets/skills/poster-enamel-magnet/previews/2.jpg +0 -0
- package/assets/skills/poster-engraved-contour-ink/SKILL.md +22 -0
- package/assets/skills/poster-engraved-contour-ink/previews/1.jpg +0 -0
- package/assets/skills/poster-engraved-contour-ink/previews/2.jpg +0 -0
- package/assets/skills/poster-fashion-tech-sheet/SKILL.md +22 -0
- package/assets/skills/poster-fashion-tech-sheet/previews/1.jpg +0 -0
- package/assets/skills/poster-felt-diorama/SKILL.md +26 -0
- package/assets/skills/poster-felt-diorama/previews/1.jpg +0 -0
- package/assets/skills/poster-felt-diorama/previews/2.jpg +0 -0
- package/assets/skills/poster-filmstrip-traveler/SKILL.md +24 -0
- package/assets/skills/poster-filmstrip-traveler/previews/1.jpg +0 -0
- package/assets/skills/poster-filmstrip-traveler/previews/2.jpg +0 -0
- package/assets/skills/poster-fireworks-typography/SKILL.md +22 -0
- package/assets/skills/poster-fireworks-typography/previews/1.jpg +0 -0
- package/assets/skills/poster-fireworks-typography/previews/2.jpg +0 -0
- package/assets/skills/poster-fireworks-typography/previews/3.jpg +0 -0
- package/assets/skills/poster-fireworks-typography/previews/4.jpg +0 -0
- package/assets/skills/poster-flat-minimal-travel/SKILL.md +20 -0
- package/assets/skills/poster-flat-minimal-travel/previews/1.jpg +0 -0
- package/assets/skills/poster-flat-minimal-travel/previews/2.jpg +0 -0
- package/assets/skills/poster-flat-minimal-travel/previews/3.jpg +0 -0
- package/assets/skills/poster-flat-minimal-travel/previews/4.jpg +0 -0
- package/assets/skills/poster-floating-island/SKILL.md +20 -0
- package/assets/skills/poster-floating-island/previews/1.jpg +0 -0
- package/assets/skills/poster-floating-island/previews/2.jpg +0 -0
- package/assets/skills/poster-floating-island/previews/3.jpg +0 -0
- package/assets/skills/poster-floating-island/previews/4.jpg +0 -0
- package/assets/skills/poster-folk-flat-illustration/SKILL.md +24 -0
- package/assets/skills/poster-folk-flat-illustration/previews/1.jpg +0 -0
- package/assets/skills/poster-folk-flat-illustration/previews/2.jpg +0 -0
- package/assets/skills/poster-folk-flat-illustration/previews/3.jpg +0 -0
- package/assets/skills/poster-folk-flat-illustration/previews/4.jpg +0 -0
- package/assets/skills/poster-food-flatlay-doodle/SKILL.md +20 -0
- package/assets/skills/poster-food-flatlay-doodle/previews/1.jpg +0 -0
- package/assets/skills/poster-food-flatlay-doodle/previews/2.jpg +0 -0
- package/assets/skills/poster-food-flatlay-doodle/previews/3.jpg +0 -0
- package/assets/skills/poster-food-flatlay-doodle/previews/4.jpg +0 -0
- package/assets/skills/poster-food-hero-splash/SKILL.md +24 -0
- package/assets/skills/poster-food-hero-splash/previews/1.jpg +0 -0
- package/assets/skills/poster-food-hero-splash/previews/2.jpg +0 -0
- package/assets/skills/poster-food-hero-splash/previews/3.jpg +0 -0
- package/assets/skills/poster-food-id-badge/SKILL.md +20 -0
- package/assets/skills/poster-food-id-badge/previews/1.jpg +0 -0
- package/assets/skills/poster-food-id-badge/previews/2.jpg +0 -0
- package/assets/skills/poster-food-id-badge/previews/3.jpg +0 -0
- package/assets/skills/poster-food-id-badge/previews/4.jpg +0 -0
- package/assets/skills/poster-food-infographic/SKILL.md +20 -0
- package/assets/skills/poster-food-infographic/previews/1.jpg +0 -0
- package/assets/skills/poster-food-infographic/previews/2.jpg +0 -0
- package/assets/skills/poster-food-infographic/previews/3.jpg +0 -0
- package/assets/skills/poster-food-infographic/previews/4.jpg +0 -0
- package/assets/skills/poster-food-papercollage/SKILL.md +26 -0
- package/assets/skills/poster-food-papercollage/previews/1.jpg +0 -0
- package/assets/skills/poster-food-papercollage/previews/2.jpg +0 -0
- package/assets/skills/poster-food-papercollage/previews/3.jpg +0 -0
- package/assets/skills/poster-food-papercollage/previews/4.jpg +0 -0
- package/assets/skills/poster-food-postcard-scene/SKILL.md +20 -0
- package/assets/skills/poster-food-postcard-scene/previews/1.jpg +0 -0
- package/assets/skills/poster-food-postcard-scene/previews/2.jpg +0 -0
- package/assets/skills/poster-food-postcard-scene/previews/3.jpg +0 -0
- package/assets/skills/poster-food-postcard-scene/previews/4.jpg +0 -0
- package/assets/skills/poster-forest-fantasy-product/SKILL.md +20 -0
- package/assets/skills/poster-forest-fantasy-product/previews/1.jpg +0 -0
- package/assets/skills/poster-forest-fantasy-product/previews/2.jpg +0 -0
- package/assets/skills/poster-fresh-beverage-ad/SKILL.md +18 -0
- package/assets/skills/poster-fresh-beverage-ad/previews/1.jpg +0 -0
- package/assets/skills/poster-fresh-beverage-ad/previews/2.jpg +0 -0
- package/assets/skills/poster-futuristic-luxury-brand/SKILL.md +24 -0
- package/assets/skills/poster-futuristic-luxury-brand/previews/1.jpg +0 -0
- package/assets/skills/poster-futuristic-luxury-brand/previews/2.jpg +0 -0
- package/assets/skills/poster-futuristic-luxury-brand/previews/3.jpg +0 -0
- package/assets/skills/poster-futuristic-luxury-brand/previews/4.jpg +0 -0
- package/assets/skills/poster-geometric-travel/SKILL.md +20 -0
- package/assets/skills/poster-geometric-travel/previews/1.jpg +0 -0
- package/assets/skills/poster-geometric-travel/previews/2.jpg +0 -0
- package/assets/skills/poster-giant-product-snow/SKILL.md +22 -0
- package/assets/skills/poster-giant-product-snow/previews/1.jpg +0 -0
- package/assets/skills/poster-giant-stamp-diorama/SKILL.md +20 -0
- package/assets/skills/poster-giant-stamp-diorama/previews/1.jpg +0 -0
- package/assets/skills/poster-giant-stamp-diorama/previews/2.jpg +0 -0
- package/assets/skills/poster-giant-stamp-diorama/previews/3.jpg +0 -0
- package/assets/skills/poster-giant-stamp-diorama/previews/4.jpg +0 -0
- package/assets/skills/poster-gouache-travel/SKILL.md +22 -0
- package/assets/skills/poster-gouache-travel/previews/1.jpg +0 -0
- package/assets/skills/poster-gouache-travel/previews/2.jpg +0 -0
- package/assets/skills/poster-gouache-travel/previews/3.jpg +0 -0
- package/assets/skills/poster-gouache-travel/previews/4.jpg +0 -0
- package/assets/skills/poster-handdrawn-doodle/SKILL.md +18 -0
- package/assets/skills/poster-handdrawn-doodle/previews/1.jpg +0 -0
- package/assets/skills/poster-handdrawn-doodle/previews/2.jpg +0 -0
- package/assets/skills/poster-handdrawn-doodle/previews/3.jpg +0 -0
- package/assets/skills/poster-handdrawn-doodle/previews/4.jpg +0 -0
- package/assets/skills/poster-hobby-activity-collage/SKILL.md +22 -0
- package/assets/skills/poster-hobby-activity-collage/previews/1.jpg +0 -0
- package/assets/skills/poster-ice-popsicle/SKILL.md +22 -0
- package/assets/skills/poster-ice-popsicle/previews/1.jpg +0 -0
- package/assets/skills/poster-ice-popsicle/previews/2.jpg +0 -0
- package/assets/skills/poster-ice-popsicle/previews/3.jpg +0 -0
- package/assets/skills/poster-ice-popsicle/previews/4.jpg +0 -0
- package/assets/skills/poster-impasto-painting/SKILL.md +26 -0
- package/assets/skills/poster-impasto-painting/previews/1.jpg +0 -0
- package/assets/skills/poster-impasto-painting/previews/62c9be8a-bcae-4ebf-8ff0-ce1c7809fe00.jpg +0 -0
- package/assets/skills/poster-ink-watercolor-sketch/SKILL.md +26 -0
- package/assets/skills/poster-ink-watercolor-sketch/previews/1.jpg +0 -0
- package/assets/skills/poster-ink-watercolor-sketch/previews/2.jpg +0 -0
- package/assets/skills/poster-instant-photo-collage/SKILL.md +20 -0
- package/assets/skills/poster-instant-photo-collage/previews/1.jpg +0 -0
- package/assets/skills/poster-instant-photo-collage/previews/2.jpg +0 -0
- package/assets/skills/poster-island-map-diorama/SKILL.md +20 -0
- package/assets/skills/poster-island-map-diorama/previews/1.jpg +0 -0
- package/assets/skills/poster-island-map-diorama/previews/2.jpg +0 -0
- package/assets/skills/poster-isometric-floating-world/SKILL.md +22 -0
- package/assets/skills/poster-isometric-floating-world/previews/1.jpg +0 -0
- package/assets/skills/poster-isometric-floating-world/previews/2.jpg +0 -0
- package/assets/skills/poster-isometric-floating-world/previews/3.jpg +0 -0
- package/assets/skills/poster-isometric-floating-world/previews/4.jpg +0 -0
- package/assets/skills/poster-isometric-teardown/SKILL.md +22 -0
- package/assets/skills/poster-isometric-teardown/previews/1.jpg +0 -0
- package/assets/skills/poster-isometric-teardown/previews/2.jpg +0 -0
- package/assets/skills/poster-kraft-sketch/SKILL.md +20 -0
- package/assets/skills/poster-kraft-sketch/previews/1.jpg +0 -0
- package/assets/skills/poster-kraft-sketch/previews/2.jpg +0 -0
- package/assets/skills/poster-kraft-sketch/previews/3.jpg +0 -0
- package/assets/skills/poster-kraft-sketch/previews/4.jpg +0 -0
- package/assets/skills/poster-landmark-collage/SKILL.md +24 -0
- package/assets/skills/poster-landmark-collage/previews/1.jpg +0 -0
- package/assets/skills/poster-landmark-collage/previews/2.jpg +0 -0
- package/assets/skills/poster-landmark-collage/previews/3.jpg +0 -0
- package/assets/skills/poster-layered-papercut-diorama/SKILL.md +27 -0
- package/assets/skills/poster-layered-papercut-diorama/previews/1.jpg +0 -0
- package/assets/skills/poster-layered-papercut-diorama/previews/2.jpg +0 -0
- package/assets/skills/poster-layered-papercut-diorama/previews/3.jpg +0 -0
- package/assets/skills/poster-layered-papercut-diorama/previews/4.jpg +0 -0
- package/assets/skills/poster-logo-glitch-digital/SKILL.md +24 -0
- package/assets/skills/poster-logo-glitch-digital/previews/1.jpg +0 -0
- package/assets/skills/poster-logo-glitch-digital/previews/2.jpg +0 -0
- package/assets/skills/poster-logo-in-sand/SKILL.md +20 -0
- package/assets/skills/poster-logo-in-sand/previews/1.jpg +0 -0
- package/assets/skills/poster-logo-in-sand/previews/2.jpg +0 -0
- package/assets/skills/poster-luxe-postage-stamp/SKILL.md +24 -0
- package/assets/skills/poster-luxe-postage-stamp/previews/1.jpg +0 -0
- package/assets/skills/poster-luxe-postage-stamp/previews/2.jpg +0 -0
- package/assets/skills/poster-luxury-editorial/SKILL.md +22 -0
- package/assets/skills/poster-luxury-editorial/previews/1.jpg +0 -0
- package/assets/skills/poster-luxury-grid-campaign/SKILL.md +22 -0
- package/assets/skills/poster-luxury-grid-campaign/previews/1.jpg +0 -0
- package/assets/skills/poster-luxury-packaging-reveal/SKILL.md +24 -0
- package/assets/skills/poster-luxury-packaging-reveal/previews/1.jpg +0 -0
- package/assets/skills/poster-luxury-packaging-reveal/previews/2.jpg +0 -0
- package/assets/skills/poster-luxury-silhouette-emblem/SKILL.md +20 -0
- package/assets/skills/poster-luxury-silhouette-emblem/previews/1.jpg +0 -0
- package/assets/skills/poster-luxury-silhouette-emblem/previews/2.jpg +0 -0
- package/assets/skills/poster-luxury-silhouette-emblem/previews/3.jpg +0 -0
- package/assets/skills/poster-luxury-silhouette-emblem/previews/4.jpg +0 -0
- package/assets/skills/poster-magazine-handwrite/SKILL.md +30 -0
- package/assets/skills/poster-magazine-handwrite/previews/1.jpg +0 -0
- package/assets/skills/poster-magazine-handwrite/previews/2.jpg +0 -0
- package/assets/skills/poster-magnetic-filings/SKILL.md +26 -0
- package/assets/skills/poster-magnetic-filings/previews/1.jpg +0 -0
- package/assets/skills/poster-magnetic-filings/previews/2.jpg +0 -0
- package/assets/skills/poster-marker-doodle/SKILL.md +20 -0
- package/assets/skills/poster-marker-doodle/previews/1.jpg +0 -0
- package/assets/skills/poster-marker-doodle/previews/2.jpg +0 -0
- package/assets/skills/poster-marker-sketch-chibi/SKILL.md +20 -0
- package/assets/skills/poster-marker-sketch-chibi/previews/1.jpg +0 -0
- package/assets/skills/poster-marker-sketch-chibi/previews/2.jpg +0 -0
- package/assets/skills/poster-marker-travel/SKILL.md +22 -0
- package/assets/skills/poster-marker-travel/previews/1.jpg +0 -0
- package/assets/skills/poster-marker-travel/previews/2.jpg +0 -0
- package/assets/skills/poster-marker-travel/previews/3.jpg +0 -0
- package/assets/skills/poster-marker-travel/previews/4.jpg +0 -0
- package/assets/skills/poster-merch-capsule-collection/SKILL.md +20 -0
- package/assets/skills/poster-merch-capsule-collection/previews/1.jpg +0 -0
- package/assets/skills/poster-merch-capsule-collection/previews/2.jpg +0 -0
- package/assets/skills/poster-merch-capsule-collection/previews/3.jpg +0 -0
- package/assets/skills/poster-midcentury-editorial/SKILL.md +24 -0
- package/assets/skills/poster-midcentury-editorial/previews/1.jpg +0 -0
- package/assets/skills/poster-midcentury-editorial/previews/2.jpg +0 -0
- package/assets/skills/poster-midcentury-editorial/previews/3.jpg +0 -0
- package/assets/skills/poster-midcentury-editorial/previews/4.jpg +0 -0
- package/assets/skills/poster-midcentury-minimal/SKILL.md +20 -0
- package/assets/skills/poster-midcentury-minimal/previews/1.jpg +0 -0
- package/assets/skills/poster-midcentury-minimal/previews/2.jpg +0 -0
- package/assets/skills/poster-midcentury-minimal/previews/3.jpg +0 -0
- package/assets/skills/poster-miniature-city/SKILL.md +20 -0
- package/assets/skills/poster-miniature-city/previews/1.jpg +0 -0
- package/assets/skills/poster-miniature-city/previews/2.jpg +0 -0
- package/assets/skills/poster-miniature-diorama/SKILL.md +24 -0
- package/assets/skills/poster-miniature-diorama/previews/1.jpg +0 -0
- package/assets/skills/poster-miniature-diorama/previews/2.jpg +0 -0
- package/assets/skills/poster-miniature-diorama/previews/73d1f002-877c-4796-8077-a728285a5a17.jpg +0 -0
- package/assets/skills/poster-miniature-palm-showroom/SKILL.md +20 -0
- package/assets/skills/poster-miniature-palm-showroom/previews/1.jpg +0 -0
- package/assets/skills/poster-miniature-palm-showroom/previews/2.jpg +0 -0
- package/assets/skills/poster-miniature-palm-showroom/previews/3.jpg +0 -0
- package/assets/skills/poster-miniature-palm-showroom/previews/4.jpg +0 -0
- package/assets/skills/poster-minimal-doodle/SKILL.md +20 -0
- package/assets/skills/poster-minimal-doodle/previews/1.jpg +0 -0
- package/assets/skills/poster-minimal-monument/SKILL.md +20 -0
- package/assets/skills/poster-minimal-monument/previews/1.jpg +0 -0
- package/assets/skills/poster-minimal-monument/previews/2.jpg +0 -0
- package/assets/skills/poster-minimal-monument/previews/3.jpg +0 -0
- package/assets/skills/poster-minimal-monument/previews/4.jpg +0 -0
- package/assets/skills/poster-minimal-wellness/SKILL.md +20 -0
- package/assets/skills/poster-minimal-wellness/previews/1.jpg +0 -0
- package/assets/skills/poster-minimal-wellness/previews/2.jpg +0 -0
- package/assets/skills/poster-minimal-wellness/previews/3.jpg +0 -0
- package/assets/skills/poster-monoline-travel/SKILL.md +22 -0
- package/assets/skills/poster-monoline-travel/previews/1.jpg +0 -0
- package/assets/skills/poster-monoline-travel/previews/2.jpg +0 -0
- package/assets/skills/poster-monoline-travel/previews/3.jpg +0 -0
- package/assets/skills/poster-monoline-travel/previews/4.jpg +0 -0
- package/assets/skills/poster-neon-ribbon-city/SKILL.md +24 -0
- package/assets/skills/poster-neon-ribbon-city/previews/1.jpg +0 -0
- package/assets/skills/poster-neon-ribbon-city/previews/2.jpg +0 -0
- package/assets/skills/poster-neon-ribbon-city/previews/3.jpg +0 -0
- package/assets/skills/poster-neon-ribbon-city/previews/4.jpg +0 -0
- package/assets/skills/poster-neon-sign/SKILL.md +22 -0
- package/assets/skills/poster-neon-sign/previews/1.jpg +0 -0
- package/assets/skills/poster-neon-sign/previews/2.jpg +0 -0
- package/assets/skills/poster-noir-black-gold/SKILL.md +20 -0
- package/assets/skills/poster-noir-black-gold/previews/1.jpg +0 -0
- package/assets/skills/poster-noir-black-gold/previews/2.jpg +0 -0
- package/assets/skills/poster-noir-black-gold/previews/3.jpg +0 -0
- package/assets/skills/poster-noir-black-gold/previews/4.jpg +0 -0
- package/assets/skills/poster-paintbrush-cityscape/SKILL.md +20 -0
- package/assets/skills/poster-paintbrush-cityscape/previews/1.jpg +0 -0
- package/assets/skills/poster-paintbrush-cityscape/previews/2.jpg +0 -0
- package/assets/skills/poster-paintbrush-cityscape/previews/3.jpg +0 -0
- package/assets/skills/poster-paintbrush-cityscape/previews/4.jpg +0 -0
- package/assets/skills/poster-paper-quilling-travel/SKILL.md +22 -0
- package/assets/skills/poster-paper-quilling-travel/previews/1.jpg +0 -0
- package/assets/skills/poster-paper-quilling-travel/previews/2.jpg +0 -0
- package/assets/skills/poster-paper-quilling-travel/previews/3.jpg +0 -0
- package/assets/skills/poster-paper-quilling-travel/previews/4.jpg +0 -0
- package/assets/skills/poster-papercraft-bookmark/SKILL.md +22 -0
- package/assets/skills/poster-papercraft-bookmark/previews/1.jpg +0 -0
- package/assets/skills/poster-papercraft-bookmark/previews/2.jpg +0 -0
- package/assets/skills/poster-papercraft-bookmark/previews/3.jpg +0 -0
- package/assets/skills/poster-papercraft-bookmark/previews/4.jpg +0 -0
- package/assets/skills/poster-papercraft-diorama-travel/SKILL.md +22 -0
- package/assets/skills/poster-papercraft-diorama-travel/previews/1.jpg +0 -0
- package/assets/skills/poster-papercraft-diorama-travel/previews/2.jpg +0 -0
- package/assets/skills/poster-papercraft-grid-diorama/SKILL.md +24 -0
- package/assets/skills/poster-papercraft-grid-diorama/previews/1.jpg +0 -0
- package/assets/skills/poster-papercraft-grid-diorama/previews/2.jpg +0 -0
- package/assets/skills/poster-papercraft-layered-papercut/SKILL.md +24 -0
- package/assets/skills/poster-papercraft-layered-papercut/previews/1.jpg +0 -0
- package/assets/skills/poster-papercraft-layered-papercut/previews/2.jpg +0 -0
- package/assets/skills/poster-papercraft-strip/SKILL.md +22 -0
- package/assets/skills/poster-papercraft-strip/previews/1.jpg +0 -0
- package/assets/skills/poster-papercraft-strip/previews/2.jpg +0 -0
- package/assets/skills/poster-papercraft-strip/previews/3.jpg +0 -0
- package/assets/skills/poster-papercraft-strip/previews/4.jpg +0 -0
- package/assets/skills/poster-papercraft-suitcase/SKILL.md +24 -0
- package/assets/skills/poster-papercraft-suitcase/previews/1.jpg +0 -0
- package/assets/skills/poster-papercraft-suitcase/previews/2.jpg +0 -0
- package/assets/skills/poster-papercraft-suitcase/previews/3.jpg +0 -0
- package/assets/skills/poster-papercut-collage/SKILL.md +22 -0
- package/assets/skills/poster-papercut-collage/previews/1.jpg +0 -0
- package/assets/skills/poster-papercut-collage/previews/2.jpg +0 -0
- package/assets/skills/poster-papercut-collage/previews/3.jpg +0 -0
- package/assets/skills/poster-papercut-collage/previews/4.jpg +0 -0
- package/assets/skills/poster-passport-diorama/SKILL.md +20 -0
- package/assets/skills/poster-passport-diorama/previews/1.jpg +0 -0
- package/assets/skills/poster-passport-diorama/previews/2.jpg +0 -0
- package/assets/skills/poster-passport-diorama/previews/3.jpg +0 -0
- package/assets/skills/poster-passport-diorama/previews/4.jpg +0 -0
- package/assets/skills/poster-passport-portal-city/SKILL.md +22 -0
- package/assets/skills/poster-passport-portal-city/previews/1.jpg +0 -0
- package/assets/skills/poster-passport-portal-city/previews/2.jpg +0 -0
- package/assets/skills/poster-passport-portal-city/previews/3.jpg +0 -0
- package/assets/skills/poster-passport-portal-city/previews/4.jpg +0 -0
- package/assets/skills/poster-pastel-gouache/SKILL.md +22 -0
- package/assets/skills/poster-pastel-gouache/previews/1.jpg +0 -0
- package/assets/skills/poster-pastel-gouache/previews/2.jpg +0 -0
- package/assets/skills/poster-pastel-gouache/previews/3.jpg +0 -0
- package/assets/skills/poster-pastel-papercollage-scene/SKILL.md +28 -0
- package/assets/skills/poster-pastel-papercollage-scene/previews/1.jpg +0 -0
- package/assets/skills/poster-pastel-papercollage-scene/previews/2.jpg +0 -0
- package/assets/skills/poster-pastel-papercollage-scene/previews/3.jpg +0 -0
- package/assets/skills/poster-pastel-papercollage-scene/previews/4.jpg +0 -0
- package/assets/skills/poster-patchwork-amigurumi/SKILL.md +24 -0
- package/assets/skills/poster-patchwork-amigurumi/previews/1.jpg +0 -0
- package/assets/skills/poster-patchwork-amigurumi/previews/2.jpg +0 -0
- package/assets/skills/poster-playful-doodle-respond/SKILL.md +22 -0
- package/assets/skills/poster-playful-doodle-respond/previews/1.jpg +0 -0
- package/assets/skills/poster-playful-doodle-respond/previews/2.jpg +0 -0
- package/assets/skills/poster-pocketwatch-city/SKILL.md +20 -0
- package/assets/skills/poster-pocketwatch-city/previews/1.jpg +0 -0
- package/assets/skills/poster-pocketwatch-city/previews/2.jpg +0 -0
- package/assets/skills/poster-pocketwatch-city/previews/3.jpg +0 -0
- package/assets/skills/poster-pocketwatch-city/previews/4.jpg +0 -0
- package/assets/skills/poster-pop-art-vehicle/SKILL.md +20 -0
- package/assets/skills/poster-pop-art-vehicle/previews/1.jpg +0 -0
- package/assets/skills/poster-pop-art-vehicle/previews/2.jpg +0 -0
- package/assets/skills/poster-pop-art-vehicle/previews/3.jpg +0 -0
- package/assets/skills/poster-pop-art-vehicle/previews/4.jpg +0 -0
- package/assets/skills/poster-popup-storybook/SKILL.md +22 -0
- package/assets/skills/poster-popup-storybook/previews/1.jpg +0 -0
- package/assets/skills/poster-popup-storybook/previews/2.jpg +0 -0
- package/assets/skills/poster-popup-storybook/previews/3.jpg +0 -0
- package/assets/skills/poster-popup-storybook/previews/4.jpg +0 -0
- package/assets/skills/poster-postcard-diorama/SKILL.md +20 -0
- package/assets/skills/poster-postcard-diorama/previews/1.jpg +0 -0
- package/assets/skills/poster-postcard-diorama/previews/2.jpg +0 -0
- package/assets/skills/poster-premium-food-advert/SKILL.md +24 -0
- package/assets/skills/poster-premium-food-advert/previews/1.jpg +0 -0
- package/assets/skills/poster-premium-food-advert/previews/2.jpg +0 -0
- package/assets/skills/poster-pressed-flower-logo/SKILL.md +22 -0
- package/assets/skills/poster-pressed-flower-logo/previews/1.jpg +0 -0
- package/assets/skills/poster-pressed-flower-logo/previews/2.jpg +0 -0
- package/assets/skills/poster-product-doodle-mixed/SKILL.md +20 -0
- package/assets/skills/poster-product-doodle-mixed/previews/1.jpg +0 -0
- package/assets/skills/poster-product-doodle-mixed/previews/2.jpg +0 -0
- package/assets/skills/poster-product-explode-splash/SKILL.md +24 -0
- package/assets/skills/poster-product-explode-splash/previews/1.jpg +0 -0
- package/assets/skills/poster-product-explode-splash/previews/2.jpg +0 -0
- package/assets/skills/poster-product-explode-splash/previews/3.jpg +0 -0
- package/assets/skills/poster-product-explode-splash/previews/4.jpg +0 -0
- package/assets/skills/poster-product-exploded-view/SKILL.md +24 -0
- package/assets/skills/poster-product-exploded-view/previews/1.jpg +0 -0
- package/assets/skills/poster-product-exploded-view/previews/2.jpg +0 -0
- package/assets/skills/poster-product-grid-campaign/SKILL.md +22 -0
- package/assets/skills/poster-product-grid-campaign/previews/1.jpg +0 -0
- package/assets/skills/poster-product-grid-campaign/previews/2.jpg +0 -0
- package/assets/skills/poster-recipe-infographic/SKILL.md +24 -0
- package/assets/skills/poster-recipe-infographic/previews/1.jpg +0 -0
- package/assets/skills/poster-recipe-infographic/previews/2.jpg +0 -0
- package/assets/skills/poster-retro-album-art/SKILL.md +22 -0
- package/assets/skills/poster-retro-album-art/previews/1.jpg +0 -0
- package/assets/skills/poster-retro-album-art/previews/2.jpg +0 -0
- package/assets/skills/poster-risograph-print/SKILL.md +24 -0
- package/assets/skills/poster-risograph-print/previews/1.jpg +0 -0
- package/assets/skills/poster-risograph-print/previews/2.jpg +0 -0
- package/assets/skills/poster-risograph-print/previews/3.jpg +0 -0
- package/assets/skills/poster-risograph-print/previews/4.jpg +0 -0
- package/assets/skills/poster-risography-travel/SKILL.md +22 -0
- package/assets/skills/poster-risography-travel/previews/1.jpg +0 -0
- package/assets/skills/poster-risography-travel/previews/2.jpg +0 -0
- package/assets/skills/poster-risography-travel/previews/3.jpg +0 -0
- package/assets/skills/poster-risography-travel/previews/4.jpg +0 -0
- package/assets/skills/poster-route-map-infographic/SKILL.md +28 -0
- package/assets/skills/poster-route-map-infographic/previews/1.jpg +0 -0
- package/assets/skills/poster-route-map-infographic/previews/2.jpg +0 -0
- package/assets/skills/poster-scandi-monoline/SKILL.md +26 -0
- package/assets/skills/poster-scandi-monoline/previews/1.jpg +0 -0
- package/assets/skills/poster-scandi-monoline/previews/2.jpg +0 -0
- package/assets/skills/poster-scandi-monoline/previews/3.jpg +0 -0
- package/assets/skills/poster-scrapbook-travel/SKILL.md +24 -0
- package/assets/skills/poster-scrapbook-travel/previews/1.jpg +0 -0
- package/assets/skills/poster-scrapbook-travel/previews/2.jpg +0 -0
- package/assets/skills/poster-scrapbook-travel/previews/3.jpg +0 -0
- package/assets/skills/poster-scrapbook-travel/previews/4.jpg +0 -0
- package/assets/skills/poster-screenprint-linocut/SKILL.md +22 -0
- package/assets/skills/poster-screenprint-linocut/previews/1.jpg +0 -0
- package/assets/skills/poster-screenprint-linocut/previews/2.jpg +0 -0
- package/assets/skills/poster-screenprint-linocut/previews/3.jpg +0 -0
- package/assets/skills/poster-screenprint-linocut/previews/4.jpg +0 -0
- package/assets/skills/poster-shrinkwrapped-logo/SKILL.md +20 -0
- package/assets/skills/poster-shrinkwrapped-logo/previews/1.jpg +0 -0
- package/assets/skills/poster-shrinkwrapped-logo/previews/2.jpg +0 -0
- package/assets/skills/poster-silhouette-miniature/SKILL.md +26 -0
- package/assets/skills/poster-silhouette-miniature/previews/1.jpg +0 -0
- package/assets/skills/poster-silhouette-miniature/previews/2.jpg +0 -0
- package/assets/skills/poster-silhouette-miniature/previews/3b8bea15-43b1-4d7b-aad7-b2f5d986cde5.png +0 -0
- package/assets/skills/poster-silk-ribbon-city/SKILL.md +22 -0
- package/assets/skills/poster-silk-ribbon-city/previews/1.jpg +0 -0
- package/assets/skills/poster-silk-ribbon-city/previews/2.jpg +0 -0
- package/assets/skills/poster-silk-ribbon-city/previews/3.jpg +0 -0
- package/assets/skills/poster-silk-ribbon-city/previews/4.jpg +0 -0
- package/assets/skills/poster-sleek-product-hero/SKILL.md +24 -0
- package/assets/skills/poster-sleek-product-hero/previews/1.jpg +0 -0
- package/assets/skills/poster-sleek-product-hero/previews/2.jpg +0 -0
- package/assets/skills/poster-soft-beauty-doodle/SKILL.md +22 -0
- package/assets/skills/poster-soft-beauty-doodle/previews/1.jpg +0 -0
- package/assets/skills/poster-soft-beauty-doodle/previews/2.jpg +0 -0
- package/assets/skills/poster-souvenir-badge/SKILL.md +22 -0
- package/assets/skills/poster-souvenir-badge/previews/1.jpg +0 -0
- package/assets/skills/poster-souvenir-badge/previews/2.jpg +0 -0
- package/assets/skills/poster-souvenir-magnet-poster/SKILL.md +20 -0
- package/assets/skills/poster-souvenir-magnet-poster/previews/1.jpg +0 -0
- package/assets/skills/poster-souvenir-magnet-poster/previews/2.jpg +0 -0
- package/assets/skills/poster-sports-champion-3d/SKILL.md +26 -0
- package/assets/skills/poster-sports-champion-3d/previews/1.jpg +0 -0
- package/assets/skills/poster-sports-maximalist/SKILL.md +20 -0
- package/assets/skills/poster-sports-maximalist/previews/1.jpg +0 -0
- package/assets/skills/poster-sports-maximalist/previews/2.jpg +0 -0
- package/assets/skills/poster-sports-passport-diorama/SKILL.md +22 -0
- package/assets/skills/poster-sports-passport-diorama/previews/1.jpg +0 -0
- package/assets/skills/poster-sports-passport-diorama/previews/2.jpg +0 -0
- package/assets/skills/poster-stone-water-product/SKILL.md +20 -0
- package/assets/skills/poster-stone-water-product/previews/1.jpg +0 -0
- package/assets/skills/poster-storyboard-character/SKILL.md +22 -0
- package/assets/skills/poster-storyboard-character/previews/1.jpg +0 -0
- package/assets/skills/poster-storybook-paper-collage-travel/SKILL.md +26 -0
- package/assets/skills/poster-storybook-paper-collage-travel/previews/1.jpg +0 -0
- package/assets/skills/poster-storybook-paper-collage-travel/previews/2.jpg +0 -0
- package/assets/skills/poster-storybook-vintage/SKILL.md +22 -0
- package/assets/skills/poster-storybook-vintage/previews/1.jpg +0 -0
- package/assets/skills/poster-storybook-vintage/previews/2.jpg +0 -0
- package/assets/skills/poster-storybook-vintage/previews/3.jpg +0 -0
- package/assets/skills/poster-street-art-mural/SKILL.md +22 -0
- package/assets/skills/poster-street-art-mural/previews/1.jpg +0 -0
- package/assets/skills/poster-surreal-postcard/SKILL.md +24 -0
- package/assets/skills/poster-surreal-postcard/previews/1.jpg +0 -0
- package/assets/skills/poster-surreal-postcard/previews/2.jpg +0 -0
- package/assets/skills/poster-surreal-postcard/previews/3.jpg +0 -0
- package/assets/skills/poster-surreal-postcard/previews/4.jpg +0 -0
- package/assets/skills/poster-swiss-letter-editorial/SKILL.md +24 -0
- package/assets/skills/poster-swiss-letter-editorial/previews/1.jpg +0 -0
- package/assets/skills/poster-swiss-letter-editorial/previews/2.jpg +0 -0
- package/assets/skills/poster-swiss-letter-editorial/previews/3.jpg +0 -0
- package/assets/skills/poster-tablet-papercraft-diorama/SKILL.md +24 -0
- package/assets/skills/poster-tablet-papercraft-diorama/previews/1.jpg +0 -0
- package/assets/skills/poster-tablet-papercraft-diorama/previews/2.jpg +0 -0
- package/assets/skills/poster-tablet-papercraft-diorama/previews/3.jpg +0 -0
- package/assets/skills/poster-tablet-papercraft-diorama/previews/4.jpg +0 -0
- package/assets/skills/poster-tabletop-miniature-diorama/SKILL.md +20 -0
- package/assets/skills/poster-tabletop-miniature-diorama/previews/1.jpg +0 -0
- package/assets/skills/poster-tabletop-miniature-diorama/previews/2.jpg +0 -0
- package/assets/skills/poster-tabletop-miniature-diorama/previews/3.jpg +0 -0
- package/assets/skills/poster-tabletop-miniature-diorama/previews/4.jpg +0 -0
- package/assets/skills/poster-tabletop-travel-planning/SKILL.md +22 -0
- package/assets/skills/poster-tabletop-travel-planning/previews/1.jpg +0 -0
- package/assets/skills/poster-tabletop-travel-planning/previews/2.jpg +0 -0
- package/assets/skills/poster-ticket-portal-city/SKILL.md +26 -0
- package/assets/skills/poster-ticket-portal-city/previews/1.jpg +0 -0
- package/assets/skills/poster-ticket-portal-city/previews/2.jpg +0 -0
- package/assets/skills/poster-time-travel-split/SKILL.md +22 -0
- package/assets/skills/poster-time-travel-split/previews/1.jpg +0 -0
- package/assets/skills/poster-tiny-planet-city/SKILL.md +24 -0
- package/assets/skills/poster-tiny-planet-city/previews/1.jpg +0 -0
- package/assets/skills/poster-tiny-planet-city/previews/2.jpg +0 -0
- package/assets/skills/poster-transparent-product/SKILL.md +20 -0
- package/assets/skills/poster-transparent-product/previews/1.jpg +0 -0
- package/assets/skills/poster-transparent-product/previews/2.jpg +0 -0
- package/assets/skills/poster-travel-collage/SKILL.md +22 -0
- package/assets/skills/poster-travel-collage/previews/1.jpg +0 -0
- package/assets/skills/poster-travel-collage/previews/2.jpg +0 -0
- package/assets/skills/poster-travel-food-spiral/SKILL.md +22 -0
- package/assets/skills/poster-travel-food-spiral/previews/1.jpg +0 -0
- package/assets/skills/poster-travel-food-spiral/previews/2.jpg +0 -0
- package/assets/skills/poster-travel-guide-comic/SKILL.md +24 -0
- package/assets/skills/poster-travel-guide-comic/previews/1.jpg +0 -0
- package/assets/skills/poster-travel-guide-comic/previews/2.jpg +0 -0
- package/assets/skills/poster-travel-infographic/SKILL.md +22 -0
- package/assets/skills/poster-travel-infographic/previews/1.jpg +0 -0
- package/assets/skills/poster-travel-infographic/previews/2.jpg +0 -0
- package/assets/skills/poster-typographic-city-fashion/SKILL.md +22 -0
- package/assets/skills/poster-typographic-city-fashion/previews/1.jpg +0 -0
- package/assets/skills/poster-typographic-city-fashion/previews/2.jpg +0 -0
- package/assets/skills/poster-typographic-city-fashion/previews/3.jpg +0 -0
- package/assets/skills/poster-typographic-letters-travel/SKILL.md +22 -0
- package/assets/skills/poster-typographic-letters-travel/previews/1.jpg +0 -0
- package/assets/skills/poster-typographic-letters-travel/previews/2.jpg +0 -0
- package/assets/skills/poster-typographic-letters-travel/previews/3.jpg +0 -0
- package/assets/skills/poster-vibrant-papercut-collage/SKILL.md +26 -0
- package/assets/skills/poster-vibrant-papercut-collage/previews/1.jpg +0 -0
- package/assets/skills/poster-vibrant-papercut-collage/previews/2.jpg +0 -0
- package/assets/skills/poster-vibrant-papercut-collage/previews/3.jpg +0 -0
- package/assets/skills/poster-vibrant-papercut-collage/previews/4.jpg +0 -0
- package/assets/skills/poster-vintage-airmail-stamp/SKILL.md +28 -0
- package/assets/skills/poster-vintage-airmail-stamp/previews/1.jpg +0 -0
- package/assets/skills/poster-vintage-airmail-stamp/previews/2.jpg +0 -0
- package/assets/skills/poster-vintage-encyclopedia/SKILL.md +26 -0
- package/assets/skills/poster-vintage-encyclopedia/previews/1.jpg +0 -0
- package/assets/skills/poster-vintage-encyclopedia/previews/2.jpg +0 -0
- package/assets/skills/poster-vintage-handpainted-ad/SKILL.md +26 -0
- package/assets/skills/poster-vintage-handpainted-ad/previews/1.jpg +0 -0
- package/assets/skills/poster-vintage-handpainted-ad/previews/2.jpg +0 -0
- package/assets/skills/poster-vintage-handpainted-ad/previews/3.jpg +0 -0
- package/assets/skills/poster-vintage-handpainted-ad/previews/4.jpg +0 -0
- package/assets/skills/poster-vintage-newspaper/SKILL.md +22 -0
- package/assets/skills/poster-vintage-newspaper/previews/1.jpg +0 -0
- package/assets/skills/poster-vintage-newspaper/previews/2.jpg +0 -0
- package/assets/skills/poster-vintage-newspaper/previews/3.jpg +0 -0
- package/assets/skills/poster-vintage-newspaper/previews/4.jpg +0 -0
- package/assets/skills/poster-vintage-romantic-typography/SKILL.md +24 -0
- package/assets/skills/poster-vintage-romantic-typography/previews/1.jpg +0 -0
- package/assets/skills/poster-vintage-romantic-typography/previews/2.jpg +0 -0
- package/assets/skills/poster-vintage-romantic-typography/previews/3.jpg +0 -0
- package/assets/skills/poster-vintage-romantic-typography/previews/4.jpg +0 -0
- package/assets/skills/poster-vintage-travel-journal/SKILL.md +22 -0
- package/assets/skills/poster-vintage-travel-journal/previews/1.jpg +0 -0
- package/assets/skills/poster-vintage-travel-journal/previews/2.jpg +0 -0
- package/assets/skills/poster-vintage-travel-magazine/SKILL.md +24 -0
- package/assets/skills/poster-vintage-travel-magazine/previews/1.jpg +0 -0
- package/assets/skills/poster-vintage-travel-magazine/previews/2.jpg +0 -0
- package/assets/skills/poster-watercolor-arch-travel/SKILL.md +20 -0
- package/assets/skills/poster-watercolor-arch-travel/previews/1.jpg +0 -0
- package/assets/skills/poster-watercolor-arch-travel/previews/2.jpg +0 -0
- package/assets/skills/poster-watercolor-arch-travel/previews/3.jpg +0 -0
- package/assets/skills/poster-watercolor-arch-travel/previews/4.jpg +0 -0
- package/assets/skills/poster-watercolor-travel/SKILL.md +26 -0
- package/assets/skills/poster-watercolor-travel/previews/1.jpg +0 -0
- package/assets/skills/poster-watercolor-travel/previews/2.jpg +0 -0
- package/assets/skills/poster-watercolor-travel-journal/SKILL.md +22 -0
- package/assets/skills/poster-watercolor-travel-journal/previews/1.jpg +0 -0
- package/assets/skills/poster-watercolor-travel-journal/previews/2.jpg +0 -0
- package/assets/skills/poster-window-frame-travel/SKILL.md +22 -0
- package/assets/skills/poster-window-frame-travel/previews/1.jpg +0 -0
- package/assets/skills/poster-window-frame-travel/previews/2.jpg +0 -0
- package/assets/skills/poster-window-frame-travel/previews/3.jpg +0 -0
- package/assets/skills/poster-window-frame-travel/previews/4.jpg +0 -0
- package/assets/skills/poster-winter-storybook/SKILL.md +20 -0
- package/assets/skills/poster-winter-storybook/previews/1.jpg +0 -0
- package/assets/skills/poster-winter-storybook/previews/2.jpg +0 -0
- package/assets/skills/poster-winter-storybook/previews/3.jpg +0 -0
- package/assets/skills/poster-woodcut-propaganda/SKILL.md +22 -0
- package/assets/skills/poster-woodcut-propaganda/previews/1.jpg +0 -0
- package/assets/skills/poster-woodcut-propaganda/previews/2.jpg +0 -0
- package/assets/skills/poster-woodcut-propaganda/previews/3.jpg +0 -0
- package/assets/skills/poster-woodcut-propaganda/previews/4.jpg +0 -0
- package/cordis.patch.yml +8 -0
- package/lib/client.js +1538 -0
- package/lib/client.js.map +1 -0
- package/lib/gate.js +115 -0
- package/lib/index.js +133 -0
- package/lib/invariant.js +18 -0
- package/lib/poster-service.js +128 -0
- package/lib/previews-route.js +72 -0
- package/lib/shared/disabled-flag.js +14 -0
- package/lib/shared/poster-contract.js +26 -0
- package/lib/shared/poster-trace.js +109 -0
- package/lib/shared/skill-format.js +69 -0
- package/lib/skills/store.js +456 -0
- package/lib/spec.js +16 -0
- package/lib/tools/get-all-skills.js +84 -0
- package/lib/tools/pick-skill.js +154 -0
- package/lib/trace-hub.js +63 -0
- package/lib/typert.js +18 -0
- package/lib/version-gate.js +149 -0
- package/package.json +104 -0
|
@@ -0,0 +1,456 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 海报 skill 库(PosterSkillStore):以文件夹为单位的本地存储。
|
|
3
|
+
*
|
|
4
|
+
* - 存储根目录:`<dshHome>/dsh-post-gen/skills/<name>/`(每个 skill 一个文件夹,
|
|
5
|
+
* 结构约定见 shared/skill-format.ts 与 docs/poster-skill-format.md);
|
|
6
|
+
* - 安装:设置面板上传 zip → 边界校验(体积/条目/路径穿越)→ 解压到暂存目录
|
|
7
|
+
* → 按格式校验(SKILL.md frontmatter + 正文生图模板 + 预览图)→ 原子换入;
|
|
8
|
+
* - 卸载:删除对应文件夹(校验失败的文件夹同样可删);
|
|
9
|
+
* - 内置 skill:包内 assets/skills/ 的目录在首启时播种进库(settings 里的
|
|
10
|
+
* seededBundled 记录已播种名单,用户删除后不会复活);
|
|
11
|
+
* - 变更通知:install/uninstall/seed 后触发 onDidChange,门控据此重估。
|
|
12
|
+
*
|
|
13
|
+
* 该 store 是海报 skill 的唯一事实来源;settings 文档不再持有 skill 名单。
|
|
14
|
+
*/
|
|
15
|
+
import { createHash } from 'node:crypto';
|
|
16
|
+
import { cp, mkdir, readdir, readFile, rename, rm, stat, writeFile } from 'node:fs/promises';
|
|
17
|
+
import { dirname, join } from 'node:path';
|
|
18
|
+
import { unzipSync } from 'fflate';
|
|
19
|
+
import { parse as parseYaml } from 'yaml';
|
|
20
|
+
import { isSkillName } from '@deepseek-ai/dsh-skill';
|
|
21
|
+
import { PREVIEWS_DIR_NAME, PREVIEW_EXTENSIONS, SKILL_ZIP_LIMITS, } from '../shared/skill-format.js';
|
|
22
|
+
/** 安装失败的业务错误(code 与 shared/poster-contract.ts 的端点约定一致)。 */
|
|
23
|
+
export class SkillInstallError extends Error {
|
|
24
|
+
code;
|
|
25
|
+
constructor(code, message) {
|
|
26
|
+
super(message);
|
|
27
|
+
this.code = code;
|
|
28
|
+
this.name = 'SkillInstallError';
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/** 文件夹名的安全形态(卸载/预览路由共用;故意比 skill name 宽,非法文件夹也要能删)。 */
|
|
32
|
+
const SAFE_FOLDER_NAME = /^[a-zA-Z0-9][a-zA-Z0-9._-]{0,63}$/;
|
|
33
|
+
/** zip 条目中永远跳过的系统噪音。 */
|
|
34
|
+
const NOISE_PATTERNS = [/^__MACOSX\//, /(^|\/)\.DS_Store$/, /(^|\/)Thumbs\.db$/i];
|
|
35
|
+
const FRONTMATTER_RE = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/;
|
|
36
|
+
export class PosterSkillStore {
|
|
37
|
+
rootDir;
|
|
38
|
+
bundledDir;
|
|
39
|
+
listeners = new Set();
|
|
40
|
+
/** 内置 skill 名(assets/skills 下的目录名),首次用到时懒加载。 */
|
|
41
|
+
bundledNamesCache;
|
|
42
|
+
/**
|
|
43
|
+
* @param rootDir - skill 库根目录(<dshHome>/dsh-post-gen/skills)。
|
|
44
|
+
* @param bundledDir - 包内内置 skill 目录(assets/skills);无则禁用播种。
|
|
45
|
+
*/
|
|
46
|
+
constructor(rootDir, bundledDir) {
|
|
47
|
+
this.rootDir = rootDir;
|
|
48
|
+
this.bundledDir = bundledDir;
|
|
49
|
+
}
|
|
50
|
+
/** 订阅库变更(安装/卸载/播种后触发);返回退订函数。 */
|
|
51
|
+
onDidChange(listener) {
|
|
52
|
+
this.listeners.add(listener);
|
|
53
|
+
return () => this.listeners.delete(listener);
|
|
54
|
+
}
|
|
55
|
+
emitChange() {
|
|
56
|
+
for (const listener of this.listeners) {
|
|
57
|
+
try {
|
|
58
|
+
listener();
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
console.warn('[dsh-post-gen] skill store listener failed:', error);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/** 扫描整个库:每个子文件夹解析为一个 skill 或一条失败记录。 */
|
|
66
|
+
async scan() {
|
|
67
|
+
const bundled = await this.loadBundledNames();
|
|
68
|
+
const skills = [];
|
|
69
|
+
const invalid = [];
|
|
70
|
+
let entries;
|
|
71
|
+
try {
|
|
72
|
+
entries = await readdir(this.rootDir);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return { skills, invalid }; // 库目录还没建 = 空库
|
|
76
|
+
}
|
|
77
|
+
for (const entry of entries.sort()) {
|
|
78
|
+
if (entry.startsWith('.'))
|
|
79
|
+
continue; // 暂存目录等内部文件
|
|
80
|
+
const dir = join(this.rootDir, entry);
|
|
81
|
+
try {
|
|
82
|
+
if (!(await stat(dir)).isDirectory())
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
try {
|
|
89
|
+
skills.push(await this.parseFolder(entry, dir, bundled));
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
invalid.push({ folder: entry, reason: error instanceof Error ? error.message : String(error) });
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return { skills, invalid };
|
|
96
|
+
}
|
|
97
|
+
/** 按名取一个已安装 skill;不存在返回 undefined。 */
|
|
98
|
+
async get(name) {
|
|
99
|
+
if (!isSkillName(name))
|
|
100
|
+
return undefined;
|
|
101
|
+
try {
|
|
102
|
+
return await this.parseFolder(name, join(this.rootDir, name), await this.loadBundledNames());
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return undefined;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/** 内置 skill 名单(懒加载 + 缓存;assets/skills 下的每个目录一个)。 */
|
|
109
|
+
async loadBundledNames() {
|
|
110
|
+
if (this.bundledNamesCache !== undefined)
|
|
111
|
+
return this.bundledNamesCache;
|
|
112
|
+
let names = [];
|
|
113
|
+
if (this.bundledDir !== undefined) {
|
|
114
|
+
try {
|
|
115
|
+
names = (await readdir(this.bundledDir)).filter((entry) => !entry.startsWith('.'));
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
names = [];
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
this.bundledNamesCache = new Set(names);
|
|
122
|
+
return this.bundledNamesCache;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* 从 zip 字节安装(或同名覆盖更新)一个 skill。
|
|
126
|
+
* @param bytes - zip 文件内容。
|
|
127
|
+
* @returns 安装结果(含是否覆盖更新)。
|
|
128
|
+
* @throws SkillInstallError 业务校验失败;其他异常视为 io-failed。
|
|
129
|
+
*/
|
|
130
|
+
async installZip(bytes) {
|
|
131
|
+
if (bytes.length > SKILL_ZIP_LIMITS.maxZipBytes) {
|
|
132
|
+
throw new SkillInstallError('too-large', `压缩包超过 ${Math.round(SKILL_ZIP_LIMITS.maxZipBytes / 1024 / 1024)}MB 上限`);
|
|
133
|
+
}
|
|
134
|
+
const relative = stripCommonRoot(extractZipEntries(bytes));
|
|
135
|
+
if (relative['SKILL.md'] === undefined) {
|
|
136
|
+
throw new SkillInstallError('invalid-skill', '压缩包结构不符合海报 skill 格式:需要包含 SKILL.md(可直接放在压缩包根目录,或统一包在一层顶层文件夹内)');
|
|
137
|
+
}
|
|
138
|
+
// 落盘到暂存目录后再做内容校验,通过才换入正式位置。
|
|
139
|
+
const staging = join(this.rootDir, `.staging-${process.pid}-${Math.random().toString(36).slice(2, 10)}`);
|
|
140
|
+
try {
|
|
141
|
+
await mkdir(staging, { recursive: true });
|
|
142
|
+
for (const [name, data] of Object.entries(relative)) {
|
|
143
|
+
const target = join(staging, ...name.split('/'));
|
|
144
|
+
await mkdir(dirname(target), { recursive: true });
|
|
145
|
+
await writeFile(target, data);
|
|
146
|
+
}
|
|
147
|
+
// 落盘到暂存目录后再做内容校验,通过才换入正式位置。
|
|
148
|
+
// 内容校验失败属于业务校验(invalid-skill),不是 IO 错误。
|
|
149
|
+
let parsed;
|
|
150
|
+
try {
|
|
151
|
+
parsed = await this.parseFolder('(staging)', staging, new Set());
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
throw new SkillInstallError('invalid-skill', error instanceof Error ? error.message : String(error));
|
|
155
|
+
}
|
|
156
|
+
const target = join(this.rootDir, parsed.name);
|
|
157
|
+
const updated = await exists(target);
|
|
158
|
+
await rm(target, { recursive: true, force: true });
|
|
159
|
+
await rename(staging, target);
|
|
160
|
+
this.emitChange();
|
|
161
|
+
// 从正式位置重解析一次,拿到正确的 bundled 标记。
|
|
162
|
+
return { skill: await this.parseFolder(parsed.name, target, await this.loadBundledNames()), updated };
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
await rm(staging, { recursive: true, force: true }).catch(() => { });
|
|
166
|
+
if (error instanceof SkillInstallError)
|
|
167
|
+
throw error;
|
|
168
|
+
throw new SkillInstallError('io-failed', error instanceof Error ? error.message : String(error));
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* 卸载一个 skill(按 skill 名或文件夹名;校验失败的文件夹同样可删)。
|
|
173
|
+
* 内置 skill(包内 assets/skills 播种的)不可删除——bundled 判定按名字,
|
|
174
|
+
* 文件夹损坏(scan 列入 invalid)的同名条目同样拒绝,避免误删出厂内容。
|
|
175
|
+
*/
|
|
176
|
+
async uninstall(nameOrFolder) {
|
|
177
|
+
if (!SAFE_FOLDER_NAME.test(nameOrFolder))
|
|
178
|
+
return 'bad-name';
|
|
179
|
+
if ((await this.loadBundledNames()).has(nameOrFolder))
|
|
180
|
+
return 'bundled';
|
|
181
|
+
const target = join(this.rootDir, nameOrFolder);
|
|
182
|
+
if (!(await exists(target)))
|
|
183
|
+
return 'not-found';
|
|
184
|
+
await rm(target, { recursive: true, force: true });
|
|
185
|
+
this.emitChange();
|
|
186
|
+
return 'ok';
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* 把包内内置 skill 播种进库,并在插件升级时做**版本迁移**:
|
|
190
|
+
*
|
|
191
|
+
* - 新内置 skill:不在 seededNames 里 → 播种(库里已有同名则视为用户版,
|
|
192
|
+
* 不覆盖,只记账);
|
|
193
|
+
* - 已播种的内置 skill:比较库内副本与包内版本的**整文件夹内容哈希**
|
|
194
|
+
* (全部文件:SKILL.md/previews/…,路径+字节参与摘要)——
|
|
195
|
+
* - 相同 → 只对齐记账;
|
|
196
|
+
* - 库内 == 记账哈希 且 包内已更新 → 用户没动过,**镜像为包内版本**
|
|
197
|
+
* (rm + cp,上游的修改/新增/删除全部传播);
|
|
198
|
+
* - 库内 != 记账哈希 → 用户改过(含预览图),**不覆盖**;
|
|
199
|
+
* - 从未记账(旧版本插件的首次升级)→ 镜像为包内版本(一次性对齐,
|
|
200
|
+
* 之后进入上面的常规判定)。
|
|
201
|
+
* @param seededNames - settings.seededBundled(历史已播种名单)。
|
|
202
|
+
* @param seededHashes - settings.seededHashes(播种时的内容哈希记账)。
|
|
203
|
+
* @returns 本次播种/刷新结果(调用方负责并入 settings)。
|
|
204
|
+
*/
|
|
205
|
+
async seedBundled(seededNames, seededHashes) {
|
|
206
|
+
if (this.bundledDir === undefined)
|
|
207
|
+
return { seeded: [], refreshed: [], hashes: {} };
|
|
208
|
+
const seeded = [];
|
|
209
|
+
const refreshed = [];
|
|
210
|
+
const hashes = {};
|
|
211
|
+
let entries;
|
|
212
|
+
try {
|
|
213
|
+
entries = await readdir(this.bundledDir);
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
return { seeded: [], refreshed: [], hashes: {} };
|
|
217
|
+
}
|
|
218
|
+
const bundled = await this.loadBundledNames();
|
|
219
|
+
for (const entry of entries) {
|
|
220
|
+
const source = join(this.bundledDir, entry);
|
|
221
|
+
try {
|
|
222
|
+
if (!(await stat(source)).isDirectory())
|
|
223
|
+
continue;
|
|
224
|
+
// 先按格式自检一遍包内目录,避免把坏的内置 skill 播进库/覆盖好版本。
|
|
225
|
+
await this.parseFolder(entry, source, bundled);
|
|
226
|
+
const libraryPath = join(this.rootDir, entry);
|
|
227
|
+
const libraryExists = await exists(libraryPath);
|
|
228
|
+
const bundledHash = await hashSkillFolder(source);
|
|
229
|
+
if (!seededNames.includes(entry)) {
|
|
230
|
+
// 新内置 skill:库里没有就播种;库里已有同名(用户版)不覆盖,只记账。
|
|
231
|
+
if (!libraryExists) {
|
|
232
|
+
await mkdir(this.rootDir, { recursive: true });
|
|
233
|
+
await cp(source, libraryPath, { recursive: true });
|
|
234
|
+
}
|
|
235
|
+
seeded.push(entry);
|
|
236
|
+
hashes[entry] = bundledHash;
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
// 已播种:用户删过 → 不复活。
|
|
240
|
+
if (!libraryExists)
|
|
241
|
+
continue;
|
|
242
|
+
const libraryHash = await hashSkillFolder(libraryPath);
|
|
243
|
+
if (libraryHash === bundledHash) {
|
|
244
|
+
hashes[entry] = bundledHash;
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
const recorded = seededHashes[entry];
|
|
248
|
+
if (recorded === undefined || libraryHash === recorded) {
|
|
249
|
+
// 未改动且包内更新(或旧版首次迁移)→ 镜像为包内版本:
|
|
250
|
+
// rm + cp,修改/新增/删除全部传播(哈希相等保证库内无用户改动)。
|
|
251
|
+
await rm(libraryPath, { recursive: true, force: true });
|
|
252
|
+
await cp(source, libraryPath, { recursive: true });
|
|
253
|
+
refreshed.push(entry);
|
|
254
|
+
hashes[entry] = bundledHash;
|
|
255
|
+
}
|
|
256
|
+
// else:用户改过(库内 != 记账哈希)→ 保持不动。
|
|
257
|
+
}
|
|
258
|
+
catch (error) {
|
|
259
|
+
console.warn(`[dsh-post-gen] bundled skill "${entry}" seeding skipped:`, error);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
if (seeded.length > 0 || refreshed.length > 0)
|
|
263
|
+
this.emitChange();
|
|
264
|
+
return { seeded, refreshed, hashes };
|
|
265
|
+
}
|
|
266
|
+
/** 解析并校验一个 skill 文件夹(SKILL.md frontmatter + 正文生图模板 + 预览图)。 */
|
|
267
|
+
async parseFolder(folder, dir, bundled) {
|
|
268
|
+
const rawSkill = await readFile(join(dir, 'SKILL.md'), 'utf8').catch(() => {
|
|
269
|
+
throw new Error('缺少 SKILL.md');
|
|
270
|
+
});
|
|
271
|
+
const match = FRONTMATTER_RE.exec(rawSkill);
|
|
272
|
+
if (!match)
|
|
273
|
+
throw new Error('SKILL.md 缺少 YAML frontmatter(--- 包裹的头部)');
|
|
274
|
+
let frontmatter;
|
|
275
|
+
try {
|
|
276
|
+
frontmatter = parseYaml(match[1]);
|
|
277
|
+
}
|
|
278
|
+
catch (error) {
|
|
279
|
+
throw new Error(`SKILL.md frontmatter 不是合法 YAML:${error instanceof Error ? error.message : String(error)}`);
|
|
280
|
+
}
|
|
281
|
+
if (!frontmatter || typeof frontmatter !== 'object')
|
|
282
|
+
throw new Error('SKILL.md frontmatter 必须是键值对');
|
|
283
|
+
const meta = frontmatter;
|
|
284
|
+
const name = typeof meta.name === 'string' ? meta.name.trim() : '';
|
|
285
|
+
if (!isSkillName(name))
|
|
286
|
+
throw new Error(`frontmatter 的 name "${name}" 不合法(需要 kebab-case)`);
|
|
287
|
+
const description = typeof meta.description === 'string' ? meta.description.trim() : '';
|
|
288
|
+
if (description === '')
|
|
289
|
+
throw new Error('frontmatter 缺少 description');
|
|
290
|
+
const content = match[2].trim();
|
|
291
|
+
if (content === '')
|
|
292
|
+
throw new Error('SKILL.md 正文为空(frontmatter 之后需要写生图提示词模板)');
|
|
293
|
+
const styleTags = Array.isArray(meta.styleTags)
|
|
294
|
+
? meta.styleTags.filter((tag) => typeof tag === 'string' && tag.trim() !== '').map((tag) => tag.trim())
|
|
295
|
+
: [];
|
|
296
|
+
const previews = await this.resolvePreviews(dir, meta.previews);
|
|
297
|
+
return {
|
|
298
|
+
name,
|
|
299
|
+
title: typeof meta.title === 'string' && meta.title.trim() !== '' ? meta.title.trim() : name,
|
|
300
|
+
description,
|
|
301
|
+
...(typeof meta.whenToUse === 'string' && meta.whenToUse.trim() !== '' ? { whenToUse: meta.whenToUse.trim() } : {}),
|
|
302
|
+
styleTags,
|
|
303
|
+
previews,
|
|
304
|
+
content,
|
|
305
|
+
bundled: bundled.has(folder) || bundled.has(name),
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
/** 解析预览图列表:frontmatter.previews 显式指定优先,缺省扫描 previews/ 目录。 */
|
|
309
|
+
async resolvePreviews(dir, declared) {
|
|
310
|
+
if (Array.isArray(declared) && declared.length > 0) {
|
|
311
|
+
const previews = [];
|
|
312
|
+
for (const entry of declared.slice(0, SKILL_ZIP_LIMITS.maxPreviews)) {
|
|
313
|
+
if (typeof entry !== 'string')
|
|
314
|
+
continue;
|
|
315
|
+
const rel = entry.replaceAll('\\', '/').replace(/^\.?\//, '');
|
|
316
|
+
if (!isSafeRelativePath(rel) || !hasPreviewExtension(rel))
|
|
317
|
+
continue;
|
|
318
|
+
if (await exists(join(dir, ...rel.split('/'))))
|
|
319
|
+
previews.push(rel);
|
|
320
|
+
}
|
|
321
|
+
return previews;
|
|
322
|
+
}
|
|
323
|
+
try {
|
|
324
|
+
const files = await readdir(join(dir, PREVIEWS_DIR_NAME));
|
|
325
|
+
return files
|
|
326
|
+
.filter((file) => hasPreviewExtension(file))
|
|
327
|
+
.sort()
|
|
328
|
+
.slice(0, SKILL_ZIP_LIMITS.maxPreviews)
|
|
329
|
+
.map((file) => `${PREVIEWS_DIR_NAME}/${file}`);
|
|
330
|
+
}
|
|
331
|
+
catch {
|
|
332
|
+
return [];
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
/** 路径存在性。 */
|
|
337
|
+
async function exists(path) {
|
|
338
|
+
try {
|
|
339
|
+
await stat(path);
|
|
340
|
+
return true;
|
|
341
|
+
}
|
|
342
|
+
catch {
|
|
343
|
+
return false;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
/** 是否允许作为预览图的扩展名。 */
|
|
347
|
+
function hasPreviewExtension(path) {
|
|
348
|
+
const ext = path.slice(path.lastIndexOf('.') + 1).toLowerCase();
|
|
349
|
+
return PREVIEW_EXTENSIONS.includes(ext);
|
|
350
|
+
}
|
|
351
|
+
/** skill 内相对路径的安全性(posix 形态,无穿越)。 */
|
|
352
|
+
function isSafeRelativePath(path) {
|
|
353
|
+
if (path === '' || path.startsWith('/') || /^[a-zA-Z]:/.test(path))
|
|
354
|
+
return false;
|
|
355
|
+
return path.split('/').every((segment) => segment !== '' && segment !== '.' && segment !== '..');
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* 解压 zip 为 { 相对路径: 字节 },全程做安全与体积校验。
|
|
359
|
+
* @throws SkillInstallError
|
|
360
|
+
*/
|
|
361
|
+
function extractZipEntries(bytes) {
|
|
362
|
+
let entries;
|
|
363
|
+
try {
|
|
364
|
+
entries = unzipSync(bytes);
|
|
365
|
+
}
|
|
366
|
+
catch (error) {
|
|
367
|
+
throw new SkillInstallError('bad-zip', `不是合法的 zip 文件:${error instanceof Error ? error.message : String(error)}`);
|
|
368
|
+
}
|
|
369
|
+
const files = {};
|
|
370
|
+
let total = 0;
|
|
371
|
+
const names = Object.keys(entries);
|
|
372
|
+
if (names.length > SKILL_ZIP_LIMITS.maxEntries) {
|
|
373
|
+
throw new SkillInstallError('too-large', `压缩包条目超过 ${SKILL_ZIP_LIMITS.maxEntries} 个上限`);
|
|
374
|
+
}
|
|
375
|
+
for (const rawName of names) {
|
|
376
|
+
const name = rawName.replaceAll('\\', '/').replace(/^\.\//, '');
|
|
377
|
+
if (name.endsWith('/'))
|
|
378
|
+
continue; // 目录条目
|
|
379
|
+
if (NOISE_PATTERNS.some((pattern) => pattern.test(name)))
|
|
380
|
+
continue;
|
|
381
|
+
if (!isSafeRelativePath(name)) {
|
|
382
|
+
throw new SkillInstallError('bad-zip', `压缩包内有不合法的路径:"${rawName}"`);
|
|
383
|
+
}
|
|
384
|
+
const data = entries[rawName];
|
|
385
|
+
if (data.length > SKILL_ZIP_LIMITS.maxFileBytes) {
|
|
386
|
+
throw new SkillInstallError('too-large', `文件 "${name}" 超过单文件体积上限`);
|
|
387
|
+
}
|
|
388
|
+
total += data.length;
|
|
389
|
+
if (total > SKILL_ZIP_LIMITS.maxTotalBytes) {
|
|
390
|
+
throw new SkillInstallError('too-large', '解压后总体积超过上限(疑似 zip bomb)');
|
|
391
|
+
}
|
|
392
|
+
files[name] = data;
|
|
393
|
+
}
|
|
394
|
+
return files;
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* 剥离统一的顶层文件夹:所有文件都不在根时,若共享同一个首段目录则去掉它。
|
|
398
|
+
* (zip 里直接平铺与包一层文件夹两种打法都接受。)
|
|
399
|
+
*/
|
|
400
|
+
function stripCommonRoot(files) {
|
|
401
|
+
const names = Object.keys(files);
|
|
402
|
+
if (names.length === 0)
|
|
403
|
+
return files;
|
|
404
|
+
if (names.some((name) => !name.includes('/')))
|
|
405
|
+
return files; // 根目录已有文件
|
|
406
|
+
const root = names[0].split('/')[0];
|
|
407
|
+
if (!names.every((name) => name.startsWith(`${root}/`)))
|
|
408
|
+
return files;
|
|
409
|
+
const stripped = {};
|
|
410
|
+
for (const [name, data] of Object.entries(files))
|
|
411
|
+
stripped[name.slice(root.length + 1)] = data;
|
|
412
|
+
return stripped;
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* 整文件夹内容哈希(内置 skill 版本迁移的"未改动"判定):全部文件的
|
|
416
|
+
* 相对路径 + 字节数 + 内容字节参与摘要(覆盖 SKILL.md 与
|
|
417
|
+
* previews/ 下任何文件的变化);文件名排序保证确定性,目录结构变化
|
|
418
|
+
* (增删文件)也体现在摘要里。
|
|
419
|
+
*/
|
|
420
|
+
async function hashSkillFolder(dir) {
|
|
421
|
+
const hash = createHash('sha256');
|
|
422
|
+
const walk = async (current, prefix) => {
|
|
423
|
+
let entries;
|
|
424
|
+
try {
|
|
425
|
+
entries = await readdir(current);
|
|
426
|
+
}
|
|
427
|
+
catch {
|
|
428
|
+
return;
|
|
429
|
+
}
|
|
430
|
+
entries.sort();
|
|
431
|
+
for (const name of entries) {
|
|
432
|
+
const absolute = join(current, name);
|
|
433
|
+
const relative = prefix === '' ? name : `${prefix}/${name}`;
|
|
434
|
+
let info;
|
|
435
|
+
try {
|
|
436
|
+
info = await stat(absolute);
|
|
437
|
+
}
|
|
438
|
+
catch {
|
|
439
|
+
continue;
|
|
440
|
+
}
|
|
441
|
+
if (info.isDirectory()) {
|
|
442
|
+
await walk(absolute, relative);
|
|
443
|
+
}
|
|
444
|
+
else if (info.isFile()) {
|
|
445
|
+
hash.update(relative);
|
|
446
|
+
hash.update('\0');
|
|
447
|
+
hash.update(String(info.size));
|
|
448
|
+
hash.update('\0');
|
|
449
|
+
hash.update(await readFile(absolute));
|
|
450
|
+
hash.update('\0');
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
};
|
|
454
|
+
await walk(dir, '');
|
|
455
|
+
return hash.digest('hex');
|
|
456
|
+
}
|
package/lib/spec.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 海报设计的持久化设置(host settings 文档的 `dsh-post-gen` 命名空间,
|
|
3
|
+
* 落在 settings.yaml)。
|
|
4
|
+
*
|
|
5
|
+
* 自 v0.2 起,海报工作流只负责风格库与工作流剧本;实际生图/编辑/多模态分析
|
|
6
|
+
* 由 dsh-qw-tool 插件提供(其设置里管理千问 API Key)。故本插件设置不再
|
|
7
|
+
* 包含 apiKey / 模型组合。
|
|
8
|
+
*/
|
|
9
|
+
import Schema from '@deepseek-ai/schemastery';
|
|
10
|
+
/** settings 文档里本插件的命名空间。 */
|
|
11
|
+
export const SETTINGS_NS = 'dsh-post-gen';
|
|
12
|
+
export const PosterSettingsSchema = Schema.object({
|
|
13
|
+
enabled: Schema.boolean().default(true),
|
|
14
|
+
seededBundled: Schema.array(Schema.string()).default([]),
|
|
15
|
+
seededHashes: Schema.dict(Schema.string()).default({}),
|
|
16
|
+
});
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { defineTool } from '@deepseek-ai/dsh-tools';
|
|
2
|
+
import { GATE_CLOSED_MESSAGE, gateOpen } from '../gate.js';
|
|
3
|
+
import { skillPreviewUrl } from '../shared/skill-format.js';
|
|
4
|
+
export function defineGetAllSkillsTool(deps) {
|
|
5
|
+
// 与二期同款:exec.arguments 在一次调用内是同一对象引用,做 WeakMap 键关联 trace。
|
|
6
|
+
const traceByArgs = new WeakMap();
|
|
7
|
+
return defineTool({
|
|
8
|
+
name: 'poster_gen_get_all_poster_skills',
|
|
9
|
+
description: '获取海报风格库(skill 库)的轻量目录:每个已安装海报风格的 name/标题/说明/适用场景/风格标签。目录只含 frontmatter 元数据,不含生图提示词模板正文——模板在 poster_gen_pick_poster_skill 选中某风格后才返回。生成海报前先调它取目录;模型无权记忆库内容,需要时随时重新调用。',
|
|
10
|
+
parameters: {},
|
|
11
|
+
output: {
|
|
12
|
+
schema: {
|
|
13
|
+
type: 'object',
|
|
14
|
+
additionalProperties: false,
|
|
15
|
+
properties: {
|
|
16
|
+
skills: {
|
|
17
|
+
type: 'array',
|
|
18
|
+
required: true,
|
|
19
|
+
items: {
|
|
20
|
+
type: 'object',
|
|
21
|
+
additionalProperties: false,
|
|
22
|
+
properties: {
|
|
23
|
+
name: { type: 'string', required: true },
|
|
24
|
+
title: { type: 'string', required: true },
|
|
25
|
+
description: { type: 'string', required: true },
|
|
26
|
+
whenToUse: { type: 'string' },
|
|
27
|
+
styleTags: { type: 'array', items: { type: 'string' } },
|
|
28
|
+
previews: { type: 'array', items: { type: 'string' } },
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
invalidFolders: { type: 'integer', required: true, description: '校验失败的文件夹数(不在目录里)' },
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
presentationMeta: (args, _value) => (traceByArgs.get(args) ?? { kind: 'poster-skills' }),
|
|
36
|
+
render: (_args, value) => {
|
|
37
|
+
const lines = [
|
|
38
|
+
`海报风格库共 ${value.skills.length} 个风格:`,
|
|
39
|
+
...value.skills.map((skill) => [
|
|
40
|
+
`- ${skill.name}(${skill.title}):${skill.description}`,
|
|
41
|
+
skill.whenToUse ? ` 适用:${skill.whenToUse}` : '',
|
|
42
|
+
skill.styleTags !== undefined && skill.styleTags.length > 0
|
|
43
|
+
? ` 标签:${skill.styleTags.join('、')}`
|
|
44
|
+
: '',
|
|
45
|
+
]
|
|
46
|
+
.filter((line) => line !== '')
|
|
47
|
+
.join('\n')),
|
|
48
|
+
];
|
|
49
|
+
return [{ type: 'text', text: lines.join('\n') }];
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
async execute(_args, exec) {
|
|
53
|
+
const settings = deps.scope.get();
|
|
54
|
+
const trace = deps.hub.begin(exec.callId, { kind: 'poster-skills' });
|
|
55
|
+
traceByArgs.set(_args, trace);
|
|
56
|
+
try {
|
|
57
|
+
const started = Date.now();
|
|
58
|
+
const { skills, invalid } = await deps.store.scan();
|
|
59
|
+
if (!gateOpen(settings, skills.length))
|
|
60
|
+
throw new Error(GATE_CLOSED_MESSAGE);
|
|
61
|
+
trace.scanned = { count: skills.length, invalid: invalid.length, durationMs: Date.now() - started };
|
|
62
|
+
trace.catalog = skills.map((skill) => ({
|
|
63
|
+
name: skill.name,
|
|
64
|
+
title: skill.title,
|
|
65
|
+
styleTags: [...skill.styleTags],
|
|
66
|
+
}));
|
|
67
|
+
return {
|
|
68
|
+
skills: skills.map((skill) => ({
|
|
69
|
+
name: skill.name,
|
|
70
|
+
title: skill.title,
|
|
71
|
+
description: skill.description,
|
|
72
|
+
...(skill.whenToUse !== undefined ? { whenToUse: skill.whenToUse } : {}),
|
|
73
|
+
styleTags: [...skill.styleTags],
|
|
74
|
+
previews: skill.previews.map((rel) => skillPreviewUrl(skill.name, rel)),
|
|
75
|
+
})),
|
|
76
|
+
invalidFolders: invalid.length,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
deps.hub.finish(exec.callId);
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
}
|