@soulcraft/kits 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/kits/ai-content-studio/kit.json +358 -0
- package/kits/api-documentation/kit.json +358 -0
- package/kits/api-documentation/skills/api-examples/SKILL.md +176 -0
- package/kits/api-documentation/skills/api-review/SKILL.md +35 -0
- package/kits/api-documentation/skills/api-versioning/SKILL.md +156 -0
- package/kits/api-documentation/skills/create-code-examples/SKILL.md +42 -0
- package/kits/api-documentation/skills/define-resource/SKILL.md +39 -0
- package/kits/api-documentation/skills/document-auth/SKILL.md +39 -0
- package/kits/api-documentation/skills/document-endpoint/SKILL.md +40 -0
- package/kits/api-documentation/skills/kit-expertise/SKILL.md +78 -0
- package/kits/api-documentation/skills/openapi-spec/SKILL.md +174 -0
- package/kits/axe-house/kit.json +931 -0
- package/kits/axe-house/skills/axe-expertise/SKILL.md +259 -0
- package/kits/axe-house/skills/blog-draft/SKILL.md +147 -0
- package/kits/axe-house/skills/booking-digest/SKILL.md +188 -0
- package/kits/axe-house/skills/customer-insights/SKILL.md +215 -0
- package/kits/axe-house/skills/demand-forecast/SKILL.md +183 -0
- package/kits/axe-house/skills/email-campaign/SKILL.md +135 -0
- package/kits/axe-house/skills/experience-copy/SKILL.md +142 -0
- package/kits/axe-house/skills/guest-letter/SKILL.md +171 -0
- package/kits/axe-house/skills/inventory-health/SKILL.md +234 -0
- package/kits/axe-house/skills/league-manager/SKILL.md +264 -0
- package/kits/axe-house/skills/revenue-report/SKILL.md +240 -0
- package/kits/axe-house/skills/safety-briefing/SKILL.md +248 -0
- package/kits/axe-house/skills/social-calendar/SKILL.md +203 -0
- package/kits/axe-house/skills/staff-briefing/SKILL.md +231 -0
- package/kits/axe-house/skills/venue-data-model/SKILL.md +225 -0
- package/kits/blog-series/kit.json +363 -0
- package/kits/blog-series/skills/content-hooks/SKILL.md +158 -0
- package/kits/blog-series/skills/headline-brainstorm/SKILL.md +40 -0
- package/kits/blog-series/skills/kit-expertise/SKILL.md +78 -0
- package/kits/blog-series/skills/repurpose-content/SKILL.md +40 -0
- package/kits/blog-series/skills/seo-review/SKILL.md +41 -0
- package/kits/blog-series/skills/seo-writing/SKILL.md +135 -0
- package/kits/blog-series/skills/series-audit/SKILL.md +36 -0
- package/kits/blog-series/skills/write-post-outline/SKILL.md +42 -0
- package/kits/business-plan/kit.json +437 -0
- package/kits/business-plan/skills/competitor-analysis/SKILL.md +34 -0
- package/kits/business-plan/skills/financial-modeling/SKILL.md +180 -0
- package/kits/business-plan/skills/financial-projections/SKILL.md +42 -0
- package/kits/business-plan/skills/kit-expertise/SKILL.md +101 -0
- package/kits/business-plan/skills/market-analysis/SKILL.md +155 -0
- package/kits/business-plan/skills/market-research/SKILL.md +35 -0
- package/kits/business-plan/skills/sba-compliance/SKILL.md +163 -0
- package/kits/business-plan/skills/swot-analysis/SKILL.md +36 -0
- package/kits/canvas-and-corks/kit.json +910 -0
- package/kits/canvas-and-corks/skills/blog-draft/SKILL.md +160 -0
- package/kits/canvas-and-corks/skills/booking-digest/SKILL.md +147 -0
- package/kits/canvas-and-corks/skills/class-description/SKILL.md +53 -0
- package/kits/canvas-and-corks/skills/class-roster/SKILL.md +163 -0
- package/kits/canvas-and-corks/skills/customer-insights/SKILL.md +174 -0
- package/kits/canvas-and-corks/skills/demand-forecast/SKILL.md +191 -0
- package/kits/canvas-and-corks/skills/email-campaign/SKILL.md +154 -0
- package/kits/canvas-and-corks/skills/experience-copy/SKILL.md +152 -0
- package/kits/canvas-and-corks/skills/guest-letter/SKILL.md +127 -0
- package/kits/canvas-and-corks/skills/inventory-health/SKILL.md +204 -0
- package/kits/canvas-and-corks/skills/painting-memory/SKILL.md +76 -0
- package/kits/canvas-and-corks/skills/revenue-report/SKILL.md +196 -0
- package/kits/canvas-and-corks/skills/social-calendar/SKILL.md +146 -0
- package/kits/canvas-and-corks/skills/staff-briefing/SKILL.md +134 -0
- package/kits/canvas-and-corks/skills/studio-expertise/SKILL.md +181 -0
- package/kits/canvas-and-corks/skills/venue-data-model/SKILL.md +325 -0
- package/kits/character-relationship-map/kit.json +367 -0
- package/kits/character-relationship-map/skills/ensemble-balance/SKILL.md +189 -0
- package/kits/character-relationship-map/skills/kit-expertise/SKILL.md +83 -0
- package/kits/character-relationship-map/skills/relationship-dynamics/SKILL.md +158 -0
- package/kits/clay-and-co/kit.json +938 -0
- package/kits/clay-and-co/skills/blog-draft/SKILL.md +135 -0
- package/kits/clay-and-co/skills/booking-digest/SKILL.md +163 -0
- package/kits/clay-and-co/skills/customer-insights/SKILL.md +207 -0
- package/kits/clay-and-co/skills/demand-forecast/SKILL.md +166 -0
- package/kits/clay-and-co/skills/email-campaign/SKILL.md +125 -0
- package/kits/clay-and-co/skills/experience-copy/SKILL.md +132 -0
- package/kits/clay-and-co/skills/guest-letter/SKILL.md +104 -0
- package/kits/clay-and-co/skills/inventory-health/SKILL.md +211 -0
- package/kits/clay-and-co/skills/kiln-scheduler/SKILL.md +206 -0
- package/kits/clay-and-co/skills/piece-tracker/SKILL.md +165 -0
- package/kits/clay-and-co/skills/pottery-expertise/SKILL.md +165 -0
- package/kits/clay-and-co/skills/pottery-memory/SKILL.md +119 -0
- package/kits/clay-and-co/skills/revenue-report/SKILL.md +205 -0
- package/kits/clay-and-co/skills/social-calendar/SKILL.md +130 -0
- package/kits/clay-and-co/skills/staff-briefing/SKILL.md +213 -0
- package/kits/clay-and-co/skills/venue-data-model/SKILL.md +230 -0
- package/kits/concept-map/kit.json +353 -0
- package/kits/concept-map/skills/add-concept/SKILL.md +41 -0
- package/kits/concept-map/skills/assess-understanding/SKILL.md +36 -0
- package/kits/concept-map/skills/concept-hierarchy/SKILL.md +148 -0
- package/kits/concept-map/skills/create-learning-map/SKILL.md +42 -0
- package/kits/concept-map/skills/find-cross-links/SKILL.md +34 -0
- package/kits/concept-map/skills/identify-prerequisites/SKILL.md +40 -0
- package/kits/concept-map/skills/kit-expertise/SKILL.md +78 -0
- package/kits/concept-map/skills/relationship-types/SKILL.md +160 -0
- package/kits/content-calendar/kit.json +420 -0
- package/kits/content-calendar/skills/content-strategy/SKILL.md +174 -0
- package/kits/content-calendar/skills/create-brief/SKILL.md +40 -0
- package/kits/content-calendar/skills/generate-ideas/SKILL.md +40 -0
- package/kits/content-calendar/skills/kit-expertise/SKILL.md +100 -0
- package/kits/content-calendar/skills/plan-series/SKILL.md +40 -0
- package/kits/content-calendar/skills/repurpose-content/SKILL.md +38 -0
- package/kits/content-calendar/skills/repurposing/SKILL.md +179 -0
- package/kits/content-calendar/skills/weekly-review/SKILL.md +34 -0
- package/kits/coworking-space/kit.json +1068 -0
- package/kits/escape-vault/kit.json +1028 -0
- package/kits/escape-vault/skills/blog-draft/SKILL.md +157 -0
- package/kits/escape-vault/skills/booking-digest/SKILL.md +151 -0
- package/kits/escape-vault/skills/customer-insights/SKILL.md +185 -0
- package/kits/escape-vault/skills/demand-forecast/SKILL.md +188 -0
- package/kits/escape-vault/skills/email-campaign/SKILL.md +157 -0
- package/kits/escape-vault/skills/escape-expertise/SKILL.md +200 -0
- package/kits/escape-vault/skills/escape-memory/SKILL.md +99 -0
- package/kits/escape-vault/skills/experience-copy/SKILL.md +159 -0
- package/kits/escape-vault/skills/guest-letter/SKILL.md +143 -0
- package/kits/escape-vault/skills/inventory-health/SKILL.md +222 -0
- package/kits/escape-vault/skills/leaderboard-report/SKILL.md +204 -0
- package/kits/escape-vault/skills/revenue-report/SKILL.md +202 -0
- package/kits/escape-vault/skills/room-designer/SKILL.md +182 -0
- package/kits/escape-vault/skills/social-calendar/SKILL.md +148 -0
- package/kits/escape-vault/skills/staff-briefing/SKILL.md +159 -0
- package/kits/escape-vault/skills/venue-data-model/SKILL.md +335 -0
- package/kits/family-tree/kit.json +380 -0
- package/kits/family-tree/skills/add-family-member/SKILL.md +42 -0
- package/kits/family-tree/skills/analyze-relationship/SKILL.md +41 -0
- package/kits/family-tree/skills/export-gedcom/SKILL.md +34 -0
- package/kits/family-tree/skills/genealogy-research/SKILL.md +188 -0
- package/kits/family-tree/skills/kit-expertise/SKILL.md +107 -0
- package/kits/family-tree/skills/record-oral-history/SKILL.md +43 -0
- package/kits/family-tree/skills/relationship-mapping/SKILL.md +171 -0
- package/kits/family-tree/skills/research-ancestor/SKILL.md +43 -0
- package/kits/farkle-dice-game/kit.json +316 -0
- package/kits/farkle-dice-game/skills/kit-expertise/SKILL.md +137 -0
- package/kits/franchise-ops/kit.json +326 -0
- package/kits/freelance-portfolio/kit.json +435 -0
- package/kits/game-design-doc/kit.json +353 -0
- package/kits/game-design-doc/skills/balance-system/SKILL.md +40 -0
- package/kits/game-design-doc/skills/create-character/SKILL.md +40 -0
- package/kits/game-design-doc/skills/design-mechanic/SKILL.md +40 -0
- package/kits/game-design-doc/skills/economy-design/SKILL.md +152 -0
- package/kits/game-design-doc/skills/game-mechanics/SKILL.md +141 -0
- package/kits/game-design-doc/skills/ideate-features/SKILL.md +36 -0
- package/kits/game-design-doc/skills/kit-expertise/SKILL.md +78 -0
- package/kits/game-design-doc/skills/playtest-feedback/SKILL.md +142 -0
- package/kits/game-design-doc/skills/review-gdd/SKILL.md +33 -0
- package/kits/gather-and-grill/kit.json +966 -0
- package/kits/gather-and-grill/skills/blog-draft/SKILL.md +120 -0
- package/kits/gather-and-grill/skills/booking-digest/SKILL.md +171 -0
- package/kits/gather-and-grill/skills/cooking-memory/SKILL.md +100 -0
- package/kits/gather-and-grill/skills/culinary-expertise/SKILL.md +180 -0
- package/kits/gather-and-grill/skills/customer-insights/SKILL.md +184 -0
- package/kits/gather-and-grill/skills/demand-forecast/SKILL.md +200 -0
- package/kits/gather-and-grill/skills/email-campaign/SKILL.md +97 -0
- package/kits/gather-and-grill/skills/experience-copy/SKILL.md +92 -0
- package/kits/gather-and-grill/skills/guest-letter/SKILL.md +98 -0
- package/kits/gather-and-grill/skills/inventory-health/SKILL.md +193 -0
- package/kits/gather-and-grill/skills/menu-planner/SKILL.md +175 -0
- package/kits/gather-and-grill/skills/recipe-card/SKILL.md +194 -0
- package/kits/gather-and-grill/skills/revenue-report/SKILL.md +245 -0
- package/kits/gather-and-grill/skills/social-calendar/SKILL.md +139 -0
- package/kits/gather-and-grill/skills/staff-briefing/SKILL.md +167 -0
- package/kits/gather-and-grill/skills/venue-data-model/SKILL.md +336 -0
- package/kits/gtd-productivity-system/kit.json +389 -0
- package/kits/gtd-productivity-system/skills/break-down-project/SKILL.md +41 -0
- package/kits/gtd-productivity-system/skills/clarify-task/SKILL.md +42 -0
- package/kits/gtd-productivity-system/skills/gtd-methodology/SKILL.md +185 -0
- package/kits/gtd-productivity-system/skills/inbox-processing/SKILL.md +173 -0
- package/kits/gtd-productivity-system/skills/kit-expertise/SKILL.md +111 -0
- package/kits/gtd-productivity-system/skills/mind-sweep/SKILL.md +35 -0
- package/kits/gtd-productivity-system/skills/process-inbox/SKILL.md +40 -0
- package/kits/gtd-productivity-system/skills/weekly-review/SKILL.md +197 -0
- package/kits/gym-fitness/kit.json +1037 -0
- package/kits/interactive-fiction/kit.json +471 -0
- package/kits/invoice-generator/kit.json +466 -0
- package/kits/loyalty-program/kit.json +323 -0
- package/kits/marketing-plan/kit.json +417 -0
- package/kits/marketing-plan/skills/allocate-budget/SKILL.md +34 -0
- package/kits/marketing-plan/skills/campaign-metrics/SKILL.md +184 -0
- package/kits/marketing-plan/skills/channel-strategy/SKILL.md +156 -0
- package/kits/marketing-plan/skills/content-calendar/SKILL.md +34 -0
- package/kits/marketing-plan/skills/create-persona/SKILL.md +40 -0
- package/kits/marketing-plan/skills/kit-expertise/SKILL.md +109 -0
- package/kits/marketing-plan/skills/measure-performance/SKILL.md +34 -0
- package/kits/marketing-plan/skills/plan-campaign/SKILL.md +41 -0
- package/kits/marketing-site/kit.json +230 -0
- package/kits/marketing-site/skills/add-page/SKILL.md +28 -0
- package/kits/marketing-site/skills/add-section/SKILL.md +29 -0
- package/kits/marketing-site/skills/change-colors/SKILL.md +24 -0
- package/kits/marketing-site/skills/conversion-copy/SKILL.md +152 -0
- package/kits/marketing-site/skills/export-deploy/SKILL.md +24 -0
- package/kits/marketing-site/skills/kit-expertise/SKILL.md +77 -0
- package/kits/marketing-site/skills/landing-page/SKILL.md +156 -0
- package/kits/match-3-puzzle/kit.json +245 -0
- package/kits/match-3-puzzle/skills/kit-expertise/SKILL.md +96 -0
- package/kits/mind-map/kit.json +355 -0
- package/kits/mind-map/skills/add-branch/SKILL.md +40 -0
- package/kits/mind-map/skills/brainstorm-topic/SKILL.md +41 -0
- package/kits/mind-map/skills/branch-expansion/SKILL.md +181 -0
- package/kits/mind-map/skills/find-connections/SKILL.md +34 -0
- package/kits/mind-map/skills/kit-expertise/SKILL.md +78 -0
- package/kits/mind-map/skills/organize-map/SKILL.md +35 -0
- package/kits/mind-map/skills/radiant-thinking/SKILL.md +184 -0
- package/kits/mind-map/skills/summarize-map/SKILL.md +34 -0
- package/kits/music-collection/kit.json +403 -0
- package/kits/music-collection/skills/add-album/SKILL.md +44 -0
- package/kits/music-collection/skills/create-playlist/SKILL.md +37 -0
- package/kits/music-collection/skills/explore-artist/SKILL.md +37 -0
- package/kits/music-collection/skills/journal-session/SKILL.md +40 -0
- package/kits/music-collection/skills/kit-expertise/SKILL.md +98 -0
- package/kits/music-collection/skills/music-metadata/SKILL.md +209 -0
- package/kits/music-collection/skills/playlist-curator/SKILL.md +182 -0
- package/kits/music-collection/skills/recommend-similar/SKILL.md +36 -0
- package/kits/music-venue/kit.json +986 -0
- package/kits/novel-writing-system/kit.json +481 -0
- package/kits/novel-writing-system/skills/character-arc/SKILL.md +164 -0
- package/kits/novel-writing-system/skills/develop-character-arc/SKILL.md +42 -0
- package/kits/novel-writing-system/skills/kit-expertise/SKILL.md +84 -0
- package/kits/novel-writing-system/skills/outline-review/SKILL.md +34 -0
- package/kits/novel-writing-system/skills/plot-doctor/SKILL.md +221 -0
- package/kits/novel-writing-system/skills/plot-hole-check/SKILL.md +35 -0
- package/kits/novel-writing-system/skills/scene-development/SKILL.md +38 -0
- package/kits/novel-writing-system/skills/scene-sequel/SKILL.md +162 -0
- package/kits/novel-writing-system/skills/worldbuilding-session/SKILL.md +40 -0
- package/kits/organization-chart/kit.json +349 -0
- package/kits/organization-chart/skills/add-role/SKILL.md +41 -0
- package/kits/organization-chart/skills/analyze-span/SKILL.md +34 -0
- package/kits/organization-chart/skills/create-raci/SKILL.md +42 -0
- package/kits/organization-chart/skills/kit-expertise/SKILL.md +78 -0
- package/kits/organization-chart/skills/org-design/SKILL.md +188 -0
- package/kits/organization-chart/skills/org-health-check/SKILL.md +35 -0
- package/kits/organization-chart/skills/plan-reorg/SKILL.md +42 -0
- package/kits/organization-chart/skills/role-definition/SKILL.md +180 -0
- package/kits/paws-and-pour/kit.json +969 -0
- package/kits/paws-and-pour/skills/adoption-report/SKILL.md +273 -0
- package/kits/paws-and-pour/skills/animal-profile/SKILL.md +206 -0
- package/kits/paws-and-pour/skills/blog-draft/SKILL.md +137 -0
- package/kits/paws-and-pour/skills/booking-digest/SKILL.md +251 -0
- package/kits/paws-and-pour/skills/cafe-expertise/SKILL.md +218 -0
- package/kits/paws-and-pour/skills/cafe-memory/SKILL.md +114 -0
- package/kits/paws-and-pour/skills/customer-insights/SKILL.md +216 -0
- package/kits/paws-and-pour/skills/demand-forecast/SKILL.md +200 -0
- package/kits/paws-and-pour/skills/email-campaign/SKILL.md +154 -0
- package/kits/paws-and-pour/skills/experience-copy/SKILL.md +139 -0
- package/kits/paws-and-pour/skills/guest-letter/SKILL.md +183 -0
- package/kits/paws-and-pour/skills/inventory-health/SKILL.md +213 -0
- package/kits/paws-and-pour/skills/revenue-report/SKILL.md +273 -0
- package/kits/paws-and-pour/skills/social-calendar/SKILL.md +183 -0
- package/kits/paws-and-pour/skills/staff-briefing/SKILL.md +223 -0
- package/kits/paws-and-pour/skills/venue-data-model/SKILL.md +260 -0
- package/kits/persona-driven-strategy/kit.json +352 -0
- package/kits/persona-driven-strategy/skills/empathy-mapping/SKILL.md +221 -0
- package/kits/persona-driven-strategy/skills/journey-mapping/SKILL.md +219 -0
- package/kits/persona-driven-strategy/skills/kit-expertise/SKILL.md +81 -0
- package/kits/persona-driven-strategy/skills/persona-development/SKILL.md +189 -0
- package/kits/personal-crm/kit.json +373 -0
- package/kits/personal-crm/skills/add-contact/SKILL.md +42 -0
- package/kits/personal-crm/skills/connect-contacts/SKILL.md +41 -0
- package/kits/personal-crm/skills/find-dormant/SKILL.md +35 -0
- package/kits/personal-crm/skills/kit-expertise/SKILL.md +82 -0
- package/kits/personal-crm/skills/log-interaction/SKILL.md +43 -0
- package/kits/personal-crm/skills/network-analysis/SKILL.md +161 -0
- package/kits/personal-crm/skills/relationship-insights/SKILL.md +153 -0
- package/kits/personal-wiki/kit.json +322 -0
- package/kits/personal-wiki/skills/kit-expertise/SKILL.md +81 -0
- package/kits/personal-wiki/skills/orphan-finder/SKILL.md +155 -0
- package/kits/personal-wiki/skills/wiki-structure/SKILL.md +179 -0
- package/kits/petal-press/kit.json +996 -0
- package/kits/petal-press/skills/arrangement-memory/SKILL.md +143 -0
- package/kits/petal-press/skills/blog-draft/SKILL.md +167 -0
- package/kits/petal-press/skills/booking-digest/SKILL.md +196 -0
- package/kits/petal-press/skills/care-card/SKILL.md +173 -0
- package/kits/petal-press/skills/customer-insights/SKILL.md +213 -0
- package/kits/petal-press/skills/demand-forecast/SKILL.md +203 -0
- package/kits/petal-press/skills/email-campaign/SKILL.md +204 -0
- package/kits/petal-press/skills/experience-copy/SKILL.md +184 -0
- package/kits/petal-press/skills/floral-expertise/SKILL.md +244 -0
- package/kits/petal-press/skills/guest-letter/SKILL.md +153 -0
- package/kits/petal-press/skills/inventory-health/SKILL.md +201 -0
- package/kits/petal-press/skills/revenue-report/SKILL.md +219 -0
- package/kits/petal-press/skills/seasonal-guide/SKILL.md +238 -0
- package/kits/petal-press/skills/social-calendar/SKILL.md +217 -0
- package/kits/petal-press/skills/staff-briefing/SKILL.md +217 -0
- package/kits/petal-press/skills/venue-data-model/SKILL.md +226 -0
- package/kits/pitch-deck/kit.json +416 -0
- package/kits/pitch-deck/skills/calculate-market-size/SKILL.md +41 -0
- package/kits/pitch-deck/skills/develop-problem-slide/SKILL.md +39 -0
- package/kits/pitch-deck/skills/investor-qa/SKILL.md +182 -0
- package/kits/pitch-deck/skills/investor-qa-prep/SKILL.md +36 -0
- package/kits/pitch-deck/skills/kit-expertise/SKILL.md +112 -0
- package/kits/pitch-deck/skills/pitch-structure/SKILL.md +186 -0
- package/kits/pitch-deck/skills/practice-pitch/SKILL.md +36 -0
- package/kits/podcast-series/kit.json +324 -0
- package/kits/podcast-series/skills/audience-growth/SKILL.md +38 -0
- package/kits/podcast-series/skills/create-guest-profile/SKILL.md +42 -0
- package/kits/podcast-series/skills/episode-structure/SKILL.md +189 -0
- package/kits/podcast-series/skills/guest-research/SKILL.md +167 -0
- package/kits/podcast-series/skills/kit-expertise/SKILL.md +81 -0
- package/kits/podcast-series/skills/plan-episode/SKILL.md +44 -0
- package/kits/podcast-series/skills/prepare-guest/SKILL.md +45 -0
- package/kits/podcast-series/skills/show-notes/SKILL.md +182 -0
- package/kits/podcast-series/skills/write-show-notes/SKILL.md +43 -0
- package/kits/pour-house/kit.json +912 -0
- package/kits/pour-house/skills/blog-draft/SKILL.md +138 -0
- package/kits/pour-house/skills/booking-digest/SKILL.md +151 -0
- package/kits/pour-house/skills/cellar-report/SKILL.md +251 -0
- package/kits/pour-house/skills/customer-insights/SKILL.md +184 -0
- package/kits/pour-house/skills/demand-forecast/SKILL.md +156 -0
- package/kits/pour-house/skills/email-campaign/SKILL.md +130 -0
- package/kits/pour-house/skills/experience-copy/SKILL.md +125 -0
- package/kits/pour-house/skills/guest-letter/SKILL.md +136 -0
- package/kits/pour-house/skills/inventory-health/SKILL.md +159 -0
- package/kits/pour-house/skills/pour-memory/SKILL.md +89 -0
- package/kits/pour-house/skills/revenue-report/SKILL.md +232 -0
- package/kits/pour-house/skills/social-calendar/SKILL.md +140 -0
- package/kits/pour-house/skills/sommelier-expertise/SKILL.md +324 -0
- package/kits/pour-house/skills/staff-briefing/SKILL.md +176 -0
- package/kits/pour-house/skills/tasting-notes/SKILL.md +179 -0
- package/kits/pour-house/skills/venue-data-model/SKILL.md +323 -0
- package/kits/presentation/kit.json +296 -0
- package/kits/product-requirements-doc/kit.json +365 -0
- package/kits/product-requirements-doc/skills/acceptance-criteria/SKILL.md +219 -0
- package/kits/product-requirements-doc/skills/create-user-story/SKILL.md +43 -0
- package/kits/product-requirements-doc/skills/define-success-metrics/SKILL.md +41 -0
- package/kits/product-requirements-doc/skills/kit-expertise/SKILL.md +81 -0
- package/kits/product-requirements-doc/skills/prd-review/SKILL.md +39 -0
- package/kits/product-requirements-doc/skills/prd-structure/SKILL.md +206 -0
- package/kits/product-requirements-doc/skills/prioritize-features/SKILL.md +43 -0
- package/kits/product-requirements-doc/skills/synthesize-research/SKILL.md +43 -0
- package/kits/product-requirements-doc/skills/user-stories/SKILL.md +198 -0
- package/kits/project-timeline/kit.json +367 -0
- package/kits/project-timeline/skills/add-milestone/SKILL.md +44 -0
- package/kits/project-timeline/skills/add-task/SKILL.md +43 -0
- package/kits/project-timeline/skills/assess-risks/SKILL.md +39 -0
- package/kits/project-timeline/skills/dependency-analysis/SKILL.md +176 -0
- package/kits/project-timeline/skills/identify-critical-path/SKILL.md +37 -0
- package/kits/project-timeline/skills/kit-expertise/SKILL.md +81 -0
- package/kits/project-timeline/skills/milestone-planning/SKILL.md +169 -0
- package/kits/project-timeline/skills/status-update/SKILL.md +39 -0
- package/kits/reading-tracker/kit.json +368 -0
- package/kits/reading-tracker/skills/add-book/SKILL.md +32 -0
- package/kits/reading-tracker/skills/book-connections/SKILL.md +161 -0
- package/kits/reading-tracker/skills/kit-expertise/SKILL.md +72 -0
- package/kits/reading-tracker/skills/log-progress/SKILL.md +29 -0
- package/kits/reading-tracker/skills/reading-insights/SKILL.md +179 -0
- package/kits/reading-tracker/skills/save-quote/SKILL.md +30 -0
- package/kits/recipe-manager/kit.json +376 -0
- package/kits/recipe-manager/skills/add-recipe/SKILL.md +33 -0
- package/kits/recipe-manager/skills/generate-shopping-list/SKILL.md +27 -0
- package/kits/recipe-manager/skills/ingredient-substitutions/SKILL.md +157 -0
- package/kits/recipe-manager/skills/kit-expertise/SKILL.md +72 -0
- package/kits/recipe-manager/skills/meal-planning/SKILL.md +184 -0
- package/kits/recipe-manager/skills/plan-meal/SKILL.md +31 -0
- package/kits/recipe-manager/skills/scaling-recipes/SKILL.md +183 -0
- package/kits/saas-app/kit.json +405 -0
- package/kits/saas-app/skills/churn-analysis/SKILL.md +219 -0
- package/kits/saas-app/skills/onboarding-flow/SKILL.md +217 -0
- package/kits/saas-app/skills/pricing-model/SKILL.md +192 -0
- package/kits/saas-app/skills/saas-expertise/SKILL.md +95 -0
- package/kits/salon-barbershop/kit.json +1021 -0
- package/kits/screenplay-writing/kit.json +412 -0
- package/kits/screenplay-writing/skills/analyze-scene/SKILL.md +42 -0
- package/kits/screenplay-writing/skills/beat-sheet/SKILL.md +134 -0
- package/kits/screenplay-writing/skills/create-scene-card/SKILL.md +46 -0
- package/kits/screenplay-writing/skills/develop-character/SKILL.md +43 -0
- package/kits/screenplay-writing/skills/generate-beat-sheet/SKILL.md +49 -0
- package/kits/screenplay-writing/skills/kit-expertise/SKILL.md +90 -0
- package/kits/screenplay-writing/skills/scene-analysis/SKILL.md +164 -0
- package/kits/screenplay-writing/skills/screenplay-format/SKILL.md +108 -0
- package/kits/social-media-manager/kit.json +476 -0
- package/kits/teacher-lesson-plan/kit.json +410 -0
- package/kits/teacher-lesson-plan/skills/assessment-design/SKILL.md +162 -0
- package/kits/teacher-lesson-plan/skills/blooms-taxonomy/SKILL.md +139 -0
- package/kits/teacher-lesson-plan/skills/create-lesson/SKILL.md +34 -0
- package/kits/teacher-lesson-plan/skills/design-unit/SKILL.md +28 -0
- package/kits/teacher-lesson-plan/skills/differentiate-lesson/SKILL.md +28 -0
- package/kits/teacher-lesson-plan/skills/differentiation/SKILL.md +180 -0
- package/kits/teacher-lesson-plan/skills/kit-expertise/SKILL.md +96 -0
- package/kits/teacher-lesson-plan/skills/schedule-lesson/SKILL.md +31 -0
- package/kits/technical-specification/kit.json +369 -0
- package/kits/technical-specification/skills/architecture-decision/SKILL.md +42 -0
- package/kits/technical-specification/skills/architecture-decisions/SKILL.md +180 -0
- package/kits/technical-specification/skills/data-model-design/SKILL.md +43 -0
- package/kits/technical-specification/skills/data-modeling/SKILL.md +159 -0
- package/kits/technical-specification/skills/define-component/SKILL.md +43 -0
- package/kits/technical-specification/skills/kit-expertise/SKILL.md +81 -0
- package/kits/technical-specification/skills/requirements-analysis/SKILL.md +42 -0
- package/kits/technical-specification/skills/security-review/SKILL.md +170 -0
- package/kits/technical-specification/skills/spec-review/SKILL.md +39 -0
- package/kits/wanderlands/kit.json +399 -0
- package/kits/wanderlands/skills/kit-expertise/SKILL.md +376 -0
- package/kits/web-application/kit.json +257 -0
- package/kits/web-application/skills/kit-expertise/SKILL.md +211 -0
- package/kits/wicks-and-whiskers/kit.json +1267 -0
- package/kits/wicks-and-whiskers/skills/blog-draft/SKILL.md +145 -0
- package/kits/wicks-and-whiskers/skills/booking-digest/SKILL.md +142 -0
- package/kits/wicks-and-whiskers/skills/candle-expertise/SKILL.md +69 -0
- package/kits/wicks-and-whiskers/skills/customer-insights/SKILL.md +176 -0
- package/kits/wicks-and-whiskers/skills/demand-forecast/SKILL.md +159 -0
- package/kits/wicks-and-whiskers/skills/email-campaign/SKILL.md +131 -0
- package/kits/wicks-and-whiskers/skills/experience-copy/SKILL.md +135 -0
- package/kits/wicks-and-whiskers/skills/guest-letter/SKILL.md +154 -0
- package/kits/wicks-and-whiskers/skills/inventory-health/SKILL.md +185 -0
- package/kits/wicks-and-whiskers/skills/kitten-profile/SKILL.md +159 -0
- package/kits/wicks-and-whiskers/skills/memory-narrative/SKILL.md +71 -0
- package/kits/wicks-and-whiskers/skills/revenue-report/SKILL.md +197 -0
- package/kits/wicks-and-whiskers/skills/social-calendar/SKILL.md +161 -0
- package/kits/wicks-and-whiskers/skills/staff-briefing/SKILL.md +174 -0
- package/kits/wicks-and-whiskers/skills/venue-data-model/SKILL.md +228 -0
- package/kits/world-building/kit.json +497 -0
- package/kits/world-building/skills/consistency-check/SKILL.md +179 -0
- package/kits/world-building/skills/create-character/SKILL.md +44 -0
- package/kits/world-building/skills/create-faction/SKILL.md +44 -0
- package/kits/world-building/skills/create-location/SKILL.md +44 -0
- package/kits/world-building/skills/create-timeline/SKILL.md +39 -0
- package/kits/world-building/skills/culture-builder/SKILL.md +171 -0
- package/kits/world-building/skills/design-magic-system/SKILL.md +38 -0
- package/kits/world-building/skills/kit-expertise/SKILL.md +110 -0
- package/kits/world-building/skills/magic-systems/SKILL.md +161 -0
- package/kits/youtube-content-plan/kit.json +346 -0
- package/kits/youtube-content-plan/skills/analytics-insights/SKILL.md +166 -0
- package/kits/youtube-content-plan/skills/analyze-performance/SKILL.md +43 -0
- package/kits/youtube-content-plan/skills/develop-video-idea/SKILL.md +45 -0
- package/kits/youtube-content-plan/skills/generate-ideas/SKILL.md +42 -0
- package/kits/youtube-content-plan/skills/kit-expertise/SKILL.md +81 -0
- package/kits/youtube-content-plan/skills/optimize-metadata/SKILL.md +43 -0
- package/kits/youtube-content-plan/skills/script-writing/SKILL.md +180 -0
- package/kits/youtube-content-plan/skills/write-script/SKILL.md +44 -0
- package/kits/youtube-content-plan/skills/youtube-seo/SKILL.md +172 -0
- package/package.json +43 -0
- package/src/index.ts +35 -0
- package/src/kits/ai-content-studio.ts +377 -0
- package/src/kits/api-documentation.ts +352 -0
- package/src/kits/axe-house.ts +949 -0
- package/src/kits/blog-series.ts +357 -0
- package/src/kits/business-plan.ts +406 -0
- package/src/kits/canvas-and-corks.ts +928 -0
- package/src/kits/character-relationship-map.ts +368 -0
- package/src/kits/clay-and-co.ts +956 -0
- package/src/kits/concept-map.ts +354 -0
- package/src/kits/content-calendar.ts +399 -0
- package/src/kits/coworking-space.ts +1084 -0
- package/src/kits/escape-vault.ts +1046 -0
- package/src/kits/family-tree.ts +381 -0
- package/src/kits/farkle-dice-game.ts +318 -0
- package/src/kits/franchise-ops.ts +345 -0
- package/src/kits/freelance-portfolio.ts +453 -0
- package/src/kits/game-design-doc.ts +353 -0
- package/src/kits/gather-and-grill.ts +984 -0
- package/src/kits/gtd-productivity-system.ts +389 -0
- package/src/kits/gym-fitness.ts +1053 -0
- package/src/kits/index.ts +76 -0
- package/src/kits/interactive-fiction.ts +489 -0
- package/src/kits/invoice-generator.ts +484 -0
- package/src/kits/loyalty-program.ts +342 -0
- package/src/kits/marketing-plan.ts +398 -0
- package/src/kits/marketing-site.ts +248 -0
- package/src/kits/match-3-puzzle.ts +248 -0
- package/src/kits/mind-map.ts +356 -0
- package/src/kits/music-collection.ts +404 -0
- package/src/kits/music-venue.ts +1002 -0
- package/src/kits/novel-writing-system.ts +461 -0
- package/src/kits/organization-chart.ts +350 -0
- package/src/kits/paws-and-pour.ts +987 -0
- package/src/kits/persona-driven-strategy.ts +345 -0
- package/src/kits/personal-crm.ts +391 -0
- package/src/kits/personal-wiki.ts +323 -0
- package/src/kits/petal-press.ts +1014 -0
- package/src/kits/pitch-deck.ts +395 -0
- package/src/kits/podcast-series.ts +324 -0
- package/src/kits/pour-house.ts +930 -0
- package/src/kits/presentation.ts +276 -0
- package/src/kits/product-requirements-doc.ts +359 -0
- package/src/kits/project-timeline.ts +368 -0
- package/src/kits/reading-tracker.ts +368 -0
- package/src/kits/recipe-manager.ts +376 -0
- package/src/kits/saas-app.ts +423 -0
- package/src/kits/salon-barbershop.ts +1037 -0
- package/src/kits/screenplay-writing.ts +412 -0
- package/src/kits/social-media-manager.ts +494 -0
- package/src/kits/teacher-lesson-plan.ts +410 -0
- package/src/kits/technical-specification.ts +363 -0
- package/src/kits/wanderlands.ts +401 -0
- package/src/kits/web-application.ts +275 -0
- package/src/kits/wicks-and-whiskers.ts +1285 -0
- package/src/kits/world-building.ts +476 -0
- package/src/kits/youtube-content-plan.ts +339 -0
- package/src/registry.ts +60 -0
- package/src/skills/api-documentation/index.ts +47 -0
- package/src/skills/axe-house/index.ts +71 -0
- package/src/skills/blog-series/index.ts +43 -0
- package/src/skills/business-plan/index.ts +43 -0
- package/src/skills/canvas-and-corks/index.ts +75 -0
- package/src/skills/character-relationship-map/index.ts +23 -0
- package/src/skills/clay-and-co/index.ts +75 -0
- package/src/skills/concept-map/index.ts +43 -0
- package/src/skills/content-calendar/index.ts +43 -0
- package/src/skills/escape-vault/index.ts +75 -0
- package/src/skills/family-tree/index.ts +43 -0
- package/src/skills/farkle-dice-game/index.ts +15 -0
- package/src/skills/game-design-doc/index.ts +47 -0
- package/src/skills/gather-and-grill/index.ts +75 -0
- package/src/skills/gtd-productivity-system/index.ts +43 -0
- package/src/skills/index.ts +109 -0
- package/src/skills/marketing-plan/index.ts +43 -0
- package/src/skills/marketing-site/index.ts +39 -0
- package/src/skills/match-3-puzzle/index.ts +15 -0
- package/src/skills/mind-map/index.ts +43 -0
- package/src/skills/music-collection/index.ts +43 -0
- package/src/skills/novel-writing-system/index.ts +47 -0
- package/src/skills/organization-chart/index.ts +43 -0
- package/src/skills/paws-and-pour/index.ts +75 -0
- package/src/skills/persona-driven-strategy/index.ts +27 -0
- package/src/skills/personal-crm/index.ts +39 -0
- package/src/skills/personal-wiki/index.ts +23 -0
- package/src/skills/petal-press/index.ts +75 -0
- package/src/skills/pitch-deck/index.ts +39 -0
- package/src/skills/podcast-series/index.ts +47 -0
- package/src/skills/pour-house/index.ts +75 -0
- package/src/skills/product-requirements-doc/index.ts +47 -0
- package/src/skills/project-timeline/index.ts +43 -0
- package/src/skills/reading-tracker/index.ts +35 -0
- package/src/skills/recipe-manager/index.ts +39 -0
- package/src/skills/saas-app/index.ts +27 -0
- package/src/skills/screenplay-writing/index.ts +43 -0
- package/src/skills/teacher-lesson-plan/index.ts +43 -0
- package/src/skills/technical-specification/index.ts +47 -0
- package/src/skills/wanderlands/index.ts +15 -0
- package/src/skills/web-application/index.ts +15 -0
- package/src/skills/wicks-and-whiskers/index.ts +71 -0
- package/src/skills/world-building/index.ts +47 -0
- package/src/skills/youtube-content-plan/index.ts +47 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module @soulcraft/kits/skills/canvas-and-corks
|
|
3
|
+
* @description Raw SKILL.md content for the canvas-and-corks kit's AI skills.
|
|
4
|
+
*
|
|
5
|
+
* Generated from: kits/canvas-and-corks/skills/{skillId}/SKILL.md
|
|
6
|
+
* Do not edit directly — edit the source SKILL.md files and re-run `bun run build:skills`.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/** Raw SKILL.md content for the `staff-briefing` skill. */
|
|
10
|
+
export const staffBriefing = "---\nid: staff-briefing\nname: Staff Morning Briefing\ndescription: Generates a structured morning operations briefing for the current paint studio shift, including class schedule, capacity, revenue forecast, easel prep counts, inventory alerts, and a pre-shift action checklist.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Staff Morning Briefing\n\nYou generate a clear, organized morning operations briefing for the opening staff team at **{{locationName}}**. Think studio-manager energy: thorough, cheerful, and ready to run a great day.\n\n## When to Trigger\n\nInvoke this skill when staff ask:\n- \"What's the briefing for today?\"\n- \"What classes are running today?\"\n- \"Good morning — what do I need to know?\"\n- \"Daily briefing\" / \"morning check-in\"\n- Any question about today's schedule at the start of a shift\n\n## Data to Pull\n\nBefore generating the briefing, gather:\n\n1. **Today's bookings** — Query `Event` entities with `metadata.entityType = 'booking'` and `metadata.date = [today's date]` and `metadata.locationId = [location]`. Group by time slot / experienceSlug.\n2. **Time slots** — Query `Event` entities with `metadata.entityType = 'time-slot'` for today to get capacity and `reservedCount` per session.\n3. **Session attributes** — For each booking, check `data.sessionAttributes` for `paintingName`, `medium`, `colorPalette`, `canvasSize` if staff have pre-assigned them.\n4. **Revenue comparison** — Query the `Measurement` aggregate for the same weekday last week (same day-of-week, one week prior) to produce a comparison figure.\n5. **Inventory alerts** — Query `Thing` entities with `metadata.entityType = 'inventory-item'` and `metadata.locationId = [location]`. Flag any where `metadata.quantity <= metadata.reorderThreshold`.\n\n## Briefing Structure\n\nGenerate the briefing in exactly this structure:\n\n---\n\n### Good morning, {{locationName}}! ☀️\n\n> **[Full date — e.g., Wednesday, February 19, 2026]**\n\n---\n\n### 1. Today's Classes\n\nFor each time slot scheduled today, produce a block:\n\n```\n🎨 [Time] — [Experience Name]\n Painting: [paintingName from session attributes, or \"TBD\"]\n Guests: [reservedCount] / [capacity] ([% fill])\n Type: [Public | Private Party]\n Canvas size: [11×14 | 16×20 | 18×24]\n Status: [Confirmed bookings count] confirmed booking(s)\n```\n\nIf no classes are scheduled: \"No classes scheduled today. Great day for studio prep or a staff training session!\"\n\n---\n\n### 2. Revenue Forecast\n\n```\nConfirmed revenue today: $[sum of totalInCents for confirmed bookings ÷ 100]\nLast [weekday] revenue: $[comparison figure ÷ 100]\nVariance: [+/- $X and percentage]\n```\n\nNote if today is tracking above, on par, or below last week's same day.\n\n---\n\n### 3. Easel Prep\n\n```\nTotal easels needed: [sum of all guestCounts across today's sessions]\nBy session:\n [Time] — [Experience]: [guestCount] easels, [canvasSize] canvases\n```\n\nInclude a reminder to pre-load paint palettes matched to each session's `colorPalette` attribute if available.\n\n---\n\n### 4. Inventory Alerts\n\nIf any items are at or below reorder threshold:\n\n```\n⚠️ [Item name] — [quantity] remaining (threshold: [reorderThreshold])\n Category: [category]\n```\n\nIf all inventory is healthy: \"All supplies are well-stocked. No reorder alerts.\"\n\n---\n\n### 5. Pre-Shift Action Checklist\n\nGenerate a session-specific checklist. Always include the universal items; add session-specific items based on today's bookings.\n\n**Universal items:**\n- [ ] Canvases cut to size and labeled (one per confirmed seat)\n- [ ] Easels set up and tested for wobble\n- [ ] Paint stations stocked — squeeze bottles filled by color\n- [ ] Rinse cups filled with clean water\n- [ ] Aprons counted and accessible at each easel\n- [ ] Music playlist loaded and volume tested\n- [ ] POS float confirmed — till opened and counted\n- [ ] Studio floor swept and entrance presentable\n- [ ] Instructor demo easel set up at front with demo canvas\n\n**Session-specific additions (add based on data):**\n- If a Kids Paint Class is on the schedule: `[ ] Kids supply station set up separately — lower easels, student-grade paint, smocks accessible, non-alcoholic beverages only`\n- If a Private Party is on the schedule: `[ ] Custom party setup per client request — check booking notes for decor, arrangement, or catering`\n- If BYOB Date Night is on the schedule: `[ ] Wine glasses polished and set — two per easel station`\n- If any session has `colorPalette` set: `[ ] Paint palette pre-loaded for [paintingName] — colors: [colorPalette]`\n- If inventory alerts exist: `[ ] Place reorder for flagged items before end of shift`\n\n---\n\n## Tone Guidelines\n\n- **Warm and organized** — Like a studio manager who's genuinely excited about the day\n- **Specific, not generic** — Use actual class names, times, and guest counts from the data\n- **Actionable** — Every section ends with something staff can do right now\n- **Concise** — Briefing should be scannable in under 2 minutes on a tablet\n- **No filler** — If a section has no relevant data, say so briefly and move on\n\n## Output Format\n\nProduce the briefing as clean, readable markdown. Use headers, emoji sparingly for visual anchoring, and tables only where they genuinely aid clarity (e.g., multiple sessions side by side). The output should render well in both a web staff dashboard and a printed daily sheet.\n";
|
|
11
|
+
|
|
12
|
+
/** Raw SKILL.md content for the `class-roster` skill. */
|
|
13
|
+
export const classRoster = "---\nid: class-roster\nname: Class Roster Generator\ndescription: Generates a formatted, printable class roster for any upcoming paint session with guest names, party sizes, skill levels, booking numbers, check-in checkboxes, easel assignments, and a painting quick-reference for the instructor.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Class Roster Generator\n\nYou generate a clean, instructor-ready class roster for **{{locationName}}**. The roster is the instructor's operating document for the session — every piece of information they need, in the order they'll need it, formatted to survive both a tablet screen and a printed page.\n\n## When to Trigger\n\nInvoke this skill when staff or instructors ask:\n- \"Class roster for tonight\"\n- \"Who's coming to the 7pm class?\"\n- \"Print the roster for Saturday\"\n- \"Prep the instructor list for [painting name]\"\n- \"Show me the guest list for [date and time]\"\n\nIf date or time isn't specified, ask: \"Which class — tonight's session, or a specific date and time?\" Then proceed.\n\n---\n\n## Data to Pull\n\n### Step 1 — The time slot\n\nFind the `Event` entity with `metadata.entityType = 'time-slot'` matching the requested date, hour, and experienceSlug. Retrieve:\n- `metadata.date`, `metadata.hour`\n- `metadata.experienceSlug`\n- `metadata.capacity`\n- `metadata.reservedCount`\n- `data.sessionAttributes` — specifically `paintingName`, `medium`, `colorPalette`, `canvasSize`, `instructorName`\n\n### Step 2 — All confirmed bookings for this slot\n\nQuery `Event` entities with `metadata.entityType = 'booking'` where:\n- `metadata.status` is `confirmed`\n- The booking has a `ParticipatesIn` relationship to this time slot (or filter by `metadata.date`, `metadata.hour`, `metadata.experienceSlug`)\n\nFor each booking, retrieve:\n- `metadata.bookingNumber`\n- `metadata.guestCount`\n- `metadata.totalInCents`\n- `data.sessionAttributes` — `partyNames` (array), `skillLevel`, `staffNotes`, `specialRequests`\n- `metadata.checkedIn` — boolean, for pre-filled status\n\n### Step 3 — Repeat guest detection\n\nCheck each customer's `metadata.totalBookings` field. If `totalBookings > 1`, flag them as a returning guest for the instructor.\n\n---\n\n## Roster Structure\n\nProduce the roster in this exact order:\n\n---\n\n# Class Roster — {{locationName}}\n\n**Class**: [Experience Name — e.g., Guided Paint Class]\n**Painting**: [paintingName from session attributes, or \"TBD\"]\n**Date**: [Full date — e.g., Saturday, February 22, 2026]\n**Time**: [e.g., 7:00 PM – 9:00 PM]\n**Instructor**: [instructorName from session attributes, or \"TBD\"]\n**Canvas Size**: [canvasSize — e.g., 16×20]\n**Medium**: [medium — e.g., Acrylic]\n\n---\n\n## Guest List\n\n| # | Easel | Booking # | Guest Name(s) | Party | Skill Level | Notes | Checked In |\n|---|---|---|---|---|---|---|---|\n| 1 | E01 | [bookingNumber] | [partyNames joined] | [guestCount] | [skillLevel] | [staffNotes / specialRequests] | ☐ |\n| 2 | E02 | [bookingNumber] | [partyNames] | [guestCount] | [skillLevel] | [notes] | ☐ |\n| ... | | | | | | | |\n\n**Column notes:**\n- **#**: Sequential row number\n- **Easel**: Pre-assigned easel number (see Easel Assignment logic below)\n- **Booking #**: Short booking reference number for POS and check-in lookup\n- **Guest Name(s)**: All names from `partyNames` — if group of 4, list all four\n- **Party**: Number of guests on this booking (guestCount)\n- **Skill Level**: From session attributes; if not set, leave blank — instructor will ask on arrival\n- **Notes**: Combine `staffNotes` and `specialRequests` if present; otherwise leave blank\n- **Checked In**: Empty checkbox for manual check-off during arrival\n\n---\n\n## Easel Assignment Logic\n\nAssign easel numbers based on skill level, working front-to-back:\n\n1. **First timers and Beginners → Front rows** (easels E01–E[N], closest to instructor demo easel)\n2. **Intermediates → Middle rows**\n3. **Advanced → Back rows** (can see the demo but work more independently)\n4. **Groups / large parties → Assign consecutive easels** (E03, E04, E05 for a party of 3) so the group is seated together\n\nIf skill level is unknown for a booking, assign to the middle section and note \"TBD\" in the Easel column.\n\nIf the class is a Private Party or Date Night, arrange easels in the layout pre-specified in the booking notes (U-shape, rows, etc.).\n\n---\n\n## Session Summary\n\n| Metric | Value |\n|---|---|\n| Confirmed bookings | [count of booking entities] |\n| Total painters confirmed | [sum of guestCount] |\n| Capacity | [metadata.capacity] |\n| Empty seats | [capacity − totalGuests] |\n| Check-in status | [N] checked in / [total] expected |\n\n---\n\n## Painting Quick Reference\n\nThe instructor's fast reference for color setup and technique prep:\n\n**Painting**: [paintingName]\n**Color palette**: [colorPalette — e.g., \"Cool tones — cerulean blue, Payne's grey, titanium white, silver-grey\"]\n**Key technique(s)**: [Derive from painting name and palette if session attributes don't specify — e.g., \"Wet-on-wet blending for sky and water reflection; dry brush for dock texture\"]\n**Canvas size**: [canvasSize]\n**Suggested brush loadout per easel**: [Based on medium and technique — e.g., \"1× 3/4\" flat, 1× round size 6, 1× detail size 2, 1× fan brush\"]\n**Paint colors to pre-load**: [List specific colors from the palette]\n\n---\n\n## Instructor Notes\n\nAuto-generate contextual notes for the instructor based on the roster data:\n\n**Returning guests to acknowledge:**\n> [List any guests with totalBookings > 1 — \"Sarah M. (Easel E03) — 4th visit. Welcome back!\" — so the instructor can greet them by name]\n\nIf no returning guests: \"All guests appear to be first-time visitors. Great opportunity to make strong first impressions.\"\n\n**Group notes:**\n> [If any booking has guestCount ≥ 4, note it: \"Booking #[N] — party of [X] for [occasion if in notes]. Seated together at E[N]–E[N+x].\"]\n\n**Special considerations:**\n> [Any allergies, mobility accommodations, or corporate group details from staffNotes or specialRequests]\n\n**BYOB reminder** (if experience is Guided Class, Date Night, or Private Party):\n> \"Remind guests that BYOB is welcome — glasses are on the side table. No glass on the painting surface.\"\n\n---\n\n## Output Format\n\nRender as clean, printable markdown. Use proper table formatting. The roster should be ready to:\n1. Display in the staff dashboard\n2. Export to PDF for physical printing\n3. Read on a tablet while standing at the studio entrance during check-in\n\nAll checkboxes use `☐` (empty) — never pre-fill as checked, even if `metadata.checkedIn = true` at the time of generation. Check-in happens live on arrival.\n";
|
|
14
|
+
|
|
15
|
+
/** Raw SKILL.md content for the `guest-letter` skill. */
|
|
16
|
+
export const guestLetter = "---\nid: guest-letter\nname: Guest Thank-You Letter\ndescription: Writes personalized post-class follow-up emails for paint studio guests, referencing their specific painting, skill level, session details, loyalty points earned, and a warm invitation to return.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Guest Thank-You Letter\n\nYou write the post-class follow-up email that guests receive after their visit to **{{businessName}}**. This is not a mass marketing email — it's a personal note from the studio that references what actually happened in their session. It should feel like it was written by the instructor, not a marketing department.\n\n## When to Trigger\n\nInvoke this skill when:\n- A class has just completed (automated post-checkout trigger)\n- Staff ask: \"Send a thank-you to tonight's guests\"\n- \"Follow up with the people from last Saturday's Date Night\"\n- \"Write a post-visit email for the [painting name] class\"\n\n---\n\n## Input Data Available\n\nYou will receive a structured object with session details. Use all available fields — the more specific the letter, the better the guest relationship.\n\n```json\n{\n \"guestNames\": [\"Alice\", \"Marcus\"],\n \"date\": \"2026-02-14\",\n \"locationName\": \"Canvas & Corks Midtown\",\n \"experienceName\": \"BYOB Date Night\",\n \"sessionAttributes\": [\n { \"key\": \"paintingName\", \"value\": \"Moonlit Harbor\" },\n { \"key\": \"medium\", \"value\": \"Acrylic\" },\n { \"key\": \"colorPalette\", \"value\": \"Cool tones\" },\n { \"key\": \"canvasSize\", \"value\": \"16×20\" },\n { \"key\": \"skillLevel\", \"value\": \"First timer\", \"guestName\": \"Alice\" },\n { \"key\": \"skillLevel\", \"value\": \"Beginner\", \"guestName\": \"Marcus\" }\n ],\n \"staffNotes\": \"Alice was nervous to start but completely nailed the reflection on the water. Marcus kept making Alice laugh which made for a beautiful, relaxed painting.\",\n \"loyaltyPointsEarned\": 45,\n \"currentLoyaltyTier\": \"Bronze\",\n \"pointsToNextTier\": 105\n}\n```\n\n---\n\n## Letter Structure\n\nWrite a 150–250 word letter in this structure. Every section must reference real data when available — no generic filler.\n\n### 1. Personalized Opener\nAddress the guest(s) by first name. If there are multiple guests (e.g., a couple or a group), address them together. Warm, not formal. \"Hey Alice and Marcus,\" or \"Hi Alice,\" — never \"Dear Valued Guest.\"\n\n### 2. Reference Their Painting\nName the painting specifically. Use one or two sensory or visual details about it — the colors, the subject, the mood. This line must feel like the writer was actually in the room watching them create it.\n\n**Good example:**\n\"Moonlit Harbor in cool blues and silver-grey — there's something quietly stunning about a harbor at night, and you both captured it.\"\n\n**Bad example:**\n\"We hope you enjoyed painting with us tonight.\"\n\n### 3. Acknowledge the Session\nIf `staffNotes` is present, incorporate the specific observation naturally — a breakthrough moment, a funny exchange, a technique that clicked. This is the most personalized moment in the letter and the hardest to fake.\n\nIf `skillLevel` is \"First timer\" or \"Beginner,\" acknowledge the specific achievement of completing their first (or early) painting.\n\n**Good example:**\n\"Alice — that water reflection you painted in the second half of class? That's not a beginner move. That's just good instincts.\"\n\n### 4. \"Your Painting Is Ready to Hang\"\nOne short, affirming sentence that marks the painting as a real, finished piece of art — not a class project. This is an important psychological moment for first-timers who may still think their work \"doesn't count.\"\n\n**Good example:**\n\"When you get home, give it a day to dry completely, then find it a wall. It deserves one.\"\n\n### 5. Loyalty Points (if applicable)\nIf `loyaltyPointsEarned` is provided, mention it simply — not as a promotional hook, but as a nice-to-know:\n\n\"You earned [N] points tonight — your account is now at [total] points. [X] more and you'll hit Silver tier.\"\n\nIf no loyalty data is available, skip this section entirely.\n\n### 6. Return Invitation\nOne sentence, genuinely warm — not \"book now\" language. Point them toward the next class or featured painting if that data is available.\n\n**Good example:**\n\"Come back and see what we're painting next month — the March lineup just went up.\"\n\n### 7. Sign-Off\nSign from `{{featuredArtist}}` if available, or \"The {{businessName}} Team\" if not. Keep it simple:\n\n\"Until next time,\n[Name or Team]\"\n\n---\n\n## Tone Rules\n\n- **Specific over generic** — Every sentence should be impossible to send to a different guest\n- **Instructor voice** — Write as if the instructor is writing directly, not as if a marketing tool generated it\n- **Warm but not saccharine** — Real warmth comes from specificity, not exclamation marks\n- **No upsell pressure** — The return invitation is an invitation, never a CTA with urgency\n- **Celebrate the achievement** — First-timers need to hear \"you did it\" explicitly. Returning guests need to hear that their growth is visible.\n- **Short is good** — 150–250 words. A longer letter is not a better letter. The guest has a painting to hang.\n\n---\n\n## Output Format\n\nPlain text, formatted for email. Use:\n- One blank line between paragraphs\n- No markdown (no asterisks, no headers) — this is an email body, not a document\n- Guest name(s) at the top, sign-off at the bottom\n\nSubject line: Generate one subject line suggestion at the top, formatted as:\n> **Suggested subject**: [subject text — 30–50 characters]\n\nGood subject lines reference the painting title:\n- \"Your Moonlit Harbor is ready to hang\"\n- \"You painted that 🎨\"\n- \"From Alice and Marcus's class last night\"\n";
|
|
17
|
+
|
|
18
|
+
/** Raw SKILL.md content for the `painting-memory` skill. */
|
|
19
|
+
export const paintingMemory = "---\nid: painting-memory\nname: Painting Memory Narrator\ndescription: Generates a warm, personalized 2nd-person storybook narrative for a paint & sip visit memory page. Incorporates painting name, skill level, color palette, and atmosphere into a 300–500 word story.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Painting Memory Narrator\n\nYou write the narrative section of a {{businessName}} Experience Memory — a personalized shareable storybook page for guests after their visit.\n\n## Your Role\n\nGenerate a warm, celebratory **300–500 word narrative** written in **2nd person** (\"You walked through the door…\"). The story should feel like a personal memoir of the session — joyful, specific, and rich with sensory detail about the creative experience.\n\n## Input Data Available\n\nYou will receive a JSON object with:\n\n```json\n{\n \"partyNames\": [\"Alice\", \"Jordan\"],\n \"date\": \"2026-03-15\",\n \"locationName\": \"Canvas & Corks Midtown\",\n \"experienceNames\": [\"Guided Paint Class\"],\n \"sessionAttributes\": [\n { \"key\": \"paintingName\", \"value\": \"Mountain Sunset\", \"guestName\": \"Alice\" },\n { \"key\": \"paintingName\", \"value\": \"Mountain Sunset\", \"guestName\": \"Jordan\" },\n { \"key\": \"skillLevel\", \"value\": \"First timer\", \"guestName\": \"Alice\" },\n { \"key\": \"skillLevel\", \"value\": \"Beginner\", \"guestName\": \"Jordan\" },\n { \"key\": \"medium\", \"value\": \"Acrylic\" },\n { \"key\": \"colorPalette\", \"value\": \"Warm tones\" }\n ],\n \"staffNotes\": \"Alice was nervous at first but really got into the color mixing!\",\n \"enrichment\": {\n \"weather\": \"partly cloudy, 62°F\",\n \"moonPhase\": \"waxing crescent\"\n }\n}\n```\n\n## Narrative Structure (Guide Only — Write Naturally)\n\n1. **Opening** — Set the scene. Where are they? What does the studio feel like?\n2. **The Painting** — Describe what they created. Name the piece. Use color language.\n3. **The Technique Moment** — A specific detail about the creative process (blending, layering, brushwork).\n4. **The People** — Weave in guest names, skill level contrast if applicable, a moment of joy or surprise.\n5. **The Atmosphere** — Drinks, music, laughter, the instructor's guidance.\n6. **The Takeaway** — What they're walking home with — not just the canvas, but the feeling.\n7. **Closing Call-to-Action** — Warm invitation to return.\n\n## Style Rules\n\n- **2nd person throughout** (\"You,\" \"your canvas,\" \"you both\")\n- **Present + past blend** — \"You remember how nervous you were\" mixed with vivid present-tense scene-setting\n- **Sensory language** — Smell of acrylic, feel of brush on canvas, clink of glasses\n- **Named specifics** — Reference the painting title, color palette, skill level when available\n- **Warm but not saccharine** — Genuine celebration, not fake enthusiasm\n- **No generic filler** — Every sentence should be specific to *this* visit\n\n## When enrichment is present\n\nWeave in 1–2 natural references to the real-world context:\n- Weather: \"A gray March afternoon that somehow felt golden inside the studio…\"\n- Moon phase: Use poetically if it fits — don't force it\n\n## When staffNotes is present\n\nIncorporate the staff observation naturally — these are the most personalized moments.\n\n## Output Format\n\nReturn only the narrative text. No headers. No JSON. 3–5 paragraphs separated by blank lines.\n";
|
|
20
|
+
|
|
21
|
+
/** Raw SKILL.md content for the `booking-digest` skill. */
|
|
22
|
+
export const bookingDigest = "---\nid: booking-digest\nname: Booking Digest\ndescription: Summarizes bookings for a specified period with class-level aggregate statistics including session counts, guest totals, revenue, fill rates, and painting popularity rankings.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Booking Digest\n\nYou generate a structured booking summary report for **{{locationName}}**. The digest gives owners and managers a fast, complete picture of booking activity for any time period — by class type, by day, and by painting.\n\n## When to Trigger\n\nInvoke this skill when staff or owners ask:\n- \"Show me bookings for this week\"\n- \"Booking summary for last month\"\n- \"How many classes did we run in January?\"\n- \"What's the booking breakdown?\"\n- \"Give me a digest of our bookings\"\n- Any question asking for a booking overview or period summary\n\n## Default Period\n\nIf no period is specified, default to the **current calendar week** (Monday through today).\n\nAccept natural language date ranges: \"last week\", \"this month\", \"last 30 days\", \"January\", \"Q4 2025\", or explicit date ranges like \"Feb 1 – Feb 15\".\n\n## Data Aggregates to Build\n\n### Primary aggregate — bookings by experience and day\n\n```typescript\nbrain.defineAggregate('bookingsByExperienceDay', {\n source: {\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.status', value: 'confirmed' }\n ]\n },\n groupBy: [\n { field: 'metadata.experienceSlug' },\n { field: 'metadata.date', window: 'day' }\n ],\n metrics: {\n sessionCount: { op: 'COUNT' },\n totalGuests: { op: 'SUM', field: 'metadata.guestCount' },\n totalRevenue: { op: 'SUM', field: 'metadata.totalInCents' },\n avgPartySize: { op: 'AVG', field: 'metadata.guestCount' }\n }\n});\n```\n\n### Painting popularity (from session attributes)\n\nIf `paintingName` session attributes are available in booking data, tally frequency across the period. This is a client-side aggregation from the raw booking data's `data.sessionAttributes` array.\n\n### Cancellation count\n\nSeparately query bookings with `metadata.status = 'cancelled'` for the same period to report cancellation volume.\n\n---\n\n## Report Structure\n\nProduce the digest in this order:\n\n---\n\n### Booking Digest — {{locationName}}\n**Period**: [start date] – [end date]\n\n---\n\n### 1. Period Summary\n\n| Metric | Value |\n|---|---|\n| Total sessions run | [count of distinct time slots with bookings] |\n| Total bookings | [total confirmed booking entities] |\n| Total painters | [sum of guestCount across all confirmed bookings] |\n| Total revenue | $[sum of totalInCents ÷ 100] |\n| Cancellations | [count of cancelled bookings] |\n| Avg party size | [avgPartySize across all bookings] |\n\n---\n\n### 2. By Class Type\n\n| Experience | Sessions | Painters | Revenue | Avg Party Size | Fill Rate |\n|---|---|---|---|---|---|\n| [experience name] | [count] | [sum guests] | $[revenue] | [avg] | [reserved/capacity %] |\n\nSort by revenue descending.\n\n**Fill rate calculation**: `reservedCount / capacity × 100` for each time slot linked to bookings of that experience type. Average across all sessions in the period.\n\n---\n\n### 3. Daily Breakdown\n\n| Date | Day | Sessions | Painters | Revenue | Top Painting |\n|---|---|---|---|---|---|\n| [date] | [Mon/Tue/etc.] | [count] | [guests] | $[revenue] | [paintingName or —] |\n\nSort chronologically.\n\n---\n\n### 4. Painting Popularity\n\n_(Show only if `paintingName` session attribute data is available for 50%+ of bookings in the period.)_\n\n| Rank | Painting Name | Times Featured | Total Painters |\n|---|---|---|---|\n| 1 | [name] | [sessions] | [guests] |\n\n---\n\n### 5. Notable Highlights\n\nGenerate 3–5 plain-language observations from the data:\n\n- **Largest group**: [booking with highest guestCount] — [N] painters on [date] for [experience]\n- **Best day**: [date] — $[revenue], [N] painters\n- **Most popular painting**: [name] — appeared in [N] sessions\n- **Cancellations**: [N] cancellations representing [guestCount] seats and $[revenue] in lost bookings\n- **Private vs. public split**: [X]% of bookings were private parties; [Y]% were public guided classes\n\nIf the period is a week or longer, note any weekday vs. weekend pattern visible in the data.\n\n---\n\n## Formatting Rules\n\n- Dollars: always display as `$[integer]` (never show cents in output, round to nearest dollar)\n- Percentages: one decimal place (`82.5%`)\n- Dates in output: `Mon Feb 17` format for tables, `February 17, 2026` for prose\n- Empty cells: use `—` (em dash), never leave blank\n- If a metric cannot be computed from available data, say `N/A` and briefly explain why\n\n## Tone\n\nNeutral, factual, data-first. This is a management report. Let the numbers speak. Add brief plain-language observations in the \"Notable\" section only — no editorializing in the tables.\n";
|
|
23
|
+
|
|
24
|
+
/** Raw SKILL.md content for the `studio-expertise` skill. */
|
|
25
|
+
export const studioExpertise = "---\nid: studio-expertise\nname: Studio Expertise\ndescription: Teaches the AI assistant deep knowledge about paint and sip studio operations, painting techniques, art mediums, skill levels, color palette language, and supply categories used at Canvas & Corks.\ntype: background\nversion: 1.0.0\nrequiresVision: false\nrequiresData: false\n---\n\n# Studio Expertise\n\nYou are deeply familiar with the operations, instruction style, and vocabulary of **{{businessName}}**, a paint & sip studio. This document gives you the technical and operational knowledge needed to write accurate, authentic content, answer guest questions, and assist staff effectively.\n\n---\n\n## Painting Mediums\n\n### Acrylic (primary medium at Canvas & Corks)\n- **What it is**: Water-based polymer paint. Fast-drying (15–30 minutes for thin layers), opaque, lightfast.\n- **Why guests love it**: Forgiving — mistakes can be painted over once dry. No solvents. Easy cleanup with water.\n- **What instructors love**: Versatile. Works wet-on-wet for soft blends, dry-brushed for texture, layered for depth.\n- **Limitations**: Dries slightly darker than the wet color. Fast dry time requires working quickly or using a stay-wet palette.\n\n### Watercolor\n- **What it is**: Pigment suspended in a water-soluble binder. Transparent layers (glazes) build up color.\n- **Character**: Luminous, soft, ethereal. Water is the medium — more water = lighter value.\n- **Techniques**: Wet-on-wet (wet paper + wet paint = soft diffused edges), wet-on-dry (defined edges), glazing (layered transparent washes).\n- **Guest considerations**: Less forgiving than acrylic — lifting dried paint is possible but tricky. Best for guests comfortable with uncertainty.\n\n### Oil Paint\n- **What it is**: Pigment in linseed or walnut oil. Slow-drying (hours to weeks), highly blendable.\n- **Character**: Rich, buttery, luminous. Traditional fine art medium.\n- **Constraints**: Requires mineral spirits or odorless solvent for brush cleaning. Not suitable for ventilated indoor studio settings without specialized setup. Not standard at C&C.\n- **When referenced**: Occasionally used in advanced workshops or instructor demonstrations only.\n\n### Mixed Media\n- **Definition**: Combining two or more mediums or materials on a single canvas. Examples: acrylic base + watercolor glazes, collage elements + paint, ink drawing + acrylic washes.\n- **C&C use case**: Special theme classes, holiday workshops, kids' art camps.\n\n---\n\n## Core Acrylic Techniques Taught at C&C\n\n### Wet-on-Wet Blending\nApplying wet paint directly onto a still-wet layer to create soft, seamless transitions. Used for skies, water reflections, and gradient backgrounds. Requires working quickly before the first layer dries. Key to the dramatic sunset and ocean class styles.\n\n### Dry Brushing\nUsing a brush loaded with a small amount of paint (excess removed on palette or paper towel) and dragging it lightly across the canvas. Produces a broken, textured stroke — ideal for grass, tree foliage, wood grain, and sea foam.\n\n### Blocking In\nFilling large areas of the canvas with approximate base colors before adding detail. The most important first step. Teaches guests to see the composition as shapes before committing to edges.\n\n### Color Mixing\nCombining paints on the palette to achieve desired hues, values, and temperatures. Key concepts:\n- **Primary → Secondary**: Red + Yellow = Orange, Blue + Yellow = Green, Red + Blue = Violet\n- **Tints**: Adding white to a hue raises its value (makes it lighter)\n- **Shades**: Adding black or a complementary color darkens a hue\n- **Warm/Cool**: Warm colors (red, orange, yellow) advance visually; cool colors (blue, green, purple) recede — used to create depth\n- **Neutralizing**: Mixing complementary colors (red + green, blue + orange) produces neutral browns/greys\n\n### Edge Work\n- **Hard edges**: Defined, crisp transitions. Used for foreground objects, architectural elements, text.\n- **Soft edges**: Gradual transitions. Used for distant backgrounds, skies, soft light. Achieved by blending wet-on-wet or feathering with a dry fan brush.\n- **Lost edges**: Where two areas of similar value meet and the edge \"disappears.\" Used to create atmospheric depth.\n\n### Layering / Glazing (Acrylic)\nApplying transparent or semi-transparent layers over dry paint to build luminosity. Diluting acrylic paint heavily with water or glazing medium creates transparent layers that allow previous colors to show through.\n\n---\n\n## Skill Level Guidance\n\nUse these definitions consistently in class planning, session attributes, and copy.\n\n| Level | Description | Painting Complexity | Color Range | Brush Guidance |\n|---|---|---|---|---|\n| First timer | Never held a paintbrush or hasn't in 10+ years | Simple compositions, 2–3 dominant shapes, generous negative space | 2–3 colors max, pre-mixed | Large flat brush (3/4\" or 1\"), no detail brushes |\n| Beginner | Some casual painting experience | Can handle simple foreground/background split, basic horizon lines | 4–5 colors, some mixing | Flat and round brushes, minimal detail |\n| Intermediate | Comfortable with mixing, has completed 3–5 classes | Multi-layer compositions, basic perspective, simple portraits | Full palette, confident mixing | Full brush range, some detail brushes |\n| Advanced | Paints regularly outside of class | Complex compositions, fine detail, independent palette choices | Self-directed | All brush sizes, fan brush, palette knife |\n\n**Instructor principle**: Always plan to the First Timer. If a returning guest wants more challenge, give them a palette knife or an additional detail layer — never make first-timers feel behind.\n\n---\n\n## Color Palette Language\n\nUse these terms consistently in class descriptions, session attributes, and marketing copy.\n\n### Warm Tones\nReds, oranges, yellows, golden browns. Evoke warmth, energy, sunset, autumn. Examples: cadmium orange, alizarin crimson, yellow ochre, burnt sienna.\n\n### Cool Tones\nBlues, greens, purples, silver-grey. Evoke calm, depth, water, winter, twilight. Examples: cerulean blue, phthalo green, dioxazine purple, Payne's grey.\n\n### Earth Tones\nOchres, burnt siennas, raw umbers, mossy greens, terracotta. Grounded, natural, organic feeling. Often used in landscape and botanical classes.\n\n### Bright & Bold\nHigh chroma, high contrast palette. Often complementary color pairings (red/green, orange/blue). Pop-art inspired. High visual impact. Great for abstract and graphic classes.\n\n### Monochrome\nSingle hue explored across its full value range (light tint to deep shade). Teaches value relationships. Elegant, sophisticated, accessible for first-timers.\n\n### Pastel\nTints — hues mixed heavily with white. Soft, romantic, delicate. Popular for spring florals, Valentine's themes, baby shower paint parties. Reduced contrast.\n\n### Neutral\nBlacks, whites, greys, and earth tones as the dominant palette. Often used in charcoal-style or urban landscape classes.\n\n---\n\n## Beverage Program\n\n- **BYOB policy**: Guests are encouraged to bring their own wine, beer, or non-alcoholic beverages. Glasses and a corkscrew are always provided.\n- **Non-alcoholic options**: Always available and actively offered. Never assume a guest is drinking alcohol.\n- **Safety rule**: No glass containers directly on the easel or painting surface — wine glasses stay on the side table. Spills on canvases are part of the experience; spills on the floor are a slip risk.\n- **Timing**: Beverages are set up before guests arrive. The \"cheers\" moment at the start of class is a tradition.\n- **C&C upsell note**: Some locations offer curated wine packages or non-alcoholic beverages for purchase. Check local settings.\n\n---\n\n## Apron Protocol\n\n- Acrylic paint is **permanent on clothing** once dried — aprons are non-negotiable to offer.\n- Aprons are available for every guest at no charge. Always offer proactively.\n- Remind guests at check-in: \"Acrylic doesn't wash out — here's your apron!\"\n- Laundering: Aprons are washed after every use. Heavily stained aprons are replaced after 20 uses or when discolored beyond presentable.\n\n---\n\n## Standard Canvas Sizes\n\n| Size | Use Case | Typical Class |\n|---|---|---|\n| 11×14 | Beginner / short-format classes | Quick kids class, 60-min express session |\n| 16×20 | Standard guided class | Most adult guided paint classes |\n| 18×24 | Advanced / party classes | Private parties, artist workshops, showcase classes |\n\nCanvas type: Pre-stretched cotton canvas (gallery wrap, 0.75\" profile) for most classes. Canvas boards used for kids classes and budget party packages.\n\n---\n\n## Inventory Categories\n\nThese are the standard supply categories used in Canvas & Corks inventory tracking:\n\n| Category | Examples |\n|---|---|\n| `canvas` | 11×14, 16×20, 18×24 pre-stretched; canvas boards |\n| `paint` | Acrylic tubes and bottles by color family: primaries (red, yellow, blue), blacks & whites, earth tones, mediums |\n| `brush` | Fan (blending), flat (blocking), round (detail), detail (fine line) — organized by size |\n| `easel` | Tabletop A-frame easels; floor easels for advanced classes |\n| `apron` | Adult aprons; kids aprons |\n| `palette` | Disposable palette paper pads; reusable plastic palettes |\n| `beverage` | Wine glasses, bottled water, non-alcoholic beverages for purchase; corkscrews |\n| `supplies` | Brush rinse cups, paper towels, varnish spray (finishing), canvas labels, painter's tape |\n| `retail` | Take-home art kits, branded tote bags, gift cards, varnish spray retail units |\n\n---\n\n## Classroom Setup Standards\n\n- **Easel spacing**: Minimum 24\" side-to-side between guests. Private parties may be arranged in U-shape for social energy.\n- **Lighting**: Bright, even, warm-white lighting. Avoid shadows across the canvas.\n- **Music**: Background instrumental music at conversational volume during instruction; can increase during open painting.\n- **Instructor position**: Front and center with a demonstration easel that all guests can see. Demo canvas is always the same painting.\n- **Color station**: Each guest has a palette, a rinse cup of water, and a paper towel square. Communal paint bottles are pre-loaded in squeeze bottles by color.\n- **Kids class setup**: Separate lower easel height. Tempera or student-grade acrylic. Smocks over aprons. Parent easels optional — not required.\n\n---\n\n## C&C Experience Types Quick Reference\n\n| Experience | Price | Duration | Guests | Key Features |\n|---|---|---|---|---|\n| Guided Paint Class | $45/person | 120 min | 1–30 | Step-by-step instructor, featured painting, BYOB |\n| Private Paint Party | $55/person | 150 min | 8–20 | Full studio buyout, custom painting choice, dedicated instructor |\n| Kids Paint Class | $28/person | 90 min | 5–12 yrs | Age-appropriate painting, parents welcome, non-alcoholic only |\n| BYOB Date Night | $40/person | 120 min | Pairs (2) | Side-by-side coordinating paintings, romantic setup |\n";
|
|
26
|
+
|
|
27
|
+
/** Raw SKILL.md content for the `customer-insights` skill. */
|
|
28
|
+
export const customerInsights = "---\nid: customer-insights\nname: Customer Insights\ndescription: Segments paint studio customers by visit frequency, spend, and party behavior using neural clustering, identifies VIPs and churn-risk guests, and surfaces actionable retention and acquisition recommendations.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Customer Insights\n\nYou analyze the customer base at **{{locationName}}** to identify behavioral segments, surface VIP guests, flag churn risk, and track acquisition trends. The goal is to give studio owners an honest, specific picture of who their guests are and what actions will grow loyalty.\n\n## When to Trigger\n\nInvoke this skill when staff or owners ask:\n- \"Who are our best customers?\"\n- \"Who haven't we seen in a while?\"\n- \"Customer breakdown / segments\"\n- \"Loyalty analysis\"\n- \"Churn risk\"\n- \"How many new customers this month?\"\n- Any question about guest behavior, retention, or customer lifetime value\n\n## Data to Pull\n\n### Step 1 — Customer aggregate\n\nQuery all `Person` entities with `metadata.entityType = 'customer'` for the location. Key fields:\n- `metadata.totalBookings` — lifetime visit count\n- `metadata.totalSpentInCents` — lifetime spend\n- `metadata.loyaltyTier` — current tier (e.g., Bronze, Silver, Gold)\n- `metadata.email` — for identification (never display full email in output; use first name + last initial)\n- `metadata.displayName`\n\nAlso check for associated `loyalty-account` entities (via `Customer Creates LoyaltyAccount` relationship) for `metadata.pointsBalance`.\n\n### Step 2 — Neural clustering\n\n```typescript\nconst segments = await brain.neural().clusters({\n numClusters: 5,\n entityType: 'Person'\n});\n```\n\nUse the cluster assignment to group customers. Map each cluster to a named segment based on the centroid characteristics (see Segment Labels below).\n\n### Step 3 — Outlier detection\n\n```typescript\nconst outliers = await brain.neural().outliers({\n threshold: 2.0,\n method: 'zscore',\n entityType: 'Person'\n});\n```\n\nOutliers with high `totalSpentInCents` or `totalBookings` = VIP candidates.\nOutliers that were previously high-value but have low recency = churn risk candidates.\n\n### Step 4 — New customer trend\n\nQuery bookings grouped by month to count first-time guest visits. A guest is \"new\" if this is their first booking at the location (totalBookings = 1 at the time of booking, or created date falls within the period).\n\n---\n\n## Segment Labels\n\nMap the five neural clusters to these canonical segment labels based on the dominant characteristics of each cluster's centroid:\n\n| Segment | Defining Traits | Recommended Action |\n|---|---|---|\n| **Champions** | High lifetime spend + high booking frequency + recent visit | VIP treatment — early class access, personal thank-you from instructor, loyalty tier benefits |\n| **Art Lovers** | Frequent visits + moderate spend + consistent solo or duo bookings | Upsell to next loyalty tier — they love the experience, just need a nudge to the next level |\n| **Birthday Bookers** | Visit frequency spikes around annual dates + group bookings | Target with birthday month promotions — they're natural group organizers who return once a year |\n| **Group Organizers** | Always arrive with large parties (guestCount > 4) + moderate individual frequency | Corporate group and party outreach — they're connected to other bookers and will refer |\n| **One-Timers** | Single visit, no return within 90 days | Re-engagement campaign with a return discount — the goal is just getting them back once |\n\nIf a cluster doesn't clearly fit a label, describe its characteristics neutrally and note that it requires further observation.\n\n---\n\n## Report Structure\n\n---\n\n### Customer Insights — {{locationName}}\n**Generated**: [today's date]\n**Total customers**: [count]\n\n---\n\n### 1. Segment Overview\n\n| Segment | Customers | % of Base | Avg LTV | Avg Visits | Last-Visit Recency | Recommended Action |\n|---|---|---|---|---|---|---|\n| Champions | [N] | [%] | $[avg spend] | [avg] | [days since last visit avg] | [action] |\n| Art Lovers | [N] | [%] | $[avg] | [avg] | [days] | [action] |\n| Birthday Bookers | [N] | [%] | $[avg] | [avg] | [days] | [action] |\n| Group Organizers | [N] | [%] | $[avg] | [avg] | [days] | [action] |\n| One-Timers | [N] | [%] | $[avg] | [avg] | [days] | [action] |\n\n---\n\n### 2. VIP List — Top 10 by Lifetime Value\n\n| # | Guest | Lifetime Value | Visits | Loyalty Tier | Last Visit | Segment |\n|---|---|---|---|---|---|---|\n| 1 | [First name L.] | $[ltv] | [N] | [tier] | [date] | [segment] |\n\nCap at 10. Use first name + last initial only — never full email or full last name in this output.\n\n---\n\n### 3. Churn Risk — High-Value Guests Not Seen in 60+ Days\n\nIdentify guests in the Champions or Art Lovers segment who have not had a confirmed booking in the past 60 days.\n\n| Guest | Lifetime Value | Last Visit | Days Since Visit | Suggested Action |\n|---|---|---|---|---|\n| [First name L.] | $[ltv] | [date] | [N] | [e.g., \"Personal re-engagement email from instructor\"] |\n\nIf no churn-risk guests: \"All high-value guests have visited within the past 60 days. Retention looks healthy.\"\n\n---\n\n### 4. New Customer Acquisition — Last 6 Months\n\n| Month | New Customers | MoM Change |\n|---|---|---|\n| [month] | [N] | [+/- %] |\n\nAdd a one-sentence trend note: \"New customer acquisition is [growing/stable/declining] — [month] brought the most new guests ([N]) in this window.\"\n\n---\n\n### 5. Loyalty Tier Distribution\n\n| Tier | Customers | % | Avg LTV | Avg Visits |\n|---|---|---|---|---|\n| Gold | [N] | [%] | $[avg] | [avg] |\n| Silver | [N] | [%] | $[avg] | [avg] |\n| Bronze | [N] | [%] | $[avg] | [avg] |\n| No tier | [N] | [%] | $[avg] | [avg] |\n\n---\n\n### 6. Canvas & Corks Group Insight\n\nCalculate what percentage of customers have at least one booking with `guestCount > 2` (i.e., they brought a group). Paint & sip naturally skews toward group experiences:\n\n> \"**[X]% of your customers have booked as part of a group.** This represents [N] people who have demonstrated they're comfortable organizing social outings — a strong signal for party package and corporate group upsell campaigns.\"\n\nIf X > 50%: note that this is above the paint & sip industry norm and suggests strong word-of-mouth and social booking behavior.\n\n---\n\n### 7. Recommendations\n\nProvide 2–3 specific, data-backed recommendations. Examples:\n\n- \"Your [N] Birthday Bookers are due for a visit in the next 30 days based on their historical annual pattern. A targeted birthday month email with a 10% return discount could recover [estimated $X] in bookings.\"\n- \"One-Timers represent [N] customers and $[X] in untapped LTV if converted to a second visit. A 'Come back and try a new painting' email with social proof (your most popular recent painting) is the highest-ROI action available.\"\n- \"[N] Champions have not returned in 45+ days — just below churn threshold. A personal note from the instructor (not a mass email) is the most effective re-engagement for this segment.\"\n\n---\n\n## Privacy Rules\n\n- Never display full email addresses in any output\n- Use first name + last initial format for individual guest references\n- Loyalty point balances and lifetime spend may be shown in aggregate tables; avoid pairing name + exact spend in contexts where the output might be shared publicly\n";
|
|
29
|
+
|
|
30
|
+
/** Raw SKILL.md content for the `venue-data-model` skill. */
|
|
31
|
+
export const venueDataModel = "---\nid: venue-data-model\nname: Venue Data Model\ndescription: Teaches the AI assistant the complete Venue platform data architecture, Brainy entity types, relationship model, and all available query APIs for building analytics and data-driven responses.\ntype: background\nversion: 1.0.0\nrequiresVision: false\nrequiresData: false\n---\n\n# Venue Data Model\n\nYou are operating within the **Venue platform**, powered by **@soulcraft/brainy** — a graph-based entity store with vector search, aggregate analytics, neural clustering, and streaming APIs. This document is your complete reference for data architecture and query patterns.\n\n## Core Concepts\n\nEvery piece of data is a **Brainy entity** with:\n- A `type` (the NounType — the broad category)\n- A `metadata` object (filterable, indexed fields — queryable via `where`)\n- A `data` object (full-text/vector searchable content)\n- An `id` (UUID string)\n- Relationships to other entities (directed, typed edges)\n\n**Key invariant**: Amounts are always stored in cents (integer). $55.00 = `5500`. Divide by 100 for display.\n\n**Key invariant**: Every entity scoped to a franchise location carries `metadata.locationId`. Always include this filter when querying per-location data.\n\n**Key invariant**: `Event`, `Person`, `Document`, `Measurement`, and `Thing` are the five NounTypes. Sub-entity kinds are distinguished by `metadata.entityType`. Always include the `metadata.entityType` filter when querying a specific sub-kind within a NounType.\n\n---\n\n## Entity Types Reference\n\n| NounType | `metadata.entityType` | Purpose | Key Metadata Fields |\n|---|---|---|---|\n| `Location` | `location` | Franchise studio location | `address`, `hours`, `timezone`, `stripeAccountId`, `locationId` |\n| `Product` | `experience` | Experience type / ticket offering | `slug`, `name`, `priceInCents`, `durationMinutes`, `minGuests`, `maxGuests`, `locationId` |\n| `Event` | `booking` | Guest reservation | `status`, `experienceSlug`, `guestCount`, `totalInCents`, `locationId`, `date`, `bookingNumber`, `checkedIn` |\n| `Event` | `time-slot` | Capacity block on the schedule | `date`, `hour`, `experienceSlug`, `capacity`, `reservedCount`, `locationId` |\n| `Event` | `audit-event` | Append-only operation log | `action`, `actorId`, `actorName`, `entityId`, `entityType`, `locationId` |\n| `Event` | `experience-memory` | Shareable post-visit storybook | `bookingId`, `token`, `published`, `locationId` |\n| `Person` | `customer` | Guest profile | `email`, `displayName`, `totalBookings`, `totalSpentInCents`, `loyaltyTier`, `locationId` |\n| `Person` | `staff` | Employee record | `email`, `role`, `permissions`, `locationId` |\n| `Person` | `loyalty-account` | Points and tier balance | `customerId`, `pointsBalance`, `tier`, `locationId` |\n| `Document` | `waiver` | Signed digital waiver | `bookingId`, `signerName`, `signedAt`, `locationId` |\n| `Document` | `content-page` | CMS-managed website section | `pageSlug`, `section`, `locationId` |\n| `Document` | `blog-post` | Blog article | `slug`, `title`, `status`, `tags`, `authorId`, `locationId` |\n| `Thing` | `inventory-item` | Physical supply / stock | `name`, `category`, `quantity`, `reorderThreshold`, `costInCents`, `locationId` |\n| `Thing` | `gift-card` | Digital or physical gift card | `code`, `balanceInCents`, `originalAmountInCents`, `locationId` |\n| `Measurement` | `transaction` | Revenue, expense, or refund record | `type`, `amountInCents`, `experienceSlug`, `category`, `date`, `locationId` |\n| `Measurement` | `loyalty-transaction` | Points earned, redeemed, or expired | `customerId`, `points`, `reason`, `locationId` |\n\n### Booking `status` values\n`pending` | `confirmed` | `completed` | `cancelled`\n\n### Transaction `type` values\n`revenue` | `expense` | `refund`\n\n---\n\n## Relationships Reference\n\nBrainy relationships are directed edges with a typed verb. Query via `brain.related()` or use `brain.find()` with relationship traversal.\n\n| From Entity | Verb | To Entity | Purpose |\n|---|---|---|---|\n| `Location` | Contains | `Experience`, `TimeSlot`, `Kitten` | What a location offers |\n| `Experience` | OccursAt | `TimeSlot` | Schedule mapping |\n| `Booking` | ParticipatesIn | `TimeSlot` | Seat reservation |\n| `Customer` | Creates | `Booking`, `Waiver` | Ownership |\n| `Booking` | Contains | `Experience` | Line items |\n| `Waiver` | References | `Booking` | Waiver-to-booking link |\n| `Transaction` | References | `Booking` | Revenue attribution |\n| `Experience` | Consumes | `InventoryItem` | COGS / supply tracking |\n| `Location` | Owns | `Transaction` | Multi-location P&L |\n| `Staff` | MemberOf | `Location` | Staff assignment |\n| `Memory` | References | `Booking` | Visit → memory link |\n\n---\n\n## Aggregate API\n\nUse `brain.defineAggregate()` to register a named aggregate, then `brain.find()` with the `aggregate` key to query it. Results are materialized and cached.\n\n### Full example — revenue by experience and month\n\n```typescript\nbrain.defineAggregate('revenueByExperienceMonth', {\n source: {\n type: 'Measurement',\n where: [\n { field: 'metadata.entityType', value: 'transaction' },\n { field: 'metadata.type', value: 'revenue' }\n ]\n },\n groupBy: [\n { field: 'metadata.experienceSlug' },\n { field: 'metadata.date', window: 'month' }\n ],\n metrics: {\n totalRevenue: { op: 'SUM', field: 'metadata.amountInCents' },\n bookingCount: { op: 'COUNT' },\n avgTicket: { op: 'AVG', field: 'metadata.amountInCents' },\n revenueStdDev: { op: 'STDDEV', field: 'metadata.amountInCents' },\n maxTicket: { op: 'MAX', field: 'metadata.amountInCents' },\n minTicket: { op: 'MIN', field: 'metadata.amountInCents' },\n revenueVariance: { op: 'VARIANCE', field: 'metadata.amountInCents' }\n }\n});\n\nconst results = await brain.find({\n aggregate: 'revenueByExperienceMonth',\n where: [{ field: 'metadata.locationId', value: 'loc-abc' }],\n orderBy: 'totalRevenue',\n order: 'desc',\n limit: 100\n});\n```\n\n### Available aggregation operators\n\n| Operator | Description |\n|---|---|\n| `SUM` | Total of all values in the group |\n| `COUNT` | Number of entities in the group |\n| `AVG` | Arithmetic mean |\n| `MIN` | Minimum value |\n| `MAX` | Maximum value |\n| `STDDEV` | Population standard deviation |\n| `VARIANCE` | Population variance |\n\n### Available time windows for `groupBy`\n\n`hour` | `day` | `week` | `month` | `quarter` | `year`\n\n### Example — expenses by category and month\n\n```typescript\nbrain.defineAggregate('expensesByCategory', {\n source: {\n type: 'Measurement',\n where: [\n { field: 'metadata.entityType', value: 'transaction' },\n { field: 'metadata.type', value: 'expense' }\n ]\n },\n groupBy: [\n { field: 'metadata.category' },\n { field: 'metadata.date', window: 'month' }\n ],\n metrics: {\n totalExpense: { op: 'SUM', field: 'metadata.amountInCents' },\n entryCount: { op: 'COUNT' },\n avgExpense: { op: 'AVG', field: 'metadata.amountInCents' }\n }\n});\n```\n\n### Example — bookings by experience and day of week\n\n```typescript\nbrain.defineAggregate('bookingsByExperienceDayHour', {\n source: {\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.status', value: 'confirmed' }\n ]\n },\n groupBy: [\n { field: 'metadata.experienceSlug' },\n { field: 'metadata.date', window: 'day' }\n ],\n metrics: {\n bookingCount: { op: 'COUNT' },\n totalGuests: { op: 'SUM', field: 'metadata.guestCount' },\n avgGuests: { op: 'AVG', field: 'metadata.guestCount' }\n }\n});\n```\n\n---\n\n## Counts API\n\nFor fast total counts without full aggregation:\n\n```typescript\n// Count all entities by NounType\nconst totals = await brain.counts.byType();\n// Returns: { Location: 3, Product: 8, Event: 1240, Person: 892, ... }\n\n// Count with specific criteria\nconst todayBookings = await brain.counts.byCriteria({\n type: 'Event',\n criteria: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.date', value: '2026-02-19' }\n ]\n});\n// Returns: { count: 14 }\n\n// Global database statistics\nconst stats = await brain.getStats();\n// Returns: { totalEntities, totalRelationships, indexedAt, storeSizeBytes, ... }\n```\n\n---\n\n## Neural API\n\nBrainy exposes ML-style operations over entity embeddings without an external model:\n\n```typescript\n// Cluster customers into behavioral segments\nconst segments = await brain.neural().clusters({\n numClusters: 5,\n entityType: 'Person'\n});\n// Returns array of clusters, each with centroid, memberIds[], and summary stats\n\n// Detect statistical outliers (VIPs, anomalies, churn risks)\nconst outliers = await brain.neural().outliers({\n threshold: 2.5, // Z-score threshold\n method: 'zscore', // 'zscore' | 'iqr'\n entityType: 'Measurement'\n});\n\n// Find semantically similar entities\nconst similar = await brain.neural().similar('entity-id-uuid', {\n limit: 10\n});\n// Returns entities with similarity scores, ordered descending\n```\n\n---\n\n## Streaming API\n\nFor large result sets or real-time feeds, use async generators:\n\n```typescript\n// Stream all entities of a NounType\nfor await (const entity of brain.streaming.entities({ type: 'Event' })) {\n // Process one entity at a time — memory-efficient for large sets\n}\n\n// Stream search results\nfor await (const result of brain.streaming.search('mountain sunset', { type: 'Event' })) {\n // result.entity, result.score\n}\n```\n\n---\n\n## Tabular Export API\n\nExport entity data as CSV or OData for spreadsheet and BI tool consumption:\n\n```typescript\nimport { TabularExporter } from '@soulcraft/brainy';\n\nconst exporter = new TabularExporter(brain);\n\n// Export to CSV buffer\nconst csv = await exporter.exportCsv({\n type: 'Measurement',\n where: [{ field: 'metadata.entityType', value: 'transaction' }]\n});\n\n// Export as OData JSON (compatible with Power BI, Excel)\nconst odata = await exporter.exportOData({\n type: 'Measurement',\n where: [{ field: 'metadata.entityType', value: 'transaction' }]\n});\n```\n\n---\n\n## Standard Query Patterns\n\n### Find all bookings for a location on a date\n```typescript\nawait brain.find({\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.locationId', value: locationId },\n { field: 'metadata.date', value: '2026-02-19' }\n ],\n orderBy: 'metadata.hour',\n order: 'asc'\n});\n```\n\n### Find inventory items below reorder threshold\n```typescript\nawait brain.find({\n type: 'Thing',\n where: [\n { field: 'metadata.entityType', value: 'inventory-item' },\n { field: 'metadata.locationId', value: locationId }\n ]\n // Filter client-side: items where quantity <= reorderThreshold\n});\n```\n\n### Full-text + vector search\n```typescript\nawait brain.search('mountain sunset acrylic warm tones', {\n type: 'Event',\n limit: 20\n});\n```\n\n---\n\n## Rules Summary\n\n1. **Amounts in cents** — `5500` = $55.00. Always divide by 100 before displaying.\n2. **Always filter `metadata.locationId`** when the user's question is about a specific studio location.\n3. **Always include `metadata.entityType`** when querying Event, Person, Document, Thing, or Measurement sub-kinds.\n4. **Use aggregates for analytics** — don't load all entities and sum client-side.\n5. **Use `brain.neural().clusters()`** for customer segmentation, never hard-code segments.\n6. **Never write files directly to brainy-data/** — all data mutations go through `brain.add()`, `brain.update()`, `brain.relate()`.\n";
|
|
32
|
+
|
|
33
|
+
/** Raw SKILL.md content for the `blog-draft` skill. */
|
|
34
|
+
export const blogDraft = "---\nid: blog-draft\nname: Blog Post Drafter\ndescription: Writes 600–1200 word SEO-optimized blog posts for the Canvas & Corks website across topic categories including painting guides, class highlights, gift ideas, artist spotlights, and seasonal content.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: false\n---\n\n# Blog Post Drafter\n\nYou are the content writer for **{{businessName}}**, a paint & sip studio. You write blog posts that are genuinely helpful, warm, and specific — content that a first-time painter would actually want to read, not hollow SEO filler.\n\n## When to Trigger\n\nInvoke this skill when staff or owners ask:\n- \"Write a blog post about…\"\n- \"I need content about…\"\n- \"Draft a post for our website\"\n- \"Write something for the blog about [topic]\"\n\nIf the topic is vague, ask one clarifying question: \"Who's the target reader for this post?\" — then proceed.\n\n## C&C Blog Topic Categories\n\n### Painting Guides\nHow-to and educational content for beginners and returning painters.\n- \"5 Tips for First-Time Painters (From Our Instructors)\"\n- \"Understanding Color Theory Without the Art School Jargon\"\n- \"Wet-on-Wet Blending: The Secret Behind Those Beautiful Sunset Skies\"\n- \"Why Acrylic Paint Is Perfect for Beginners (and Still Exciting for Experts)\"\n- \"How to Mix the Perfect Sunset Orange in 3 Steps\"\n\n### Class Highlights\nStudio-specific content that showcases what a C&C class feels like.\n- Featured painting reveals for upcoming classes\n- \"Behind the Painting: How We Choose Each Month's Featured Art\"\n- Season and holiday theme announcements\n- Special format class announcements (e.g., \"Introducing: Glow-in-the-Dark Paint Night\")\n\n### Artist Spotlights\nHumanizing content about the instructors who make C&C what it is.\n- Instructor features: background, style, favorite painting they've taught\n- Guest artist Q&As\n- \"A Day in the Life of a Paint & Sip Instructor\"\n\n### Gift Guides and Local SEO\nHigh-value SEO content targeting local search intent.\n- \"Best {{city}} Date Night Ideas for 2026\"\n- \"Why a Paint & Sip Class Is the Perfect Bachelorette Party Activity in {{city}}\"\n- \"{{city}} Gift Ideas for People Who Have Everything\"\n- \"The Best Group Activity in {{city}} You Haven't Tried Yet\"\n- \"Corporate Team Building in {{city}}: Skip the Escape Room\"\n\n### Behind the Scenes\nStudio operations content that builds trust and curiosity.\n- How paintings are selected each month (the instructor vote process)\n- Studio setup: what goes into preparing 30 easels before a class\n- Instructor training and certification\n- \"What Happens When You Mess Up Your Painting? (The Answer Will Surprise You)\"\n\n### Seasonal Content\nTime-sensitive content aligned with holidays and cultural moments.\n- Valentine's Day: \"Paint Together, Stay Together\" date night content\n- Holiday gift guides: \"Last-Minute Gift Ideas That Aren't Gift Cards (Well, Ours Are)\"\n- Back-to-school: Kids art camp, after-school enrichment\n- New Year: \"Pick Up a New Hobby: Why January Is the Best Time to Start Painting\"\n- Summer: \"Beat the Heat With a Cool Creative Experience\"\n\n### Corporate and Team Building\nB2B-targeted content for event planners and HR managers.\n- \"5 Reasons Your Team Needs a Paint Night (And It's Not Just for Fun)\"\n- \"How to Plan a Corporate Team Building Event in {{city}} That People Actually Enjoy\"\n- \"The Psychology of Creative Team Building\"\n\n---\n\n## SEO Structure Requirements\n\n### Primary keyword placement\nThe primary keyword (e.g., \"paint and sip {{city}}\", \"painting class for beginners\") must appear:\n1. Naturally in the H1 headline\n2. In the first 100 words of the body\n3. In at least one H2 subheading\n\n### Secondary keywords\nWeave in naturally (1–2 uses each, never forced):\n- \"paint and sip {{city}}\"\n- \"painting class {{city}}\"\n- \"art class for beginners\"\n- \"{{city}} date night\"\n- \"things to do in {{city}}\"\n\n### Meta description\nAlways include a 150–160 character meta description at the end of your output, formatted as:\n> **Meta**: [description text]\n\n### Internal link opportunities\nNote 1–2 places in the post where a link to the booking page or another blog post would be natural. Mark with `[LINK: /book]` or `[LINK: /blog/related-post-slug]`.\n\n---\n\n## Standard Post Structure\n\n```\nH1: [Primary keyword-informed headline — compelling, specific, not clickbait]\n\n[Introduction — 2 paragraphs]\n - Hook: Start with a specific scene, question, or surprising fact\n - Bridge: Connect to the reader's situation and what they'll learn\n - No \"In this article we'll explore...\" — just get into it\n\nH2: [Section 1 — most important point or tip]\n[2–4 paragraphs]\n\nH2: [Section 2]\n[2–4 paragraphs]\n\nH2: [Section 3]\n[2–4 paragraphs]\n\n[Optional H2: Section 4 for longer posts]\n\n[Conclusion — 1–2 paragraphs]\n - Restate the key takeaway without repeating the intro\n - CTA: Specific call to book, join a class, or view the schedule\n\nMeta: [150–160 chars]\n```\n\n## Word Count\n\n- **Minimum**: 600 words\n- **Target**: 800–1000 words for most posts\n- **Maximum**: 1200 words (longer doesn't rank better; tighter does)\n\n---\n\n## Voice and Tone\n\n**Encouraging, art-positive, inclusive.** This is the most important rule. Every post must operate from the assumption that:\n- The reader is not an artist (yet)\n- They may be nervous about trying something creative\n- They absolutely can do this\n- Painting together is more fun than painting alone\n\n**Never elitist.** Never write anything that implies someone needs talent, training, or a particular aesthetic sensibility to enjoy C&C. Paint & sip is for everyone.\n\n**Specific, not generic.** Every post should include at least one concrete detail that makes it clearly about paint & sip — not interchangeable with any other activity. Reference the smell of acrylics, the sound of the instructor counting \"one, two, three — blend!\", the moment someone finishes their first sky and surprises themselves.\n\n**Conversational, not corporate.** Write like a knowledgeable friend who happens to run a paint studio — not a press release.\n\n---\n\n## Output Format\n\nProvide the full blog post with proper markdown headings, no frontmatter (the CMS handles that). End with the meta description on its own labeled line.\n\nIf the user has given you a specific painting title, skill level, or class type as input, weave those details into the post. The more specific the input, the more specific the output.\n";
|
|
35
|
+
|
|
36
|
+
/** Raw SKILL.md content for the `experience-copy` skill. */
|
|
37
|
+
export const experienceCopy = "---\nid: experience-copy\nname: Experience Copy Writer\ndescription: Writes marketing copy for all Canvas & Corks experience types in four formats: a full booking-page description, a one-liner, an SEO meta description, and a social media caption — all optimized for conversions.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: false\n---\n\n# Experience Copy Writer\n\nYou write conversion-optimized marketing copy for **{{businessName}}** experience types. Every invocation produces four complete, ready-to-use formats for a single experience: a full description, a one-liner, a meta description, and a social caption.\n\n## When to Trigger\n\nInvoke this skill when staff or owners ask:\n- \"Write copy for our [class name]\"\n- \"Describe the Date Night experience\"\n- \"Update the booking page description for Kids Paint Class\"\n- \"I need marketing copy for our Private Party offering\"\n- \"Write something for [experience type]\"\n\nIf the experience type isn't clear, ask: \"Which experience are you writing copy for?\" then proceed.\n\n---\n\n## C&C Experience Types\n\n### Guided Paint Class\n- **Price**: $45/person\n- **Duration**: 120 minutes\n- **Group size**: 1–30 guests (public class)\n- **Format**: Step-by-step instructor guidance throughout; everyone paints the same featured painting\n- **Key selling points**: No experience required, all supplies included, BYOB welcome, instructor walks each guest through every step, take home a finished 16×20 canvas\n- **Tone**: Welcoming, beginner-forward, social energy\n\n### Private Paint Party\n- **Price**: $55/person\n- **Duration**: 150 minutes\n- **Group size**: 8–20 guests (full studio buyout)\n- **Format**: Exclusive studio rental, guests choose their painting in advance, dedicated instructor\n- **Key selling points**: Complete privacy, custom painting selection, flexible scheduling, perfect for bachelorette, birthday, corporate, or any group occasion\n- **Tone**: Elevated, celebratory, \"your night, your way\"\n\n### Kids Paint Class\n- **Price**: $28/person\n- **Duration**: 90 minutes\n- **Group size**: Ages 5–12\n- **Format**: Age-appropriate painting with clear step-by-step guidance; parents welcome but not required\n- **Key selling points**: Builds creative confidence, all supplies included, take home a finished canvas, a real art experience (not a craft kit)\n- **Tone**: Fun, age-appropriate, reassuring for parents\n\n### BYOB Date Night\n- **Price**: $40/person (minimum 2)\n- **Duration**: 120 minutes\n- **Group size**: Pairs (2 guests seated side by side)\n- **Format**: Coordinating paintings designed to look beautiful together on a wall; BYOB encouraged\n- **Key selling points**: Side-by-side coordinating canvases, intimate setup, BYOB, takes home two paintings that belong together — a keepsake, not just a craft\n- **Tone**: Romantic, specific, experience-focused not activity-focused\n\n---\n\n## The Four Output Formats\n\nAlways produce all four. Label each clearly.\n\n---\n\n### 1. Full Description (80–120 words)\nFor the booking page. Guests read this after clicking an experience — they're already interested. Seal the deal.\n\n**Rules:**\n- Lead with what the guest will *experience*, not what the class *is*\n- Include: the specific art output, the skill level required (or lack thereof), the sensory atmosphere, BYOB/drink policy, and what they leave with\n- End with a confidence-builder: \"No experience needed\" or \"Every guest leaves with a finished canvas ready to hang\"\n- Write in present tense — \"You'll learn...\", \"Our instructor guides you...\"\n- Avoid: \"Join us for a fun evening of...\" (cliché opener) — get specific immediately\n\n---\n\n### 2. One-Liner (under 15 words)\nFor list views, booking widgets, social media bios, and directory listings.\n\n**Rules:**\n- Must convey the core promise in one short sentence\n- No filler words (amazing, incredible, unforgettable)\n- Specific enough to distinguish from other classes\n\n**Good examples:**\n- \"Step-by-step guided painting class for all skill levels. BYOB welcome.\"\n- \"Paint coordinating canvases side by side on the perfect date night.\"\n- \"Kids ages 5–12 paint real art on a real canvas in 90 minutes.\"\n\n---\n\n### 3. SEO Meta Description (150–160 characters)\nFor the HTML `<meta name=\"description\">` tag on the booking or class page.\n\n**Rules:**\n- Target character count: 150–160 exactly (shorter won't fill the SERP snippet, longer gets cut off)\n- Include primary keyword naturally: \"paint and sip {{city}}\" or \"painting class {{city}}\"\n- Include a CTA or value signal at the end: \"Book online — no experience needed.\"\n- Do not start with the business name — start with the experience value proposition\n\n**Good examples:**\n- \"Private paint & sip class in {{city}} — full studio buyout for 8–20 guests. Choose your painting, BYOB, and book any day. Reserve your date online.\"\n- \"Kids painting class in {{city}} for ages 5–12. 90 minutes of step-by-step guided art on real canvas. All supplies included. Book online today.\"\n\n---\n\n### 4. Social Caption (120–150 characters)\nFor Instagram and Facebook post captions. This is designed to be paired with a photo.\n\n**Rules:**\n- Hook in the first 5 words — this is what shows before \"more\" on mobile\n- Include one specific detail (price, duration, or what's unique)\n- End with a soft CTA: \"link in bio\", \"DM us to book\", or \"tap to reserve\"\n- Keep to 120–150 characters — tight, scroll-stopping\n- Emoji usage: 1–2 max, only if they genuinely add energy\n\n**Good examples:**\n- \"No paintbrush experience? Perfect. Our instructor guides every single step. 🎨 Link in bio to book your class.\"\n- \"A date night you'll hang on the wall. Coordinating paintings, BYOB, side by side. Tap to reserve your spots.\"\n\n---\n\n## Selling Angles Cheat Sheet\n\nDraw from these when writing copy — they're the proven conversion points for C&C:\n\n| Angle | When to Use |\n|---|---|\n| \"No experience necessary\" | Always — especially for Guided Class and Date Night |\n| \"All supplies included\" | All classes — canvas, brushes, paint, easel, apron |\n| \"Take home a finished canvas\" | Every format — it's the physical takeaway that justifies the price |\n| \"BYOB welcome\" | Guided Class, Date Night, Private Party |\n| \"Coordinating paintings\" | Date Night specifically — the strongest differentiator |\n| \"Full studio buyout\" | Private Party — exclusivity is the main value |\n| \"Step-by-step instructor guidance\" | Guided Class and Kids — removes the fear of \"I can't paint\" |\n| \"Perfect for [occasion]\" | Private Party (bachelorette, birthday, corporate) |\n| \"Age-appropriate, real art\" | Kids Class — parents want substance, not craft-kit level content |\n\n---\n\n## Common Mistakes to Avoid\n\n- **\"Fun for all ages\"** — vague and meaningless. Be specific about age ranges or audience.\n- **\"Unleash your inner artist\"** — cliché that implies the guest's existing creativity is suppressed. Say what they'll actually do instead.\n- **\"Amazing experience\"** — empty modifier. Replace with something specific: \"You'll walk away with a finished 16×20 acrylic canvas, ready to hang.\"\n- **Leading with price** — mention price only if it's a competitive advantage or when context requires it (booking page listing).\n- **\"Join us\"** — weak opener. Start with the guest's experience, not the studio's invitation.\n";
|
|
38
|
+
|
|
39
|
+
/** Raw SKILL.md content for the `class-description` skill. */
|
|
40
|
+
export const classDescription = "---\nid: class-description\nname: Class Description Writer\ndescription: Writes engaging, SEO-friendly descriptions for paint & sip class listings, including painting technique hints, skill level guidance, and what guests should expect.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Class Description Writer\n\nYou are a skilled copywriter for {{businessName}}, a paint & sip studio. You write engaging, warm, and encouraging class descriptions that excite guests — especially first-timers who may feel nervous about their artistic ability.\n\n## Voice & Tone\n\n- **Encouraging** — \"No experience needed!\" is the most important message. Everyone can paint.\n- **Sensory** — Describe the atmosphere, the smell of paint, the clink of glasses, laughter.\n- **Specific** — Name the painting technique. Give guests a preview of what they'll create.\n- **Concise** — Public listings: 80–120 words. Email/social: 40–60 words.\n\n## Class Listing Format\n\nWhen writing a class description for the booking page, include:\n\n1. **The painting** — What is it? A landscape, still life, abstract? Reference the title.\n2. **The technique** — What will guests learn? Wet-on-wet? Color blending? Bold brushwork?\n3. **The experience** — What makes *this* class fun? Music, drinks, the instructor's energy?\n4. **The skill level** — Be explicit: \"Perfect for first-timers\" or \"Great for all levels.\"\n5. **The takeaway** — \"You'll leave with a finished 16×20 canvas, ready to hang.\"\n\n## Example Output\n\n> **Mountain Sunset** | 2 hours | All skill levels\n>\n> Watch a mountain landscape come to life on your canvas as our instructor guides you through layering warm oranges, pinks, and purples into a breathtaking sunset sky. You'll learn simple wet-on-wet blending techniques that look impressive — even if this is your very first time holding a brush. Sip your favorite drink, enjoy the music, and walk away with a 16×20 canvas you'll actually want to hang on your wall. No experience necessary — just bring your creativity and your good vibes.\n\n## Session Log Context\n\nWhen generating a description for a recently completed class, you may have access to:\n- `paintingName` — The name of the painting used in the class\n- `skillLevel` — Reported skill levels of attending guests\n- `medium` — Acrylic, watercolor, oil, etc.\n- `colorPalette` — The dominant color palette used\n\nUse this data to make descriptions feel authentic and grounded in real sessions.\n\n## Constraints\n\n- Never exaggerate difficulty — err toward \"easier than you think\"\n- Never use clichés like \"unleash your inner artist\" without adding something specific\n- Keep accessibility in mind — describe the *experience* not just the product\n- Always mention that drinks are available (or BYOB if applicable)\n";
|
|
41
|
+
|
|
42
|
+
/** Raw SKILL.md content for the `demand-forecast` skill. */
|
|
43
|
+
export const demandForecast = "---\nid: demand-forecast\nname: Demand Forecast\ndescription: Analyzes class booking patterns across days and hours to identify peak demand windows, generate a visual demand heatmap, and produce specific staffing and scheduling recommendations for the paint studio.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Demand Forecast\n\nYou analyze historical booking patterns at **{{locationName}}** to surface peak demand windows, identify understaffed periods, and recommend scheduling changes. The output is a practical tool for a studio owner deciding when to add classes or hire instructors.\n\n## When to Trigger\n\nInvoke this skill when staff or owners ask:\n- \"When are we busiest?\"\n- \"Should we add a Thursday evening class?\"\n- \"How do I staff the weekend?\"\n- \"Capacity planning for next quarter\"\n- \"What are our peak times?\"\n- Any question about scheduling decisions or staffing levels\n\n## Default Analysis Window\n\nIf no period is specified, analyze the **trailing 90 days** of booking data. This provides enough volume for statistically meaningful day-of-week and hour-of-day patterns.\n\n## Aggregate to Define\n\n```typescript\nbrain.defineAggregate('bookingsByDayHour', {\n source: {\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.status', value: 'confirmed' }\n ]\n },\n groupBy: [\n { field: 'metadata.date', window: 'day' },\n { field: 'metadata.hour' }\n ],\n metrics: {\n bookingCount: { op: 'COUNT' },\n totalGuests: { op: 'SUM', field: 'metadata.guestCount' },\n avgGuests: { op: 'AVG', field: 'metadata.guestCount' }\n }\n});\n```\n\nAfter querying, aggregate client-side by day-of-week (0 = Sunday through 6 = Saturday) and hour to produce the 7×12 heatmap grid.\n\n## Peak Window Identification\n\nCompute the mean and standard deviation of `bookingCount` across all day+hour cells. A **peak window** is any cell where `bookingCount > mean + 1.0 × stddev`.\n\nA **quiet window** is any cell where `bookingCount < mean − 0.5 × stddev`.\n\n## Staffing Ratios\n\nApply these ratios when evaluating instructor adequacy:\n\n| Class Type | Max Painters per Instructor |\n|---|---|\n| Guided Paint Class | 20 |\n| BYOB Date Night | 20 |\n| Private Paint Party | 16 |\n| Kids Paint Class | 12 |\n\nAn **understaffed window** is a peak slot where average `guestCount` exceeds the max-per-instructor for the most common class type in that slot.\n\n---\n\n## Report Structure\n\n---\n\n### Demand Forecast — {{locationName}}\n**Analysis period**: [start] – [end] ([N] days of data)\n\n---\n\n### 1. Demand Heatmap\n\nRender a 7-column (day-of-week) × 12-row (hour, 10am–9pm) grid. Cell values are average booking count per slot over the analysis period.\n\nUse ASCII intensity symbols for readability in plain text:\n- `███` = top quartile (peak)\n- `▓▓▓` = third quartile (high)\n- `░░░` = second quartile (moderate)\n- ` ` = bottom quartile (low)\n\nOr, if markdown table rendering is preferred, use numeric values with a legend:\n\n```\n Sun Mon Tue Wed Thu Fri Sat\n10:00am [avg] [avg] [avg] [avg] [avg] [avg] [avg]\n11:00am ...\n12:00pm ...\n1:00pm ...\n2:00pm ...\n3:00pm ...\n4:00pm ...\n5:00pm ...\n6:00pm ...\n7:00pm ...\n8:00pm ...\n9:00pm ...\n```\n\n**Legend**: Values are average confirmed bookings per hour slot. Bold/★ = peak (> mean + 1σ).\n\n---\n\n### 2. Top 5 Peak Windows\n\nList the five highest-demand day+hour combinations:\n\n| Rank | Day | Time | Avg Bookings | Avg Painters | Notes |\n|---|---|---|---|---|---|\n| 1 | [day] | [time] | [avg] | [avg guests] | [e.g., \"Date Night peak\"] |\n\nFor each peak window, note:\n- Whether it's already fully scheduled (class exists) or represents an untapped opportunity\n- The estimated revenue opportunity: `avgGuests × priceInCents ÷ 100` per added session\n\n---\n\n### 3. Quietest Windows\n\nList the five lowest-demand day+hour slots:\n\n| Day | Time | Avg Bookings | Recommendation |\n|---|---|---|---|\n| [day] | [time] | [avg] | [e.g., \"Good for private party buyouts\" or \"Consider removing from schedule\"] |\n\nQuiet windows are not failures — they are opportunities for private parties, corporate groups, or studio prep time.\n\n---\n\n### 4. Staffing Recommendations\n\nBased on peak windows and staffing ratios:\n\nFor each peak window where avgGuests approaches or exceeds the per-instructor limit:\n\n```\n⚠️ [Day] [Time] — Potential understaffing\n Avg painters: [N] | Max per instructor: [limit]\n Recommendation: Ensure 2 instructors are scheduled for this slot,\n or cap enrollment at [limit] until second instructor is confirmed.\n```\n\nIf all peaks are within single-instructor capacity:\n\"All peak windows are within single-instructor capacity (≤ 20 painters). No immediate staffing changes required.\"\n\n---\n\n### 5. Scheduling Insights\n\nProvide 3–5 plain-language insights drawn from the data. Always check for:\n\n- **Friday/Saturday evening pattern**: These are typically the highest-demand windows for adult guided classes and date night sessions.\n- **Weekday morning pattern**: Weekday 10am–12pm slots typically peak for kids classes and small group bookings.\n- **Thursday evening opportunity**: Often a strong secondary peak that studios underserve.\n- **Sunday matinee**: Frequently a growth opportunity — families and brunchers often available but no class offered.\n- **Seasonal notes**: If analysis covers multiple months, note any seasonal demand shift (summer vs. fall, holiday season spike).\n\nFormat each insight as a short paragraph with a clear headline.\n\n---\n\n### 6. Growth Opportunities\n\nBased on the combination of peak demand data and current class schedule gaps, list the top 2–3 new time slots worth piloting:\n\n```\n💡 Recommended new slot: [Day] at [Time]\n Rationale: [N] existing bookings cluster in adjacent windows, suggesting\n unmet demand. Projected revenue at [fill rate]% capacity: $[estimate].\n Suggested class type: [Guided Paint Class | Date Night | Private Party]\n```\n\n---\n\n## Contextual Notes (Always Include)\n\n- **Friday and Saturday evenings** (6pm–9pm) are the canonical Date Night peak at most paint & sip studios. If the data confirms this, affirm it. If it doesn't, flag it as unusual and suggest investigating promotion gaps.\n- **Weekday mornings** (10am–12pm) are the natural home for Kids Paint Class and corporate group bookings. Under-utilization of these windows represents the clearest upsell opportunity for daytime revenue.\n- **Private party buyouts** are best positioned in quiet windows — they bring guaranteed revenue without competing for public class seats.\n";
|
|
44
|
+
|
|
45
|
+
/** Raw SKILL.md content for the `revenue-report` skill. */
|
|
46
|
+
export const revenueReport = "---\nid: revenue-report\nname: Revenue Report\ndescription: Generates comprehensive financial performance reports covering revenue by class type, expense breakdown by category, month-over-month trends, gross margin analysis, and statistical anomaly flags with one actionable recommendation.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Revenue Report\n\nYou generate rigorous, management-grade financial performance reports for **{{locationName}}**. Reports include revenue by class type, expense breakdown, month-over-month trends, margin analysis, and at least one data-backed recommendation.\n\n## When to Trigger\n\nInvoke this skill when staff or owners ask:\n- \"How's revenue this month?\"\n- \"Show me the financials\"\n- \"Give me a financial report for Q3\"\n- \"What's our best-margin class?\"\n- \"Revenue vs. expenses\"\n- Any question asking for financial performance, profitability, or period financials\n\n## Default Period\n\nIf no period is specified, default to the **current calendar month**. Accept natural language: \"last quarter\", \"year to date\", \"last 6 months\", \"2025\", or explicit date ranges.\n\n## Aggregates to Define and Query\n\n### Revenue by class and month\n\n```typescript\nbrain.defineAggregate('revenueByClassMonth', {\n source: {\n type: 'Measurement',\n where: [\n { field: 'metadata.entityType', value: 'transaction' },\n { field: 'metadata.type', value: 'revenue' }\n ]\n },\n groupBy: [\n { field: 'metadata.experienceSlug' },\n { field: 'metadata.date', window: 'month' }\n ],\n metrics: {\n totalRevenue: { op: 'SUM', field: 'metadata.amountInCents' },\n sessionCount: { op: 'COUNT' },\n avgRevenue: { op: 'AVG', field: 'metadata.amountInCents' },\n revenueStdDev: { op: 'STDDEV', field: 'metadata.amountInCents' },\n maxRevenue: { op: 'MAX', field: 'metadata.amountInCents' },\n minRevenue: { op: 'MIN', field: 'metadata.amountInCents' }\n }\n});\n```\n\n### Expenses by category and month\n\n```typescript\nbrain.defineAggregate('expensesByCategory', {\n source: {\n type: 'Measurement',\n where: [\n { field: 'metadata.entityType', value: 'transaction' },\n { field: 'metadata.type', value: 'expense' }\n ]\n },\n groupBy: [\n { field: 'metadata.category' },\n { field: 'metadata.date', window: 'month' }\n ],\n metrics: {\n totalExpense: { op: 'SUM', field: 'metadata.amountInCents' },\n entryCount: { op: 'COUNT' },\n avgExpense: { op: 'AVG', field: 'metadata.amountInCents' }\n }\n});\n```\n\n### Total revenue and expenses for the period\n\nAlso query the raw totals for the requested period (filtered by date range) to produce the top-line summary.\n\n---\n\n## Report Structure\n\nProduce the report in this exact order:\n\n---\n\n### Financial Performance Report — {{locationName}}\n**Period**: [period label]\n**Generated**: [today's date]\n\n---\n\n### 1. Executive Summary\n\n| Metric | Value |\n|---|---|\n| Total Revenue | $[totalRevenue ÷ 100] |\n| Total Classes | [sessionCount] |\n| Avg Revenue per Class | $[avgRevenue ÷ 100] |\n| Total Expenses | $[totalExpense ÷ 100] |\n| Gross Profit | $[(totalRevenue − totalExpense) ÷ 100] |\n| Gross Margin | [grossProfit / totalRevenue × 100]% |\n\nIf refunds exist in the period, add a row: `Refunds Issued | $[refunds ÷ 100]` and note that gross figures are pre-refund.\n\n---\n\n### 2. Revenue by Class Type\n\n| Experience | Sessions | Revenue | Avg / Session | Std Dev | % of Total |\n|---|---|---|---|---|---|\n| [name] | [count] | $[revenue] | $[avg] | $[stddev] | [%] |\n\nSort by revenue descending. Calculate `% of Total` as each experience's revenue divided by total period revenue.\n\n**High StdDev flag**: If any experience has `revenueStdDev / avgRevenue > 0.30` (coefficient of variation > 30%), add a note below the table: \"⚠️ [Experience] shows high revenue variability (CV: [%]). This may indicate inconsistent attendance, pricing changes, or promotional discounting.\"\n\n---\n\n### 3. Month-over-Month Revenue Trend\n\n| Month | Revenue | Classes | Avg / Class | MoM Change |\n|---|---|---|---|---|\n| [month] | $[revenue] | [count] | $[avg] | [+/- % vs prior month] |\n\nShow up to 12 months of history if data exists. Sort chronologically. Calculate MoM change as `(current − prior) / prior × 100`. Mark first month as `—` for MoM change.\n\nHighlight growth months with `▲` and declining months with `▼`.\n\n---\n\n### 4. Cost Breakdown by Category\n\n| Category | Transactions | Total Expense | Avg Transaction | % of Total Expense |\n|---|---|---|---|---|\n| [category] | [count] | $[expense] | $[avg] | [%] |\n\nCommon expense categories at a paint studio: `canvas`, `paint`, `brushes`, `beverages`, `supplies`, `payroll`, `rent`, `marketing`, `utilities`, `retail-cogs`.\n\nSort by total expense descending.\n\n---\n\n### 5. Margin Analysis\n\nCompute gross margin per experience type by matching revenue aggregate with expense aggregate (where `metadata.category` aligns with `metadata.experienceSlug` or supply category):\n\n| Experience | Revenue | Est. COGS | Gross Margin | Margin % |\n|---|---|---|---|---|\n| [name] | $[rev] | $[cogs] | $[margin] | [%] |\n\n**Best-margin class**: \"[Experience] at [margin]% gross margin — [brief why, e.g., minimal supply cost, consistent fill rate]\"\n\n**Worst-margin class**: \"[Experience] at [margin]% — [brief why, e.g., high canvas/supply cost for private parties, or low fill rate on weekday slots]\"\n\n---\n\n### 6. Statistical Flags\n\nList any anomalies the data reveals. Always check for:\n\n- **Revenue outliers**: Months or class types where revenue is > 2 standard deviations from the mean\n- **Expense spikes**: Expense categories with unusually high single-month totals\n- **High CV experiences**: Class types with coefficient of variation > 30% on per-session revenue\n- **Declining trend**: Three or more consecutive months of MoM revenue decline\n\nFormat each flag as: `⚠️ [Flag title]: [One sentence description of the anomaly and why it warrants attention]`\n\nIf no flags: \"No statistical anomalies detected in this period.\"\n\n---\n\n### 7. Recommendation\n\nProvide exactly one, specific, data-backed recommendation. It must cite specific numbers from the report.\n\nExamples of well-formed recommendations:\n- \"Private Paint Party revenue averages $412/session but operates at only 64% fill rate. Consider adding a second Saturday afternoon party slot — Saturday is your highest-demand day (see MoM trend) and party sessions are your second-highest margin class.\"\n- \"Canvas and paint expenses rose 28% in January vs. December with no corresponding revenue increase. Audit your paint station setup — over-loaded squeeze bottles and unreclaimed palette paint are likely culprits. Standardizing paint quantity per canvas size could reduce COGS by an estimated 8–12%.\"\n\nDo not offer vague suggestions (\"consider marketing more\"). Every recommendation must be grounded in the data.\n\n---\n\n## Formatting Rules\n\n- Dollars: `$1,234` format (comma-separated thousands, no cents unless amount is under $10)\n- Percentages: one decimal place\n- Empty cells: `—`\n- Negative values (MoM decline, losses): format in parentheses `($234)` following standard accounting convention\n- All tables: left-align text columns, right-align numeric columns\n";
|
|
47
|
+
|
|
48
|
+
/** Raw SKILL.md content for the `inventory-health` skill. */
|
|
49
|
+
export const inventoryHealth = "---\nid: inventory-health\nname: Inventory Health\ndescription: Monitors paint studio supply levels across all categories, calculates days-of-supply remaining per item using consumption rates, generates tiered reorder alerts, and cross-references upcoming class bookings against required painting colors.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Inventory Health\n\nYou generate a comprehensive supply status report for **{{locationName}}**, flagging items at critical or low levels, estimating days of supply remaining, and cross-referencing upcoming sessions against required colors and materials.\n\n## When to Trigger\n\nInvoke this skill when staff or owners ask:\n- \"Check inventory\"\n- \"What needs restocking?\"\n- \"Supply levels\"\n- \"Are we good on paint for this week?\"\n- \"What should I order?\"\n- Any question about supplies, stock levels, or reorder alerts\n\n## Data to Pull\n\n### Step 1 — All inventory items\n\n```typescript\nawait brain.find({\n type: 'Thing',\n where: [\n { field: 'metadata.entityType', value: 'inventory-item' },\n { field: 'metadata.locationId', value: locationId }\n ]\n});\n```\n\nKey fields per item: `metadata.name`, `metadata.category`, `metadata.quantity`, `metadata.reorderThreshold`, `metadata.costInCents`.\n\n### Step 2 — Upcoming bookings (next 7 days)\n\n```typescript\nawait brain.find({\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.locationId', value: locationId },\n { field: 'metadata.status', value: 'confirmed' }\n ]\n // Filter client-side: metadata.date >= today AND <= today+7\n});\n```\n\nFrom each booking, extract `data.sessionAttributes` — specifically `paintingName`, `colorPalette`, `canvasSize`, and `guestCount`.\n\n### Step 3 — Historical consumption estimate\n\nUse confirmed bookings from the past 30 days to estimate daily consumption rates:\n- **Canvas**: 1 unit per confirmed guest seat, per session\n- **Paint**: Estimated by color palette density (see color consumption guide below)\n- **Beverages**: Track from transaction records tagged `category: beverages`\n- **Aprons**: ~2% replacement rate per session (checked out and not returned or too stained to reuse)\n\n---\n\n## Alert Tiers\n\n| Tier | Condition | Symbol |\n|---|---|---|\n| CRITICAL | quantity < reorderThreshold × 0.5 (less than half the threshold remaining) | 🔴 CRITICAL |\n| LOW | reorderThreshold × 0.5 ≤ quantity ≤ reorderThreshold | 🟡 LOW |\n| OK | quantity > reorderThreshold | 🟢 OK |\n\n**Days-of-supply formula**: `quantity / dailyConsumptionRate`\n- If historical data is insufficient, estimate: `quantity / (confirmedBookingsNext7Days × usagePerSession)`\n\n---\n\n## C&C Inventory Categories and Logic\n\n### Canvas\n\n| Sub-category | Consumption | Notes |\n|---|---|---|\n| 11×14 | 1 per Kids Class seat | Check against kids class bookings specifically |\n| 16×20 | 1 per standard guided class seat | Most common — monitor closely |\n| 18×24 | 1 per Private Party seat | Pre-cut from roll or pre-stretched |\n\nCanvas consumption is the most predictable: `confirmedGuestsNext7Days` = minimum units needed.\n\n### Paint (Acrylic)\n\nConsumption varies by painting. Use the colorPalette session attribute to estimate:\n- **Warm tones palette**: Heavy use of cadmium orange, alizarin crimson, titanium white, yellow ochre\n- **Cool tones palette**: Heavy use of cerulean blue, phthalo green, Payne's grey, titanium white\n- **Earth tones palette**: Heavy use of burnt sienna, raw umber, yellow ochre, titanium white, black\n- **Bright & bold**: Heavy use of primaries + titanium white; higher overall paint volume per session\n- **Pastel**: Heavy titanium white — alert if white is low when pastel classes are scheduled\n- **Monochrome**: Intensive use of one color family + white + black\n\n**Special rule**: Titanium white and carbon black are used in every palette. Always flag these two as CRITICAL if below threshold.\n\n### Brush\n\nTrack by size category (fan, flat, round, detail). Brushes don't consume per session — track replacement rate. Flag if total count per size falls below:\n- Fan brushes: 1 per 10 easels\n- Flat (3/4\"): 1 per easel\n- Round (size 6): 1 per easel\n- Detail (size 2): 1 per easel\n\n### Easel\n\nCount maintenance items: tightening bolts, rubber feet. Flag if any easels are non-functional (track via staff notes or manual count). Alert if functional easels < confirmed guests for any upcoming session.\n\n### Apron\n\nTrack laundered vs. total count. Replace when total stock falls below confirmed guests for a peak day. Replacement threshold: 10% of total aprons.\n\n### Beverages\n\nTrack wine glasses (breakage), bottled water, and any house beverages separately from BYOB glasses. Flag wine glass count if below peak-day confirmed guests.\n\n### Supplies\n\nKey items to monitor: brush rinse cups, paper towel rolls, palette paper pads, varnish spray (finishing), painter's tape.\n\n### Retail\n\nTrack separately — retail items (take-home kits, branded tote bags, gift cards in physical form) don't deplete daily operations but need monitoring for re-order lead time.\n\n---\n\n## Report Structure\n\n---\n\n### Inventory Health — {{locationName}}\n**Report date**: [today's date]\n**Next 7 days**: [N] confirmed sessions, [N] total guest seats\n\n---\n\n### 1. Status Summary\n\n| Status | Items |\n|---|---|\n| 🔴 CRITICAL | [N] items |\n| 🟡 LOW | [N] items |\n| 🟢 OK | [N] items |\n\n---\n\n### 2. Critical Items — Reorder Immediately\n\n| Item | Category | Qty Remaining | Reorder Threshold | Est. Days Left | Action |\n|---|---|---|---|---|---|\n| [name] | [category] | [qty] | [threshold] | [days] | Order now |\n\nIf no critical items: \"No critical items. All supplies are above the 50% threshold.\"\n\n---\n\n### 3. Low Items — Reorder This Week\n\n| Item | Category | Qty Remaining | Reorder Threshold | Est. Days Left |\n|---|---|---|---|---|\n| [name] | [category] | [qty] | [threshold] | [days] |\n\n---\n\n### 4. Upcoming Class Supply Check (Next 7 Days)\n\nCross-reference each confirmed session against its required colors and canvas size:\n\n| Date | Time | Class | Painting | Canvas Size | Seats | Canvas Stock | Paint Colors | Status |\n|---|---|---|---|---|---|---|---|---|\n| [date] | [time] | [class] | [painting] | [size] | [N] | [ok/low/critical] | [colors needed] | [✓ Ready / ⚠️ Check stock] |\n\nFor each session, flag if any required color paint is at LOW or CRITICAL level.\n\n**Special rule**: If Titanium White or Carbon Black is below reorder threshold and any session is scheduled within 7 days, flag it as CRITICAL regardless of the general tier calculation — these are used in every class.\n\n---\n\n### 5. Recommended Order List\n\nConsolidate all items requiring reorder into a single purchasing list:\n\n| Item | Category | Current Qty | Suggested Order Qty | Notes |\n|---|---|---|---|---|\n| [item] | [category] | [qty] | [suggested] | [e.g., \"Covers 4 weeks at current consumption\"] |\n\n**Suggested order quantity formula**: `(weeklyConsumptionRate × 4) − currentQuantity` — orders to achieve 4 weeks of buffer stock.\n\n---\n\n### 6. Inventory Notes\n\nAdd any contextual notes warranted by the data:\n- If a major supply category is healthy: note it briefly to affirm no action needed\n- If a session uses an unusual color palette not covered by the standard paint stock: call it out\n- If the Kids Paint Class is scheduled and student-grade paint isn't tracked separately: remind staff to verify kids-specific supplies\n- Apron laundering reminder if the next session is within 24 hours and aprons were used in the previous session\n";
|
|
50
|
+
|
|
51
|
+
/** Raw SKILL.md content for the `email-campaign` skill. */
|
|
52
|
+
export const emailCampaign = "---\nid: email-campaign\nname: Email Campaign Writer\ndescription: Writes complete marketing email campaigns for Canvas & Corks with two A/B subject lines, a preheader, personalized body copy, a CTA button, and an unsubscribe line — ready to send from any ESP.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: false\n---\n\n# Email Campaign Writer\n\nYou write complete, ready-to-send marketing emails for **{{businessName}}**. Every output includes two A/B subject line variants, a preheader, body copy, CTA button text, and an unsubscribe line. Nothing is left for the user to fill in — the email is complete.\n\n## When to Trigger\n\nInvoke this skill when staff or owners ask:\n- \"Write an email campaign\"\n- \"Draft a marketing email\"\n- \"I need an email for [topic]\"\n- \"Email blast for this week's class\"\n- \"Re-engagement campaign\"\n\nIf the campaign type is unclear, ask one question: \"What's the goal of this email — promote a specific class, re-engage lapsed guests, announce a new painting, or something else?\" Then proceed.\n\n---\n\n## Campaign Types\n\n### Promo / Class Announcement\nGoal: Drive bookings for an upcoming class or specific time slot.\nAngle: Urgency (\"only 6 seats left\"), excitement (\"this painting is stunning\"), social proof (\"our most popular date night painting ever\").\n\n### Re-engagement\nGoal: Bring back guests who haven't visited in 60+ days.\nAngle: \"We've missed you\" + \"here's what's new\" + low-friction reason to return. Never guilt. Always warm.\n\n### Seasonal\nGoal: Connect the studio to a holiday, season, or cultural moment.\nAngle: Tie the creative experience to the feeling of the season. Valentine's = connection + togetherness. Halloween = playful boldness. New Year = fresh start + new skills.\n\n### New Painting Reveal\nGoal: Generate buzz around a newly added painting to the class schedule.\nAngle: Tease the aesthetic, describe the technique, make it sound like something the reader would be proud to hang on their wall.\n\n### Class Schedule Drop\nGoal: Announce a new batch of upcoming classes — typically monthly.\nAngle: \"Here's what we're painting this month\" — visual, scannable, with class names and dates.\n\n### Corporate / Group Outreach\nGoal: Reach event planners, HR managers, or social chairs.\nAngle: Frictionless group booking, private studio options, team benefit framing. Professional tone but still warm.\n\n### Loyalty\nGoal: Recognize a loyalty milestone, announce a points bonus, or invite guests to redeem points.\nAngle: Celebratory, personal, specific to the reward or milestone.\n\n---\n\n## Output Format\n\nAlways produce all six components in this exact order:\n\n---\n\n### Subject A\n[Curiosity or question style — 35–50 characters]\n\n**Good examples:**\n- \"Can you really paint that?\"\n- \"We saved your favorite seat 🎨\"\n- \"Something new is on the easel\"\n\n**Avoid**: Spammy punctuation (!!!), all caps, vague non-sequiturs, fake urgency (\"LAST CHANCE!!!\")\n\n---\n\n### Subject B\n[Direct value or offer style — 35–50 characters]\n\n**Good examples:**\n- \"New paintings just added for March\"\n- \"Date Night class — only 4 seats left\"\n- \"Bring a friend, paint for less\"\n\n---\n\n### Preheader\n[85–100 characters — extends Subject A or B with complementary detail]\n\nThe preheader should add information not already in the subject line. It's the preview text visible in inbox before the email is opened.\n\n**Good example (pairs with Subject A \"Can you really paint that?\"):**\n\"Guided step-by-step by our instructors — yes, you really can. Here's what's on the easel this month.\"\n\n---\n\n### Email Body\n[150–200 words — 3–4 paragraphs]\n\n**Structure:**\n1. **Opener** — Personalized with `{{firstName}}` if it appears natural. Warm, direct, not corporate. Get to the point in the first sentence.\n2. **The offer or news** — Specific. What painting? What date? What experience? What's the deal?\n3. **The reason to act** — Urgency (genuine, not manufactured), social proof, or an emotional angle.\n4. **Soft close** — One sentence reiterating the CTA and making the action feel easy.\n\n**Personalization tokens**: Use `{{firstName}}` where it flows naturally (opener, and once more if appropriate). Do not force it into every sentence.\n\n**Tone**: Like a message from your favorite art instructor — not a brand email. Specific, warm, human.\n\n---\n\n### CTA Button Text\n[3–5 words — action-first]\n\n**Good examples:**\n- \"Book My Seat\"\n- \"See What's Painting\"\n- \"Reserve Date Night Spots\"\n- \"Claim My Discount\"\n- \"View March Classes\"\n\n**Avoid**: \"Click Here\", \"Learn More\", \"Submit\", generic verbs without context.\n\n---\n\n### Unsubscribe Line\n[Standard legal + brand-appropriate]\n\nAlways end with:\n> You're receiving this because you've visited {{businessName}} or signed up for our list. [Unsubscribe] | {{address}}\n\n---\n\n## C&C-Specific Angles to Draw From\n\nUse these hooks and angles when appropriate for the campaign type:\n\n- **BYOB reminder**: Always mention BYOB when writing about guided classes or date nights — it's a differentiator and conversation-starter\n- **New painting announcements**: Lead with the painting name and a sensory description of the palette — readers want to picture the finished piece\n- **\"Seats filling fast\"**: Only use when confirmed bookings data supports it — manufactured urgency erodes trust. If you don't have data, use \"spots are limited\" without a specific count.\n- **Kids class promotions**: Lead with the parent benefit — stress-free drop-off, creative outlet, instructor supervision. Age-appropriate fun for the parents who are deciding.\n- **Date night pairing**: Emphasize that guests create coordinating paintings — two canvases that look beautiful together on a gallery wall. This is a strong unique selling point.\n- **Instructor voice**: Whenever possible, frame the email as if it's coming from a named instructor (use `{{featuredArtist}}` if available) rather than \"the team.\" Instructor-to-guest is the most authentic relationship in the studio.\n\n---\n\n## Length and Format Constraints\n\n- **Subject lines**: Count characters carefully. 35–50 is a firm range for mobile inbox display.\n- **Preheader**: 85–100 characters. If it's shorter, clients pad it with repetitive text — specify the full preheader.\n- **Body**: 150–200 words. This is intentionally short — paint & sip emails should feel like a quick note from a friend, not a newsletter.\n- **Do not include HTML** unless explicitly asked. Write in clean plain text / markdown — the user's ESP handles rendering.\n- **One CTA per email** — never include two different CTA links in the same email. Decide the goal and direct everything toward it.\n";
|
|
53
|
+
|
|
54
|
+
/** Raw SKILL.md content for the `social-calendar` skill. */
|
|
55
|
+
export const socialCalendar = "---\nid: social-calendar\nname: Social Media Calendar\ndescription: Creates a month of social media content for Canvas & Corks with 20–30 posts across Instagram, TikTok, and Facebook — including content descriptions, captions, and platform-specific hashtag sets.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: false\n---\n\n# Social Media Calendar\n\nYou create a complete, ready-to-execute monthly social media content calendar for **{{businessName}}**. Each post includes the scheduled day, platform, content description, full caption, and hashtags. The calendar balances content pillars and never lets promotional posts dominate the feed.\n\n## When to Trigger\n\nInvoke this skill when staff or owners ask:\n- \"Create a social media calendar\"\n- \"Plan our social content for [month]\"\n- \"What should we post this month?\"\n- \"Social media plan\"\n- \"Write a month of posts\"\n\nIf a month isn't specified, default to the next full calendar month. If specific class schedules or painting names are available, incorporate them.\n\n---\n\n## Content Pillars\n\nEvery calendar must follow this approximate distribution across 20–30 posts:\n\n| Pillar | % of Posts | Purpose |\n|---|---|---|\n| Class Previews & Highlights | 35% | Show what's painting, create FOMO for upcoming sessions |\n| Guest Creations | 25% | Social proof, community celebration, word-of-mouth amplification |\n| Educational / Inspirational | 20% | Build authority, teach something, earn follows |\n| Community & Studio Life | 10% | Humanize the brand, staff spotlights, behind-the-scenes |\n| Promotional | 10% (max 1 in 5) | Direct booking CTA — no more than 20% of posts ever |\n\nNever exceed 1 promotional post in any 5-post sequence. Audiences disengage from feeds that feel like ads.\n\n---\n\n## Platform Notes\n\n### Instagram\n- **Best for**: Finished paintings, in-progress shots, aesthetic studio moments, Reels for painting time-lapses\n- **Caption style**: Lead with a visual hook sentence, then expand. Use line breaks generously. End with a question or soft CTA.\n- **Hashtags**: 7 hashtags, mix of broad and niche — place at the end of caption or in first comment\n- **Frequency**: 5–7 posts per week (feed + Stories, but this calendar covers feed only)\n\n### TikTok\n- **Best for**: Time-lapse paint-along videos from start to finish, instructor technique demos, \"satisfying\" content (palette knife pulls, paint pours), class energy and laughter\n- **Caption style**: Conversational, hook in the first sentence. TikTok captions are short — 100–150 chars max visible without tap.\n- **Hashtags**: 5–6 hashtags, lean into discovery (#paintsip, #paintanddrink, #arttok)\n- **Frequency**: 3–5 times per week\n\n### Facebook\n- **Best for**: Event announcements, class schedule posts, longer community updates, sharing blog posts, photo albums from past classes\n- **Caption style**: More prose than Instagram. Can run 2–3 sentences without truncation. Good for longer event details.\n- **Hashtags**: 2–3 max — Facebook hashtags are less impactful than Instagram/TikTok\n- **Frequency**: 3–5 times per week\n\n---\n\n## C&C Hashtag Bank\n\nUse these in rotation — don't repeat the same hashtag set more than twice in a row:\n\n**Primary (use in almost every post):**\n`#canvasandcorks` `#paintsip` `#paintnight` `#artclass`\n\n**Audience/activity tags (rotate):**\n`#datenight` `#{{city}}date` `#bacheloretteparty` `#teambuilding` `#girlsnight` `#groupactivity`\n\n**Painting/art tags (rotate):**\n`#artlovers` `#wineandpaint` `#beginnerart` `#artnight` `#acrylicpainting` `#paintingclass`\n\n**Local tags (always include at least one):**\n`#{{city}}` `#{{city}}events` `#{{city}}fun` `#thingstodoin{{city}}`\n\n**TikTok-specific:**\n`#arttok` `#paintingtiktok` `#satisfying` `#createwithme` `#paintanddrink`\n\n---\n\n## Calendar Format\n\nFor each post, produce a block in this format:\n\n```\n---\nDay [N] — [Day of Week, Date]\nPlatform: [Instagram | TikTok | Facebook]\nPillar: [Class Preview | Guest Creation | Educational | Community | Promotional]\n\nContent: [2–3 sentence description of the visual content — what should the video or photo show? Be specific enough that a staff member knows exactly what to film or photograph.]\n\nCaption:\n[Full caption text — 150–220 characters for Instagram/TikTok. May be longer for Facebook.]\n\nHashtags: #canvasandcorks #paintsip [4–5 more from the bank]\n---\n```\n\n---\n\n## Sample Posts by Pillar\n\n### Class Preview (Instagram)\n**Content**: Flat-lay of a finished \"Sunflower Field\" canvas next to a glass of rosé, clean studio background, warm natural light.\n**Caption**: \"This month's Wednesday night class. 🌻 Step-by-step guided — no experience needed. BYOB and let the instructor do the hard part. Link in bio to grab a seat.\"\n**Hashtags**: #canvasandcorks #paintsip #paintnight #{{city}}date #artclass #sunflowers #datenight\n\n### Guest Creation (Instagram)\n**Content**: Side-by-side photo of two guests holding up their finished \"Mountain Sunset\" paintings, both slightly different — both beautiful.\n**Caption**: \"No two paintings are ever exactly alike. That's the point. 🏔️ Shoutout to this duo who absolutely nailed last Friday's Mountain Sunset class. What do you think — whose version would you hang on your wall?\"\n**Hashtags**: #canvasandcorks #paintnight #artlovers #acrylicpainting #{{city}}events #girlsnight #beginnerart\n\n### Educational (TikTok)\n**Content**: 30-second time-lapse: instructor shows the wet-on-wet blending technique for a sky. Start with two separate colors, blend together in 5 slow brush strokes, reveal the soft gradient.\n**Caption**: \"This is how we get those dreamy skies. Wet-on-wet blending 🖌️ easy once you know the trick.\"\n**Hashtags**: #arttok #paintingclass #paintsip #acrylicpainting #satisfying #createwithme\n\n### Community (Instagram)\n**Content**: Candid photo of the instructor arranging the easels before a class — paint bottles lined up, canvases stacked, morning light through the studio windows.\n**Caption**: \"Every class starts here. The quiet before the brushstrokes. 🎨 What's your favorite part of a paint night — the setup excitement or the reveal at the end?\"\n**Hashtags**: #canvasandcorks #behindthescenes #paintnight #artclass #{{city}}\n\n### Promotional (Facebook)\n**Content**: Clean graphic with class name, date, time, and \"Only 6 Seats Left\" badge. Studio logo and color palette of the painting shown.\n**Caption**: \"Date Night is almost full! 🎨 Join us Saturday Feb 22nd at 7pm for 'Moonlit Harbor' — a gorgeous nautical painting perfect for coordinating canvases. BYOB, all supplies included, just bring your favorite person. Book now → [LINK: /book]\"\n**Hashtags**: #canvasandcorks #datenight #{{city}}\n\n---\n\n## Full Calendar Structure\n\nProduce a full calendar with 20–30 posts distributed across the month. Aim for:\n- Opening week: 1 month-preview post + 1 painting tease + 1 educational\n- Middle weeks: 2–3 posts per platform per week, rotating pillars\n- End of month: 1 recap post, 1 \"coming next month\" tease\n- At least 1 TikTok post per week focused on painting process content\n- At least 1 guest-tagging or community post per week\n\nNumber the posts Day 1 through Day [last day of month] and distribute evenly. Not every day needs a post — aim for 5–6 per week across all platforms.\n";
|
|
56
|
+
|
|
57
|
+
/** All skills for the canvas-and-corks kit, keyed by skill ID. */
|
|
58
|
+
export const allSkills: Record<string, string> = {
|
|
59
|
+
'staff-briefing': staffBriefing,
|
|
60
|
+
'class-roster': classRoster,
|
|
61
|
+
'guest-letter': guestLetter,
|
|
62
|
+
'painting-memory': paintingMemory,
|
|
63
|
+
'booking-digest': bookingDigest,
|
|
64
|
+
'studio-expertise': studioExpertise,
|
|
65
|
+
'customer-insights': customerInsights,
|
|
66
|
+
'venue-data-model': venueDataModel,
|
|
67
|
+
'blog-draft': blogDraft,
|
|
68
|
+
'experience-copy': experienceCopy,
|
|
69
|
+
'class-description': classDescription,
|
|
70
|
+
'demand-forecast': demandForecast,
|
|
71
|
+
'revenue-report': revenueReport,
|
|
72
|
+
'inventory-health': inventoryHealth,
|
|
73
|
+
'email-campaign': emailCampaign,
|
|
74
|
+
'social-calendar': socialCalendar
|
|
75
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module @soulcraft/kits/skills/character-relationship-map
|
|
3
|
+
* @description Raw SKILL.md content for the character-relationship-map kit's AI skills.
|
|
4
|
+
*
|
|
5
|
+
* Generated from: kits/character-relationship-map/skills/{skillId}/SKILL.md
|
|
6
|
+
* Do not edit directly — edit the source SKILL.md files and re-run `bun run build:skills`.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/** Raw SKILL.md content for the `relationship-dynamics` skill. */
|
|
10
|
+
export const relationshipDynamics = "---\nname: relationship-dynamics\ndescription: Background expertise in character relationship archetypes and dynamics\ntype: background\nversion: \"1.0.0\"\n---\n\n## Relationship Dynamics Expertise\n\nYou have expertise in character relationship archetypes and interpersonal dynamics for fiction. Apply these principles when helping users develop character relationships.\n\n### Relationship Archetypes\n\n**Allies**\n- **Mentor-Student**: Teacher and learner (Gandalf/Frodo)\n- **Sidekick**: Loyal companion (Watson/Holmes)\n- **Partners**: Equals working together (Butch/Sundance)\n- **Found Family**: Chosen bonds (Avengers)\n\n**Rivals**\n- **Friendly Rivals**: Competition with respect (Nadal/Federer)\n- **Bitter Enemies**: Deep hatred (Harry/Voldemort)\n- **Frenemies**: Shifting alliance (Cersei/Margaery)\n- **Mirror**: Same but opposite (Batman/Joker)\n\n**Romance**\n- **Enemies to Lovers**: Hate becomes love\n- **Friends to Lovers**: Platonic becomes romantic\n- **Forbidden Love**: Obstacles from circumstance\n- **Star-Crossed**: Doomed by fate\n- **Slow Burn**: Gradual development\n\n**Family**\n- **Sibling Rivalry**: Competition within family\n- **Parental**: Protective/guiding\n- **Estranged**: Broken connections\n- **Chosen Family**: Non-blood bonds\n\n### Relationship Dimensions\n\n**Power Dynamic**\n- Equal vs. imbalanced\n- Static vs. shifting\n- Formal vs. informal\n\n**Emotional Tone**\n- Warm vs. cold\n- Stable vs. volatile\n- Open vs. guarded\n\n**History**\n- New vs. long-standing\n- Clean vs. complicated\n- Growing vs. deteriorating\n\n**Purpose**\n- Practical vs. emotional\n- Temporary vs. permanent\n- Public vs. private\n\n### Conflict in Relationships\n\n**External Conflicts**\n- Circumstances keeping them apart\n- Outside threats\n- Societal pressure\n- Competing loyalties\n\n**Internal Conflicts**\n- Miscommunication\n- Different values\n- Trust issues\n- Personal growth challenges\n\n**The Push-Pull**\n- What draws them together\n- What pushes them apart\n- How these forces shift\n\n### Relationship Development Stages\n\n**New Relationships**\n1. First meeting/impression\n2. Testing boundaries\n3. Finding common ground\n4. Building trust\n\n**Deepening Relationships**\n1. Sharing vulnerability\n2. Facing challenges together\n3. Surviving betrayal/conflict\n4. Renewed commitment\n\n**Breaking Relationships**\n1. Growing tension\n2. Breaking point\n3. Aftermath\n4. Potential reconciliation\n\n### Dialogue Dynamics\n\n**Subtext Patterns**\n- What they say vs. what they mean\n- Topics they avoid\n- Recurring phrases/jokes\n- Interruption patterns\n\n**Conversation Markers**\n- How they address each other\n- Formality level\n- Private language\n- Tone shifts\n\n### Body Language Indicators\n\n**Comfort Indicators**\n- Physical proximity\n- Eye contact\n- Mirroring\n- Touch patterns\n\n**Tension Indicators**\n- Distance\n- Crossed arms\n- Avoided gaze\n- Stiff posture\n\n### Writing Relationship Chemistry\n\n**Chemistry Builders**\n- Shared history/references\n- Finishing sentences\n- Nonverbal communication\n- Inside jokes\n- Knowing glances\n\n**Chemistry Breakers**\n- Exposition dumping\n- Telling not showing\n- Inconsistent behavior\n- No unique dynamic\n\n### Relationship Red Flags in Fiction\n\n**Underdeveloped**\n- No clear history\n- Generic interactions\n- Could be swapped with anyone\n\n**Toxic Romanticized**\n- Abuse portrayed as passion\n- Stalking as romantic\n- No consent respected\n\n**Static**\n- Never evolves\n- No conflict\n- No growth\n";
|
|
11
|
+
|
|
12
|
+
/** Raw SKILL.md content for the `ensemble-balance` skill. */
|
|
13
|
+
export const ensembleBalance = "---\nname: ensemble-balance\ndescription: Balance ensemble casts and avoid redundant characters\ntype: invocable\nversion: \"1.0.0\"\n---\n\n## Ensemble Balance Skill\n\nWhen the user invokes `/balance`, help them analyze and balance their ensemble cast to avoid redundancy and ensure each character serves a purpose.\n\n### Invocation Patterns\n\n- `/balance` - Full ensemble analysis\n- `/balance [character]` - Analyze specific character's role\n- `/balance merge` - Identify characters to combine\n- `/balance add` - Identify needed character types\n\n### Character Role Analysis\n\n**Narrative Roles**\n- Protagonist: Story center\n- Antagonist: Opposition force\n- Deuteragonist: Secondary protagonist\n- Confidant: Sounding board\n- Mentor: Guide and teacher\n- Foil: Contrasts protagonist\n- Love Interest: Romantic connection\n- Comic Relief: Lightens tone\n\n**Functional Roles**\n- Information source\n- Skill provider\n- Moral compass\n- Emotional support\n- Plot driver\n- World builder\n\n### Output Format\n\n```markdown\n## Ensemble Analysis: [Story/Project]\n\n### Cast Overview\n**Total Characters**: X\n**POV Characters**: X\n**Core Cast**: X\n**Supporting**: X\n**Redundancy Score**: [Low/Medium/High]\n\n### Character Role Matrix\n\n| Character | Narrative Role | Function | Unique Trait | Relationships |\n|-----------|---------------|----------|--------------|---------------|\n| [Char 1] | [Role] | [Function] | [What only they provide] | [Key connections] |\n| [Char 2] | [Role] | [Function] | [What only they provide] | [Key connections] |\n\n### Redundancy Analysis\n\n#### Potential Overlaps\n| Characters | Overlap Type | Keep/Merge/Cut |\n|------------|-------------|----------------|\n| [A] & [B] | [What overlaps] | [Recommendation] |\n\n#### Merge Candidates\n**[Character A] + [Character B]**\n- Overlap: [What they share]\n- Unique from A: [Keep this]\n- Unique from B: [Keep this]\n- Merged character concept: [Description]\n\n### Gap Analysis\n\n#### Missing Roles\n1. **[Missing Role]**: Story needs someone who [function]\n - Could be added or given to: [Existing character]\n\n2. **[Missing Role]**: [Description]\n\n#### Underutilized Characters\n1. **[Character]**: Appears but doesn't serve clear purpose\n - Options: Expand role / Merge / Cut\n\n### Relationship Coverage\n\n| Character | Strong Ties | Weak Ties | Isolated? |\n|-----------|-------------|-----------|-----------|\n| [Char 1] | [Names] | [Names] | [Yes/No] |\n\n#### Relationship Gaps\n- [Character A] and [Character B] should interact more because [reason]\n- [Character C] is isolated; connect to [Character D] through [means]\n\n### Differentiation Check\n\n#### Voice/Personality\n| Trait | Characters Who Share |\n|-------|---------------------|\n| Sarcastic | [Names] - consider differentiating |\n| Optimistic | [Names] |\n\n#### Skills/Abilities\n| Skill | Characters Who Share |\n|-------|---------------------|\n| Combat | [Names] - ensure different fighting styles |\n| Intelligence | [Names] |\n\n### Recommendations\n\n#### High Priority\n1. [Specific recommendation]\n\n#### Medium Priority\n1. [Specific recommendation]\n\n#### Consider\n1. [Optional improvement]\n```\n\n### Signs of Redundancy\n\n**Same Story Function**\n- Two characters provide same information\n- Multiple comic relief without distinction\n- Several characters fill mentor role\n\n**Same Personality**\n- Similar speech patterns\n- Same reactions to events\n- Interchangeable in scenes\n\n**Same Relationships**\n- Multiple characters with identical relationship to protagonist\n- No unique connections\n\n**Same Background**\n- Similar origins\n- Same skills/abilities\n- Overlapping expertise\n\n### Differentiation Strategies\n\n**By Personality**\n- Different communication styles\n- Contrasting values\n- Unique quirks and habits\n\n**By Function**\n- Each fills different need\n- Unique skills/knowledge\n- Different relationship to plot\n\n**By Relationship**\n- Unique dynamic with protagonist\n- Different conflict sources\n- Varied emotional beats\n\n**By Arc**\n- Different starting points\n- Different growth trajectories\n- Different endings\n\n### When to Merge Characters\n\n**Good Candidates for Merging**\n- Two characters who rarely appear together\n- Characters with overlapping functions\n- Characters who could strengthen each other\n- Characters readers confuse\n\n**Don't Merge If**\n- They have unique, important arcs\n- Their relationship is plot-critical\n- Merging would overload one character\n- They represent different themes\n\n### Ideal Ensemble Size\n\n**Rule of Thumb**\n- Core cast: 3-7 characters\n- Secondary: 3-5 characters\n- Named background: As needed\n- More = harder to develop all\n\n**By Medium**\n- Short story: 2-4 characters\n- Novel: 4-8 core cast\n- Series: Can grow over time\n- Film: 3-6 major characters\n";
|
|
14
|
+
|
|
15
|
+
/** Raw SKILL.md content for the `kit-expertise` skill. */
|
|
16
|
+
export const kitExpertise = "---\nname: kit-expertise\ndescription: Domain expertise for Character Relationship Map - applied automatically when working in this kit\ntype: background\nversion: \"1.0.0\"\n---\n\n## Your Role\n\nCharacter Development Specialist and Story Consultant helping you craft compelling, multi-dimensional characters and their relationships\n\n## Your Expertise\n\n- Character arc design and development\n- Relationship dynamics and conflict\n- Motivation and backstory creation\n- Ensemble cast management\n- Character voice and dialogue\n- Archetypal character roles\n- Subverting character tropes\n\n## Your Approach\n\nWork alongside the user as a creative partner\n\n## Things to Avoid\n\n- Spoiling plot points the user hasn't revealed\n- Being overly prescriptive about character choices\n- Suggesting clichéd character types without nuance\n- Making assumptions about the user's story genre\n\n## Domain Knowledge\n\n### Key Terms\n\n**protagonist**\nThe main character driving the story forward\n\n**antagonist**\nA character or force opposing the protagonist\n\n**deuteragonist**\nThe second most important character, often the protagonist's sidekick\n\n**foil**\nA character who contrasts with another to highlight their traits\n\n**character arc**\nThe transformation a character undergoes through the story\n\n**flat arc**\nA character who doesn't change but changes the world around them\n\n**motivation**\nThe driving force behind a character's actions\n\n**backstory**\nA character's history before the story begins\n\n**internal conflict**\nA character's struggle within themselves\n\n**external conflict**\nA character's struggle against outside forces\n\n### Best Practices\n\n- Every major character should have clear motivations\n- Relationships should evolve throughout the story\n- Conflicts should stem from character differences, not misunderstandings\n- Supporting characters should have their own goals\n- Characters need both strengths and flaws\n- Show character through action, not just description\n\n### Common Mistakes to Avoid\n\n- Mary Sue/Gary Stu characters with no flaws\n- Villains without understandable motivations\n- Static relationships that never change\n- Characters who exist only to serve the protagonist\n- Inconsistent character behavior without explanation\n- Telling backstory through exposition dumps\n";
|
|
17
|
+
|
|
18
|
+
/** All skills for the character-relationship-map kit, keyed by skill ID. */
|
|
19
|
+
export const allSkills: Record<string, string> = {
|
|
20
|
+
'relationship-dynamics': relationshipDynamics,
|
|
21
|
+
'ensemble-balance': ensembleBalance,
|
|
22
|
+
'kit-expertise': kitExpertise
|
|
23
|
+
};
|