├── mcp-builder
└── scripts
│ ├── requirements.txt
│ └── example_evaluation.xml
├── document-skills
├── docx
│ ├── scripts
│ │ ├── __init__.py
│ │ └── templates
│ │ │ ├── people.xml
│ │ │ ├── comments.xml
│ │ │ ├── commentsExtended.xml
│ │ │ ├── commentsIds.xml
│ │ │ └── commentsExtensible.xml
│ ├── ooxml
│ │ ├── scripts
│ │ │ ├── validation
│ │ │ │ └── __init__.py
│ │ │ ├── unpack.py
│ │ │ └── validate.py
│ │ └── schemas
│ │ │ ├── ISO-IEC29500-4_2016
│ │ │ ├── vml-presentationDrawing.xsd
│ │ │ ├── dml-lockedCanvas.xsd
│ │ │ ├── shared-customXmlSchemaProperties.xsd
│ │ │ ├── dml-picture.xsd
│ │ │ ├── shared-customXmlDataProperties.xsd
│ │ │ ├── shared-additionalCharacteristics.xsd
│ │ │ ├── shared-relationshipReference.xsd
│ │ │ ├── shared-documentPropertiesCustom.xsd
│ │ │ ├── shared-documentPropertiesExtended.xsd
│ │ │ └── vml-wordprocessingDrawing.xsd
│ │ │ ├── microsoft
│ │ │ ├── wml-sdtdatahash-2020.xsd
│ │ │ ├── wml-symex-2015.xsd
│ │ │ ├── wml-2018.xsd
│ │ │ ├── wml-cid-2016.xsd
│ │ │ ├── wml-cex-2018.xsd
│ │ │ └── wml-2012.xsd
│ │ │ ├── ecma
│ │ │ └── fouth-edition
│ │ │ │ ├── opc-relationships.xsd
│ │ │ │ ├── opc-contentTypes.xsd
│ │ │ │ ├── opc-coreProperties.xsd
│ │ │ │ └── opc-digSig.xsd
│ │ │ └── mce
│ │ │ └── mc.xsd
│ └── LICENSE.txt
├── pptx
│ ├── ooxml
│ │ ├── scripts
│ │ │ ├── validation
│ │ │ │ └── __init__.py
│ │ │ ├── unpack.py
│ │ │ └── validate.py
│ │ └── schemas
│ │ │ ├── ISO-IEC29500-4_2016
│ │ │ ├── vml-presentationDrawing.xsd
│ │ │ ├── dml-lockedCanvas.xsd
│ │ │ ├── shared-customXmlSchemaProperties.xsd
│ │ │ ├── dml-picture.xsd
│ │ │ ├── shared-customXmlDataProperties.xsd
│ │ │ ├── shared-additionalCharacteristics.xsd
│ │ │ ├── shared-relationshipReference.xsd
│ │ │ ├── shared-documentPropertiesCustom.xsd
│ │ │ ├── shared-documentPropertiesExtended.xsd
│ │ │ └── vml-wordprocessingDrawing.xsd
│ │ │ ├── microsoft
│ │ │ ├── wml-sdtdatahash-2020.xsd
│ │ │ ├── wml-symex-2015.xsd
│ │ │ ├── wml-2018.xsd
│ │ │ ├── wml-cid-2016.xsd
│ │ │ ├── wml-cex-2018.xsd
│ │ │ └── wml-2012.xsd
│ │ │ ├── ecma
│ │ │ └── fouth-edition
│ │ │ │ ├── opc-relationships.xsd
│ │ │ │ ├── opc-contentTypes.xsd
│ │ │ │ ├── opc-coreProperties.xsd
│ │ │ │ └── opc-digSig.xsd
│ │ │ └── mce
│ │ │ └── mc.xsd
│ └── LICENSE.txt
├── pdf
│ ├── scripts
│ │ ├── check_fillable_fields.py
│ │ ├── convert_pdf_to_images.py
│ │ ├── create_validation_image.py
│ │ ├── check_bounding_boxes.py
│ │ └── fill_pdf_form_with_annotations.py
│ └── LICENSE.txt
└── xlsx
│ └── LICENSE.txt
├── slack-gif-creator
├── requirements.txt
└── templates
│ ├── bounce.py
│ └── shake.py
├── theme-factory
├── theme-showcase.pdf
├── themes
│ ├── desert-rose.md
│ ├── forest-canopy.md
│ ├── midnight-galaxy.md
│ ├── botanical-garden.md
│ ├── golden-hour.md
│ ├── arctic-frost.md
│ ├── tech-innovation.md
│ ├── modern-minimalist.md
│ ├── ocean-depths.md
│ └── sunset-boulevard.md
└── SKILL.md
├── canvas-design
└── canvas-fonts
│ ├── Jura-Light.ttf
│ ├── Jura-Medium.ttf
│ ├── Lora-Bold.ttf
│ ├── Lora-Italic.ttf
│ ├── Outfit-Bold.ttf
│ ├── Lora-Regular.ttf
│ ├── Tektur-Medium.ttf
│ ├── WorkSans-Bold.ttf
│ ├── Boldonse-Regular.ttf
│ ├── CrimsonPro-Bold.ttf
│ ├── DMMono-Regular.ttf
│ ├── EricaOne-Regular.ttf
│ ├── GeistMono-Bold.ttf
│ ├── Gloock-Regular.ttf
│ ├── IBMPlexMono-Bold.ttf
│ ├── Italiana-Regular.ttf
│ ├── Lora-BoldItalic.ttf
│ ├── Outfit-Regular.ttf
│ ├── RedHatMono-Bold.ttf
│ ├── Tektur-Regular.ttf
│ ├── WorkSans-Italic.ttf
│ ├── WorkSans-Regular.ttf
│ ├── ArsenalSC-Regular.ttf
│ ├── BigShoulders-Bold.ttf
│ ├── CrimsonPro-Italic.ttf
│ ├── CrimsonPro-Regular.ttf
│ ├── GeistMono-Regular.ttf
│ ├── IBMPlexSerif-Bold.ttf
│ ├── JetBrainsMono-Bold.ttf
│ ├── NationalPark-Bold.ttf
│ ├── PoiretOne-Regular.ttf
│ ├── RedHatMono-Regular.ttf
│ ├── Silkscreen-Regular.ttf
│ ├── SmoochSans-Medium.ttf
│ ├── YoungSerif-Regular.ttf
│ ├── BigShoulders-Regular.ttf
│ ├── IBMPlexMono-Regular.ttf
│ ├── IBMPlexSerif-Italic.ttf
│ ├── IBMPlexSerif-Regular.ttf
│ ├── InstrumentSans-Bold.ttf
│ ├── InstrumentSans-Italic.ttf
│ ├── JetBrainsMono-Regular.ttf
│ ├── NationalPark-Regular.ttf
│ ├── PixelifySans-Medium.ttf
│ ├── WorkSans-BoldItalic.ttf
│ ├── BricolageGrotesque-Bold.ttf
│ ├── IBMPlexSerif-BoldItalic.ttf
│ ├── InstrumentSans-Regular.ttf
│ ├── InstrumentSerif-Italic.ttf
│ ├── InstrumentSerif-Regular.ttf
│ ├── BricolageGrotesque-Regular.ttf
│ ├── InstrumentSans-BoldItalic.ttf
│ ├── LibreBaskerville-Regular.ttf
│ ├── NothingYouCouldDo-Regular.ttf
│ ├── IBMPlexMono-OFL.txt
│ └── PoiretOne-OFL.txt
├── artifacts-builder
├── scripts
│ ├── shadcn-components.tar.gz
│ └── bundle-artifact.sh
└── SKILL.md
├── template-skill
└── SKILL.md
├── internal-comms
├── examples
│ ├── general-comms.md
│ ├── faq-answers.md
│ ├── 3p-updates.md
│ └── company-newsletter.md
└── SKILL.md
├── webapp-testing
├── examples
│ ├── static_html_automation.py
│ ├── console_logging.py
│ └── element_discovery.py
├── SKILL.md
└── scripts
│ └── with_server.py
├── skill-creator
└── scripts
│ ├── quick_validate.py
│ └── package_skill.py
├── brand-guidelines
└── SKILL.md
├── image-enhancer
└── SKILL.md
├── video-downloader
└── SKILL.md
├── skill-share
└── SKILL.md
├── changelog-generator
└── SKILL.md
└── raffle-winner-picker
└── SKILL.md
/mcp-builder/scripts/requirements.txt:
--------------------------------------------------------------------------------
1 | anthropic>=0.39.0
2 | mcp>=1.1.0
3 |
--------------------------------------------------------------------------------
/document-skills/docx/scripts/__init__.py:
--------------------------------------------------------------------------------
1 | # Make scripts directory a package for relative imports in tests
2 |
--------------------------------------------------------------------------------
/slack-gif-creator/requirements.txt:
--------------------------------------------------------------------------------
1 | pillow>=10.0.0
2 | imageio>=2.31.0
3 | imageio-ffmpeg>=0.4.9
4 | numpy>=1.24.0
--------------------------------------------------------------------------------
/theme-factory/theme-showcase.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/theme-factory/theme-showcase.pdf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/Jura-Light.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/Jura-Light.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/Jura-Medium.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/Jura-Medium.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/Lora-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/Lora-Bold.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/Lora-Italic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/Lora-Italic.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/Outfit-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/Outfit-Bold.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/Lora-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/Lora-Regular.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/Tektur-Medium.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/Tektur-Medium.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/WorkSans-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/WorkSans-Bold.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/Boldonse-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/Boldonse-Regular.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/DMMono-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/DMMono-Regular.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/EricaOne-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/EricaOne-Regular.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/GeistMono-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/GeistMono-Bold.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/Gloock-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/Gloock-Regular.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/Italiana-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/Italiana-Regular.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/Lora-BoldItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/Lora-BoldItalic.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/Outfit-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/Outfit-Regular.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/RedHatMono-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/RedHatMono-Bold.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/Tektur-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/Tektur-Regular.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/WorkSans-Italic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/WorkSans-Italic.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/WorkSans-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/WorkSans-Regular.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/BigShoulders-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/BigShoulders-Bold.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/GeistMono-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/GeistMono-Regular.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/NationalPark-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/NationalPark-Bold.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/PoiretOne-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/PoiretOne-Regular.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/RedHatMono-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/RedHatMono-Regular.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/Silkscreen-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/Silkscreen-Regular.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/SmoochSans-Medium.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/SmoochSans-Medium.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/YoungSerif-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/YoungSerif-Regular.ttf
--------------------------------------------------------------------------------
/artifacts-builder/scripts/shadcn-components.tar.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/artifacts-builder/scripts/shadcn-components.tar.gz
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/BigShoulders-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/BigShoulders-Regular.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/NationalPark-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/NationalPark-Regular.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/PixelifySans-Medium.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/PixelifySans-Medium.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuilenren/awesome-claude-skills/master/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf
--------------------------------------------------------------------------------
/template-skill/SKILL.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: template-skill
3 | description: Replace with description of the skill and when Claude should use it.
4 | ---
5 |
6 | # Insert instructions below
7 |
--------------------------------------------------------------------------------
/document-skills/docx/scripts/templates/people.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/document-skills/docx/ooxml/scripts/validation/__init__.py:
--------------------------------------------------------------------------------
1 | """
2 | Validation modules for Word document processing.
3 | """
4 |
5 | from .base import BaseSchemaValidator
6 | from .docx import DOCXSchemaValidator
7 | from .pptx import PPTXSchemaValidator
8 | from .redlining import RedliningValidator
9 |
10 | __all__ = [
11 | "BaseSchemaValidator",
12 | "DOCXSchemaValidator",
13 | "PPTXSchemaValidator",
14 | "RedliningValidator",
15 | ]
16 |
--------------------------------------------------------------------------------
/document-skills/pptx/ooxml/scripts/validation/__init__.py:
--------------------------------------------------------------------------------
1 | """
2 | Validation modules for Word document processing.
3 | """
4 |
5 | from .base import BaseSchemaValidator
6 | from .docx import DOCXSchemaValidator
7 | from .pptx import PPTXSchemaValidator
8 | from .redlining import RedliningValidator
9 |
10 | __all__ = [
11 | "BaseSchemaValidator",
12 | "DOCXSchemaValidator",
13 | "PPTXSchemaValidator",
14 | "RedliningValidator",
15 | ]
16 |
--------------------------------------------------------------------------------
/document-skills/pdf/scripts/check_fillable_fields.py:
--------------------------------------------------------------------------------
1 | import sys
2 | from pypdf import PdfReader
3 |
4 |
5 | # Script for Claude to run to determine whether a PDF has fillable form fields. See forms.md.
6 |
7 |
8 | reader = PdfReader(sys.argv[1])
9 | if (reader.get_fields()):
10 | print("This PDF has fillable form fields")
11 | else:
12 | print("This PDF does not have fillable form fields; you will need to visually determine where to enter data")
13 |
--------------------------------------------------------------------------------
/theme-factory/themes/desert-rose.md:
--------------------------------------------------------------------------------
1 | # Desert Rose
2 |
3 | A soft and sophisticated theme with dusty, muted tones perfect for elegant presentations.
4 |
5 | ## Color Palette
6 |
7 | - **Dusty Rose**: `#d4a5a5` - Soft primary color
8 | - **Clay**: `#b87d6d` - Earthy accent
9 | - **Sand**: `#e8d5c4` - Warm neutral backgrounds
10 | - **Deep Burgundy**: `#5d2e46` - Rich dark contrast
11 |
12 | ## Typography
13 |
14 | - **Headers**: FreeSans Bold
15 | - **Body Text**: FreeSans
16 |
17 | ## Best Used For
18 |
19 | Fashion presentations, beauty brands, wedding planning, interior design, boutique businesses.
20 |
--------------------------------------------------------------------------------
/theme-factory/themes/forest-canopy.md:
--------------------------------------------------------------------------------
1 | # Forest Canopy
2 |
3 | A natural and grounded theme featuring earth tones inspired by dense forest environments.
4 |
5 | ## Color Palette
6 |
7 | - **Forest Green**: `#2d4a2b` - Primary dark green
8 | - **Sage**: `#7d8471` - Muted green accent
9 | - **Olive**: `#a4ac86` - Light accent color
10 | - **Ivory**: `#faf9f6` - Backgrounds and text
11 |
12 | ## Typography
13 |
14 | - **Headers**: FreeSerif Bold
15 | - **Body Text**: FreeSans
16 |
17 | ## Best Used For
18 |
19 | Environmental presentations, sustainability reports, outdoor brands, wellness content, organic products.
20 |
--------------------------------------------------------------------------------
/theme-factory/themes/midnight-galaxy.md:
--------------------------------------------------------------------------------
1 | # Midnight Galaxy
2 |
3 | A dramatic and cosmic theme with deep purples and mystical tones for impactful presentations.
4 |
5 | ## Color Palette
6 |
7 | - **Deep Purple**: `#2b1e3e` - Rich dark base
8 | - **Cosmic Blue**: `#4a4e8f` - Mystical mid-tone
9 | - **Lavender**: `#a490c2` - Soft accent color
10 | - **Silver**: `#e6e6fa` - Light highlights and text
11 |
12 | ## Typography
13 |
14 | - **Headers**: FreeSans Bold
15 | - **Body Text**: FreeSans
16 |
17 | ## Best Used For
18 |
19 | Entertainment industry, gaming presentations, nightlife venues, luxury brands, creative agencies.
20 |
--------------------------------------------------------------------------------
/theme-factory/themes/botanical-garden.md:
--------------------------------------------------------------------------------
1 | # Botanical Garden
2 |
3 | A fresh and organic theme featuring vibrant garden-inspired colors for lively presentations.
4 |
5 | ## Color Palette
6 |
7 | - **Fern Green**: `#4a7c59` - Rich natural green
8 | - **Marigold**: `#f9a620` - Bright floral accent
9 | - **Terracotta**: `#b7472a` - Earthy warm tone
10 | - **Cream**: `#f5f3ed` - Soft neutral backgrounds
11 |
12 | ## Typography
13 |
14 | - **Headers**: DejaVu Serif Bold
15 | - **Body Text**: DejaVu Sans
16 |
17 | ## Best Used For
18 |
19 | Garden centers, food presentations, farm-to-table content, botanical brands, natural products.
20 |
--------------------------------------------------------------------------------
/theme-factory/themes/golden-hour.md:
--------------------------------------------------------------------------------
1 | # Golden Hour
2 |
3 | A rich and warm autumnal palette that creates an inviting and sophisticated atmosphere.
4 |
5 | ## Color Palette
6 |
7 | - **Mustard Yellow**: `#f4a900` - Bold primary accent
8 | - **Terracotta**: `#c1666b` - Warm secondary color
9 | - **Warm Beige**: `#d4b896` - Neutral backgrounds
10 | - **Chocolate Brown**: `#4a403a` - Dark text and anchors
11 |
12 | ## Typography
13 |
14 | - **Headers**: FreeSans Bold
15 | - **Body Text**: FreeSans
16 |
17 | ## Best Used For
18 |
19 | Restaurant presentations, hospitality brands, fall campaigns, cozy lifestyle content, artisan products.
20 |
--------------------------------------------------------------------------------
/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/theme-factory/themes/arctic-frost.md:
--------------------------------------------------------------------------------
1 | # Arctic Frost
2 |
3 | A cool and crisp winter-inspired theme that conveys clarity, precision, and professionalism.
4 |
5 | ## Color Palette
6 |
7 | - **Ice Blue**: `#d4e4f7` - Light backgrounds and highlights
8 | - **Steel Blue**: `#4a6fa5` - Primary accent color
9 | - **Silver**: `#c0c0c0` - Metallic accent elements
10 | - **Crisp White**: `#fafafa` - Clean backgrounds and text
11 |
12 | ## Typography
13 |
14 | - **Headers**: DejaVu Sans Bold
15 | - **Body Text**: DejaVu Sans
16 |
17 | ## Best Used For
18 |
19 | Healthcare presentations, technology solutions, winter sports, clean tech, pharmaceutical content.
20 |
--------------------------------------------------------------------------------
/theme-factory/themes/tech-innovation.md:
--------------------------------------------------------------------------------
1 | # Tech Innovation
2 |
3 | A bold and modern theme with high-contrast colors perfect for cutting-edge technology presentations.
4 |
5 | ## Color Palette
6 |
7 | - **Electric Blue**: `#0066ff` - Vibrant primary accent
8 | - **Neon Cyan**: `#00ffff` - Bright highlight color
9 | - **Dark Gray**: `#1e1e1e` - Deep backgrounds
10 | - **White**: `#ffffff` - Clean text and contrast
11 |
12 | ## Typography
13 |
14 | - **Headers**: DejaVu Sans Bold
15 | - **Body Text**: DejaVu Sans
16 |
17 | ## Best Used For
18 |
19 | Tech startups, software launches, innovation showcases, AI/ML presentations, digital transformation content.
20 |
--------------------------------------------------------------------------------
/document-skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/document-skills/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/theme-factory/themes/modern-minimalist.md:
--------------------------------------------------------------------------------
1 | # Modern Minimalist
2 |
3 | A clean and contemporary theme with a sophisticated grayscale palette for maximum versatility.
4 |
5 | ## Color Palette
6 |
7 | - **Charcoal**: `#36454f` - Primary dark color
8 | - **Slate Gray**: `#708090` - Medium gray for accents
9 | - **Light Gray**: `#d3d3d3` - Backgrounds and dividers
10 | - **White**: `#ffffff` - Text and clean backgrounds
11 |
12 | ## Typography
13 |
14 | - **Headers**: DejaVu Sans Bold
15 | - **Body Text**: DejaVu Sans
16 |
17 | ## Best Used For
18 |
19 | Tech presentations, architecture portfolios, design showcases, modern business proposals, data visualization.
20 |
--------------------------------------------------------------------------------
/theme-factory/themes/ocean-depths.md:
--------------------------------------------------------------------------------
1 | # Ocean Depths
2 |
3 | A professional and calming maritime theme that evokes the serenity of deep ocean waters.
4 |
5 | ## Color Palette
6 |
7 | - **Deep Navy**: `#1a2332` - Primary background color
8 | - **Teal**: `#2d8b8b` - Accent color for highlights and emphasis
9 | - **Seafoam**: `#a8dadc` - Secondary accent for lighter elements
10 | - **Cream**: `#f1faee` - Text and light backgrounds
11 |
12 | ## Typography
13 |
14 | - **Headers**: DejaVu Sans Bold
15 | - **Body Text**: DejaVu Sans
16 |
17 | ## Best Used For
18 |
19 | Corporate presentations, financial reports, professional consulting decks, trust-building content.
20 |
--------------------------------------------------------------------------------
/theme-factory/themes/sunset-boulevard.md:
--------------------------------------------------------------------------------
1 | # Sunset Boulevard
2 |
3 | A warm and vibrant theme inspired by golden hour sunsets, perfect for energetic and creative presentations.
4 |
5 | ## Color Palette
6 |
7 | - **Burnt Orange**: `#e76f51` - Primary accent color
8 | - **Coral**: `#f4a261` - Secondary warm accent
9 | - **Warm Sand**: `#e9c46a` - Highlighting and backgrounds
10 | - **Deep Purple**: `#264653` - Dark contrast and text
11 |
12 | ## Typography
13 |
14 | - **Headers**: DejaVu Serif Bold
15 | - **Body Text**: DejaVu Sans
16 |
17 | ## Best Used For
18 |
19 | Creative pitches, marketing presentations, lifestyle brands, event promotions, inspirational content.
20 |
--------------------------------------------------------------------------------
/internal-comms/examples/general-comms.md:
--------------------------------------------------------------------------------
1 | ## Instructions
2 | You are being asked to write internal company communication that doesn't fit into the standard formats (3P
3 | updates, newsletters, or FAQs).
4 |
5 | Before proceeding:
6 | 1. Ask the user about their target audience
7 | 2. Understand the communication's purpose
8 | 3. Clarify the desired tone (formal, casual, urgent, informational)
9 | 4. Confirm any specific formatting requirements
10 |
11 | Use these general principles:
12 | - Be clear and concise
13 | - Use active voice
14 | - Put the most important information first
15 | - Include relevant links and references
16 | - Match the company's communication style
--------------------------------------------------------------------------------
/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd:
--------------------------------------------------------------------------------
1 |
2 |
8 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd:
--------------------------------------------------------------------------------
1 |
2 |
8 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/document-skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/document-skills/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/document-skills/docx/ooxml/schemas/microsoft/wml-2018.xsd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/document-skills/pptx/ooxml/schemas/microsoft/wml-2018.xsd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/document-skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/document-skills/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/webapp-testing/examples/static_html_automation.py:
--------------------------------------------------------------------------------
1 | from playwright.sync_api import sync_playwright
2 | import os
3 |
4 | # Example: Automating interaction with static HTML files using file:// URLs
5 |
6 | html_file_path = os.path.abspath('path/to/your/file.html')
7 | file_url = f'file://{html_file_path}'
8 |
9 | with sync_playwright() as p:
10 | browser = p.chromium.launch(headless=True)
11 | page = browser.new_page(viewport={'width': 1920, 'height': 1080})
12 |
13 | # Navigate to local HTML file
14 | page.goto(file_url)
15 |
16 | # Take screenshot
17 | page.screenshot(path='/mnt/user-data/outputs/static_page.png', full_page=True)
18 |
19 | # Interact with elements
20 | page.click('text=Click Me')
21 | page.fill('#name', 'John Doe')
22 | page.fill('#email', 'john@example.com')
23 |
24 | # Submit form
25 | page.click('button[type="submit"]')
26 | page.wait_for_timeout(500)
27 |
28 | # Take final screenshot
29 | page.screenshot(path='/mnt/user-data/outputs/after_submit.png', full_page=True)
30 |
31 | browser.close()
32 |
33 | print("Static HTML automation completed!")
--------------------------------------------------------------------------------
/document-skills/docx/ooxml/scripts/unpack.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 | """Unpack and format XML contents of Office files (.docx, .pptx, .xlsx)"""
3 |
4 | import random
5 | import sys
6 | import defusedxml.minidom
7 | import zipfile
8 | from pathlib import Path
9 |
10 | # Get command line arguments
11 | assert len(sys.argv) == 3, "Usage: python unpack.py "
12 | input_file, output_dir = sys.argv[1], sys.argv[2]
13 |
14 | # Extract and format
15 | output_path = Path(output_dir)
16 | output_path.mkdir(parents=True, exist_ok=True)
17 | zipfile.ZipFile(input_file).extractall(output_path)
18 |
19 | # Pretty print all XML files
20 | xml_files = list(output_path.rglob("*.xml")) + list(output_path.rglob("*.rels"))
21 | for xml_file in xml_files:
22 | content = xml_file.read_text(encoding="utf-8")
23 | dom = defusedxml.minidom.parseString(content)
24 | xml_file.write_bytes(dom.toprettyxml(indent=" ", encoding="ascii"))
25 |
26 | # For .docx files, suggest an RSID for tracked changes
27 | if input_file.endswith(".docx"):
28 | suggested_rsid = "".join(random.choices("0123456789ABCDEF", k=8))
29 | print(f"Suggested RSID for edit session: {suggested_rsid}")
30 |
--------------------------------------------------------------------------------
/document-skills/pptx/ooxml/scripts/unpack.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 | """Unpack and format XML contents of Office files (.docx, .pptx, .xlsx)"""
3 |
4 | import random
5 | import sys
6 | import defusedxml.minidom
7 | import zipfile
8 | from pathlib import Path
9 |
10 | # Get command line arguments
11 | assert len(sys.argv) == 3, "Usage: python unpack.py "
12 | input_file, output_dir = sys.argv[1], sys.argv[2]
13 |
14 | # Extract and format
15 | output_path = Path(output_dir)
16 | output_path.mkdir(parents=True, exist_ok=True)
17 | zipfile.ZipFile(input_file).extractall(output_path)
18 |
19 | # Pretty print all XML files
20 | xml_files = list(output_path.rglob("*.xml")) + list(output_path.rglob("*.rels"))
21 | for xml_file in xml_files:
22 | content = xml_file.read_text(encoding="utf-8")
23 | dom = defusedxml.minidom.parseString(content)
24 | xml_file.write_bytes(dom.toprettyxml(indent=" ", encoding="ascii"))
25 |
26 | # For .docx files, suggest an RSID for tracked changes
27 | if input_file.endswith(".docx"):
28 | suggested_rsid = "".join(random.choices("0123456789ABCDEF", k=8))
29 | print(f"Suggested RSID for edit session: {suggested_rsid}")
30 |
--------------------------------------------------------------------------------
/webapp-testing/examples/console_logging.py:
--------------------------------------------------------------------------------
1 | from playwright.sync_api import sync_playwright
2 |
3 | # Example: Capturing console logs during browser automation
4 |
5 | url = 'http://localhost:5173' # Replace with your URL
6 |
7 | console_logs = []
8 |
9 | with sync_playwright() as p:
10 | browser = p.chromium.launch(headless=True)
11 | page = browser.new_page(viewport={'width': 1920, 'height': 1080})
12 |
13 | # Set up console log capture
14 | def handle_console_message(msg):
15 | console_logs.append(f"[{msg.type}] {msg.text}")
16 | print(f"Console: [{msg.type}] {msg.text}")
17 |
18 | page.on("console", handle_console_message)
19 |
20 | # Navigate to page
21 | page.goto(url)
22 | page.wait_for_load_state('networkidle')
23 |
24 | # Interact with the page (triggers console logs)
25 | page.click('text=Dashboard')
26 | page.wait_for_timeout(1000)
27 |
28 | browser.close()
29 |
30 | # Save console logs to file
31 | with open('/mnt/user-data/outputs/console.log', 'w') as f:
32 | f.write('\n'.join(console_logs))
33 |
34 | print(f"\nCaptured {len(console_logs)} console messages")
35 | print(f"Logs saved to: /mnt/user-data/outputs/console.log")
--------------------------------------------------------------------------------
/mcp-builder/scripts/example_evaluation.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Calculate the compound interest on $10,000 invested at 5% annual interest rate, compounded monthly for 3 years. What is the final amount in dollars (rounded to 2 decimal places)?
4 | 11614.72
5 |
6 |
7 | A projectile is launched at a 45-degree angle with an initial velocity of 50 m/s. Calculate the total distance (in meters) it has traveled from the launch point after 2 seconds, assuming g=9.8 m/s². Round to 2 decimal places.
8 | 87.25
9 |
10 |
11 | A sphere has a volume of 500 cubic meters. Calculate its surface area in square meters. Round to 2 decimal places.
12 | 304.65
13 |
14 |
15 | Calculate the population standard deviation of this dataset: [12, 15, 18, 22, 25, 30, 35]. Round to 2 decimal places.
16 | 7.61
17 |
18 |
19 | Calculate the pH of a solution with a hydrogen ion concentration of 3.5 × 10^-5 M. Round to 2 decimal places.
20 | 4.46
21 |
22 |
23 |
--------------------------------------------------------------------------------
/document-skills/pdf/scripts/convert_pdf_to_images.py:
--------------------------------------------------------------------------------
1 | import os
2 | import sys
3 |
4 | from pdf2image import convert_from_path
5 |
6 |
7 | # Converts each page of a PDF to a PNG image.
8 |
9 |
10 | def convert(pdf_path, output_dir, max_dim=1000):
11 | images = convert_from_path(pdf_path, dpi=200)
12 |
13 | for i, image in enumerate(images):
14 | # Scale image if needed to keep width/height under `max_dim`
15 | width, height = image.size
16 | if width > max_dim or height > max_dim:
17 | scale_factor = min(max_dim / width, max_dim / height)
18 | new_width = int(width * scale_factor)
19 | new_height = int(height * scale_factor)
20 | image = image.resize((new_width, new_height))
21 |
22 | image_path = os.path.join(output_dir, f"page_{i+1}.png")
23 | image.save(image_path)
24 | print(f"Saved page {i+1} as {image_path} (size: {image.size})")
25 |
26 | print(f"Converted {len(images)} pages to PNG images")
27 |
28 |
29 | if __name__ == "__main__":
30 | if len(sys.argv) != 3:
31 | print("Usage: convert_pdf_to_images.py [input pdf] [output directory]")
32 | sys.exit(1)
33 | pdf_path = sys.argv[1]
34 | output_directory = sys.argv[2]
35 | convert(pdf_path, output_directory)
36 |
--------------------------------------------------------------------------------
/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd:
--------------------------------------------------------------------------------
1 |
2 |
6 |
8 |
9 |
10 |
11 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd:
--------------------------------------------------------------------------------
1 |
2 |
6 |
8 |
9 |
10 |
11 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd:
--------------------------------------------------------------------------------
1 |
2 |
7 |
9 |
10 |
11 |
12 |
13 |
14 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd:
--------------------------------------------------------------------------------
1 |
2 |
7 |
9 |
10 |
11 |
12 |
13 |
14 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/document-skills/pdf/LICENSE.txt:
--------------------------------------------------------------------------------
1 | © 2025 Anthropic, PBC. All rights reserved.
2 |
3 | LICENSE: Use of these materials (including all code, prompts, assets, files,
4 | and other components of this Skill) is governed by your agreement with
5 | Anthropic regarding use of Anthropic's services. If no separate agreement
6 | exists, use is governed by Anthropic's Consumer Terms of Service or
7 | Commercial Terms of Service, as applicable:
8 | https://www.anthropic.com/legal/consumer-terms
9 | https://www.anthropic.com/legal/commercial-terms
10 | Your applicable agreement is referred to as the "Agreement." "Services" are
11 | as defined in the Agreement.
12 |
13 | ADDITIONAL RESTRICTIONS: Notwithstanding anything in the Agreement to the
14 | contrary, users may not:
15 |
16 | - Extract these materials from the Services or retain copies of these
17 | materials outside the Services
18 | - Reproduce or copy these materials, except for temporary copies created
19 | automatically during authorized use of the Services
20 | - Create derivative works based on these materials
21 | - Distribute, sublicense, or transfer these materials to any third party
22 | - Make, offer to sell, sell, or import any inventions embodied in these
23 | materials
24 | - Reverse engineer, decompile, or disassemble these materials
25 |
26 | The receipt, viewing, or possession of these materials does not convey or
27 | imply any license or right beyond those expressly granted above.
28 |
29 | Anthropic retains all right, title, and interest in these materials,
30 | including all copyrights, patents, and other intellectual property rights.
31 |
--------------------------------------------------------------------------------
/document-skills/docx/LICENSE.txt:
--------------------------------------------------------------------------------
1 | © 2025 Anthropic, PBC. All rights reserved.
2 |
3 | LICENSE: Use of these materials (including all code, prompts, assets, files,
4 | and other components of this Skill) is governed by your agreement with
5 | Anthropic regarding use of Anthropic's services. If no separate agreement
6 | exists, use is governed by Anthropic's Consumer Terms of Service or
7 | Commercial Terms of Service, as applicable:
8 | https://www.anthropic.com/legal/consumer-terms
9 | https://www.anthropic.com/legal/commercial-terms
10 | Your applicable agreement is referred to as the "Agreement." "Services" are
11 | as defined in the Agreement.
12 |
13 | ADDITIONAL RESTRICTIONS: Notwithstanding anything in the Agreement to the
14 | contrary, users may not:
15 |
16 | - Extract these materials from the Services or retain copies of these
17 | materials outside the Services
18 | - Reproduce or copy these materials, except for temporary copies created
19 | automatically during authorized use of the Services
20 | - Create derivative works based on these materials
21 | - Distribute, sublicense, or transfer these materials to any third party
22 | - Make, offer to sell, sell, or import any inventions embodied in these
23 | materials
24 | - Reverse engineer, decompile, or disassemble these materials
25 |
26 | The receipt, viewing, or possession of these materials does not convey or
27 | imply any license or right beyond those expressly granted above.
28 |
29 | Anthropic retains all right, title, and interest in these materials,
30 | including all copyrights, patents, and other intellectual property rights.
31 |
--------------------------------------------------------------------------------
/document-skills/pptx/LICENSE.txt:
--------------------------------------------------------------------------------
1 | © 2025 Anthropic, PBC. All rights reserved.
2 |
3 | LICENSE: Use of these materials (including all code, prompts, assets, files,
4 | and other components of this Skill) is governed by your agreement with
5 | Anthropic regarding use of Anthropic's services. If no separate agreement
6 | exists, use is governed by Anthropic's Consumer Terms of Service or
7 | Commercial Terms of Service, as applicable:
8 | https://www.anthropic.com/legal/consumer-terms
9 | https://www.anthropic.com/legal/commercial-terms
10 | Your applicable agreement is referred to as the "Agreement." "Services" are
11 | as defined in the Agreement.
12 |
13 | ADDITIONAL RESTRICTIONS: Notwithstanding anything in the Agreement to the
14 | contrary, users may not:
15 |
16 | - Extract these materials from the Services or retain copies of these
17 | materials outside the Services
18 | - Reproduce or copy these materials, except for temporary copies created
19 | automatically during authorized use of the Services
20 | - Create derivative works based on these materials
21 | - Distribute, sublicense, or transfer these materials to any third party
22 | - Make, offer to sell, sell, or import any inventions embodied in these
23 | materials
24 | - Reverse engineer, decompile, or disassemble these materials
25 |
26 | The receipt, viewing, or possession of these materials does not convey or
27 | imply any license or right beyond those expressly granted above.
28 |
29 | Anthropic retains all right, title, and interest in these materials,
30 | including all copyrights, patents, and other intellectual property rights.
31 |
--------------------------------------------------------------------------------
/document-skills/xlsx/LICENSE.txt:
--------------------------------------------------------------------------------
1 | © 2025 Anthropic, PBC. All rights reserved.
2 |
3 | LICENSE: Use of these materials (including all code, prompts, assets, files,
4 | and other components of this Skill) is governed by your agreement with
5 | Anthropic regarding use of Anthropic's services. If no separate agreement
6 | exists, use is governed by Anthropic's Consumer Terms of Service or
7 | Commercial Terms of Service, as applicable:
8 | https://www.anthropic.com/legal/consumer-terms
9 | https://www.anthropic.com/legal/commercial-terms
10 | Your applicable agreement is referred to as the "Agreement." "Services" are
11 | as defined in the Agreement.
12 |
13 | ADDITIONAL RESTRICTIONS: Notwithstanding anything in the Agreement to the
14 | contrary, users may not:
15 |
16 | - Extract these materials from the Services or retain copies of these
17 | materials outside the Services
18 | - Reproduce or copy these materials, except for temporary copies created
19 | automatically during authorized use of the Services
20 | - Create derivative works based on these materials
21 | - Distribute, sublicense, or transfer these materials to any third party
22 | - Make, offer to sell, sell, or import any inventions embodied in these
23 | materials
24 | - Reverse engineer, decompile, or disassemble these materials
25 |
26 | The receipt, viewing, or possession of these materials does not convey or
27 | imply any license or right beyond those expressly granted above.
28 |
29 | Anthropic retains all right, title, and interest in these materials,
30 | including all copyrights, patents, and other intellectual property rights.
31 |
--------------------------------------------------------------------------------
/internal-comms/SKILL.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: internal-comms
3 | description: A set of resources to help me write all kinds of internal communications, using the formats that my company likes to use. Claude should use this skill whenever asked to write some sort of internal communications (status reports, leadership updates, 3P updates, company newsletters, FAQs, incident reports, project updates, etc.).
4 | license: Complete terms in LICENSE.txt
5 | ---
6 |
7 | ## When to use this skill
8 | To write internal communications, use this skill for:
9 | - 3P updates (Progress, Plans, Problems)
10 | - Company newsletters
11 | - FAQ responses
12 | - Status reports
13 | - Leadership updates
14 | - Project updates
15 | - Incident reports
16 |
17 | ## How to use this skill
18 |
19 | To write any internal communication:
20 |
21 | 1. **Identify the communication type** from the request
22 | 2. **Load the appropriate guideline file** from the `examples/` directory:
23 | - `examples/3p-updates.md` - For Progress/Plans/Problems team updates
24 | - `examples/company-newsletter.md` - For company-wide newsletters
25 | - `examples/faq-answers.md` - For answering frequently asked questions
26 | - `examples/general-comms.md` - For anything else that doesn't explicitly match one of the above
27 | 3. **Follow the specific instructions** in that file for formatting, tone, and content gathering
28 |
29 | If the communication type doesn't match any existing guideline, ask for clarification or more context about the desired format.
30 |
31 | ## Keywords
32 | 3P updates, company newsletter, company comms, weekly update, faqs, common questions, updates, internal comms
33 |
--------------------------------------------------------------------------------
/webapp-testing/examples/element_discovery.py:
--------------------------------------------------------------------------------
1 | from playwright.sync_api import sync_playwright
2 |
3 | # Example: Discovering buttons and other elements on a page
4 |
5 | with sync_playwright() as p:
6 | browser = p.chromium.launch(headless=True)
7 | page = browser.new_page()
8 |
9 | # Navigate to page and wait for it to fully load
10 | page.goto('http://localhost:5173')
11 | page.wait_for_load_state('networkidle')
12 |
13 | # Discover all buttons on the page
14 | buttons = page.locator('button').all()
15 | print(f"Found {len(buttons)} buttons:")
16 | for i, button in enumerate(buttons):
17 | text = button.inner_text() if button.is_visible() else "[hidden]"
18 | print(f" [{i}] {text}")
19 |
20 | # Discover links
21 | links = page.locator('a[href]').all()
22 | print(f"\nFound {len(links)} links:")
23 | for link in links[:5]: # Show first 5
24 | text = link.inner_text().strip()
25 | href = link.get_attribute('href')
26 | print(f" - {text} -> {href}")
27 |
28 | # Discover input fields
29 | inputs = page.locator('input, textarea, select').all()
30 | print(f"\nFound {len(inputs)} input fields:")
31 | for input_elem in inputs:
32 | name = input_elem.get_attribute('name') or input_elem.get_attribute('id') or "[unnamed]"
33 | input_type = input_elem.get_attribute('type') or 'text'
34 | print(f" - {name} ({input_type})")
35 |
36 | # Take screenshot for visual reference
37 | page.screenshot(path='/tmp/page_discovery.png', full_page=True)
38 | print("\nScreenshot saved to /tmp/page_discovery.png")
39 |
40 | browser.close()
--------------------------------------------------------------------------------
/artifacts-builder/scripts/bundle-artifact.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | set -e
3 |
4 | echo "📦 Bundling React app to single HTML artifact..."
5 |
6 | # Check if we're in a project directory
7 | if [ ! -f "package.json" ]; then
8 | echo "❌ Error: No package.json found. Run this script from your project root."
9 | exit 1
10 | fi
11 |
12 | # Check if index.html exists
13 | if [ ! -f "index.html" ]; then
14 | echo "❌ Error: No index.html found in project root."
15 | echo " This script requires an index.html entry point."
16 | exit 1
17 | fi
18 |
19 | # Install bundling dependencies
20 | echo "📦 Installing bundling dependencies..."
21 | pnpm add -D parcel @parcel/config-default parcel-resolver-tspaths html-inline
22 |
23 | # Create Parcel config with tspaths resolver
24 | if [ ! -f ".parcelrc" ]; then
25 | echo "🔧 Creating Parcel configuration with path alias support..."
26 | cat > .parcelrc << 'EOF'
27 | {
28 | "extends": "@parcel/config-default",
29 | "resolvers": ["parcel-resolver-tspaths", "..."]
30 | }
31 | EOF
32 | fi
33 |
34 | # Clean previous build
35 | echo "🧹 Cleaning previous build..."
36 | rm -rf dist bundle.html
37 |
38 | # Build with Parcel
39 | echo "🔨 Building with Parcel..."
40 | pnpm exec parcel build index.html --dist-dir dist --no-source-maps
41 |
42 | # Inline everything into single HTML
43 | echo "🎯 Inlining all assets into single HTML file..."
44 | pnpm exec html-inline dist/index.html > bundle.html
45 |
46 | # Get file size
47 | FILE_SIZE=$(du -h bundle.html | cut -f1)
48 |
49 | echo ""
50 | echo "✅ Bundle complete!"
51 | echo "📄 Output: bundle.html ($FILE_SIZE)"
52 | echo ""
53 | echo "You can now use this single HTML file as an artifact in Claude conversations."
54 | echo "To test locally: open bundle.html in your browser"
--------------------------------------------------------------------------------
/document-skills/pdf/scripts/create_validation_image.py:
--------------------------------------------------------------------------------
1 | import json
2 | import sys
3 |
4 | from PIL import Image, ImageDraw
5 |
6 |
7 | # Creates "validation" images with rectangles for the bounding box information that
8 | # Claude creates when determining where to add text annotations in PDFs. See forms.md.
9 |
10 |
11 | def create_validation_image(page_number, fields_json_path, input_path, output_path):
12 | # Input file should be in the `fields.json` format described in forms.md.
13 | with open(fields_json_path, 'r') as f:
14 | data = json.load(f)
15 |
16 | img = Image.open(input_path)
17 | draw = ImageDraw.Draw(img)
18 | num_boxes = 0
19 |
20 | for field in data["form_fields"]:
21 | if field["page_number"] == page_number:
22 | entry_box = field['entry_bounding_box']
23 | label_box = field['label_bounding_box']
24 | # Draw red rectangle over entry bounding box and blue rectangle over the label.
25 | draw.rectangle(entry_box, outline='red', width=2)
26 | draw.rectangle(label_box, outline='blue', width=2)
27 | num_boxes += 2
28 |
29 | img.save(output_path)
30 | print(f"Created validation image at {output_path} with {num_boxes} bounding boxes")
31 |
32 |
33 | if __name__ == "__main__":
34 | if len(sys.argv) != 5:
35 | print("Usage: create_validation_image.py [page number] [fields.json file] [input image path] [output image path]")
36 | sys.exit(1)
37 | page_number = int(sys.argv[1])
38 | fields_json_path = sys.argv[2]
39 | input_image_path = sys.argv[3]
40 | output_image_path = sys.argv[4]
41 | create_validation_image(page_number, fields_json_path, input_image_path, output_image_path)
42 |
--------------------------------------------------------------------------------
/document-skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/document-skills/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
33 |
34 |
35 |
36 |
37 |
38 |
40 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
33 |
34 |
35 |
36 |
37 |
38 |
40 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/document-skills/docx/ooxml/scripts/validate.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 | """
3 | Command line tool to validate Office document XML files against XSD schemas and tracked changes.
4 |
5 | Usage:
6 | python validate.py --original
7 | """
8 |
9 | import argparse
10 | import sys
11 | from pathlib import Path
12 |
13 | from validation import DOCXSchemaValidator, PPTXSchemaValidator, RedliningValidator
14 |
15 |
16 | def main():
17 | parser = argparse.ArgumentParser(description="Validate Office document XML files")
18 | parser.add_argument(
19 | "unpacked_dir",
20 | help="Path to unpacked Office document directory",
21 | )
22 | parser.add_argument(
23 | "--original",
24 | required=True,
25 | help="Path to original file (.docx/.pptx/.xlsx)",
26 | )
27 | parser.add_argument(
28 | "-v",
29 | "--verbose",
30 | action="store_true",
31 | help="Enable verbose output",
32 | )
33 | args = parser.parse_args()
34 |
35 | # Validate paths
36 | unpacked_dir = Path(args.unpacked_dir)
37 | original_file = Path(args.original)
38 | file_extension = original_file.suffix.lower()
39 | assert unpacked_dir.is_dir(), f"Error: {unpacked_dir} is not a directory"
40 | assert original_file.is_file(), f"Error: {original_file} is not a file"
41 | assert file_extension in [".docx", ".pptx", ".xlsx"], (
42 | f"Error: {original_file} must be a .docx, .pptx, or .xlsx file"
43 | )
44 |
45 | # Run validations
46 | match file_extension:
47 | case ".docx":
48 | validators = [DOCXSchemaValidator, RedliningValidator]
49 | case ".pptx":
50 | validators = [PPTXSchemaValidator]
51 | case _:
52 | print(f"Error: Validation not supported for file type {file_extension}")
53 | sys.exit(1)
54 |
55 | # Run validators
56 | success = True
57 | for V in validators:
58 | validator = V(unpacked_dir, original_file, verbose=args.verbose)
59 | if not validator.validate():
60 | success = False
61 |
62 | if success:
63 | print("All validations PASSED!")
64 |
65 | sys.exit(0 if success else 1)
66 |
67 |
68 | if __name__ == "__main__":
69 | main()
70 |
--------------------------------------------------------------------------------
/document-skills/pptx/ooxml/scripts/validate.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 | """
3 | Command line tool to validate Office document XML files against XSD schemas and tracked changes.
4 |
5 | Usage:
6 | python validate.py --original
7 | """
8 |
9 | import argparse
10 | import sys
11 | from pathlib import Path
12 |
13 | from validation import DOCXSchemaValidator, PPTXSchemaValidator, RedliningValidator
14 |
15 |
16 | def main():
17 | parser = argparse.ArgumentParser(description="Validate Office document XML files")
18 | parser.add_argument(
19 | "unpacked_dir",
20 | help="Path to unpacked Office document directory",
21 | )
22 | parser.add_argument(
23 | "--original",
24 | required=True,
25 | help="Path to original file (.docx/.pptx/.xlsx)",
26 | )
27 | parser.add_argument(
28 | "-v",
29 | "--verbose",
30 | action="store_true",
31 | help="Enable verbose output",
32 | )
33 | args = parser.parse_args()
34 |
35 | # Validate paths
36 | unpacked_dir = Path(args.unpacked_dir)
37 | original_file = Path(args.original)
38 | file_extension = original_file.suffix.lower()
39 | assert unpacked_dir.is_dir(), f"Error: {unpacked_dir} is not a directory"
40 | assert original_file.is_file(), f"Error: {original_file} is not a file"
41 | assert file_extension in [".docx", ".pptx", ".xlsx"], (
42 | f"Error: {original_file} must be a .docx, .pptx, or .xlsx file"
43 | )
44 |
45 | # Run validations
46 | match file_extension:
47 | case ".docx":
48 | validators = [DOCXSchemaValidator, RedliningValidator]
49 | case ".pptx":
50 | validators = [PPTXSchemaValidator]
51 | case _:
52 | print(f"Error: Validation not supported for file type {file_extension}")
53 | sys.exit(1)
54 |
55 | # Run validators
56 | success = True
57 | for V in validators:
58 | validator = V(unpacked_dir, original_file, verbose=args.verbose)
59 | if not validator.validate():
60 | success = False
61 |
62 | if success:
63 | print("All validations PASSED!")
64 |
65 | sys.exit(0 if success else 1)
66 |
67 |
68 | if __name__ == "__main__":
69 | main()
70 |
--------------------------------------------------------------------------------
/skill-creator/scripts/quick_validate.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 | """
3 | Quick validation script for skills - minimal version
4 | """
5 |
6 | import sys
7 | import os
8 | import re
9 | from pathlib import Path
10 |
11 | def validate_skill(skill_path):
12 | """Basic validation of a skill"""
13 | skill_path = Path(skill_path)
14 |
15 | # Check SKILL.md exists
16 | skill_md = skill_path / 'SKILL.md'
17 | if not skill_md.exists():
18 | return False, "SKILL.md not found"
19 |
20 | # Read and validate frontmatter
21 | content = skill_md.read_text()
22 | if not content.startswith('---'):
23 | return False, "No YAML frontmatter found"
24 |
25 | # Extract frontmatter
26 | match = re.match(r'^---\n(.*?)\n---', content, re.DOTALL)
27 | if not match:
28 | return False, "Invalid frontmatter format"
29 |
30 | frontmatter = match.group(1)
31 |
32 | # Check required fields
33 | if 'name:' not in frontmatter:
34 | return False, "Missing 'name' in frontmatter"
35 | if 'description:' not in frontmatter:
36 | return False, "Missing 'description' in frontmatter"
37 |
38 | # Extract name for validation
39 | name_match = re.search(r'name:\s*(.+)', frontmatter)
40 | if name_match:
41 | name = name_match.group(1).strip()
42 | # Check naming convention (hyphen-case: lowercase with hyphens)
43 | if not re.match(r'^[a-z0-9-]+$', name):
44 | return False, f"Name '{name}' should be hyphen-case (lowercase letters, digits, and hyphens only)"
45 | if name.startswith('-') or name.endswith('-') or '--' in name:
46 | return False, f"Name '{name}' cannot start/end with hyphen or contain consecutive hyphens"
47 |
48 | # Extract and validate description
49 | desc_match = re.search(r'description:\s*(.+)', frontmatter)
50 | if desc_match:
51 | description = desc_match.group(1).strip()
52 | # Check for angle brackets
53 | if '<' in description or '>' in description:
54 | return False, "Description cannot contain angle brackets (< or >)"
55 |
56 | return True, "Skill is valid!"
57 |
58 | if __name__ == "__main__":
59 | if len(sys.argv) != 2:
60 | print("Usage: python quick_validate.py ")
61 | sys.exit(1)
62 |
63 | valid, message = validate_skill(sys.argv[1])
64 | print(message)
65 | sys.exit(0 if valid else 1)
--------------------------------------------------------------------------------
/internal-comms/examples/faq-answers.md:
--------------------------------------------------------------------------------
1 | ## Instructions
2 | You are an assistant for answering questions that are being asked across the company. Every week, there are lots of questions that get asked across the company, and your goal is to try to summarize what those questions are. We want our company to be well-informed and on the same page, so your job is to produce a set of frequently asked questions that our employees are asking and attempt to answer them. Your singular job is to do two things:
3 |
4 | - Find questions that are big sources of confusion for lots of employees at the company, generally about things that affect a large portion of the employee base
5 | - Attempt to give a nice summarized answer to that question in order to minimize confusion.
6 |
7 | Some examples of areas that may be interesting to folks: recent corporate events (fundraising, new executives, etc.), upcoming launches, hiring progress, changes to vision or focus, etc.
8 |
9 |
10 | ## Tools Available
11 | You should use the company's available tools, where communication and work happens. For most companies, it looks something like this:
12 | - Slack: questions being asked across the company - it could be questions in response to posts with lots of responses, questions being asked with lots of reactions or thumbs up to show support, or anything else to show that a large number of employees want to ask the same things
13 | - Email: emails with FAQs written directly in them can be a good source as well
14 | - Documents: docs in places like Google Drive, linked on calendar events, etc. can also be a good source of FAQs, either directly added or inferred based on the contents of the doc
15 |
16 | ## Formatting
17 | The formatting should be pretty basic:
18 |
19 | - *Question*: [insert question - 1 sentence]
20 | - *Answer*: [insert answer - 1-2 sentence]
21 |
22 | ## Guidance
23 | Make sure you're being holistic in your questions. Don't focus too much on just the user in question or the team they are a part of, but try to capture the entire company. Try to be as holistic as you can in reading all the tools available, producing responses that are relevant to all at the company.
24 |
25 | ## Answer Guidelines
26 | - Base answers on official company communications when possible
27 | - If information is uncertain, indicate that clearly
28 | - Link to authoritative sources (docs, announcements, emails)
29 | - Keep tone professional but approachable
30 | - Flag if a question requires executive input or official response
--------------------------------------------------------------------------------
/brand-guidelines/SKILL.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: brand-guidelines
3 | description: Applies Anthropic's official brand colors and typography to any sort of artifact that may benefit from having Anthropic's look-and-feel. Use it when brand colors or style guidelines, visual formatting, or company design standards apply.
4 | license: Complete terms in LICENSE.txt
5 | ---
6 |
7 | # Anthropic Brand Styling
8 |
9 | ## Overview
10 |
11 | To access Anthropic's official brand identity and style resources, use this skill.
12 |
13 | **Keywords**: branding, corporate identity, visual identity, post-processing, styling, brand colors, typography, Anthropic brand, visual formatting, visual design
14 |
15 | ## Brand Guidelines
16 |
17 | ### Colors
18 |
19 | **Main Colors:**
20 |
21 | - Dark: `#141413` - Primary text and dark backgrounds
22 | - Light: `#faf9f5` - Light backgrounds and text on dark
23 | - Mid Gray: `#b0aea5` - Secondary elements
24 | - Light Gray: `#e8e6dc` - Subtle backgrounds
25 |
26 | **Accent Colors:**
27 |
28 | - Orange: `#d97757` - Primary accent
29 | - Blue: `#6a9bcc` - Secondary accent
30 | - Green: `#788c5d` - Tertiary accent
31 |
32 | ### Typography
33 |
34 | - **Headings**: Poppins (with Arial fallback)
35 | - **Body Text**: Lora (with Georgia fallback)
36 | - **Note**: Fonts should be pre-installed in your environment for best results
37 |
38 | ## Features
39 |
40 | ### Smart Font Application
41 |
42 | - Applies Poppins font to headings (24pt and larger)
43 | - Applies Lora font to body text
44 | - Automatically falls back to Arial/Georgia if custom fonts unavailable
45 | - Preserves readability across all systems
46 |
47 | ### Text Styling
48 |
49 | - Headings (24pt+): Poppins font
50 | - Body text: Lora font
51 | - Smart color selection based on background
52 | - Preserves text hierarchy and formatting
53 |
54 | ### Shape and Accent Colors
55 |
56 | - Non-text shapes use accent colors
57 | - Cycles through orange, blue, and green accents
58 | - Maintains visual interest while staying on-brand
59 |
60 | ## Technical Details
61 |
62 | ### Font Management
63 |
64 | - Uses system-installed Poppins and Lora fonts when available
65 | - Provides automatic fallback to Arial (headings) and Georgia (body)
66 | - No font installation required - works with existing system fonts
67 | - For best results, pre-install Poppins and Lora fonts in your environment
68 |
69 | ### Color Application
70 |
71 | - Uses RGB color values for precise brand matching
72 | - Applied via python-pptx's RGBColor class
73 | - Maintains color fidelity across different systems
74 |
--------------------------------------------------------------------------------
/document-skills/docx/scripts/templates/comments.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/document-skills/docx/scripts/templates/commentsExtended.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/document-skills/docx/scripts/templates/commentsIds.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/document-skills/docx/scripts/templates/commentsExtensible.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
9 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
--------------------------------------------------------------------------------
/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
9 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
--------------------------------------------------------------------------------
/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd:
--------------------------------------------------------------------------------
1 |
2 |
8 |
10 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
--------------------------------------------------------------------------------
/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd:
--------------------------------------------------------------------------------
1 |
2 |
8 |
10 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
--------------------------------------------------------------------------------
/image-enhancer/SKILL.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: image-enhancer
3 | description: Improves the quality of images, especially screenshots, by enhancing resolution, sharpness, and clarity. Perfect for preparing images for presentations, documentation, or social media posts.
4 | ---
5 |
6 | # Image Enhancer
7 |
8 | This skill takes your images and screenshots and makes them look better—sharper, clearer, and more professional.
9 |
10 | ## When to Use This Skill
11 |
12 | - Improving screenshot quality for blog posts or documentation
13 | - Enhancing images before sharing on social media
14 | - Preparing images for presentations or reports
15 | - Upscaling low-resolution images
16 | - Sharpening blurry photos
17 | - Cleaning up compressed images
18 |
19 | ## What This Skill Does
20 |
21 | 1. **Analyzes Image Quality**: Checks resolution, sharpness, and compression artifacts
22 | 2. **Enhances Resolution**: Upscales images intelligently
23 | 3. **Improves Sharpness**: Enhances edges and details
24 | 4. **Reduces Artifacts**: Cleans up compression artifacts and noise
25 | 5. **Optimizes for Use Case**: Adjusts based on intended use (web, print, social media)
26 |
27 | ## How to Use
28 |
29 | ### Basic Enhancement
30 |
31 | ```
32 | Improve the image quality of screenshot.png
33 | ```
34 |
35 | ```
36 | Enhance all images in this folder
37 | ```
38 |
39 | ### Specific Improvements
40 |
41 | ```
42 | Upscale this image to 4K resolution
43 | ```
44 |
45 | ```
46 | Sharpen this blurry screenshot
47 | ```
48 |
49 | ```
50 | Reduce compression artifacts in this image
51 | ```
52 |
53 | ### Batch Processing
54 |
55 | ```
56 | Improve the quality of all PNG files in this directory
57 | ```
58 |
59 | ## Example
60 |
61 | **User**: "Improve the image quality of screenshot-2024.png"
62 |
63 | **Output**:
64 | ```
65 | Analyzing screenshot-2024.png...
66 |
67 | Current specs:
68 | - Resolution: 1920x1080
69 | - Format: PNG
70 | - Quality: Good, but slight blur
71 |
72 | Enhancements applied:
73 | ✓ Upscaled to 2560x1440 (retina)
74 | ✓ Sharpened edges
75 | ✓ Enhanced text clarity
76 | ✓ Optimized file size
77 |
78 | Saved as: screenshot-2024-enhanced.png
79 | Original preserved as: screenshot-2024-original.png
80 | ```
81 |
82 | **Inspired by:** Lenny Rachitsky's workflow from his newsletter - used for screenshots in his articles
83 |
84 | ## Tips
85 |
86 | - Always keeps original files as backup
87 | - Works best with screenshots and digital images
88 | - Can batch process entire folders
89 | - Specify output format if needed (PNG for quality, JPG for smaller size)
90 | - For social media, mention the platform for optimal sizing
91 |
92 | ## Common Use Cases
93 |
94 | - **Blog Posts**: Enhance screenshots before publishing
95 | - **Documentation**: Make UI screenshots crystal clear
96 | - **Social Media**: Optimize images for Twitter, LinkedIn, Instagram
97 | - **Presentations**: Upscale images for large screens
98 | - **Print Materials**: Increase resolution for physical media
99 |
100 |
--------------------------------------------------------------------------------
/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
39 |
40 |
41 |
42 |
43 |
44 |
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
39 |
40 |
41 |
42 |
43 |
44 |
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/video-downloader/SKILL.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: video-downloader
3 | description: Downloads videos from YouTube and other platforms for offline viewing, editing, or archival. Handles various formats and quality options.
4 | ---
5 |
6 | # Video Downloader
7 |
8 | This skill downloads videos from YouTube and other platforms directly to your computer.
9 |
10 | ## When to Use This Skill
11 |
12 | - Downloading YouTube videos for offline viewing
13 | - Saving educational content for reference
14 | - Archiving important videos
15 | - Getting video files for editing or repurposing
16 | - Downloading your own content from platforms
17 | - Saving conference talks or webinars
18 |
19 | ## What This Skill Does
20 |
21 | 1. **Downloads Videos**: Fetches videos from YouTube and other platforms
22 | 2. **Quality Selection**: Lets you choose resolution (480p, 720p, 1080p, 4K)
23 | 3. **Format Options**: Downloads in various formats (MP4, WebM, audio-only)
24 | 4. **Batch Downloads**: Can download multiple videos or playlists
25 | 5. **Metadata Preservation**: Saves title, description, and thumbnail
26 |
27 | ## How to Use
28 |
29 | ### Basic Download
30 |
31 | ```
32 | Download this YouTube video: https://youtube.com/watch?v=...
33 | ```
34 |
35 | ```
36 | Download this video in 1080p quality
37 | ```
38 |
39 | ### Audio Only
40 |
41 | ```
42 | Download the audio from this YouTube video as MP3
43 | ```
44 |
45 | ### Playlist Download
46 |
47 | ```
48 | Download all videos from this YouTube playlist: [URL]
49 | ```
50 |
51 | ### Batch Download
52 |
53 | ```
54 | Download these 5 YouTube videos:
55 | 1. [URL]
56 | 2. [URL]
57 | ...
58 | ```
59 |
60 | ## Example
61 |
62 | **User**: "Download this YouTube video: https://youtube.com/watch?v=abc123"
63 |
64 | **Output**:
65 | ```
66 | Downloading from YouTube...
67 |
68 | Video: "How to Build Products Users Love"
69 | Channel: Lenny's Podcast
70 | Duration: 45:32
71 | Quality: 1080p
72 |
73 | Progress: ████████████████████ 100%
74 |
75 | ✓ Downloaded: how-to-build-products-users-love.mp4
76 | ✓ Saved thumbnail: how-to-build-products-users-love.jpg
77 | ✓ Size: 342 MB
78 |
79 | Saved to: ~/Downloads/
80 | ```
81 |
82 | **Inspired by:** Lenny's workflow from his newsletter
83 |
84 | ## Important Notes
85 |
86 | ⚠️ **Copyright & Fair Use**
87 | - Only download videos you have permission to download
88 | - Respect copyright laws and platform terms of service
89 | - Use for personal, educational, or fair use purposes
90 | - Don't redistribute copyrighted content
91 |
92 | ## Tips
93 |
94 | - Specify quality if you need lower file size (720p vs 1080p)
95 | - Use audio-only for podcasts or music to save space
96 | - Download to a dedicated folder to stay organized
97 | - Check file size before downloading on slow connections
98 |
99 | ## Common Use Cases
100 |
101 | - **Education**: Save tutorials and courses for offline learning
102 | - **Research**: Archive videos for reference
103 | - **Content Creation**: Download your own content from platforms
104 | - **Backup**: Save important videos before they're removed
105 | - **Offline Viewing**: Watch videos without internet access
106 |
107 |
--------------------------------------------------------------------------------
/skill-share/SKILL.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: skill-share
3 | description: A skill that creates new Claude skills and automatically shares them on Slack using Rube for seamless team collaboration and skill discovery.
4 | license: Complete terms in LICENSE.txt
5 | ---
6 |
7 | ## When to use this skill
8 |
9 | Use this skill when you need to:
10 | - **Create new Claude skills** with proper structure and metadata
11 | - **Generate skill packages** ready for distribution
12 | - **Automatically share created skills** on Slack channels for team visibility
13 | - **Validate skill structure** before sharing
14 | - **Package and distribute** skills to your team
15 |
16 | Also use this skill when:
17 | - **User says he wants to create/share his skill**
18 |
19 | This skill is ideal for:
20 | - Creating skills as part of team workflows
21 | - Building internal tools that need skill creation + team notification
22 | - Automating the skill development pipeline
23 | - Collaborative skill creation with team notifications
24 |
25 | ## Key Features
26 |
27 | ### 1. Skill Creation
28 | - Creates properly structured skill directories with SKILL.md
29 | - Generates standardized scripts/, references/, and assets/ directories
30 | - Auto-generates YAML frontmatter with required metadata
31 | - Enforces naming conventions (hyphen-case)
32 |
33 | ### 2. Skill Validation
34 | - Validates SKILL.md format and required fields
35 | - Checks naming conventions
36 | - Ensures metadata completeness before packaging
37 |
38 | ### 3. Skill Packaging
39 | - Creates distributable zip files
40 | - Includes all skill assets and documentation
41 | - Runs validation automatically before packaging
42 |
43 | ### 4. Slack Integration via Rube
44 | - Automatically sends created skill information to designated Slack channels
45 | - Shares skill metadata (name, description, link)
46 | - Posts skill summary for team discovery
47 | - Provides direct links to skill files
48 |
49 | ## How It Works
50 |
51 | 1. **Initialization**: Provide skill name and description
52 | 2. **Creation**: Skill directory is created with proper structure
53 | 3. **Validation**: Skill metadata is validated for correctness
54 | 4. **Packaging**: Skill is packaged into a distributable format
55 | 5. **Slack Notification**: Skill details are posted to your team's Slack channel
56 |
57 | ## Example Usage
58 |
59 | ```
60 | When you ask Claude to create a skill called "pdf-analyzer":
61 | 1. Creates /skill-pdf-analyzer/ with SKILL.md template
62 | 2. Generates structured directories (scripts/, references/, assets/)
63 | 3. Validates the skill structure
64 | 4. Packages the skill as a zip file
65 | 5. Posts to Slack: "New Skill Created: pdf-analyzer - Advanced PDF analysis and extraction capabilities"
66 | ```
67 |
68 | ## Integration with Rube
69 |
70 | This skill leverages Rube for:
71 | - **SLACK_SEND_MESSAGE**: Posts skill information to team channels
72 | - **SLACK_POST_MESSAGE_WITH_BLOCKS**: Shares rich formatted skill metadata
73 | - **SLACK_FIND_CHANNELS**: Discovers target channels for skill announcements
74 |
75 | ## Requirements
76 |
77 | - Slack workspace connection via Rube
78 | - Write access to skill creation directory
79 | - Python 3.7+ for skill creation scripts
80 | - Target Slack channel for skill notifications
81 |
--------------------------------------------------------------------------------
/theme-factory/SKILL.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: theme-factory
3 | description: Toolkit for styling artifacts with a theme. These artifacts can be slides, docs, reportings, HTML landing pages, etc. There are 10 pre-set themes with colors/fonts that you can apply to any artifact that has been creating, or can generate a new theme on-the-fly.
4 | license: Complete terms in LICENSE.txt
5 | ---
6 |
7 |
8 | # Theme Factory Skill
9 |
10 | This skill provides a curated collection of professional font and color themes themes, each with carefully selected color palettes and font pairings. Once a theme is chosen, it can be applied to any artifact.
11 |
12 | ## Purpose
13 |
14 | To apply consistent, professional styling to presentation slide decks, use this skill. Each theme includes:
15 | - A cohesive color palette with hex codes
16 | - Complementary font pairings for headers and body text
17 | - A distinct visual identity suitable for different contexts and audiences
18 |
19 | ## Usage Instructions
20 |
21 | To apply styling to a slide deck or other artifact:
22 |
23 | 1. **Show the theme showcase**: Display the `theme-showcase.pdf` file to allow users to see all available themes visually. Do not make any modifications to it; simply show the file for viewing.
24 | 2. **Ask for their choice**: Ask which theme to apply to the deck
25 | 3. **Wait for selection**: Get explicit confirmation about the chosen theme
26 | 4. **Apply the theme**: Once a theme has been chosen, apply the selected theme's colors and fonts to the deck/artifact
27 |
28 | ## Themes Available
29 |
30 | The following 10 themes are available, each showcased in `theme-showcase.pdf`:
31 |
32 | 1. **Ocean Depths** - Professional and calming maritime theme
33 | 2. **Sunset Boulevard** - Warm and vibrant sunset colors
34 | 3. **Forest Canopy** - Natural and grounded earth tones
35 | 4. **Modern Minimalist** - Clean and contemporary grayscale
36 | 5. **Golden Hour** - Rich and warm autumnal palette
37 | 6. **Arctic Frost** - Cool and crisp winter-inspired theme
38 | 7. **Desert Rose** - Soft and sophisticated dusty tones
39 | 8. **Tech Innovation** - Bold and modern tech aesthetic
40 | 9. **Botanical Garden** - Fresh and organic garden colors
41 | 10. **Midnight Galaxy** - Dramatic and cosmic deep tones
42 |
43 | ## Theme Details
44 |
45 | Each theme is defined in the `themes/` directory with complete specifications including:
46 | - Cohesive color palette with hex codes
47 | - Complementary font pairings for headers and body text
48 | - Distinct visual identity suitable for different contexts and audiences
49 |
50 | ## Application Process
51 |
52 | After a preferred theme is selected:
53 | 1. Read the corresponding theme file from the `themes/` directory
54 | 2. Apply the specified colors and fonts consistently throughout the deck
55 | 3. Ensure proper contrast and readability
56 | 4. Maintain the theme's visual identity across all slides
57 |
58 | ## Create your Own Theme
59 | To handle cases where none of the existing themes work for an artifact, create a custom theme. Based on provided inputs, generate a new theme similar to the ones above. Give the theme a similar name describing what the font/color combinations represent. Use any basic description provided to choose appropriate colors/fonts. After generating the theme, show it for review and verification. Following that, apply the theme as described above.
60 |
--------------------------------------------------------------------------------
/artifacts-builder/SKILL.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: artifacts-builder
3 | description: Suite of tools for creating elaborate, multi-component claude.ai HTML artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn/ui). Use for complex artifacts requiring state management, routing, or shadcn/ui components - not for simple single-file HTML/JSX artifacts.
4 | license: Complete terms in LICENSE.txt
5 | ---
6 |
7 | # Artifacts Builder
8 |
9 | To build powerful frontend claude.ai artifacts, follow these steps:
10 | 1. Initialize the frontend repo using `scripts/init-artifact.sh`
11 | 2. Develop your artifact by editing the generated code
12 | 3. Bundle all code into a single HTML file using `scripts/bundle-artifact.sh`
13 | 4. Display artifact to user
14 | 5. (Optional) Test the artifact
15 |
16 | **Stack**: React 18 + TypeScript + Vite + Parcel (bundling) + Tailwind CSS + shadcn/ui
17 |
18 | ## Design & Style Guidelines
19 |
20 | VERY IMPORTANT: To avoid what is often referred to as "AI slop", avoid using excessive centered layouts, purple gradients, uniform rounded corners, and Inter font.
21 |
22 | ## Quick Start
23 |
24 | ### Step 1: Initialize Project
25 |
26 | Run the initialization script to create a new React project:
27 | ```bash
28 | bash scripts/init-artifact.sh
29 | cd
30 | ```
31 |
32 | This creates a fully configured project with:
33 | - ✅ React + TypeScript (via Vite)
34 | - ✅ Tailwind CSS 3.4.1 with shadcn/ui theming system
35 | - ✅ Path aliases (`@/`) configured
36 | - ✅ 40+ shadcn/ui components pre-installed
37 | - ✅ All Radix UI dependencies included
38 | - ✅ Parcel configured for bundling (via .parcelrc)
39 | - ✅ Node 18+ compatibility (auto-detects and pins Vite version)
40 |
41 | ### Step 2: Develop Your Artifact
42 |
43 | To build the artifact, edit the generated files. See **Common Development Tasks** below for guidance.
44 |
45 | ### Step 3: Bundle to Single HTML File
46 |
47 | To bundle the React app into a single HTML artifact:
48 | ```bash
49 | bash scripts/bundle-artifact.sh
50 | ```
51 |
52 | This creates `bundle.html` - a self-contained artifact with all JavaScript, CSS, and dependencies inlined. This file can be directly shared in Claude conversations as an artifact.
53 |
54 | **Requirements**: Your project must have an `index.html` in the root directory.
55 |
56 | **What the script does**:
57 | - Installs bundling dependencies (parcel, @parcel/config-default, parcel-resolver-tspaths, html-inline)
58 | - Creates `.parcelrc` config with path alias support
59 | - Builds with Parcel (no source maps)
60 | - Inlines all assets into single HTML using html-inline
61 |
62 | ### Step 4: Share Artifact with User
63 |
64 | Finally, share the bundled HTML file in conversation with the user so they can view it as an artifact.
65 |
66 | ### Step 5: Testing/Visualizing the Artifact (Optional)
67 |
68 | Note: This is a completely optional step. Only perform if necessary or requested.
69 |
70 | To test/visualize the artifact, use available tools (including other Skills or built-in tools like Playwright or Puppeteer). In general, avoid testing the artifact upfront as it adds latency between the request and when the finished artifact can be seen. Test later, after presenting the artifact, if requested or if issues arise.
71 |
72 | ## Reference
73 |
74 | - **shadcn/ui components**: https://ui.shadcn.com/docs/components
--------------------------------------------------------------------------------
/document-skills/pdf/scripts/check_bounding_boxes.py:
--------------------------------------------------------------------------------
1 | from dataclasses import dataclass
2 | import json
3 | import sys
4 |
5 |
6 | # Script to check that the `fields.json` file that Claude creates when analyzing PDFs
7 | # does not have overlapping bounding boxes. See forms.md.
8 |
9 |
10 | @dataclass
11 | class RectAndField:
12 | rect: list[float]
13 | rect_type: str
14 | field: dict
15 |
16 |
17 | # Returns a list of messages that are printed to stdout for Claude to read.
18 | def get_bounding_box_messages(fields_json_stream) -> list[str]:
19 | messages = []
20 | fields = json.load(fields_json_stream)
21 | messages.append(f"Read {len(fields['form_fields'])} fields")
22 |
23 | def rects_intersect(r1, r2):
24 | disjoint_horizontal = r1[0] >= r2[2] or r1[2] <= r2[0]
25 | disjoint_vertical = r1[1] >= r2[3] or r1[3] <= r2[1]
26 | return not (disjoint_horizontal or disjoint_vertical)
27 |
28 | rects_and_fields = []
29 | for f in fields["form_fields"]:
30 | rects_and_fields.append(RectAndField(f["label_bounding_box"], "label", f))
31 | rects_and_fields.append(RectAndField(f["entry_bounding_box"], "entry", f))
32 |
33 | has_error = False
34 | for i, ri in enumerate(rects_and_fields):
35 | # This is O(N^2); we can optimize if it becomes a problem.
36 | for j in range(i + 1, len(rects_and_fields)):
37 | rj = rects_and_fields[j]
38 | if ri.field["page_number"] == rj.field["page_number"] and rects_intersect(ri.rect, rj.rect):
39 | has_error = True
40 | if ri.field is rj.field:
41 | messages.append(f"FAILURE: intersection between label and entry bounding boxes for `{ri.field['description']}` ({ri.rect}, {rj.rect})")
42 | else:
43 | messages.append(f"FAILURE: intersection between {ri.rect_type} bounding box for `{ri.field['description']}` ({ri.rect}) and {rj.rect_type} bounding box for `{rj.field['description']}` ({rj.rect})")
44 | if len(messages) >= 20:
45 | messages.append("Aborting further checks; fix bounding boxes and try again")
46 | return messages
47 | if ri.rect_type == "entry":
48 | if "entry_text" in ri.field:
49 | font_size = ri.field["entry_text"].get("font_size", 14)
50 | entry_height = ri.rect[3] - ri.rect[1]
51 | if entry_height < font_size:
52 | has_error = True
53 | messages.append(f"FAILURE: entry bounding box height ({entry_height}) for `{ri.field['description']}` is too short for the text content (font size: {font_size}). Increase the box height or decrease the font size.")
54 | if len(messages) >= 20:
55 | messages.append("Aborting further checks; fix bounding boxes and try again")
56 | return messages
57 |
58 | if not has_error:
59 | messages.append("SUCCESS: All bounding boxes are valid")
60 | return messages
61 |
62 | if __name__ == "__main__":
63 | if len(sys.argv) != 2:
64 | print("Usage: check_bounding_boxes.py [fields.json]")
65 | sys.exit(1)
66 | # Input file should be in the `fields.json` format described in forms.md.
67 | with open(sys.argv[1]) as f:
68 | messages = get_bounding_box_messages(f)
69 | for msg in messages:
70 | print(msg)
71 |
--------------------------------------------------------------------------------
/internal-comms/examples/3p-updates.md:
--------------------------------------------------------------------------------
1 | ## Instructions
2 | You are being asked to write a 3P update. 3P updates stand for "Progress, Plans, Problems." The main audience is for executives, leadership, other teammates, etc. They're meant to be very succinct and to-the-point: think something you can read in 30-60sec or less. They're also for people with some, but not a lot of context on what the team does.
3 |
4 | 3Ps can cover a team of any size, ranging all the way up to the entire company. The bigger the team, the less granular the tasks should be. For example, "mobile team" might have "shipped feature" or "fixed bugs," whereas the company might have really meaty 3Ps, like "hired 20 new people" or "closed 10 new deals."
5 |
6 | They represent the work of the team across a time period, almost always one week. They include three sections:
7 | 1) Progress: what the team has accomplished over the next time period. Focus mainly on things shipped, milestones achieved, tasks created, etc.
8 | 2) Plans: what the team plans to do over the next time period. Focus on what things are top-of-mind, really high priority, etc. for the team.
9 | 3) Problems: anything that is slowing the team down. This could be things like too few people, bugs or blockers that are preventing the team from moving forward, some deal that fell through, etc.
10 |
11 | Before writing them, make sure that you know the team name. If it's not specified, you can ask explicitly what the team name you're writing for is.
12 |
13 |
14 | ## Tools Available
15 | Whenever possible, try to pull from available sources to get the information you need:
16 | - Slack: posts from team members with their updates - ideally look for posts in large channels with lots of reactions
17 | - Google Drive: docs written from critical team members with lots of views
18 | - Email: emails with lots of responses of lots of content that seems relevant
19 | - Calendar: non-recurring meetings that have a lot of importance, like product reviews, etc.
20 |
21 |
22 | Try to gather as much context as you can, focusing on the things that covered the time period you're writing for:
23 | - Progress: anything between a week ago and today
24 | - Plans: anything from today to the next week
25 | - Problems: anything between a week ago and today
26 |
27 |
28 | If you don't have access, you can ask the user for things they want to cover. They might also include these things to you directly, in which case you're mostly just formatting for this particular format.
29 |
30 | ## Workflow
31 |
32 | 1. **Clarify scope**: Confirm the team name and time period (usually past week for Progress/Problems, next
33 | week for Plans)
34 | 2. **Gather information**: Use available tools or ask the user directly
35 | 3. **Draft the update**: Follow the strict formatting guidelines
36 | 4. **Review**: Ensure it's concise (30-60 seconds to read) and data-driven
37 |
38 | ## Formatting
39 |
40 | The format is always the same, very strict formatting. Never use any formatting other than this. Pick an emoji that is fun and captures the vibe of the team and update.
41 |
42 | [pick an emoji] [Team Name] (Dates Covered, usually a week)
43 | Progress: [1-3 sentences of content]
44 | Plans: [1-3 sentences of content]
45 | Problems: [1-3 sentences of content]
46 |
47 | Each section should be no more than 1-3 sentences: clear, to the point. It should be data-driven, and generally include metrics where possible. The tone should be very matter-of-fact, not super prose-heavy.
--------------------------------------------------------------------------------
/document-skills/docx/ooxml/schemas/mce/mc.xsd:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
--------------------------------------------------------------------------------
/document-skills/pptx/ooxml/schemas/mce/mc.xsd:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
--------------------------------------------------------------------------------
/internal-comms/examples/company-newsletter.md:
--------------------------------------------------------------------------------
1 | ## Instructions
2 | You are being asked to write a company-wide newsletter update. You are meant to summarize the past week/month of a company in the form of a newsletter that the entire company will read. It should be maybe ~20-25 bullet points long. It will be sent via Slack and email, so make it consumable for that.
3 |
4 | Ideally it includes the following attributes:
5 | - Lots of links: pulling documents from Google Drive that are very relevant, linking to prominent Slack messages in announce channels and from executives, perhgaps referencing emails that went company-wide, highlighting significant things that have happened in the company.
6 | - Short and to-the-point: each bullet should probably be no longer than ~1-2 sentences
7 | - Use the "we" tense, as you are part of the company. Many of the bullets should say "we did this" or "we did that"
8 |
9 | ## Tools to use
10 | If you have access to the following tools, please try to use them. If not, you can also let the user know directly that their responses would be better if they gave them access.
11 |
12 | - Slack: look for messages in channels with lots of people, with lots of reactions or lots of responses within the thread
13 | - Email: look for things from executives that discuss company-wide announcements
14 | - Calendar: if there were meetings with large attendee lists, particularly things like All-Hands meetings, big company announcements, etc. If there were documents attached to those meetings, those are great links to include.
15 | - Documents: if there were new docs published in the last week or two that got a lot of attention, you can link them. These should be things like company-wide vision docs, plans for the upcoming quarter or half, things authored by critical executives, etc.
16 | - External press: if you see references to articles or press we've received over the past week, that could be really cool too.
17 |
18 | If you don't have access to any of these things, you can ask the user for things they want to cover. In this case, you'll mostly just be polishing up and fitting to this format more directly.
19 |
20 | ## Sections
21 | The company is pretty big: 1000+ people. There are a variety of different teams and initiatives going on across the company. To make sure the update works well, try breaking it into sections of similar things. You might break into clusters like {product development, go to market, finance} or {recruiting, execution, vision}, or {external news, internal news} etc. Try to make sure the different areas of the company are highlighted well.
22 |
23 | ## Prioritization
24 | Focus on:
25 | - Company-wide impact (not team-specific details)
26 | - Announcements from leadership
27 | - Major milestones and achievements
28 | - Information that affects most employees
29 | - External recognition or press
30 |
31 | Avoid:
32 | - Overly granular team updates (save those for 3Ps)
33 | - Information only relevant to small groups
34 | - Duplicate information already communicated
35 |
36 | ## Example Formats
37 |
38 | :megaphone: Company Announcements
39 | - Announcement 1
40 | - Announcement 2
41 | - Announcement 3
42 |
43 | :dart: Progress on Priorities
44 | - Area 1
45 | - Sub-area 1
46 | - Sub-area 2
47 | - Sub-area 3
48 | - Area 2
49 | - Sub-area 1
50 | - Sub-area 2
51 | - Sub-area 3
52 | - Area 3
53 | - Sub-area 1
54 | - Sub-area 2
55 | - Sub-area 3
56 |
57 | :pillar: Leadership Updates
58 | - Post 1
59 | - Post 2
60 | - Post 3
61 |
62 | :thread: Social Updates
63 | - Update 1
64 | - Update 2
65 | - Update 3
66 |
--------------------------------------------------------------------------------
/slack-gif-creator/templates/bounce.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 | """
3 | Bounce Animation Template - Creates bouncing motion for objects.
4 |
5 | Use this to make objects bounce up and down or horizontally with realistic physics.
6 | """
7 |
8 | import sys
9 | from pathlib import Path
10 |
11 | # Add parent directory to path
12 | sys.path.append(str(Path(__file__).parent.parent))
13 |
14 | from core.gif_builder import GIFBuilder
15 | from core.frame_composer import create_blank_frame, draw_circle, draw_emoji
16 | from core.easing import ease_out_bounce, interpolate
17 |
18 |
19 | def create_bounce_animation(
20 | object_type: str = 'circle',
21 | object_data: dict = None,
22 | num_frames: int = 30,
23 | bounce_height: int = 150,
24 | ground_y: int = 350,
25 | start_x: int = 240,
26 | frame_width: int = 480,
27 | frame_height: int = 480,
28 | bg_color: tuple[int, int, int] = (255, 255, 255)
29 | ) -> list:
30 | """
31 | Create frames for a bouncing animation.
32 |
33 | Args:
34 | object_type: 'circle', 'emoji', or 'custom'
35 | object_data: Data for the object (e.g., {'radius': 30, 'color': (255, 0, 0)})
36 | num_frames: Number of frames in the animation
37 | bounce_height: Maximum height of bounce
38 | ground_y: Y position of ground
39 | start_x: X position (or starting X if moving horizontally)
40 | frame_width: Frame width
41 | frame_height: Frame height
42 | bg_color: Background color
43 |
44 | Returns:
45 | List of frames
46 | """
47 | frames = []
48 |
49 | # Default object data
50 | if object_data is None:
51 | if object_type == 'circle':
52 | object_data = {'radius': 30, 'color': (255, 100, 100)}
53 | elif object_type == 'emoji':
54 | object_data = {'emoji': '⚽', 'size': 60}
55 |
56 | for i in range(num_frames):
57 | # Create blank frame
58 | frame = create_blank_frame(frame_width, frame_height, bg_color)
59 |
60 | # Calculate progress (0.0 to 1.0)
61 | t = i / (num_frames - 1) if num_frames > 1 else 0
62 |
63 | # Calculate Y position using bounce easing
64 | y = ground_y - int(ease_out_bounce(t) * bounce_height)
65 |
66 | # Draw object
67 | if object_type == 'circle':
68 | draw_circle(
69 | frame,
70 | center=(start_x, y),
71 | radius=object_data['radius'],
72 | fill_color=object_data['color']
73 | )
74 | elif object_type == 'emoji':
75 | draw_emoji(
76 | frame,
77 | emoji=object_data['emoji'],
78 | position=(start_x - object_data['size'] // 2, y - object_data['size'] // 2),
79 | size=object_data['size']
80 | )
81 |
82 | frames.append(frame)
83 |
84 | return frames
85 |
86 |
87 | # Example usage
88 | if __name__ == '__main__':
89 | print("Creating bouncing ball GIF...")
90 |
91 | # Create GIF builder
92 | builder = GIFBuilder(width=480, height=480, fps=20)
93 |
94 | # Generate bounce animation
95 | frames = create_bounce_animation(
96 | object_type='circle',
97 | object_data={'radius': 40, 'color': (255, 100, 100)},
98 | num_frames=40,
99 | bounce_height=200
100 | )
101 |
102 | # Add frames to builder
103 | builder.add_frames(frames)
104 |
105 | # Save GIF
106 | builder.save('bounce_test.gif', num_colors=64)
--------------------------------------------------------------------------------
/changelog-generator/SKILL.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: changelog-generator
3 | description: Automatically creates user-facing changelogs from git commits by analyzing commit history, categorizing changes, and transforming technical commits into clear, customer-friendly release notes. Turns hours of manual changelog writing into minutes of automated generation.
4 | ---
5 |
6 | # Changelog Generator
7 |
8 | This skill transforms technical git commits into polished, user-friendly changelogs that your customers and users will actually understand and appreciate.
9 |
10 | ## When to Use This Skill
11 |
12 | - Preparing release notes for a new version
13 | - Creating weekly or monthly product update summaries
14 | - Documenting changes for customers
15 | - Writing changelog entries for app store submissions
16 | - Generating update notifications
17 | - Creating internal release documentation
18 | - Maintaining a public changelog/product updates page
19 |
20 | ## What This Skill Does
21 |
22 | 1. **Scans Git History**: Analyzes commits from a specific time period or between versions
23 | 2. **Categorizes Changes**: Groups commits into logical categories (features, improvements, bug fixes, breaking changes, security)
24 | 3. **Translates Technical → User-Friendly**: Converts developer commits into customer language
25 | 4. **Formats Professionally**: Creates clean, structured changelog entries
26 | 5. **Filters Noise**: Excludes internal commits (refactoring, tests, etc.)
27 | 6. **Follows Best Practices**: Applies changelog guidelines and your brand voice
28 |
29 | ## How to Use
30 |
31 | ### Basic Usage
32 |
33 | From your project repository:
34 |
35 | ```
36 | Create a changelog from commits since last release
37 | ```
38 |
39 | ```
40 | Generate changelog for all commits from the past week
41 | ```
42 |
43 | ```
44 | Create release notes for version 2.5.0
45 | ```
46 |
47 | ### With Specific Date Range
48 |
49 | ```
50 | Create a changelog for all commits between March 1 and March 15
51 | ```
52 |
53 | ### With Custom Guidelines
54 |
55 | ```
56 | Create a changelog for commits since v2.4.0, using my changelog
57 | guidelines from CHANGELOG_STYLE.md
58 | ```
59 |
60 | ## Example
61 |
62 | **User**: "Create a changelog for commits from the past 7 days"
63 |
64 | **Output**:
65 | ```markdown
66 | # Updates - Week of March 10, 2024
67 |
68 | ## ✨ New Features
69 |
70 | - **Team Workspaces**: Create separate workspaces for different
71 | projects. Invite team members and keep everything organized.
72 |
73 | - **Keyboard Shortcuts**: Press ? to see all available shortcuts.
74 | Navigate faster without touching your mouse.
75 |
76 | ## 🔧 Improvements
77 |
78 | - **Faster Sync**: Files now sync 2x faster across devices
79 | - **Better Search**: Search now includes file contents, not just titles
80 |
81 | ## 🐛 Fixes
82 |
83 | - Fixed issue where large images wouldn't upload
84 | - Resolved timezone confusion in scheduled posts
85 | - Corrected notification badge count
86 | ```
87 |
88 | **Inspired by:** Manik Aggarwal's use case from Lenny's Newsletter
89 |
90 | ## Tips
91 |
92 | - Run from your git repository root
93 | - Specify date ranges for focused changelogs
94 | - Use your CHANGELOG_STYLE.md for consistent formatting
95 | - Review and adjust the generated changelog before publishing
96 | - Save output directly to CHANGELOG.md
97 |
98 | ## Related Use Cases
99 |
100 | - Creating GitHub release notes
101 | - Writing app store update descriptions
102 | - Generating email updates for users
103 | - Creating social media announcement posts
104 |
105 |
--------------------------------------------------------------------------------
/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd:
--------------------------------------------------------------------------------
1 |
2 |
7 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
--------------------------------------------------------------------------------
/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd:
--------------------------------------------------------------------------------
1 |
2 |
7 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
--------------------------------------------------------------------------------
/skill-creator/scripts/package_skill.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 | """
3 | Skill Packager - Creates a distributable zip file of a skill folder
4 |
5 | Usage:
6 | python utils/package_skill.py [output-directory]
7 |
8 | Example:
9 | python utils/package_skill.py skills/public/my-skill
10 | python utils/package_skill.py skills/public/my-skill ./dist
11 | """
12 |
13 | import sys
14 | import zipfile
15 | from pathlib import Path
16 | from quick_validate import validate_skill
17 |
18 |
19 | def package_skill(skill_path, output_dir=None):
20 | """
21 | Package a skill folder into a zip file.
22 |
23 | Args:
24 | skill_path: Path to the skill folder
25 | output_dir: Optional output directory for the zip file (defaults to current directory)
26 |
27 | Returns:
28 | Path to the created zip file, or None if error
29 | """
30 | skill_path = Path(skill_path).resolve()
31 |
32 | # Validate skill folder exists
33 | if not skill_path.exists():
34 | print(f"❌ Error: Skill folder not found: {skill_path}")
35 | return None
36 |
37 | if not skill_path.is_dir():
38 | print(f"❌ Error: Path is not a directory: {skill_path}")
39 | return None
40 |
41 | # Validate SKILL.md exists
42 | skill_md = skill_path / "SKILL.md"
43 | if not skill_md.exists():
44 | print(f"❌ Error: SKILL.md not found in {skill_path}")
45 | return None
46 |
47 | # Run validation before packaging
48 | print("🔍 Validating skill...")
49 | valid, message = validate_skill(skill_path)
50 | if not valid:
51 | print(f"❌ Validation failed: {message}")
52 | print(" Please fix the validation errors before packaging.")
53 | return None
54 | print(f"✅ {message}\n")
55 |
56 | # Determine output location
57 | skill_name = skill_path.name
58 | if output_dir:
59 | output_path = Path(output_dir).resolve()
60 | output_path.mkdir(parents=True, exist_ok=True)
61 | else:
62 | output_path = Path.cwd()
63 |
64 | zip_filename = output_path / f"{skill_name}.zip"
65 |
66 | # Create the zip file
67 | try:
68 | with zipfile.ZipFile(zip_filename, 'w', zipfile.ZIP_DEFLATED) as zipf:
69 | # Walk through the skill directory
70 | for file_path in skill_path.rglob('*'):
71 | if file_path.is_file():
72 | # Calculate the relative path within the zip
73 | arcname = file_path.relative_to(skill_path.parent)
74 | zipf.write(file_path, arcname)
75 | print(f" Added: {arcname}")
76 |
77 | print(f"\n✅ Successfully packaged skill to: {zip_filename}")
78 | return zip_filename
79 |
80 | except Exception as e:
81 | print(f"❌ Error creating zip file: {e}")
82 | return None
83 |
84 |
85 | def main():
86 | if len(sys.argv) < 2:
87 | print("Usage: python utils/package_skill.py [output-directory]")
88 | print("\nExample:")
89 | print(" python utils/package_skill.py skills/public/my-skill")
90 | print(" python utils/package_skill.py skills/public/my-skill ./dist")
91 | sys.exit(1)
92 |
93 | skill_path = sys.argv[1]
94 | output_dir = sys.argv[2] if len(sys.argv) > 2 else None
95 |
96 | print(f"📦 Packaging skill: {skill_path}")
97 | if output_dir:
98 | print(f" Output directory: {output_dir}")
99 | print()
100 |
101 | result = package_skill(skill_path, output_dir)
102 |
103 | if result:
104 | sys.exit(0)
105 | else:
106 | sys.exit(1)
107 |
108 |
109 | if __name__ == "__main__":
110 | main()
111 |
--------------------------------------------------------------------------------
/document-skills/docx/ooxml/schemas/microsoft/wml-2012.xsd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
--------------------------------------------------------------------------------
/document-skills/pptx/ooxml/schemas/microsoft/wml-2012.xsd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
--------------------------------------------------------------------------------
/document-skills/pdf/scripts/fill_pdf_form_with_annotations.py:
--------------------------------------------------------------------------------
1 | import json
2 | import sys
3 |
4 | from pypdf import PdfReader, PdfWriter
5 | from pypdf.annotations import FreeText
6 |
7 |
8 | # Fills a PDF by adding text annotations defined in `fields.json`. See forms.md.
9 |
10 |
11 | def transform_coordinates(bbox, image_width, image_height, pdf_width, pdf_height):
12 | """Transform bounding box from image coordinates to PDF coordinates"""
13 | # Image coordinates: origin at top-left, y increases downward
14 | # PDF coordinates: origin at bottom-left, y increases upward
15 | x_scale = pdf_width / image_width
16 | y_scale = pdf_height / image_height
17 |
18 | left = bbox[0] * x_scale
19 | right = bbox[2] * x_scale
20 |
21 | # Flip Y coordinates for PDF
22 | top = pdf_height - (bbox[1] * y_scale)
23 | bottom = pdf_height - (bbox[3] * y_scale)
24 |
25 | return left, bottom, right, top
26 |
27 |
28 | def fill_pdf_form(input_pdf_path, fields_json_path, output_pdf_path):
29 | """Fill the PDF form with data from fields.json"""
30 |
31 | # `fields.json` format described in forms.md.
32 | with open(fields_json_path, "r") as f:
33 | fields_data = json.load(f)
34 |
35 | # Open the PDF
36 | reader = PdfReader(input_pdf_path)
37 | writer = PdfWriter()
38 |
39 | # Copy all pages to writer
40 | writer.append(reader)
41 |
42 | # Get PDF dimensions for each page
43 | pdf_dimensions = {}
44 | for i, page in enumerate(reader.pages):
45 | mediabox = page.mediabox
46 | pdf_dimensions[i + 1] = [mediabox.width, mediabox.height]
47 |
48 | # Process each form field
49 | annotations = []
50 | for field in fields_data["form_fields"]:
51 | page_num = field["page_number"]
52 |
53 | # Get page dimensions and transform coordinates.
54 | page_info = next(p for p in fields_data["pages"] if p["page_number"] == page_num)
55 | image_width = page_info["image_width"]
56 | image_height = page_info["image_height"]
57 | pdf_width, pdf_height = pdf_dimensions[page_num]
58 |
59 | transformed_entry_box = transform_coordinates(
60 | field["entry_bounding_box"],
61 | image_width, image_height,
62 | pdf_width, pdf_height
63 | )
64 |
65 | # Skip empty fields
66 | if "entry_text" not in field or "text" not in field["entry_text"]:
67 | continue
68 | entry_text = field["entry_text"]
69 | text = entry_text["text"]
70 | if not text:
71 | continue
72 |
73 | font_name = entry_text.get("font", "Arial")
74 | font_size = str(entry_text.get("font_size", 14)) + "pt"
75 | font_color = entry_text.get("font_color", "000000")
76 |
77 | # Font size/color seems to not work reliably across viewers:
78 | # https://github.com/py-pdf/pypdf/issues/2084
79 | annotation = FreeText(
80 | text=text,
81 | rect=transformed_entry_box,
82 | font=font_name,
83 | font_size=font_size,
84 | font_color=font_color,
85 | border_color=None,
86 | background_color=None,
87 | )
88 | annotations.append(annotation)
89 | # page_number is 0-based for pypdf
90 | writer.add_annotation(page_number=page_num - 1, annotation=annotation)
91 |
92 | # Save the filled PDF
93 | with open(output_pdf_path, "wb") as output:
94 | writer.write(output)
95 |
96 | print(f"Successfully filled PDF form and saved to {output_pdf_path}")
97 | print(f"Added {len(annotations)} text annotations")
98 |
99 |
100 | if __name__ == "__main__":
101 | if len(sys.argv) != 4:
102 | print("Usage: fill_pdf_form_with_annotations.py [input pdf] [fields.json] [output pdf]")
103 | sys.exit(1)
104 | input_pdf = sys.argv[1]
105 | fields_json = sys.argv[2]
106 | output_pdf = sys.argv[3]
107 |
108 | fill_pdf_form(input_pdf, fields_json, output_pdf)
--------------------------------------------------------------------------------
/webapp-testing/SKILL.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: webapp-testing
3 | description: Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.
4 | license: Complete terms in LICENSE.txt
5 | ---
6 |
7 | # Web Application Testing
8 |
9 | To test local web applications, write native Python Playwright scripts.
10 |
11 | **Helper Scripts Available**:
12 | - `scripts/with_server.py` - Manages server lifecycle (supports multiple servers)
13 |
14 | **Always run scripts with `--help` first** to see usage. DO NOT read the source until you try running the script first and find that a customized solution is abslutely necessary. These scripts can be very large and thus pollute your context window. They exist to be called directly as black-box scripts rather than ingested into your context window.
15 |
16 | ## Decision Tree: Choosing Your Approach
17 |
18 | ```
19 | User task → Is it static HTML?
20 | ├─ Yes → Read HTML file directly to identify selectors
21 | │ ├─ Success → Write Playwright script using selectors
22 | │ └─ Fails/Incomplete → Treat as dynamic (below)
23 | │
24 | └─ No (dynamic webapp) → Is the server already running?
25 | ├─ No → Run: python scripts/with_server.py --help
26 | │ Then use the helper + write simplified Playwright script
27 | │
28 | └─ Yes → Reconnaissance-then-action:
29 | 1. Navigate and wait for networkidle
30 | 2. Take screenshot or inspect DOM
31 | 3. Identify selectors from rendered state
32 | 4. Execute actions with discovered selectors
33 | ```
34 |
35 | ## Example: Using with_server.py
36 |
37 | To start a server, run `--help` first, then use the helper:
38 |
39 | **Single server:**
40 | ```bash
41 | python scripts/with_server.py --server "npm run dev" --port 5173 -- python your_automation.py
42 | ```
43 |
44 | **Multiple servers (e.g., backend + frontend):**
45 | ```bash
46 | python scripts/with_server.py \
47 | --server "cd backend && python server.py" --port 3000 \
48 | --server "cd frontend && npm run dev" --port 5173 \
49 | -- python your_automation.py
50 | ```
51 |
52 | To create an automation script, include only Playwright logic (servers are managed automatically):
53 | ```python
54 | from playwright.sync_api import sync_playwright
55 |
56 | with sync_playwright() as p:
57 | browser = p.chromium.launch(headless=True) # Always launch chromium in headless mode
58 | page = browser.new_page()
59 | page.goto('http://localhost:5173') # Server already running and ready
60 | page.wait_for_load_state('networkidle') # CRITICAL: Wait for JS to execute
61 | # ... your automation logic
62 | browser.close()
63 | ```
64 |
65 | ## Reconnaissance-Then-Action Pattern
66 |
67 | 1. **Inspect rendered DOM**:
68 | ```python
69 | page.screenshot(path='/tmp/inspect.png', full_page=True)
70 | content = page.content()
71 | page.locator('button').all()
72 | ```
73 |
74 | 2. **Identify selectors** from inspection results
75 |
76 | 3. **Execute actions** using discovered selectors
77 |
78 | ## Common Pitfall
79 |
80 | ❌ **Don't** inspect the DOM before waiting for `networkidle` on dynamic apps
81 | ✅ **Do** wait for `page.wait_for_load_state('networkidle')` before inspection
82 |
83 | ## Best Practices
84 |
85 | - **Use bundled scripts as black boxes** - To accomplish a task, consider whether one of the scripts available in `scripts/` can help. These scripts handle common, complex workflows reliably without cluttering the context window. Use `--help` to see usage, then invoke directly.
86 | - Use `sync_playwright()` for synchronous scripts
87 | - Always close the browser when done
88 | - Use descriptive selectors: `text=`, `role=`, CSS selectors, or IDs
89 | - Add appropriate waits: `page.wait_for_selector()` or `page.wait_for_timeout()`
90 |
91 | ## Reference Files
92 |
93 | - **examples/** - Examples showing common patterns:
94 | - `element_discovery.py` - Discovering buttons, links, and inputs on a page
95 | - `static_html_automation.py` - Using file:// URLs for local HTML
96 | - `console_logging.py` - Capturing console logs during automation
--------------------------------------------------------------------------------
/webapp-testing/scripts/with_server.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 | """
3 | Start one or more servers, wait for them to be ready, run a command, then clean up.
4 |
5 | Usage:
6 | # Single server
7 | python scripts/with_server.py --server "npm run dev" --port 5173 -- python automation.py
8 | python scripts/with_server.py --server "npm start" --port 3000 -- python test.py
9 |
10 | # Multiple servers
11 | python scripts/with_server.py \
12 | --server "cd backend && python server.py" --port 3000 \
13 | --server "cd frontend && npm run dev" --port 5173 \
14 | -- python test.py
15 | """
16 |
17 | import subprocess
18 | import socket
19 | import time
20 | import sys
21 | import argparse
22 |
23 | def is_server_ready(port, timeout=30):
24 | """Wait for server to be ready by polling the port."""
25 | start_time = time.time()
26 | while time.time() - start_time < timeout:
27 | try:
28 | with socket.create_connection(('localhost', port), timeout=1):
29 | return True
30 | except (socket.error, ConnectionRefusedError):
31 | time.sleep(0.5)
32 | return False
33 |
34 |
35 | def main():
36 | parser = argparse.ArgumentParser(description='Run command with one or more servers')
37 | parser.add_argument('--server', action='append', dest='servers', required=True, help='Server command (can be repeated)')
38 | parser.add_argument('--port', action='append', dest='ports', type=int, required=True, help='Port for each server (must match --server count)')
39 | parser.add_argument('--timeout', type=int, default=30, help='Timeout in seconds per server (default: 30)')
40 | parser.add_argument('command', nargs=argparse.REMAINDER, help='Command to run after server(s) ready')
41 |
42 | args = parser.parse_args()
43 |
44 | # Remove the '--' separator if present
45 | if args.command and args.command[0] == '--':
46 | args.command = args.command[1:]
47 |
48 | if not args.command:
49 | print("Error: No command specified to run")
50 | sys.exit(1)
51 |
52 | # Parse server configurations
53 | if len(args.servers) != len(args.ports):
54 | print("Error: Number of --server and --port arguments must match")
55 | sys.exit(1)
56 |
57 | servers = []
58 | for cmd, port in zip(args.servers, args.ports):
59 | servers.append({'cmd': cmd, 'port': port})
60 |
61 | server_processes = []
62 |
63 | try:
64 | # Start all servers
65 | for i, server in enumerate(servers):
66 | print(f"Starting server {i+1}/{len(servers)}: {server['cmd']}")
67 |
68 | # Use shell=True to support commands with cd and &&
69 | process = subprocess.Popen(
70 | server['cmd'],
71 | shell=True,
72 | stdout=subprocess.PIPE,
73 | stderr=subprocess.PIPE
74 | )
75 | server_processes.append(process)
76 |
77 | # Wait for this server to be ready
78 | print(f"Waiting for server on port {server['port']}...")
79 | if not is_server_ready(server['port'], timeout=args.timeout):
80 | raise RuntimeError(f"Server failed to start on port {server['port']} within {args.timeout}s")
81 |
82 | print(f"Server ready on port {server['port']}")
83 |
84 | print(f"\nAll {len(servers)} server(s) ready")
85 |
86 | # Run the command
87 | print(f"Running: {' '.join(args.command)}\n")
88 | result = subprocess.run(args.command)
89 | sys.exit(result.returncode)
90 |
91 | finally:
92 | # Clean up all servers
93 | print(f"\nStopping {len(server_processes)} server(s)...")
94 | for i, process in enumerate(server_processes):
95 | try:
96 | process.terminate()
97 | process.wait(timeout=5)
98 | except subprocess.TimeoutExpired:
99 | process.kill()
100 | process.wait()
101 | print(f"Server {i+1} stopped")
102 | print("All servers stopped")
103 |
104 |
105 | if __name__ == '__main__':
106 | main()
--------------------------------------------------------------------------------
/slack-gif-creator/templates/shake.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 | """
3 | Shake Animation Template - Creates shaking/vibrating motion.
4 |
5 | Use this for impact effects, emphasis, or nervous/excited reactions.
6 | """
7 |
8 | import sys
9 | import math
10 | from pathlib import Path
11 |
12 | sys.path.append(str(Path(__file__).parent.parent))
13 |
14 | from core.gif_builder import GIFBuilder
15 | from core.frame_composer import create_blank_frame, draw_circle, draw_emoji, draw_text
16 | from core.easing import ease_out_quad
17 |
18 |
19 | def create_shake_animation(
20 | object_type: str = 'emoji',
21 | object_data: dict = None,
22 | num_frames: int = 20,
23 | shake_intensity: int = 15,
24 | center_x: int = 240,
25 | center_y: int = 240,
26 | direction: str = 'horizontal', # 'horizontal', 'vertical', or 'both'
27 | frame_width: int = 480,
28 | frame_height: int = 480,
29 | bg_color: tuple[int, int, int] = (255, 255, 255)
30 | ) -> list:
31 | """
32 | Create frames for a shaking animation.
33 |
34 | Args:
35 | object_type: 'circle', 'emoji', 'text', or 'custom'
36 | object_data: Data for the object
37 | num_frames: Number of frames
38 | shake_intensity: Maximum shake displacement in pixels
39 | center_x: Center X position
40 | center_y: Center Y position
41 | direction: 'horizontal', 'vertical', or 'both'
42 | frame_width: Frame width
43 | frame_height: Frame height
44 | bg_color: Background color
45 |
46 | Returns:
47 | List of frames
48 | """
49 | frames = []
50 |
51 | # Default object data
52 | if object_data is None:
53 | if object_type == 'emoji':
54 | object_data = {'emoji': '😱', 'size': 80}
55 | elif object_type == 'text':
56 | object_data = {'text': 'SHAKE!', 'font_size': 50, 'color': (255, 0, 0)}
57 |
58 | for i in range(num_frames):
59 | frame = create_blank_frame(frame_width, frame_height, bg_color)
60 |
61 | # Calculate progress
62 | t = i / (num_frames - 1) if num_frames > 1 else 0
63 |
64 | # Decay shake intensity over time
65 | intensity = shake_intensity * (1 - ease_out_quad(t))
66 |
67 | # Calculate shake offset using sine wave for smooth oscillation
68 | freq = 3 # Oscillation frequency
69 | offset_x = 0
70 | offset_y = 0
71 |
72 | if direction in ['horizontal', 'both']:
73 | offset_x = int(math.sin(t * freq * 2 * math.pi) * intensity)
74 |
75 | if direction in ['vertical', 'both']:
76 | offset_y = int(math.cos(t * freq * 2 * math.pi) * intensity)
77 |
78 | # Apply offset
79 | x = center_x + offset_x
80 | y = center_y + offset_y
81 |
82 | # Draw object
83 | if object_type == 'emoji':
84 | draw_emoji(
85 | frame,
86 | emoji=object_data['emoji'],
87 | position=(x - object_data['size'] // 2, y - object_data['size'] // 2),
88 | size=object_data['size']
89 | )
90 | elif object_type == 'text':
91 | draw_text(
92 | frame,
93 | text=object_data['text'],
94 | position=(x, y),
95 | font_size=object_data['font_size'],
96 | color=object_data['color'],
97 | centered=True
98 | )
99 | elif object_type == 'circle':
100 | draw_circle(
101 | frame,
102 | center=(x, y),
103 | radius=object_data.get('radius', 30),
104 | fill_color=object_data.get('color', (100, 100, 255))
105 | )
106 |
107 | frames.append(frame)
108 |
109 | return frames
110 |
111 |
112 | # Example usage
113 | if __name__ == '__main__':
114 | print("Creating shake GIF...")
115 |
116 | builder = GIFBuilder(width=480, height=480, fps=24)
117 |
118 | frames = create_shake_animation(
119 | object_type='emoji',
120 | object_data={'emoji': '😱', 'size': 100},
121 | num_frames=30,
122 | shake_intensity=20,
123 | direction='both'
124 | )
125 |
126 | builder.add_frames(frames)
127 | builder.save('shake_test.gif', num_colors=128)
--------------------------------------------------------------------------------
/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
--------------------------------------------------------------------------------
/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
--------------------------------------------------------------------------------
/raffle-winner-picker/SKILL.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: raffle-winner-picker
3 | description: Picks random winners from lists, spreadsheets, or Google Sheets for giveaways, raffles, and contests. Ensures fair, unbiased selection with transparency.
4 | ---
5 |
6 | # Raffle Winner Picker
7 |
8 | This skill randomly selects winners from lists, spreadsheets, or Google Sheets for giveaways and contests.
9 |
10 | ## When to Use This Skill
11 |
12 | - Running social media giveaways
13 | - Picking raffle winners at events
14 | - Randomly selecting participants for surveys or tests
15 | - Choosing winners from contest submissions
16 | - Fair distribution of limited spots or resources
17 | - Random team assignments
18 |
19 | ## What This Skill Does
20 |
21 | 1. **Random Selection**: Uses cryptographically random selection
22 | 2. **Multiple Sources**: Works with CSV, Excel, Google Sheets, or plain lists
23 | 3. **Multiple Winners**: Can pick one or multiple winners
24 | 4. **Duplicate Prevention**: Ensures the same person can't win twice
25 | 5. **Transparent Results**: Shows the selection process clearly
26 | 6. **Winner Details**: Displays all relevant information about winners
27 |
28 | ## How to Use
29 |
30 | ### From Google Sheets
31 |
32 | ```
33 | Pick a random row from this Google Sheet to select a winner
34 | for a giveaway: [Sheet URL]
35 | ```
36 |
37 | ### From Local File
38 |
39 | ```
40 | Pick 3 random winners from entries.csv
41 | ```
42 |
43 | ### From List
44 |
45 | ```
46 | Pick a random winner from this list:
47 | - Alice (alice@email.com)
48 | - Bob (bob@email.com)
49 | - Carol (carol@email.com)
50 | ...
51 | ```
52 |
53 | ### Multiple Winners
54 |
55 | ```
56 | Pick 5 random winners from contest-entries.xlsx,
57 | make sure no duplicates
58 | ```
59 |
60 | ## Example
61 |
62 | **User**: "Pick a random row from this Google Sheet to select a winner for a giveaway."
63 |
64 | **Output**:
65 | ```
66 | Accessing Google Sheet...
67 | Total entries found: 247
68 |
69 | Randomly selecting winner...
70 |
71 | 🎉 WINNER SELECTED! 🎉
72 |
73 | Row #142
74 | Name: Sarah Johnson
75 | Email: sarah.j@email.com
76 | Entry Date: March 10, 2024
77 | Comment: "Love your newsletter!"
78 |
79 | Selection method: Cryptographically random
80 | Timestamp: 2024-03-15 14:32:18 UTC
81 |
82 | Would you like to:
83 | - Pick another winner (excluding Sarah)?
84 | - Export winner details?
85 | - Pick runner-ups?
86 | ```
87 |
88 | **Inspired by:** Lenny's use case - picking a Sora 2 giveaway winner from his subscriber Slack community
89 |
90 | ## Features
91 |
92 | ### Fair Selection
93 | - Uses secure random number generation
94 | - No bias or patterns
95 | - Transparent process
96 | - Repeatable with seed (for verification)
97 |
98 | ### Exclusions
99 | ```
100 | Pick a random winner excluding previous winners:
101 | Alice, Bob, Carol
102 | ```
103 |
104 | ### Weighted Selection
105 | ```
106 | Pick a winner with weighted probability based on
107 | the "entries" column (1 entry = 1 ticket)
108 | ```
109 |
110 | ### Runner-ups
111 | ```
112 | Pick 1 winner and 3 runner-ups from the list
113 | ```
114 |
115 | ## Example Workflows
116 |
117 | ### Social Media Giveaway
118 | 1. Export entries from Google Form to Sheets
119 | 2. "Pick a random winner from [Sheet URL]"
120 | 3. Verify winner details
121 | 4. Announce publicly with timestamp
122 |
123 | ### Event Raffle
124 | 1. Create CSV of attendee names and emails
125 | 2. "Pick 10 random winners from attendees.csv"
126 | 3. Export winner list
127 | 4. Email winners directly
128 |
129 | ### Team Assignment
130 | 1. Have list of participants
131 | 2. "Randomly split this list into 4 equal teams"
132 | 3. Review assignments
133 | 4. Share team rosters
134 |
135 | ## Tips
136 |
137 | - **Document the process**: Save the timestamp and method
138 | - **Public announcement**: Share selection details for transparency
139 | - **Check eligibility**: Verify winner meets contest rules
140 | - **Have backups**: Pick runner-ups in case winner is ineligible
141 | - **Export results**: Save winner list for records
142 |
143 | ## Privacy & Fairness
144 |
145 | ✓ Uses cryptographically secure randomness
146 | ✓ No manipulation possible
147 | ✓ Timestamp recorded for verification
148 | ✓ Can provide seed for third-party verification
149 | ✓ Respects data privacy
150 |
151 | ## Common Use Cases
152 |
153 | - Newsletter subscriber giveaways
154 | - Product launch raffles
155 | - Conference ticket drawings
156 | - Beta tester selection
157 | - Focus group participant selection
158 | - Random prize distribution at events
159 |
160 |
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt:
--------------------------------------------------------------------------------
1 | Copyright © 2017 IBM Corp. with Reserved Font Name "Plex"
2 |
3 | This Font Software is licensed under the SIL Open Font License, Version 1.1.
4 | This license is copied below, and is also available with a FAQ at:
5 | https://openfontlicense.org
6 |
7 |
8 | -----------------------------------------------------------
9 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
10 | -----------------------------------------------------------
11 |
12 | PREAMBLE
13 | The goals of the Open Font License (OFL) are to stimulate worldwide
14 | development of collaborative font projects, to support the font creation
15 | efforts of academic and linguistic communities, and to provide a free and
16 | open framework in which fonts may be shared and improved in partnership
17 | with others.
18 |
19 | The OFL allows the licensed fonts to be used, studied, modified and
20 | redistributed freely as long as they are not sold by themselves. The
21 | fonts, including any derivative works, can be bundled, embedded,
22 | redistributed and/or sold with any software provided that any reserved
23 | names are not used by derivative works. The fonts and derivatives,
24 | however, cannot be released under any other type of license. The
25 | requirement for fonts to remain under this license does not apply
26 | to any document created using the fonts or their derivatives.
27 |
28 | DEFINITIONS
29 | "Font Software" refers to the set of files released by the Copyright
30 | Holder(s) under this license and clearly marked as such. This may
31 | include source files, build scripts and documentation.
32 |
33 | "Reserved Font Name" refers to any names specified as such after the
34 | copyright statement(s).
35 |
36 | "Original Version" refers to the collection of Font Software components as
37 | distributed by the Copyright Holder(s).
38 |
39 | "Modified Version" refers to any derivative made by adding to, deleting,
40 | or substituting -- in part or in whole -- any of the components of the
41 | Original Version, by changing formats or by porting the Font Software to a
42 | new environment.
43 |
44 | "Author" refers to any designer, engineer, programmer, technical
45 | writer or other person who contributed to the Font Software.
46 |
47 | PERMISSION & CONDITIONS
48 | Permission is hereby granted, free of charge, to any person obtaining
49 | a copy of the Font Software, to use, study, copy, merge, embed, modify,
50 | redistribute, and sell modified and unmodified copies of the Font
51 | Software, subject to the following conditions:
52 |
53 | 1) Neither the Font Software nor any of its individual components,
54 | in Original or Modified Versions, may be sold by itself.
55 |
56 | 2) Original or Modified Versions of the Font Software may be bundled,
57 | redistributed and/or sold with any software, provided that each copy
58 | contains the above copyright notice and this license. These can be
59 | included either as stand-alone text files, human-readable headers or
60 | in the appropriate machine-readable metadata fields within text or
61 | binary files as long as those fields can be easily viewed by the user.
62 |
63 | 3) No Modified Version of the Font Software may use the Reserved Font
64 | Name(s) unless explicit written permission is granted by the corresponding
65 | Copyright Holder. This restriction only applies to the primary font name as
66 | presented to the users.
67 |
68 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
69 | Software shall not be used to promote, endorse or advertise any
70 | Modified Version, except to acknowledge the contribution(s) of the
71 | Copyright Holder(s) and the Author(s) or with their explicit written
72 | permission.
73 |
74 | 5) The Font Software, modified or unmodified, in part or in whole,
75 | must be distributed entirely under this license, and must not be
76 | distributed under any other license. The requirement for fonts to
77 | remain under this license does not apply to any document created
78 | using the Font Software.
79 |
80 | TERMINATION
81 | This license becomes null and void if any of the above conditions are
82 | not met.
83 |
84 | DISCLAIMER
85 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
86 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
87 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
88 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
89 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
90 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
91 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
92 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
93 | OTHER DEALINGS IN THE FONT SOFTWARE.
94 |
--------------------------------------------------------------------------------
/canvas-design/canvas-fonts/PoiretOne-OFL.txt:
--------------------------------------------------------------------------------
1 | Copyright (c) 2011, Denis Masharov (denis.masharov@gmail.com)
2 |
3 | This Font Software is licensed under the SIL Open Font License, Version 1.1.
4 | This license is copied below, and is also available with a FAQ at:
5 | https://openfontlicense.org
6 |
7 |
8 | -----------------------------------------------------------
9 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
10 | -----------------------------------------------------------
11 |
12 | PREAMBLE
13 | The goals of the Open Font License (OFL) are to stimulate worldwide
14 | development of collaborative font projects, to support the font creation
15 | efforts of academic and linguistic communities, and to provide a free and
16 | open framework in which fonts may be shared and improved in partnership
17 | with others.
18 |
19 | The OFL allows the licensed fonts to be used, studied, modified and
20 | redistributed freely as long as they are not sold by themselves. The
21 | fonts, including any derivative works, can be bundled, embedded,
22 | redistributed and/or sold with any software provided that any reserved
23 | names are not used by derivative works. The fonts and derivatives,
24 | however, cannot be released under any other type of license. The
25 | requirement for fonts to remain under this license does not apply
26 | to any document created using the fonts or their derivatives.
27 |
28 | DEFINITIONS
29 | "Font Software" refers to the set of files released by the Copyright
30 | Holder(s) under this license and clearly marked as such. This may
31 | include source files, build scripts and documentation.
32 |
33 | "Reserved Font Name" refers to any names specified as such after the
34 | copyright statement(s).
35 |
36 | "Original Version" refers to the collection of Font Software components as
37 | distributed by the Copyright Holder(s).
38 |
39 | "Modified Version" refers to any derivative made by adding to, deleting,
40 | or substituting -- in part or in whole -- any of the components of the
41 | Original Version, by changing formats or by porting the Font Software to a
42 | new environment.
43 |
44 | "Author" refers to any designer, engineer, programmer, technical
45 | writer or other person who contributed to the Font Software.
46 |
47 | PERMISSION & CONDITIONS
48 | Permission is hereby granted, free of charge, to any person obtaining
49 | a copy of the Font Software, to use, study, copy, merge, embed, modify,
50 | redistribute, and sell modified and unmodified copies of the Font
51 | Software, subject to the following conditions:
52 |
53 | 1) Neither the Font Software nor any of its individual components,
54 | in Original or Modified Versions, may be sold by itself.
55 |
56 | 2) Original or Modified Versions of the Font Software may be bundled,
57 | redistributed and/or sold with any software, provided that each copy
58 | contains the above copyright notice and this license. These can be
59 | included either as stand-alone text files, human-readable headers or
60 | in the appropriate machine-readable metadata fields within text or
61 | binary files as long as those fields can be easily viewed by the user.
62 |
63 | 3) No Modified Version of the Font Software may use the Reserved Font
64 | Name(s) unless explicit written permission is granted by the corresponding
65 | Copyright Holder. This restriction only applies to the primary font name as
66 | presented to the users.
67 |
68 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
69 | Software shall not be used to promote, endorse or advertise any
70 | Modified Version, except to acknowledge the contribution(s) of the
71 | Copyright Holder(s) and the Author(s) or with their explicit written
72 | permission.
73 |
74 | 5) The Font Software, modified or unmodified, in part or in whole,
75 | must be distributed entirely under this license, and must not be
76 | distributed under any other license. The requirement for fonts to
77 | remain under this license does not apply to any document created
78 | using the Font Software.
79 |
80 | TERMINATION
81 | This license becomes null and void if any of the above conditions are
82 | not met.
83 |
84 | DISCLAIMER
85 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
86 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
87 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
88 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
89 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
90 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
91 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
92 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
93 | OTHER DEALINGS IN THE FONT SOFTWARE.
94 |
--------------------------------------------------------------------------------