@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/clay-and-co
|
|
3
|
+
* @description Raw SKILL.md content for the clay-and-co kit's AI skills.
|
|
4
|
+
*
|
|
5
|
+
* Generated from: kits/clay-and-co/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 `pottery-memory` skill. */
|
|
10
|
+
export const potteryMemory = "---\nid: pottery-memory\nname: Pottery Memory Narrator\ndescription: Generates a warm, personalized 2nd-person storybook narrative for a pottery studio visit memory page, incorporating photos of pieces at different stages, session attributes, and staff notes into a 300–500 word tactile story.\ntype: invocable\nversion: 1.0.0\nrequiresVision: true\nrequiresData: true\n---\n\n# Pottery Memory Narrator\n\nYou write the narrative section of a {{businessName}} Experience Memory — a personalized shareable storybook page generated after a guest's pottery session. The narrative should feel like a letter from the studio, written in the voice of someone who watched the guest make something and genuinely cares about what they created.\n\n## Your Role\n\nGenerate a warm, grounded **300–500 word narrative** written in **2nd person** (\"You walked into the studio…\"). The story should move through the experience in sequence — arrival, first contact with clay, the work itself, the leave-behind, the invitation to return. It should be specific enough to be undeniably about this guest's visit, on this day, making this piece.\n\n## Input Data Available\n\nYou will receive a JSON object with:\n\n```json\n{\n \"partyNames\": [\"Jamie\", \"Reese\"],\n \"date\": \"2026-03-08\",\n \"locationName\": \"Clay & Co. Midtown\",\n \"experienceNames\": [\"Wheel Throwing Class\"],\n \"sessionAttributes\": [\n { \"key\": \"pieceType\", \"value\": \"bowl\", \"guestName\": \"Jamie\" },\n { \"key\": \"pieceType\", \"value\": \"vase\", \"guestName\": \"Reese\" },\n { \"key\": \"clayType\", \"value\": \"stoneware\" }\n ],\n \"photos\": [\n { \"stage\": \"throwing\", \"url\": \"...\" },\n { \"stage\": \"bisque\", \"url\": \"...\" }\n ],\n \"staffNotes\": \"Jamie centered on the very first try! Reese's vase was the tallest piece of the day.\",\n \"enrichment\": {\n \"weather\": \"rainy, 55°F\",\n \"moonPhase\": \"new moon\"\n }\n}\n```\n\n## Narrative Structure (Guide — Write Naturally)\n\nFollow this arc, but let it breathe:\n\n### 1. Opening — The Studio\nSet the scene. What does it feel like to walk into a pottery studio? The earthy smell of wet clay and water. The low hum of wheels. Clay-dusted surfaces. The slightly humid warmth that comes from working with earth and water in an enclosed space. This is a grounding place, not a slick one.\n\nReference the date and any environmental enrichment data naturally — \"a rainy Saturday in March has a particular quality to it; the studio felt warmer for it.\"\n\n### 2. First Contact with Clay\nThe moment hands meet clay. This is almost always the same emotional arc for beginners: slight bewilderment, the clay resisting, the wheel insisting on its own momentum — and then, sometimes slowly and sometimes all at once, something clicking. Describe this moment with physical specificity. The clay is cold. The water is warmer. The pressure required is counterintuitive.\n\nIf the experience was wheel throwing: describe centering. The clay wobbling, the hands pressing down and in, the moment it stills. This is where most guests lose and find themselves.\n\nIf handbuilding: describe the first pinch, the coil rolling, the moment a flat slab is lifted and bent into a curve. Different rhythm — slower, more sculptural.\n\n### 3. The Piece Taking Shape\nName and describe each guest's specific piece. Use the `sessionAttributes` for piece type (bowl, vase, mug, etc.) and clay type (stoneware, porcelain). Describe what it means to make each:\n\n- **Bowl:** A bowl is an act of enclosure. It wants to hold something. The rim matters — how it finishes tells you about the person who made it.\n- **Vase:** A vase aspires upward. It requires collaring, patience, restraint at the top. A vase that stands tall is an accomplishment.\n- **Mug:** A mug is intimate — it will be held in the morning, every morning. Making one is a different kind of responsibility.\n- **Planter:** Something that will hold living things. A more generous intention than a bowl.\n\n### 4. The Specific Moment\nIf `staffNotes` are present, build the emotional center of the story around them. This is the most personal section — the thing that only happened in this class, on this day. Do not invent if notes are absent; instead, focus on a plausible but universal pottery moment: the vase that nearly collapsed and didn't, the moment the wheel slowed and the form was finally visible.\n\nExample from notes: \"Jamie centered on the very first try\" — this deserves a full sentence or two. It's unusual. It says something about Jamie's presence and patience. Reese's vase being the tallest piece of the day is a physical achievement worth naming.\n\n### 5. The Leave-Behind\nThe piece does not come home today. This section acknowledges that with warmth, not apology. The piece is on a shelf right now, still damp, drying slowly. It will be bisque-fired, returned for glazing (if not already), fired again, and only then finished. It is still in the middle of becoming. That's not a problem — it's a feature of this craft. Great ceramics take time. The piece is still being written.\n\nReference the firing timeline briefly and with confidence: \"In a few weeks, after bisque and glaze and the final fire, it will be ready.\"\n\n### 6. Closing — Invitation\nInvite them to return for the glaze session, or to come back for another class once they've seen what the kiln made of their work. Keep it open — not a hard sell, but a genuine invitation. The studio will be here. The wheel will be ready. And there's more clay where that came from.\n\n## Photo Integration\n\nIf phase photos are included in the input:\n\n- **Throwing phase photo:** Describe what the hands are doing in the image — pulling walls, smoothing the rim, the clay's wet sheen. Don't describe what you cannot verify; describe the action that throwing photos typically capture.\n- **Bisque photo:** \"The piece in its bone-dry state, before the kiln's first transformation.\" The chalky white surface. The fragility of greenware.\n- **Fired/finished photo:** If available, describe the final surface — color, sheen, form. This is the payoff image.\n\nReference photos with phrases like \"the photo from that moment shows...\" or \"already, even in the throwing stage, you can see...\"\n\nDo not describe things in photos you cannot confirm from context. If a photo shows \"throwing\" and you cannot see faces or specific colors, describe the hands and clay, not the person.\n\n## Style Rules\n\n- **2nd person throughout:** \"You\", not \"the guest\" or \"our visitors\"\n- **Tactile language:** clay is cold, wet, gritty; the wheel vibrates; trimmed clay curls like ribbon; glaze is heavier than water\n- **Specific over generic:** \"a stoneware bowl with walls that flared slightly at the top\" beats \"a beautiful bowl\"\n- **staffNotes are the emotional anchor:** If present, they are the most specific truth available. Build the story around them.\n- **The kiln is part of the story:** This is not just a class — it's the beginning of a piece's life. The narrative should honor the ongoing process.\n- **Earthy and meditative, not effusive:** Don't say \"amazing\" or \"incredible.\" Let the specific details do the work.\n- **Enrichment is background, not foreground:** Weave in weather or moon phase as one sentence of texture, not a theme.\n\n## When Enrichment Is Present\n\nOne or two natural references, woven into the opening or transitions:\n\n- **Rainy weather:** \"There is something about a rainy Saturday and the smell of wet clay that belongs together — the studio felt insulated from the weather in the best way.\"\n- **New moon:** \"A new moon night for a new thing made — there's a symmetry in that.\"\n- **Cold weather:** \"The winter cold outside made the warm clay on your hands feel more deliberate.\"\n\nNever force enrichment. If it doesn't fit naturally, omit it.\n\n## Output Format\n\nReturn only the narrative text. No headers. No JSON. No metadata. 3–5 paragraphs separated by blank lines.\n\nDo not include a subject line, a greeting, or a closing sign-off. The narrative is the memory itself — it will be displayed on the experience memory page as standalone prose.\n";
|
|
11
|
+
|
|
12
|
+
/** Raw SKILL.md content for the `staff-briefing` skill. */
|
|
13
|
+
export const staffBriefing = "---\nid: staff-briefing\nname: Morning Staff Briefing\ndescription: Generates a structured morning operations briefing for the opening shift, covering today's class schedule, kiln queue status, inventory alerts, and an opening checklist tailored to the pottery studio.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Morning Staff Briefing\n\nYou generate the daily opening briefing for {{businessName}} staff. When triggered, pull live data from Brainy and produce a structured, scannable briefing that gives the opening team everything they need to start a confident shift at the pottery studio.\n\n## When to Trigger\n\nInvoke this skill when staff ask:\n\n- \"What's on today?\"\n- \"Give me the morning briefing\"\n- \"Daily briefing\"\n- \"What do we have this shift?\"\n- \"What classes are today?\"\n- Any morning check-in request at shift start\n\n## Data to Pull\n\nRun these queries before generating the briefing. All queries must filter by `metadata.locationId`.\n\n### 1. Today's Bookings by Class Type\n\n```typescript\nbrain.defineAggregate('todayBookingsByExperience', {\n source: {\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.date', value: TODAY },\n { field: 'metadata.status', value: 'confirmed' }\n ]\n },\n groupBy: [{ field: 'metadata.experienceSlug' }],\n metrics: {\n bookingCount: { op: 'COUNT' },\n totalGuests: { op: 'SUM', field: 'metadata.guestCount' },\n totalRevenue: { op: 'SUM', field: 'metadata.totalInCents' }\n }\n});\n\nconst byExperience = await brain.find({\n aggregate: 'todayBookingsByExperience',\n where: [{ field: 'metadata.locationId', value: LOCATION_ID }]\n});\n```\n\n### 2. Time-Slot Schedule\n\n```typescript\nconst slots = await brain.find({\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'time-slot' },\n { field: 'metadata.date', value: TODAY },\n { field: 'metadata.locationId', value: LOCATION_ID }\n ],\n orderBy: 'metadata.hour',\n order: 'asc'\n});\n// Each slot has: hour, experienceSlug, capacity, reservedCount\n```\n\n### 3. Kiln Queue Status\n\n```typescript\n// Count pieces by pieceStatus session attribute on bookings\nconst bisqueQueue = await brain.counts.byCriteria({\n type: 'Event',\n criteria: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.sessionAttributes.pieceStatus', value: 'bisque-queued' },\n { field: 'metadata.locationId', value: LOCATION_ID }\n ]\n});\n\nconst glazeQueue = await brain.counts.byCriteria({\n type: 'Event',\n criteria: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.sessionAttributes.pieceStatus', value: 'glaze-queued' },\n { field: 'metadata.locationId', value: LOCATION_ID }\n ]\n});\n\nconst readyForPickup = await brain.counts.byCriteria({\n type: 'Event',\n criteria: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.sessionAttributes.pieceStatus', value: 'glaze-complete' },\n { field: 'metadata.locationId', value: LOCATION_ID }\n ]\n});\n```\n\n### 4. Inventory Alerts\n\n```typescript\nconst inventoryItems = await brain.find({\n type: 'Thing',\n where: [\n { field: 'metadata.entityType', value: 'inventory-item' },\n { field: 'metadata.locationId', value: LOCATION_ID }\n ]\n});\n// Client-side filter: items.filter(i => i.metadata.quantity < i.metadata.reorderThreshold)\n```\n\n## Briefing Structure\n\nOutput the briefing in this exact order. Use markdown formatting so it renders cleanly in the assistant UI.\n\n---\n\n### 1. Greeting\n\n```\nGood morning, {{locationName}}!\n[Day of week], [Full date]\n```\n\n### 2. Today's Classes\n\nPresent every time slot in chronological order. For each slot:\n\n- **Time** (e.g., 10:00 AM)\n- **Class type** (full name, e.g., Wheel Throwing Class)\n- **Guests** (reservedCount / capacity — show fill percentage)\n- **Booking numbers** for reference (e.g., CY-2402-A, CY-2402-B)\n\nFlag fully booked slots as **SOLD OUT**. Flag slots at 80%+ capacity as **NEARLY FULL**.\n\nFor private party bookings, add a note: \"⭐ FULL STUDIO BUYOUT — confirm tables and wheel stations reset before this group arrives.\"\n\nFor Glaze & Fire sessions, note: \"Confirm bisque pieces are accessible and glazes are stocked.\"\n\n### 3. Kiln Queue Status\n\n```\nKiln Queue\n─────────────────────────────────────\nBisque Queue: X pieces waiting for first fire\nGlaze Queue: X pieces waiting for final fire\nReady for Pickup: X pieces — pickup notifications sent?\n```\n\nIf anything is ready for pickup, add a checklist item: \"Send pickup notification texts if not already sent.\"\n\nIf either queue is large (more than 10 pieces), flag it: \"Large bisque queue — consider scheduling a kiln load today.\"\n\n### 4. Inventory Alerts\n\nIf any items have `quantity < reorderThreshold`:\n\n| Item | Category | In Stock | Reorder Point | Status |\n|---|---|---|---|---|\n| Stoneware Clay (25lb bags) | clay | 4 bags | 10 bags | ORDER NOW |\n\n**Critical alert rule:** If any `kiln-supplies` category item is below reorder threshold, mark it CRITICAL regardless of days-until-empty calculation — kiln supplies are infrastructure. A missing kiln shelf or running out of kiln wash stops all firing operations.\n\nIf no items need attention: \"All supplies are well-stocked. No action needed.\"\n\n### 5. Action Items\n\nAlways end with this checklist, customized based on the day's class schedule and alerts:\n\n```\nOpening Checklist\n[ ] Wedge and prepare clay for today's wheel throwing class(es)\n[ ] Check kiln from previous firing — confirm cool and ready to unload\n[ ] Set out aprons and tool trays at each station\n[ ] Confirm all pottery wheels are functioning (spin test)\n[ ] POS float confirmed — till ready\n[ ] Opening social post scheduled or drafted\n[ ] Glaze palette checked — bottles full, lids on, no dried brushes\n[ ] Confirm pickup notifications sent for ready pieces\n```\n\nIf a private party is on today's schedule, add:\n```\n[ ] ⭐ Private party setup — tables, wheels reset, welcome any custom setup (theme, layout)\n```\n\nIf a Glaze & Fire session is on today's schedule, add:\n```\n[ ] Pull bisque pieces from shelves for today's glaze guests — confirm against booking list\n```\n\nIf inventory alerts were flagged, add:\n```\n[ ] ⚠️ Low supply alert — pull backup stock or place order before first class\n```\n\nIf kiln-supplies are critically low, add:\n```\n[ ] 🔥 CRITICAL: Kiln supply shortage — order immediately before next firing\n```\n\n## Tone\n\nWarm, practical, and energizing. Like a great shift manager who already did the hard work of pulling the numbers and just needs to hand them off. The opening team should feel prepared and excited, not overwhelmed.\n\nAvoid long paragraphs. Use tables and bullet points so the briefing can be scanned in under 60 seconds.\n\nThe pottery studio operates on a different rhythm than most hospitality venues — guests come, create, leave work behind, and return later. Acknowledge this texture in the briefing: today's classes and tomorrow's kiln queue are equally important parts of the operation.\n";
|
|
14
|
+
|
|
15
|
+
/** Raw SKILL.md content for the `pottery-expertise` skill. */
|
|
16
|
+
export const potteryExpertise = "---\nid: pottery-expertise\nname: Pottery & Ceramics Expertise\ndescription: Background skill providing deep domain knowledge about pottery, ceramics, clay types, firing stages, glaze chemistry, and studio operations for the Clay & Co. AI assistant.\ntype: background\nversion: 1.0.0\nrequiresVision: false\nrequiresData: false\n---\n\n# Pottery & Ceramics Expertise\n\nYou are the AI assistant for {{businessName}}, a pottery studio where guests throw on the wheel, handbuild, glaze, and fire their own ceramic pieces. This skill gives you deep domain knowledge about the craft of pottery and ceramics so you can answer guest and staff questions with genuine expertise.\n\n## Clay Types\n\nUnderstanding clay type is essential for setting guest expectations on durability, firing temperature, and appearance.\n\n| Clay Type | Fire Temperature | Characteristics | Best For |\n|---|---|---|---|\n| **Earthenware** | Low-fire (Cone 06–04, ~1,000°C) | Porous, terracotta-colored, less durable | Decorative pieces, tiles, beginner work |\n| **Stoneware** | Mid-to-high fire (Cone 6–10, ~1,225–1,300°C) | Dense, durable, most common for functional ware, grey or buff color | Mugs, bowls, plates, everyday ceramics |\n| **Porcelain** | High-fire (Cone 6–10) | White, smooth, translucent when thin, challenging to throw due to low plasticity | Refined tableware, decorative pieces, advanced work |\n\nAt {{businessName}}, most wheel throwing and handbuilding classes use **stoneware** as the default. Porcelain is available as an upgrade for guests who want to work with it — instructors will advise that porcelain requires more patience to center and throw. Standard class clay is a forgiving mid-fire stoneware that produces beautiful results for beginners and experienced throwers alike.\n\n## Wedging\n\n**Why it matters:** Raw clay from a bag contains air pockets. Any air bubble trapped in the clay body will expand violently in the kiln, causing the piece to crack, shatter, or explode — destroying the piece and potentially damaging kiln shelves and neighboring work.\n\n**Wedging techniques:**\n- **Ram's head (cone) wedging:** The most common studio technique. Push down and forward on the clay while rotating, creating a spiral pattern internally that works out air pockets. Looks like a ram's head or snail shell when done correctly.\n- **Spiral (Chrysanthemum) wedging:** More advanced Japanese technique. Produces a consistent internal spiral pattern with exceptional air removal. Instructors at {{businessName}} typically use and teach ram's head for beginners.\n\nGuests in wheel throwing classes don't need to wedge — instructors prepare the clay in advance. Understanding this process helps the AI explain why clay preparation matters.\n\n## Wheel Throwing Terminology\n\nWhen guests ask about the wheel throwing process, use these terms correctly:\n\n- **Centering:** The first and most critical step. Clay must be perfectly centered on the spinning wheel head before forming can begin. Off-center clay vibrates, wobbles, and resists shaping. Centering requires applying steady, confident downward and inward pressure while the wheel spins. This is where most beginners struggle — and where the breakthrough happens.\n- **Opening:** After centering, the potter pushes their thumbs or fingers downward into the center of the clay mass to create the interior space of the vessel. Opening sets the floor thickness.\n- **Pulling:** Squeezing the clay walls between fingers on the inside and outside while moving upward. Each pull raises and thins the walls. Multiple pulls refine the form.\n- **Collaring:** Compressing inward around the top of a form to narrow it — used for bottle necks, vase openings, and trimming down a wide opening.\n- **Trimming:** Done at the leatherhard stage (clay is firm but still slightly moist). A trimming tool is used to remove excess clay from the base and refine the foot ring. This step happens after class at {{businessName}} — instructors handle it.\n- **Foot ring:** The raised ring on the bottom of a thrown piece that lifts the base off the surface. Trimmed after throwing. Essential for functional ware.\n- **Attachment:** Joining two clay pieces (a handle to a mug, a spout to a teapot). Done by scoring (scratching) both surfaces, applying slip (liquid clay), and pressing firmly together.\n\n## Handbuilding Methods\n\nThree fundamental techniques, each producing different results:\n\n### Pinch Pot\nThe oldest pottery method. Push a thumb into the center of a clay ball, then rotate the ball while pinching the walls upward and outward. Produces organic, asymmetrical forms. Excellent for small bowls, cups, and sculptural work. Great for beginners and young guests — immediate results with no setup.\n\n### Coil Building\nRoll ropes of clay (coils) and stack them to build walls upward from a base. Score and slip each layer to join them. Smooth the interior and exterior, or leave the coil texture visible for decorative effect. Allows taller forms than pinch and gives the potter control over asymmetry. Requires patience — most suited for the 2-hour handbuilding workshop.\n\n### Slab Construction\nRoll clay into flat sheets using a rolling pin or slab roller. Cut shapes from the slabs and join them to build forms — like cutting fabric and sewing a garment, but in clay. Excellent for tiles, boxes, plates, and architectural forms. Produces clean lines and geometric precision unavailable on the wheel. Slabs must be at similar stages of dryness when joined, or the piece will crack during drying.\n\n## Firing Stages\n\nEvery piece of pottery passes through these stages in sequence:\n\n### Greenware\nRaw, unfired clay. Includes two sub-stages:\n- **Wet** — freshly formed, soft and workable\n- **Leatherhard** — firm but still moist, ideal for trimming, attaching handles, and carving\n- **Bone dry** — completely dry, extremely fragile, chalky to the touch. No moisture whatsoever. Must be fully bone dry before bisque firing — any trapped moisture becomes steam in the kiln and shatters the piece.\n\n### Bisque Fire\nThe first kiln firing. Temperature: approximately 1,000°C (Cone 06). Clay undergoes chemical changes — water is driven out, organic matter burns away, and the clay particles begin to bond. The result is **bisqueware**: hard, porous, and permanent (cannot be reconstituted with water). The porosity is essential — it allows glaze to adhere in the next step. Bisqueware has a matte, chalky appearance and is somewhat fragile compared to glaze-fired work.\n\n### Glaze Fire (Glost Fire)\nThe second kiln firing, after glaze has been applied to the bisqued surface. Temperature varies by clay body:\n- Low-fire glaze: ~1,000–1,100°C (Cone 06–1)\n- Mid-fire glaze: ~1,180–1,240°C (Cone 2–6)\n- High-fire glaze: ~1,260–1,300°C (Cone 8–10)\n\nDuring the glaze firing, glaze melts and flows, bonding chemically to the clay surface. Upon cooling, it solidifies into a glass-like surface. This is the final transformation — the piece emerges with its finished color, texture, and character.\n\n## Glaze Chemistry (Fundamentals)\n\nGlaze is essentially liquid glass applied to the surface of bisqueware before the final firing. Understanding the basics helps the AI answer guest questions about color, food safety, and surface finish.\n\n**Basic glaze formula:** Silica (glass-former) + Flux (melting agent) + Alumina (stabilizer). Additional colorants (metal oxides, stains) produce color.\n\n**Surface finishes:**\n- **Glossy:** High silica content, smooth and reflective. Most common. Easy to clean, food-safe when properly formulated.\n- **Matte:** Lower silica or higher alumina. Flat, non-reflective surface. Trendy and popular. Can feel slightly rough to the touch.\n- **Satin:** Between glossy and matte. Soft sheen, slightly velvety feel. Very popular for mugs and bowls.\n\n**Color development:**\n- Glaze color in the raw (unfired) state often looks nothing like the fired result — sometimes dramatically different. Metal oxides shift color in unpredictable, beautiful ways under heat.\n- **Oxidation atmosphere** (electric kilns): consistent, predictable color development. Blues stay blue. Reds stay red.\n- **Reduction atmosphere** (gas kilns): intentional oxygen deprivation during firing produces dramatic color shifts. Copper glazes turn red, iron glazes turn celadon green. Unpredictable and prized.\n- If {{kilnType}} includes gas kilns, reduction firing is available — instructors can explain to guests who ask.\n\n**Food safety:**\n- All studio glazes at {{businessName}} are lead-free and food-safe when properly fired to the correct cone.\n- Food safety requires: correct glaze chemistry (no raw lead), proper firing temperature (underfire can leave leachable materials), and no glaze crawling (bare clay areas).\n- Guests who specifically want food-safe functional ware should mention it during their glaze session.\n\n## The Cone System\n\nKilns are rated by \"cone\" — standardized temperature equivalents used across the ceramic industry:\n\n| Cone | Temperature (approx.) | Typical Use |\n|---|---|---|\n| Cone 06 | ~1,000°C | Low-fire glazes, terra cotta, earthenware |\n| Cone 04 | ~1,060°C | Low-fire glaze ceiling |\n| Cone 6 | ~1,225°C | Mid-fire stoneware (most common studio standard) |\n| Cone 10 | ~1,300°C | High-fire stoneware, porcelain |\n\n**Critical rule:** All pieces in a single kiln load must be compatible firing temperatures. Never load a Cone 6 piece and a Cone 10 piece in the same firing. The kiln fires to a single temperature — underfire causes weak, porous results; overfire melts pieces. At {{businessName}}, all work is typically fired together at the same cone unless otherwise noted for special projects.\n\n## Common Defects\n\nUnderstanding defects helps the AI explain what went wrong if a guest's piece has issues:\n\n| Defect | Cause | Prevention |\n|---|---|---|\n| **Cracking during drying** | Clay dried too fast (draft, direct sun) or uneven wall thickness | Even walls, slow drying under plastic; instructors handle this |\n| **Cracking during bisque fire** | Piece not fully bone dry before firing; rapid temperature rise | Ensure bone-dry; slow early kiln ramp |\n| **Explosion** | Trapped air bubbles or moisture | Proper wedging; fully bone-dry before firing |\n| **Glaze crawling** | Glaze applied too thick; dusty bisque surface | Clean bisqueware; apply appropriate glaze thickness |\n| **Pinholing** | Gas trapped in clay or glaze escaping during firing | Proper kiln firing schedule; correct glaze application |\n| **Glaze running** | Glaze applied too thick near base; flux-heavy glaze overfire | Leave 1/4\" bare at base; correct application weight |\n\n## The Multi-Session Timeline at {{businessName}}\n\nThis is the lifecycle of every piece made in the studio. Set guest expectations clearly:\n\n```\nDay 0: Guest creates piece in wheel throwing or handbuilding class\nDays 1–2: Piece trimmed by instructor (leatherhard stage)\nDays 2–6: Piece dries slowly on studio shelves (bone dry)\nDay 7–10: Bisque kiln loaded and fired (1–2 day firing cycle)\nDay 10–12: Kiln cools and unloads\nDay 12: Guest notified — piece ready for glaze session\nDay 12+: Guest attends Glaze & Fire session (separate booking)\nDay 12+1: Glaze kiln loaded and fired\nDay 17–19: Glaze kiln cools and unloads\nDay 19: Guest notified — piece ready for pickup!\n```\n\n**Communicate conservatively:** Always add 2 days to any estimate you give guests. Kiln loading depends on how full the kiln gets, and schedules can shift. A guest told \"2 weeks\" who waits 2.5 weeks is fine. A guest told \"10 days\" who waits 2 weeks is frustrated.\n\n## Wheel Throwing Instructor Ratio\n\nWheel throwing requires active, hands-on instruction — especially for beginners. One instructor can comfortably manage:\n- **Wheel throwing:** 1 instructor per 8 students maximum. At 6–8 students, a second instructor significantly improves the experience.\n- **Handbuilding:** 1 instructor per 12 students. Less real-time intervention needed; more self-directed once technique is demonstrated.\n- **Glaze sessions:** 1 instructor per 12 guests. Mostly independent with occasional guidance on color and technique.\n\n## Seasonal Patterns\n\n**Valentine's Day (February):** Date Night Pottery is a top booking. Expect 2–3× normal demand the week of Feb 14. Wheel throwing for two is a popular Valentine's gift.\n\n**Spring (March–May):** Private party bookings increase as corporate and celebration events ramp up. Handbuilding workshops grow — more casual, group-friendly energy.\n\n**Summer (June–August):** Family and youth bookings increase. Consider dedicated family handbuilding sessions. Gift card redemptions rise as summer travel winds down.\n\n**Holiday Season (November–December):** Gift card sales surge. Guests want to make gifts — bowls, mugs, and planters for the holidays. Plan firing capacity carefully — pieces made in mid-November need to be pickup-ready before Christmas if guests are giving them as gifts. That timeline is tight. Communicate clearly about turnaround when taking holiday bookings.\n";
|
|
17
|
+
|
|
18
|
+
/** Raw SKILL.md content for the `piece-tracker` skill. */
|
|
19
|
+
export const pieceTracker = "---\nid: piece-tracker\nname: Piece Tracker\ndescription: Tracks the multi-session lifecycle of pottery pieces from creation through bisque fire, glaze session, glaze fire, and pickup — providing status views for staff and individual guests with estimated timeline and action flags.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Piece Tracker\n\nYou track the lifecycle of every pottery piece made at {{businessName}} from creation to pickup. Pottery is the only experience type in the studio where the guest's work outlasts their session — a piece made on a Tuesday is still in the building two weeks later, being fired, cooled, glazed, fired again. This skill makes that process visible and manageable for both staff and guests.\n\n## When to Trigger\n\nInvoke this skill when:\n\n- A guest asks: \"Where is my piece?\", \"When will my piece be ready?\", \"What's the status of my pottery?\"\n- Staff asks: \"What's in the kiln queue?\", \"Who has pieces ready for pickup?\", \"Show me the active piece tracking\"\n- Any piece status, pickup notification, or firing lifecycle question\n\n## Piece Lifecycle Stages\n\nEvery piece at {{businessName}} passes through these stages in order. The current stage is stored as the session attribute `pieceStatus` on the booking entity.\n\n| Stage ID | Display Name | Description |\n|---|---|---|\n| `created` | Created | Just made by the guest. Sitting in the making area, still wet. |\n| `trimmed` | Trimmed & Drying | Instructor has trimmed the base/foot ring. On the drying shelf. |\n| `bisque-queued` | Bisque Queue | Bone dry and loaded into the kiln queue for first firing. |\n| `bisque-complete` | Bisque Complete | First firing done. Hard, porous bisqueware. Ready for glazing. |\n| `glazed` | Glazed | Guest has completed their Glaze & Fire session. Glaze applied. |\n| `glaze-queued` | Glaze Queue | Glazed piece loaded into kiln for final firing. |\n| `glaze-complete` | Ready for Pickup | Final firing complete. Piece is done. Pickup notification due. |\n| `picked-up` | Picked Up | Guest has collected their finished piece. Journey complete. |\n\n## Data Model\n\nPiece status is stored in the session attribute `pieceStatus` on the booking entity. Update via `brain.update()`:\n\n```typescript\nawait brain.update(bookingEntityId, {\n metadata: {\n sessionAttributes: {\n ...existingAttributes,\n pieceStatus: 'bisque-complete' // update to new stage\n }\n }\n});\n```\n\nGlaze & Fire session bookings are linked to the original making booking via a `References` relationship:\n\n```typescript\n// When creating a Glaze & Fire booking for a returning guest:\nawait brain.relate(glazeBookingId, 'References', originalMakingBookingId);\n```\n\n## Querying Piece Status\n\n### All Active Pieces (for staff view)\n\n```typescript\nconst activePieces = await brain.find({\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.locationId', value: LOCATION_ID },\n { field: 'metadata.status', value: 'confirmed' }\n ]\n});\n\n// Client-side filter: exclude stage 'picked-up', include all others\nconst inProgress = activePieces.filter(\n b => b.metadata.sessionAttributes?.pieceStatus &&\n b.metadata.sessionAttributes.pieceStatus !== 'picked-up'\n);\n```\n\n### A Specific Guest's Piece (for guest query)\n\n```typescript\nconst guestBookings = await brain.find({\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.customerId', value: CUSTOMER_ID },\n { field: 'metadata.locationId', value: LOCATION_ID }\n ]\n});\n// Find the most recent booking with a pieceStatus that is not 'picked-up'\n```\n\n## Output: Staff View\n\nPresent all active pieces as a table, sorted by creation date (oldest first — these need attention most):\n\n| Guest | Booking # | Piece | Clay | Stage | Created | Est. Ready | Flags |\n|---|---|---|---|---|---|---|---|\n| Jamie M. | CY-2602-A | Bowl | Stoneware | Bisque Complete | Feb 8 | Feb 22 | — |\n| Reese T. | CY-2602-B | Vase | Stoneware | Bisque Complete | Feb 8 | Feb 22 | Notify for glaze |\n| Sam P. | CY-2601-C | Mug | Porcelain | Glaze Queue | Jan 31 | Feb 19 | — |\n| Jordan L. | CY-2512-F | Planter | Stoneware | Ready for Pickup | Dec 12 | — | ⚠️ 68 days — urgent |\n\n**Flag rules:**\n- Any piece at `bisque-complete` with no linked Glaze & Fire booking: flag \"Notify for glaze session\"\n- Any piece at `glaze-complete` for more than 14 days: flag \"⚠️ [X] days — pickup overdue\"\n- Any piece at `glaze-complete` for more than 25 days: flag \"🔴 [X] days — approaching donation threshold\"\n- Any piece that has been in the same stage for more than twice the expected duration: flag \"Stuck — check status\"\n\n## Output: Guest View\n\nWhen a specific guest asks about their piece, use this format:\n\n> **Your [piece type] is currently [stage display name].**\n>\n> [Next step explanation in plain language, 1–2 sentences]\n>\n> **Estimated ready:** [date range, conservatively stated]\n\nExamples:\n\n**Stage: bisque-complete**\n> Your stoneware bowl is bisque-fired and ready for glazing. We'll reach out to schedule your Glaze & Fire session — usually within the next day or two.\n> **Estimated pickup:** approximately February 26–28 (after glazing + final fire).\n\n**Stage: glaze-queued**\n> Your vase is glazed and loaded into the kiln for its final firing. This is the last step — after firing and cool-down, it'll be ready to take home.\n> **Estimated ready:** approximately February 21–23. We'll text you the moment it's out.\n\n**Stage: glaze-complete**\n> Your bowl is done! It's fired, cooled, and ready for pickup. We'll send you a text today with pickup details.\n> **Pickup hours:** [include studio hours].\n\n## Timeline Estimates\n\nUse these for projecting dates. Always state conservatively (add 2 days to any internal estimate before communicating to guests):\n\n| Stage Transition | Expected Duration | What Affects It |\n|---|---|---|\n| Created → Trimmed | 1–2 days | Instructor availability, piece drying |\n| Trimmed → Bisque Queue | 2–5 days | Drying time (humidity-dependent) |\n| Bisque Queue → Bisque Complete | 2–3 days | Kiln load timing, firing cycle |\n| Bisque Complete → Glaze Session | Guest-controlled (they schedule) | — |\n| Glazed → Glaze Queue | 0–2 days | Glaze dry time |\n| Glaze Queue → Glaze Complete | 2–3 days | Kiln load timing, firing cycle |\n\n**Communicate conservatively:** If the internal estimate is Feb 19, tell the guest Feb 21. Surprises should always run in the direction of early, never late.\n\n## Staff Actions Available\n\nWhen operating in staff mode, surface these actions for each piece:\n\n- **Advance stage** — Move piece to the next lifecycle stage (with confirmation)\n- **Flag for review** — Mark a piece for instructor inspection (cracking, glaze issue, kiln incident)\n- **Mark as picked up** — Close the lifecycle when guest collects their piece\n- **Send pickup notification** — Trigger the pickup ready message to the guest\n- **Extend hold** — Add a note that the guest has requested a longer hold period\n\n## Integration Points\n\n- **staff-briefing:** Kiln queue counts feed directly into Section 3 of the morning briefing\n- **guest-letter:** The `estimatedBisqueDate` and `estimatedPickupDate` fields from piece tracking feed into the post-visit thank-you letter\n- **kiln-scheduler:** This skill and kiln-scheduler share the same data source (booking `pieceStatus` attributes); they are complementary views of the same firing queue\n";
|
|
20
|
+
|
|
21
|
+
/** Raw SKILL.md content for the `guest-letter` skill. */
|
|
22
|
+
export const guestLetter = "---\nid: guest-letter\nname: Guest Thank-You Letter\ndescription: Generates a personalized post-visit email for pottery studio guests referencing their specific piece, clay type, glazing status, firing timeline, and loyalty points — written in the voice of a pottery instructor who cares about the guest's piece.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Guest Thank-You Letter\n\nYou write personalized post-visit emails for {{businessName}} guests. These letters are sent after a wheel throwing, handbuilding, or date night pottery class — when the guest has left their piece behind and the firing journey is just beginning. The letter should make them feel excited about what's coming, informed about the timeline, and genuinely connected to what they made.\n\n## When to Trigger\n\nInvoke this skill when:\n\n- A booking is marked as completed and the system generates a post-visit communication\n- Staff manually requests a personalized thank-you for a specific booking\n- A guest asks for a summary of their visit\n\n## Input Data Available\n\nYou will receive a JSON object with:\n\n```json\n{\n \"partyNames\": [\"Jamie\", \"Reese\"],\n \"date\": \"2026-03-08\",\n \"locationName\": \"Clay & Co. Midtown\",\n \"experienceSlug\": \"wheel-throwing\",\n \"experienceName\": \"Wheel Throwing Class\",\n \"sessionAttributes\": [\n { \"key\": \"pieceType\", \"value\": \"bowl\", \"guestName\": \"Jamie\" },\n { \"key\": \"pieceType\", \"value\": \"vase\", \"guestName\": \"Reese\" },\n { \"key\": \"clayType\", \"value\": \"stoneware\" }\n ],\n \"glazingStatus\": \"pending\",\n \"estimatedBisqueDate\": \"2026-03-18\",\n \"estimatedPickupDate\": \"2026-03-29\",\n \"loyaltyPointsEarned\": 55,\n \"loyaltyTier\": \"bronze\",\n \"bookingNumber\": \"CY-2603-A\",\n \"staffNotes\": \"Jamie centered on the very first try! Reese's vase was the tallest piece of the day.\"\n}\n```\n\n## Letter Structure\n\nWrite 150–250 words. Five sections, no headers — it reads like a warm personal note, not a formatted document.\n\n### 1. Personalized Opener\nAddress the guest(s) by name. Reference today's date or the feeling of a class session. Not \"Thank you for visiting\" — write into the world of what they made.\n\nExample: \"Jamie and Reese — your stoneware is on the shelf, and it's still a little warm from the studio today.\"\n\n### 2. Their Specific Piece\nReference what each guest made — the piece type, the clay, any detail from `sessionAttributes` or `staffNotes`. If staff notes are present, build this section around the specific thing that happened.\n\nExample using staffNotes: \"Jamie, you centered on your very first try — something that takes most beginners half the session to achieve. Your bowl has a steadiness in its walls that reflects that. Reese, that vase may be the tallest piece we've had on the wheel all month.\"\n\n### 3. What Happens Next (Firing Timeline)\nExplain the next steps clearly but warmly. Not a policy document — frame it as the piece's own journey.\n\n- The piece is drying on our shelves right now\n- Bisque fire: estimated [estimatedBisqueDate] — we'll reach out to schedule the glaze session\n- Glaze fire and pickup: estimated [estimatedPickupDate] — we'll text when it's ready\n- Invite them to book a Glaze & Fire session once notified\n\nKeep it honest. If timing may shift, say so: \"Kiln schedules can shift by a few days, but we'll keep you updated every step of the way.\"\n\n### 4. Loyalty Points\nIf loyaltyPointsEarned > 0, briefly acknowledge it.\n\nExample: \"You earned 55 points on this visit — they're now in your account and apply toward future classes.\"\n\n### 5. Social Share Invite and Closing\nInvite them to share their experience. Make it feel like sharing, not promotion.\n\nExample: \"If you want to document your piece at any stage — from wet clay to fired finish — tag us at @{{instagram}}. We love watching what people make.\"\n\nClose warmly. Not \"Best regards\" — close like a note from the studio that made them something.\n\n## Style Rules\n\n- **2nd person or direct address** — \"You\" or \"[Name], your piece...\"\n- **The piece is real** — it's a physical object that survived their hands, is now surviving its own drying process, and will survive the kiln. Treat it with the same respect.\n- **staffNotes are the most personal input available** — if they exist, the entire emotional core of the letter should center on the specific thing described\n- **Never generic** — \"We hope you had a wonderful time\" is forbidden. Reference the specific experience.\n- **Timing is honest** — Don't promise faster than you can deliver. The guest's excitement is real; don't undermine it with late pickups.\n- **The letter is from the studio, not a machine** — Use \"we\" and \"our instructors\" and write as if a person at the studio sat down to write this after a long, satisfying day of teaching\n\n## Output Format\n\nReturn the email in plain prose — no headers, no bullet points, no markdown formatting. This is a letter, not a report.\n\nInclude a subject line suggestion at the top:\n\n```\nSubject: Your piece is on the shelf, [First Name(s)]\n\n[Letter body]\n```\n";
|
|
23
|
+
|
|
24
|
+
/** Raw SKILL.md content for the `booking-digest` skill. */
|
|
25
|
+
export const bookingDigest = "---\nid: booking-digest\nname: Booking Digest\ndescription: Summarizes pottery studio bookings for a specified period with aggregate stats by class type, daily breakdown, multi-session tracking notes, and week-over-week trend comparison.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Booking Digest\n\nYou produce booking summary reports for {{businessName}} staff and management. Given a date range (defaulting to the current Monday–Sunday week), you pull aggregate booking data from Brainy and present it as a concise, structured digest.\n\n## When to Trigger\n\nInvoke this skill when someone asks:\n\n- \"Booking summary\"\n- \"How many bookings this week?\"\n- \"Show me bookings for [period]\"\n- \"How did we do last month in bookings?\"\n- \"Week in review — bookings\"\n- Any request for a period-based booking count or revenue summary\n\n## Default Period\n\nIf no date range is specified, use the **current Monday through Sunday** (ISO weeks, Monday start). If a partial week is in progress, include all available days up to today.\n\nAccept natural language overrides: \"this month\", \"last week\", \"last 30 days\", \"February\", \"Q1\".\n\n## Aggregate Definition\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 bookingCount: { op: 'COUNT' },\n totalGuests: { op: 'SUM', field: 'metadata.guestCount' },\n totalRevenue: { op: 'SUM', field: 'metadata.totalInCents' },\n avgPartySize: { op: 'AVG', field: 'metadata.guestCount' },\n maxPartySize: { op: 'MAX', field: 'metadata.guestCount' }\n }\n});\n\nconst results = await brain.find({\n aggregate: 'bookingsByExperienceDay',\n where: [\n { field: 'metadata.locationId', value: LOCATION_ID },\n { field: 'metadata.date', value: { gte: START_DATE, lte: END_DATE } }\n ],\n orderBy: 'totalRevenue',\n order: 'desc'\n});\n```\n\nAlso pull the **same period last week** by shifting the date range back 7 days, for trend comparison.\n\n## Output Structure\n\nPresent the digest in this order. Use markdown formatting throughout.\n\n---\n\n### 1. Period Summary\n\n```\nBooking Digest: Mon Feb 10 – Sun Feb 16, 2026\n──────────────────────────────────────────────\nTotal Bookings: 31\nTotal Guests: 74\nTotal Revenue: $3,485.00\nAvg Party Size: 2.4 guests\n```\n\n### 2. By Class Type\n\nA table showing performance per experience type for the period:\n\n| Class | Bookings | Guests | Revenue | Avg Party |\n|---|---|---|---|---|\n| Wheel Throwing Class | 14 | 32 | $1,760 | 2.3 |\n| Handbuilding Workshop | 9 | 26 | $1,170 | 2.9 |\n| Date Night Pottery | 4 | 8 | $400 | 2.0 |\n| Glaze & Fire Session | 3 | 6 | $105 | 2.0 |\n| Private Pottery Party | 1 | 8 | $520 | 8.0 |\n\nSort by revenue descending. Include a **Total** row at the bottom.\n\nDivide all `InCents` values by 100 before display. Format as `$X,XXX.XX`.\n\n**Pottery note:** Glaze & Fire sessions will always show lower per-booking revenue but represent returning customers who made pieces in earlier wheel throwing or handbuilding classes. A high Glaze & Fire volume relative to making classes is a healthy indicator of good piece-tracking follow-through.\n\n### 3. Daily Breakdown\n\nA table showing each day in the period:\n\n| Day | Date | Bookings | Revenue | vs. Avg |\n|---|---|---|---|---|\n| Monday | Feb 10 | 2 | $190 | -41% |\n| Tuesday | Feb 11 | 4 | $378 | +18% |\n| Wednesday | Feb 12 | 5 | $472 | +47% |\n| Thursday | Feb 13 | 4 | $378 | +18% |\n| Friday | Feb 14 | 7 | $784 | +144% ⭐ |\n| Saturday | Feb 15 | 6 | $672 | +110% |\n| Sunday | Feb 16 | 3 | $283 | -12% |\n\nMark the peak day with a ⭐. Calculate \"vs. Avg\" as percentage above/below the period daily average.\n\n### 4. Multi-Session Notes\n\nPottery is unique: a single piece creation event leads to one or more return visits. Report on the active piece-tracking pipeline for this period:\n\n- **Pieces in progress this period:** Count of bookings with a `pieceStatus` session attribute that is not `picked-up` (i.e., active pieces in the firing lifecycle)\n- **Pieces completing this period:** Count of pieces that moved to `glaze-complete` during this period (ready for pickup)\n- **Glaze & Fire conversion:** What percentage of this period's wheel throwing / handbuilding guests from 2–3 weeks prior have now returned for a glaze session?\n\nExample output:\n```\nMulti-Session Pipeline\n Active pieces in firing cycle: 42\n Pieces ready for pickup (period): 11\n Glaze return rate (cohort): 78% — guests who made pieces 2–3 wks ago\n```\n\nA return rate below 60% suggests guests may not have been notified about bisque-complete, or are having trouble scheduling a glaze session. Flag this if it occurs.\n\n### 5. Notable\n\n- **Largest group:** Guest count + class type + date (e.g., \"Party of 8 — Private Pottery Party, Feb 15\")\n- **Highest-value booking:** Total amount + class + date\n- **Cancellations:** Count of cancelled bookings for the period (query where `status = 'cancelled'`). If zero: \"No cancellations this period.\"\n\n### 6. Week-Over-Week Trend\n\nIf comparison data for the prior week is available:\n\n```\nvs. Last Week (Feb 3–9)\n Bookings: +5 (+19%)\n Guests: +12 (+19%)\n Revenue: +$430 (+14%)\n```\n\nIf prior week data is unavailable, state clearly: \"Comparison data not available for prior week.\"\n\n## Formatting Rules\n\n- All revenue figures: divide cents by 100, format as `$X,XXX.XX`\n- All percentages: 1 decimal place (e.g., `+17.3%`)\n- Dates: `Mon Feb 10` format for table rows, `February 10, 2026` for prose headers\n- Never display raw cent values\n- Use `—` in table cells when data is unavailable (not `0`, not `null`)\n";
|
|
26
|
+
|
|
27
|
+
/** Raw SKILL.md content for the `customer-insights` skill. */
|
|
28
|
+
export const customerInsights = "---\nid: customer-insights\nname: Customer Insights\ndescription: Segments the pottery studio customer base using neural clustering into five behavioral profiles, surfaces VIP guests by lifetime value, flags high-value churn risks, and identifies customers with unclaimed pieces.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Customer Insights\n\nYou perform behavioral customer analysis for {{businessName}} — segmenting guests by spend and visit patterns, identifying VIPs worth nurturing, surfacing high-value customers at churn risk, and tracking acquisition trends. All analysis draws on live Brainy data using aggregates and neural clustering.\n\n## When to Trigger\n\nInvoke this skill when someone asks:\n\n- \"Who are our best customers?\"\n- \"Customer segments\"\n- \"Who hasn't been back lately?\"\n- \"Churn risk analysis\"\n- \"VIP list\"\n- \"Loyalty breakdown\"\n- \"How many new customers this month?\"\n- \"Who hasn't picked up their piece yet?\"\n- Any customer relationship or loyalty analysis request\n\n## Step 1: Pull Customer Aggregate\n\n```typescript\nbrain.defineAggregate('customerLifetimeValue', {\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.customerId' }\n ],\n metrics: {\n totalSpent: { op: 'SUM', field: 'metadata.amountInCents' },\n visitCount: { op: 'COUNT' },\n avgTicket: { op: 'AVG', field: 'metadata.amountInCents' },\n maxTicket: { op: 'MAX', field: 'metadata.amountInCents' }\n }\n});\n\nconst ltv = await brain.find({\n aggregate: 'customerLifetimeValue',\n where: [{ field: 'metadata.locationId', value: LOCATION_ID }],\n orderBy: 'totalSpent',\n order: 'desc'\n});\n// Also pull lastVisitDate from each customer's most recent booking metadata\n```\n\n## Step 2: Neural Clustering\n\nRun behavioral clustering on the customer population:\n\n```typescript\nconst segments = await brain.neural().clusters({\n numClusters: 5,\n entityType: 'Person',\n where: [\n { field: 'metadata.entityType', value: 'customer' },\n { field: 'metadata.locationId', value: LOCATION_ID }\n ]\n});\n// → Array<{ label: string, members: Entity[], centroid: number[] }>\n```\n\n## Step 3: Outlier Detection\n\nIdentify VIP candidates and churn risks at the extremes of the distribution:\n\n```typescript\nconst outliers = await brain.neural().outliers({\n threshold: 2.0, // z-score: catches top/bottom ~5% of customers\n method: 'zscore',\n entityType: 'Person',\n minNeighbors: 3\n});\n// → Array<{ entity: Entity, reason: string, score: number }>\n```\n\n## Segment Labeling Guide\n\nMap the 5 neural clusters to pottery-specific, business-meaningful labels based on the `centroid` vector dimensions (spend and frequency):\n\n| Segment Name | Cluster Characteristics | Priority Action |\n|---|---|---|\n| **Master Potters** | High spend + high frequency + multiple class types attended | Enroll in gold/platinum loyalty; invite to exclusive workshops or advanced sessions |\n| **Weekend Warriors** | Mid spend + consistent weekend frequency, usually wheel throwing | Upsell to multi-session progressions; date night + follow-up glaze sessions |\n| **Gift Givers** | Mostly gift card redemptions or single-visit bookings around gift-giving periods | Re-engagement in post-visit — the gift experience is the hook |\n| **Multi-Session Committed** | Attended both a making class and a Glaze & Fire session — completed the full journey | Highest loyalty potential; ideal for loyalty enrollment + return class promotions |\n| **One-Time Makers** | Single class only; no Glaze & Fire return, no second booking | Re-engagement campaign; reminder that their piece is still being fired (if applicable) |\n\nApply labels based on cluster centroid proximity to these profiles — do not mechanically force every cluster into a label if the data tells a different story.\n\n## Pottery-Specific: Unclaimed Pieces Alert\n\n```typescript\n// Find customers who have pieces at glaze-complete stage but have not picked up\nconst unclaimed = await brain.find({\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.sessionAttributes.pieceStatus', value: 'glaze-complete' },\n { field: 'metadata.locationId', value: LOCATION_ID }\n ]\n});\n// Cross-reference with booking date to identify pieces older than 14 days at glaze-complete\n```\n\nSurface customers with pieces ready for pickup for more than 14 days. These guests need a follow-up notification. Per the studio policy, pieces unclaimed after 30 days are donated.\n\n## Output Structure\n\n---\n\n### 1. Segment Overview\n\n| Segment | Customers | Avg Lifetime Value | Avg Visits | Recommended Action |\n|---|---|---|---|---|\n| Master Potters | 18 | $318 | 5.8 | Advanced workshop invites + loyalty perks |\n| Multi-Session Committed | 42 | $112 | 2.8 | Loyalty enrollment + return class promotions |\n| Weekend Warriors | 64 | $128 | 2.4 | Date night upsell + multi-session packages |\n| Gift Givers | 38 | $58 | 1.2 | Post-visit re-engagement within 30 days |\n| One-Time Makers | 76 | $52 | 1.0 | \"Come back for your glaze session\" campaign |\n\nShow total customer count below the table.\n\n### 2. VIP List\n\nTop 10 customers by lifetime value. Include last visit date to flag anyone overdue for a return:\n\n| Rank | Customer | Total Spent | Visits | Last Visit | Loyalty Tier | Status |\n|---|---|---|---|---|---|---|\n| 1 | Jamie M. | $724 | 13 | Jan 28, 2026 | Platinum | Active |\n| 2 | Reese T. | $612 | 11 | Feb 14, 2026 | Gold | Active |\n| 3 | Alex K. | $508 | 9 | Nov 3, 2025 | Gold | ⚠️ 108 days |\n\nFlag any VIP last seen more than 60 days ago with ⚠️ and the days-since count.\n\nPrivacy note: display first name + last initial only.\n\n### 3. Churn Risk List\n\nHigh-value customers (top 25% by lifetime value) who have not visited in 60+ days. These are the highest-priority win-back targets.\n\n| Customer | Lifetime Value | Visits | Last Visit | Days Absent | Segment |\n|---|---|---|---|---|---|\n| Alex K. | $508 | 9 | Nov 3, 2025 | 108 | Master Potters |\n| Jordan R. | $440 | 8 | Oct 15, 2025 | 127 | Weekend Warriors |\n\nIf no customers meet the churn risk threshold: \"No high-value customers are currently at churn risk. Great retention!\"\n\n### 4. Unclaimed Pieces Alert\n\nCustomers with pieces at `glaze-complete` status for more than 14 days:\n\n| Customer | Booking # | Piece Type | Ready Since | Days Waiting | Action |\n|---|---|---|---|---|---|\n| Sam P. | CY-2401-C | Bowl (stoneware) | Feb 4, 2026 | 15 | Send pickup reminder |\n| Morgan L. | CY-2312-F | Vase (porcelain) | Jan 28, 2026 | 22 | Urgent follow-up |\n\nFlag any piece waiting more than 25 days in red — approaching the 30-day donation threshold.\n\nIf no unclaimed pieces: \"No pieces are past the 14-day pickup threshold.\"\n\n### 5. New Customer Acquisition Trend\n\nNew customers per month for the trailing 6 months. \"New\" = first-ever booking at this location.\n\n| Month | New Customers | vs. Prior Month |\n|---|---|---|\n| Sep 2025 | 18 | — |\n| Oct 2025 | 22 | +22% |\n| Nov 2025 | 20 | -9% |\n| Dec 2025 | 31 | +55% |\n| Jan 2026 | 14 | -55% |\n| Feb 2026 | 26 | +86% |\n\nBriefly note any obvious driver of spikes or dips (e.g., \"December spike aligns with holiday gift bookings and private party season\").\n\n### 6. Loyalty Tier Distribution\n\nCounts of active loyalty accounts by tier, with average points balance:\n\n| Tier | Accounts | Avg Points Balance |\n|---|---|---|\n| Bronze | 128 | 118 |\n| Silver | 44 | 362 |\n| Gold | 16 | 1,084 |\n| Platinum | 6 | 3,840 |\n\nTotal enrolled: [sum]. Note percentage of total customer base enrolled in loyalty.\n\n## Privacy Guidelines\n\n- Display customer names as **First name + Last initial** only (e.g., \"Jamie M.\")\n- Never display full email addresses in output\n- Do not surface specific piece details or booking content in this report — that belongs in the guest-letter or piece-tracker skills\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: Background skill teaching the AI assistant the complete Venue platform data architecture — entity types, relationships, and the full Brainy API including aggregates, neural clustering, streaming, and counts.\ntype: background\nversion: 1.0.0\nrequiresVision: false\nrequiresData: false\n---\n\n# Venue Data Model\n\nYou are operating on the Venue platform, built on **@soulcraft/brainy** — a graph database with vector search, neural clustering, and aggregate query capabilities. This skill gives you a complete map of every entity type, relationship, and API call available to you when answering data-driven questions for {{businessName}}.\n\n## Entity Types\n\nEvery entity has a `type` (NounType) and a `metadata.entityType` string that further classifies it within that type. Always filter by both when querying.\n\n| NounType | `metadata.entityType` | Purpose | Key Metadata Fields |\n|---|---|---|---|\n| Location | `location` | Franchise location record | `address`, `hours`, `timezone`, `stripeAccountId`, `locationId` |\n| Product | `experience` | Bookable experience / ticket type | `slug`, `name`, `priceInCents`, `durationMinutes`, `minGuests`, `maxGuests`, `locationId` |\n| Event | `booking` | Guest reservation | `status` (pending/confirmed/completed/cancelled), `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 action log | `action`, `actorId`, `actorName`, `entityId`, `entityType`, `locationId` |\n| Event | `experience-memory` | Shareable visit storybook page | `bookingId`, `token` (public URL slug), `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 balance and tier | `customerId`, `pointsBalance`, `tier` (bronze/silver/gold/platinum), `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` (draft/published), `tags`, `authorId`, `locationId` |\n| Document | `adoption-application` | Animal adoption form | `kittenId`, `applicantEmail`, `status`, `locationId` |\n| Thing | `inventory-item` | Stock item with quantity tracking | `name`, `category`, `quantity`, `reorderThreshold`, `costInCents`, `locationId` |\n| Thing | `gift-card` | Digital or physical gift card | `code`, `balanceInCents`, `originalAmountInCents`, `redeemedAt`, `locationId` |\n| Measurement | `transaction` | Revenue, expense, or refund record | `type` (revenue/expense/refund), `amountInCents`, `experienceSlug`, `category`, `date`, `stripeId`, `locationId` |\n| Measurement | `loyalty-transaction` | Points earned, redeemed, or expired | `customerId`, `points`, `reason` (earned/redeemed/expired), `locationId` |\n| Organism | `kitten` | Foster animal profile | `name`, `age`, `breed`, `personalities`, `adoptionStatus`, `locationId` |\n\n## Relationships\n\nGraph edges connect entities using typed verbs. Use relationships to traverse the graph without duplicating data.\n\n| Relationship | Meaning |\n|---|---|\n| Location **Contains** Experience, TimeSlot, InventoryItem | What exists at a given location |\n| Booking **ParticipatesIn** TimeSlot | Which slot a reservation occupies |\n| Customer **Creates** Booking, Waiver, AdoptionApplication | Ownership of guest-initiated records |\n| Booking **Contains** Experience | Line items on a reservation |\n| Transaction **References** Booking | Revenue record linked back to a booking |\n| Memory **References** Booking | Visit storybook linked to a booking |\n| Booking **References** Booking | Glaze & Fire session linked back to original making booking |\n| Staff **MemberOf** Location | Employee location assignment |\n| LoyaltyAccount **BelongsTo** Customer | One loyalty account per customer |\n\n## Brainy Aggregate API\n\nAggregates are the primary tool for financial summaries, trend analysis, and operational reporting. Define them once, then query them with filters.\n\n### Defining and Running an Aggregate\n\n```typescript\n// Step 1: Define a named aggregate (do this once at startup or on demand)\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 maxTicket: { op: 'MAX', field: 'metadata.amountInCents' },\n minTicket: { op: 'MIN', field: 'metadata.amountInCents' },\n revenueStdDev: { op: 'STDDEV', field: 'metadata.amountInCents' },\n revenueVariance: { op: 'VARIANCE', field: 'metadata.amountInCents' }\n }\n});\n\n// Step 2: Execute with runtime filters, ordering, and limits\nconst results = await brain.find({\n aggregate: 'revenueByExperienceMonth',\n where: [{ field: 'metadata.locationId', value: 'loc-abc123' }],\n orderBy: 'totalRevenue',\n order: 'desc',\n limit: 100\n});\n// Returns: Array<{ groupKey: string, metrics: Record<string, number>, count: number }>\n```\n\n### Supported Aggregation Operations\n\n| `op` value | Meaning |\n|---|---|\n| `SUM` | Sum all values in the group |\n| `COUNT` | Count records in the group |\n| `AVG` | Arithmetic mean of values |\n| `MIN` | Minimum value in the group |\n| `MAX` | Maximum value in the group |\n| `STDDEV` | Population standard deviation |\n| `VARIANCE` | Population variance |\n\n### Supported Time Windows (for `groupBy` with `window`)\n\n`hour` | `day` | `week` | `month` | `quarter` | `year`\n\n---\n\n## Counts API\n\nO(1) fast counts without loading entities into memory. Use for dashboards and health checks.\n\n```typescript\n// Count by NounType — always O(1)\nconst totals = await brain.counts.byType();\n// → { Event: 450, Person: 210, Measurement: 890, Thing: 340, Document: 120, Organism: 28, Location: 3 }\n\n// Count with filter 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 { field: 'metadata.status', value: 'confirmed' }\n ]\n});\n// → { total: 14 }\n\n// Full graph statistics\nconst stats = await brain.getStats();\n// → { entities: 1540, relationships: 3200, density: 0.42, byType: { ... } }\n```\n\n---\n\n## Neural API\n\nMachine-learning operations on the graph. Use for segmentation, anomaly detection, and similarity search.\n\n```typescript\n// Cluster customers into behavioral segments\nconst segments = await brain.neural().clusters({\n numClusters: 5,\n entityType: 'Person',\n where: [{ field: 'metadata.entityType', value: 'customer' }]\n});\n// → Array<{ label: string, members: Entity[], centroid: number[] }>\n\n// Detect anomalous entities (outliers and VIPs)\nconst outliers = await brain.neural().outliers({\n threshold: 2.5, // z-score cutoff — higher = fewer results\n method: 'zscore', // 'zscore' | 'iqr' | 'isolation'\n entityType: 'Measurement',\n minNeighbors: 3\n});\n// → Array<{ entity: Entity, reason: string, score: number }>\n\n// Find semantically similar entities via vector embedding\nconst similar = await brain.neural().similar('entity-id-123', { limit: 10 });\n// → Array<{ entity: Entity, similarity: number }>\n```\n\n---\n\n## Streaming API\n\nProcess large result sets without loading everything into memory. Use for bulk exports, batch jobs, and anything where result count may exceed a few thousand.\n\n```typescript\n// Stream entities by type with optional filter\nfor await (const booking of brain.streaming.entities({\n type: 'Event',\n where: [{ field: 'metadata.entityType', value: 'booking' }]\n})) {\n // process one booking at a time — no memory accumulation\n}\n\n// Stream vector search results\nfor await (const result of brain.streaming.search('wheel throwing pottery class', {\n type: 'Event',\n limit: 200\n})) {\n // result.entity, result.score\n}\n```\n\n---\n\n## Export API\n\nGenerate tabular exports from any entity type for spreadsheets, finance tools, or OData consumers.\n\n```typescript\nimport { TabularExporter } from '@soulcraft/brainy';\n\nconst exporter = new TabularExporter(brain);\n\n// CSV export\nconst { data, rowCount } = await exporter.exportCsv({ type: 'Measurement' });\n\n// OData export (for Power BI, Excel, etc.)\nconst odata = await exporter.exportOData({ type: 'Measurement' });\n```\n\n---\n\n## Critical Rules\n\nThese rules govern every query you run on this platform. Violating them produces wrong or corrupt data.\n\n1. **All monetary amounts are stored as integers in cents.** Always divide by 100 for display. `$55.00 = 5500`. Never store or compute floats.\n\n2. **Always filter by `metadata.locationId`** when producing per-location reports. The database is shared across all franchise locations.\n\n3. **Always include `metadata.entityType`** when querying Event, Person, Document, Thing, or Measurement types. Without it, you will mix bookings with time-slots, customers with staff, and transactions with loyalty records.\n\n4. **Audit events are append-only.** Never update or delete a record with `metadata.entityType === 'audit-event'`.\n\n5. **Stripe is the source of truth for payments.** `metadata.stripeId` links to Stripe; Brainy stores reference IDs only. Do not compute refunds or charges from Brainy data alone.\n\n6. **Do not write files directly to `brainy-data/`.** All mutations must go through the Brainy API (`brain.add()`, `brain.update()`, `brain.relate()`). Direct filesystem writes bypass indexes and cause corruption.\n\n7. **Pottery is a multi-session process.** A booking for a wheel throwing or handbuilding class is not the end of the customer journey — it triggers a piece-tracking lifecycle. Glaze & Fire bookings are linked to original making bookings via `References` relationships. When querying revenue or customer lifetime value, account for this: a customer who made one pot and returned for two glaze sessions has three bookings but one piece journey.\n";
|
|
32
|
+
|
|
33
|
+
/** Raw SKILL.md content for the `blog-draft` skill. */
|
|
34
|
+
export const blogDraft = "---\nid: blog-draft\nname: Blog Post Draft\ndescription: Drafts SEO-optimized blog posts for Clay & Co. across technique guides, kiln science, pottery history, gift guides, studio updates, and seasonal topics — in an earthy, tactile, and thoughtful voice.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: false\n---\n\n# Blog Post Draft\n\nYou draft blog posts for {{businessName}}. Posts should inform, delight, and drive local discovery — balancing genuine pottery knowledge with the warmth of a community studio voice.\n\n## When to Trigger\n\nInvoke this skill when someone asks:\n\n- \"Write a blog post about [topic]\"\n- \"Draft a post on wheel throwing for beginners\"\n- \"I need blog content for [month]\"\n- \"Write something about our pottery process\"\n- Any request for blog or long-form content\n\n## Content Categories\n\nChoose the most relevant category based on the request or suggest the best fit if no topic is specified:\n\n### Technique Guides\nAccessible deep-dives into pottery techniques. Written for curious beginners — not art school graduates.\n\nExample topics:\n- \"A Beginner's Guide to Wheel Throwing\" — centering, opening, pulling. What to expect, what's hard, and why that's okay.\n- \"5 Common Pottery Mistakes (And What They're Actually Teaching You)\" — cracking, collapsing, wobbly walls. Reframe failure as learning.\n- \"Handbuilding vs. Wheel Throwing: Which Is Right for You?\" — practical comparison for someone booking their first class.\n- \"What Is Trimming, and Why Does It Matter?\" — explain the leatherhard stage for guests curious about what happens after class.\n\n### Kiln Science\nDemystify the transformation that happens inside the kiln. This is genuinely fascinating content.\n\nExample topics:\n- \"How Firing Transforms Clay: The Science of Ceramics\" — greenware to bisque to glaze fire. Chemical changes, not just heat.\n- \"What Do Cone Numbers Mean?\" — explain the cone system in plain language.\n- \"Why Your Glaze Looks Different After Firing\" — color chemistry, oxidation vs. reduction, why the preview tiles matter.\n- \"What Causes Pottery to Crack — And How We Prevent It\" — air bubbles, drying, thermal shock. Educational and trust-building.\n\n### Pottery History and Traditions\nConnect the studio's work to the 25,000-year history of ceramics.\n\nExample topics:\n- \"The World's Oldest Craft: A Brief History of Pottery\"\n- \"From Coils to Wheels: How Pottery Evolved\"\n- \"Wabi-Sabi and the Beauty of Imperfect Ceramics\" — Japanese aesthetic philosophy applied to studio pottery.\n- \"Why Every Culture on Earth Makes Pottery\"\n\n### Gift Guides\nDrive gift card and booking gift sales.\n\nExample topics:\n- \"10 Unique Handmade Gifts from {{city}} (That Aren't Another Candle)\"\n- \"Why a Pottery Class Is the Perfect Gift for Someone Who Has Everything\"\n- \"How to Give the Gift of a Private Pottery Party\"\n\n### Studio Updates and Community\nHumanize the studio. Showcase finished work, instructor profiles, studio life.\n\nExample topics:\n- \"Introducing Our Instructors\" — instructor profiles with their pottery backgrounds\n- \"Pieces We Love: Student Work from This Month\"\n- \"What It's Like to Work in a Pottery Studio\"\n\n### Seasonal Content\nTime-sensitive posts that align with gifting and event occasions.\n\nExample topics:\n- **February:** \"Valentine's Day Date Night: Wheel Throwing for Two\"\n- **November:** \"Holiday Pottery Gift Ideas — And Why You Need to Book Now\" (explain firing timeline honestly)\n- **March:** \"Spring Is the Perfect Time to Start a New Craft\"\n- **September:** \"Back to Making: Why Fall Is Our Favorite Season in the Studio\"\n\n## SEO Guidance\n\n**Primary keyword:** \"pottery class {{city}}\" or \"wheel throwing {{city}}\"\n\nFor local SEO, every post should naturally include:\n- City name at least twice in the body\n- The studio name at least once\n- A clear call to action linking to the booking page\n\nSecondary keywords to weave in where natural: \"ceramics class\", \"handbuilding workshop\", \"pottery studio {{city}}\", \"beginner pottery\"\n\n## Post Structure\n\n```\nTitle: [60–70 characters, include primary keyword where natural]\nMeta description: [150–160 characters, include \"pottery class {{city}}\" and a benefit]\n\nIntro paragraph (80–100 words):\n Hook the reader. Start with a specific sensory detail or surprising fact —\n not \"At {{businessName}}, we believe...\" Open in the world of pottery, not the world of the studio.\n\nBody (600–900 words):\n 3–5 subheaded sections. Mix practical information with genuine enthusiasm.\n Every claim should feel grounded — like it's coming from someone who has\n actually worked with clay, not read about it.\n\nClosing CTA (50–80 words):\n Warm invitation to book, visit, or share. Don't hard-sell. Earn the click.\n```\n\n## Voice and Style\n\n**Earthy, thoughtful, tactile.** This is a pottery studio, not a tech company. The language should feel like clay — honest, weighted, satisfying in the hand.\n\n- Write about what clay feels like, not just what it looks like\n- Use specific sensory details: \"the chalky surface of a bone-dry bowl\", \"the slight resistance of leatherhard clay under a trimming tool\"\n- Reference the meditative quality of the wheel — centering clay has a way of centering the person\n- Avoid superlatives (\"amazing\", \"incredible\", \"best\") — prefer precise descriptors\n- Never write \"there is nothing quite like...\" — show the specific thing instead\n- The finished piece matters: you take home something real, fired in a kiln, made with your hands. This is not air-dry craft. Lean on this distinction.\n\n## Output Format\n\nReturn the complete post in markdown, including:\n\n```\n# Title\n\n**Meta description:** [150–160 chars]\n\n[Body in markdown with ## subheadings]\n\n---\n*Ready to try it yourself? [Book a class at {{businessName}} in {{city}}](/book/{{locationSlug}}) — no experience required.*\n```\n";
|
|
35
|
+
|
|
36
|
+
/** Raw SKILL.md content for the `kiln-scheduler` skill. */
|
|
37
|
+
export const kilnScheduler = "---\nid: kiln-scheduler\nname: Kiln Scheduler\ndescription: Plans bisque and glaze kiln loads by querying the active piece pipeline, estimates cubic footage requirements, recommends optimal firing dates, flags clay type compatibility, and generates firing parameters tailored to the studio's kiln type(s).\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Kiln Scheduler\n\nYou plan kiln firings for {{businessName}}. The pottery studio's entire multi-session workflow depends on efficient kiln management — pieces wait in the queue, and the kiln fires when a load is ready. This skill turns that queue into a concrete firing schedule with dates, load estimates, and firing parameters.\n\n## When to Trigger\n\nInvoke this skill when someone asks:\n\n- \"Kiln schedule\"\n- \"What's in the kiln queue?\"\n- \"When should we load the bisque kiln?\"\n- \"Plan next week's firings\"\n- \"Loading the kiln — what goes in?\"\n- Any firing planning or kiln management question\n\n## Kiln Capacity Concepts\n\nUnderstanding capacity is essential before planning a load.\n\n**Standard studio electric kiln:** approximately 7–10 cubic feet, loaded on 2–4 shelves.\n\n**Capacity rules of thumb:**\n- **Bisque load:** Pieces can be stacked and loaded more densely. Bisque firing does not use glaze, so touching is acceptable. A 7 cu ft kiln can typically hold 15–25 bisque pieces depending on size.\n- **Glaze load:** Pieces cannot touch (glaze melts and would fuse them together). Glazed pieces need at least 0.5\" clearance from each other and from kiln walls. The same kiln fits 12–18 glazed pieces per load.\n- **Size adjustments:** Tall pieces (vases over 8\") take vertical space; wide pieces (plates, large bowls) take shelf space. Account for both dimensions. A tall vase may require an entire shelf row to itself on the upper kiln section.\n\n**If {{kilnType}} includes gas kilns:**\n- Gas kilns fire in reduction atmosphere — intentional oxygen deprivation produces dramatic glaze color shifts (copper → red, iron → celadon).\n- Schedule reduction firings separately from standard oxidation firings.\n- Raku kiln (if available): fired outdoors, extremely rapid cycle, pieces pulled while glowing and placed in reduction chambers. Schedule separately from all other firings.\n\n## Data to Query\n\n### Bisque Queue\n\n```typescript\nconst bisqueQueue = await brain.find({\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.sessionAttributes.pieceStatus', value: 'bisque-queued' },\n { field: 'metadata.locationId', value: LOCATION_ID }\n ]\n});\n// Each booking has: guestName, pieceType, clayType, date, bookingNumber\n```\n\n### Glaze Queue\n\n```typescript\nconst glazeQueue = await brain.find({\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.sessionAttributes.pieceStatus', value: 'glaze-queued' },\n { field: 'metadata.locationId', value: LOCATION_ID }\n ]\n});\n// Each booking also has: glazeColors, firingType (glossy/matte/satin)\n```\n\nAlso pull pieces at `trimmed` stage to project pieces approaching bisque-ready in the next 3–5 days:\n\n```typescript\nconst nearlyReady = await brain.find({\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.sessionAttributes.pieceStatus', value: 'trimmed' },\n { field: 'metadata.locationId', value: LOCATION_ID }\n ]\n});\n```\n\n## Clay Type Compatibility\n\n**Critical rule:** All pieces in a single kiln load must be fired at the same cone (temperature). Mixing incompatible cone levels ruins pieces.\n\n| Clay Type | Typical Firing Cone | Temperature |\n|---|---|---|\n| Standard stoneware | Cone 6 | ~1,225°C |\n| Porcelain | Cone 6–10 | ~1,225–1,300°C |\n| Earthenware | Cone 06 | ~1,000°C |\n\n**Mixing rules:**\n- Cone 6 stoneware + Cone 6 porcelain: compatible — fire together\n- Cone 6 stoneware + Cone 06 earthenware: **NOT compatible** — must fire separately\n- Cone 10 + Cone 6: **NOT compatible** — must fire separately\n- Raku pieces: always separate, outdoor kiln, special process\n\nAt {{businessName}}, the standard class clay is stoneware (Cone 6). Flag any porcelain pieces and confirm they fire at Cone 6 before loading with stoneware. If any piece is from a different clay body with a different target cone, it must be scheduled in a separate firing.\n\n## Output Structure\n\n---\n\n### 1. Bisque Queue Summary\n\n```\nBisque Queue — {{locationName}}\nAs of: [today's date]\n──────────────────────────────────\nPieces ready to load: 14\nPieces drying (2–5 days): 8\nEstimated kiln loads needed: 1 (fits in one 7 cu ft load)\n```\n\nList each piece in queue:\n\n| Booking # | Guest | Piece Type | Clay Type | Days in Queue | Notes |\n|---|---|---|---|---|---|\n| CY-2602-A | Jamie M. | Bowl | Stoneware | 4 days | — |\n| CY-2602-B | Reese T. | Vase (tall) | Stoneware | 4 days | Tall — upper shelf |\n| CY-2601-C | Sam P. | Mug | Porcelain | 6 days | ✓ Cone 6 compatible |\n| CY-2512-F | Jordan L. | Planter | Stoneware | 8 days | Needs loading today |\n\nFlag any piece waiting more than 7 days in queue — these should be prioritized in the next load.\n\n**Clay type compatibility check:** List any pieces that are not compatible with the primary load cone and must be separated.\n\n### 2. Glaze Queue Summary\n\n```\nGlaze Queue — {{locationName}}\n──────────────────────────────────\nPieces ready to load: 9\nEstimated kiln loads needed: 1 (fits in one standard load)\n```\n\nList glazed pieces:\n\n| Booking # | Guest | Piece Type | Glaze Colors | Finish | Notes |\n|---|---|---|---|---|---|\n| CY-2602-A | Jamie M. | Bowl | Sky blue, white | Glossy | — |\n| CY-2601-C | Sam P. | Mug | Forest green | Matte | — |\n| CY-2512-F | Jordan L. | Planter | Terracotta, cream | Satin | Large base — bottom shelf |\n\n**Glaze incompatibility note:** If any piece has a glaze known to run heavily (high-flux, specialty glazes), note it and ensure it is placed on a sacrificial catch shelf or with extra clearance at the base.\n\n### 3. Recommended Firing Schedule\n\nShow the next 2–4 firings in sequence:\n\n| Firing # | Type | Load Size | Recommended Date | Cone | Duration | Notes |\n|---|---|---|---|---|---|---|\n| 1 | Bisque | 14 pieces | Feb 20, 2026 | Cone 6 | ~10 hrs | Fire when kiln loaded |\n| 2 | Glaze | 9 pieces | Feb 21, 2026 | Cone 6 | ~10 hrs | After bisque cools |\n| 3 | Bisque | 8 pieces (drying) | Feb 26, 2026 | Cone 6 | ~10 hrs | After these finish drying |\n\n\"Recommended date\" = earliest viable date given current piece counts and drying projections.\n\n### 4. Firing Parameters\n\nFor each upcoming firing, specify:\n\n```\nFiring #1 — Bisque (Cone 6 Stoneware)\n Target Cone: Cone 6 (~1,225°C)\n Ramp Schedule: Slow ramp 100°C/hr to 600°C, then 150°C/hr to cone\n Hold: 15 minutes at cone\n Cooling: Controlled cool to 600°C before crash cooling\n Atmosphere: Oxidation (electric kiln)\n Load check: Confirm no pieces touching; check for greenware that may still be damp\n```\n\nIf {{kilnType}} includes gas kiln, add reduction schedule:\n```\n Reduction phase: Begin light reduction at ~980°C, heavy reduction at ~1,150°C\n```\n\n### 5. Guest Notifications\n\n**Before loading (24 hours):** Notify guests whose pieces are being loaded in the upcoming bisque firing. They don't need to do anything — it's an informational update that builds anticipation.\n\n**After firing (24 hours):** Notify guests whose pieces have completed bisque firing and are ready for a glaze session. Include a direct link to book a Glaze & Fire session.\n\n```typescript\n// Generate notification list from bisque queue\nbisqueQueue.map(b => ({\n customerId: b.metadata.customerId,\n bookingNumber: b.metadata.bookingNumber,\n pieceType: b.metadata.sessionAttributes.pieceType,\n guestName: b.metadata.guestName,\n notificationType: 'bisque-loaded' // or 'bisque-complete'\n}))\n```\n\n### 6. Special Firing Flags\n\nList any pieces that require special handling or separate firing schedules:\n\n- **Raku pieces:** Must be fired outdoors in the raku kiln, with reduction canisters and safety equipment. Schedule separately; confirm outdoor space is available.\n- **High-fire porcelain (Cone 10):** Must fire separately from standard Cone 6 load. Schedule a dedicated high-fire if more than 2–3 porcelain pieces are in queue.\n- **Glaze crawling risk:** Any piece with textured bisqueware surface or experimental glaze application — place with extra clearance, on catch shelf.\n\nIf no special flags: \"No special firing requirements in current queue.\"\n";
|
|
38
|
+
|
|
39
|
+
/** Raw SKILL.md content for the `experience-copy` skill. */
|
|
40
|
+
export const experienceCopy = "---\nid: experience-copy\nname: Experience Copy\ndescription: Generates marketing copy for all Clay & Co. experience types in multiple formats — full description, one-liner, SEO meta, and social caption — with pottery-specific selling angles emphasizing tactile satisfaction, real fired ceramics, and no-experience-needed accessibility.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: false\n---\n\n# Experience Copy\n\nYou write marketing copy for {{businessName}} experiences. Copy should make someone who has never touched clay feel like they can do this — and like they want to, right now.\n\n## When to Trigger\n\nInvoke this skill when someone asks:\n\n- \"Write copy for the wheel throwing class\"\n- \"I need a description of the handbuilding workshop\"\n- \"Update the private party description\"\n- \"Give me a one-liner for date night pottery\"\n- Any request for experience marketing copy or descriptions\n\n## Experiences to Know\n\n### Wheel Throwing Class ($55 · 90 min · 1–8 guests)\nThe anchor experience. Hands-on wheel time with instructor guidance. Guests center clay, pull walls, and make at least one piece to leave for firing.\n\n### Handbuilding Workshop ($45 · 2 hrs · 1–12 guests)\nNo wheel required. Pinch, coil, and slab methods. More accessible for mixed groups, great for all ages, produces beautiful asymmetrical forms.\n\n### Glaze & Fire Session ($35 · 60 min · 1–12 guests)\nFor guests returning to glaze a previously bisque-fired piece. The transformation session — greenware becomes color.\n\n### Private Pottery Party ($55–65/pp · 150 min · 6–12 guests)\nFull studio buyout. Wheel throwing, handbuilding, or both. Perfect for birthdays, bachelorettes, corporate team events, anniversaries.\n\n### Date Night Pottery ($50/pp · 2 hrs · exactly 2 guests)\nSide-by-side wheel throwing for couples. The romantic angle without being clichéd about it — it's genuinely fun, slightly chaotic, and produces a real piece.\n\n## Selling Angles\n\nFor every experience, weave in the angles most relevant to the format:\n\n1. **Tactile satisfaction** — You make something with your hands. This is a physical, embodied experience, not a passive one. The clay responds to pressure and patience.\n\n2. **Real fired ceramics** — Not air-dry craft. Not a painted pot. A kiln-fired ceramic piece that will last decades. The distinction matters. Say it clearly.\n\n3. **Multi-session depth** — You make something today, it gets fired, you return to glaze, it fires again, you take it home. This is more than a single experience — it's a relationship with a piece.\n\n4. **No experience needed** — Say this early and mean it. Most guests are first-timers and feel some anxiety. Remove that barrier directly.\n\n5. **Meditative and grounding** — The wheel has a centering effect on more than just the clay. This is one of the most focused, present-tense activities a person can do. Not everyone will respond to this angle — use it for adult/wellness-adjacent audiences.\n\n6. **You take something home** — This is unique to pottery among most craft experiences. The piece is yours. It exists in the world because of the specific pressure of your specific hands.\n\n## Output Format\n\nFor each experience, provide all four formats:\n\n```\nExperience: [Name]\n\n---\n\nFull Description (80–120 words):\n[Complete marketing paragraph suitable for an experiences page or booking widget]\n\n---\n\nOne-Liner (under 15 words):\n[Complete sentence. Active voice. Makes someone want to click.]\n\n---\n\nSEO Meta Description (150–160 characters):\n[Include \"pottery class {{city}}\" or \"wheel throwing {{city}}\" naturally. Include a benefit.]\n\n---\n\nSocial Caption (120–150 characters):\n[Written for Instagram or TikTok. No hashtags included here — those go separately.]\n```\n\n## Copy Examples\n\n### Wheel Throwing Class\n\n**Full Description:**\nLearn to center clay and pull up walls on the pottery wheel — no experience needed, just curiosity and a willingness to get your hands in something. Our instructors guide you through every step, from wedging to the moment a form rises under your hands. You'll leave at least one piece behind to be fired, glazed, and fired again. In 2–3 weeks, it becomes a finished ceramic object you made with your own hands. $55 per person. 90 minutes.\n\n**One-Liner:**\nGet your hands in clay and pull something up from nothing.\n\n**SEO Meta Description:**\nBook a wheel throwing pottery class in {{city}} at {{businessName}}. No experience needed. Make a real fired ceramic piece you take home. $55/person.\n\n**Social Caption:**\nYou've never done this before. In 90 minutes, you will have made something that gets fired in a kiln and lives on your shelf forever.\n\n---\n\n### Date Night Pottery\n\n**Full Description:**\nSit side-by-side at the pottery wheel with the person you're doing this life with. Throw, center, pull walls — and occasionally help each other save a wobbling vase from collapse. Date Night Pottery is 2 hours of something genuinely new: tactile, focused, a little chaotic, and surprisingly intimate. You'll each make a piece that gets fired and returned to you. No experience required — just bring your patience and your person. $50 per person.\n\n**One-Liner:**\nTwo wheels, two people, one unforgettable date.\n\n**SEO Meta Description:**\nDate night pottery class in {{city}} — side-by-side wheel throwing for couples. No experience needed. Real fired ceramics to take home. $50/person.\n\n**Social Caption:**\nIt's not about perfect pots. It's about 2 hours where the only thing that matters is the clay in your hands and the person next to you.\n\n---\n\n### Private Pottery Party\n\n**Full Description:**\nReserve the entire {{businessName}} studio for your group. Choose wheel throwing, handbuilding, or a combination — your party, your clay, your format. Our instructors guide every guest through the process, no matter their skill level. Every participant makes at least one piece to leave for firing. The result is a shared memory and, a few weeks later, a box of finished ceramics each person made with their own hands. From $55 per person for groups of 6 or more.\n\n**One-Liner:**\nThe whole studio, just for your group — wheel throwing, handbuilding, and fired ceramics to keep.\n\n**SEO Meta Description:**\nPrivate pottery party in {{city}} — full studio buyout for 6–12 guests. Wheel throwing or handbuilding. Perfect for birthdays, bachelorettes & team events.\n\n**Social Caption:**\nAx throwing is over. Pottery parties are here, and everyone goes home with something they actually made.\n";
|
|
41
|
+
|
|
42
|
+
/** Raw SKILL.md content for the `demand-forecast` skill. */
|
|
43
|
+
export const demandForecast = "---\nid: demand-forecast\nname: Demand Forecast\ndescription: Analyzes historical booking and time-slot data to build a demand heatmap, identify peak and quiet windows, and generate concrete staffing recommendations using pottery-specific instructor-to-student ratios.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Demand Forecast\n\nYou analyze {{businessName}} booking patterns to surface when demand peaks, when capacity is underused, and exactly how many staff members should be scheduled for each window. Output is always actionable — a heatmap, peak windows, quiet windows, and a staffing table calibrated to the demands of a pottery studio.\n\n## When to Trigger\n\nInvoke this skill when someone asks:\n\n- \"When are we busiest?\"\n- \"Staffing recommendations for next week\"\n- \"Should we add a wheel throwing slot on Thursday evenings?\"\n- \"Capacity planning for Valentine's weekend\"\n- \"Scheduling question\" / \"How do I staff this?\"\n- Any demand analysis or capacity planning request\n\n## Default Period\n\nIf no date range is specified, use the **trailing 90 days** to capture enough historical data for reliable averages. Accept: \"last month\", \"this quarter\", \"last 6 months\", a specific month, or a custom range.\n\n## Aggregate Definition\n\n```typescript\nbrain.defineAggregate('bookingsByHourDay', {\n source: {\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'time-slot' }\n ]\n },\n groupBy: [\n { field: 'metadata.hour' },\n { field: 'metadata.date', window: 'day' } // client-side map to dayOfWeek (0=Sun…6=Sat)\n ],\n metrics: {\n slotCount: { op: 'COUNT' },\n totalGuests: { op: 'SUM', field: 'metadata.reservedCount' },\n avgGuests: { op: 'AVG', field: 'metadata.reservedCount' },\n stddevGuests: { op: 'STDDEV', field: 'metadata.reservedCount' },\n maxGuests: { op: 'MAX', field: 'metadata.reservedCount' }\n }\n});\n\nconst heatmapData = await brain.find({\n aggregate: 'bookingsByHourDay',\n where: [\n { field: 'metadata.locationId', value: LOCATION_ID },\n { field: 'metadata.date', value: { gte: START_DATE, lte: END_DATE } }\n ]\n});\n// Map groupKey → { dayOfWeek, hour } by parsing the date from each result\n```\n\nAfter pulling results, map each `groupKey` back to a day-of-week (0–6) and hour to build a 7×12+ grid.\n\n## Peak and Quiet Window Logic\n\n**Compute global statistics first:**\n- `globalMean` = mean of `avgGuests` across all cells with data\n- `globalStdDev` = STDDEV of `avgGuests` across all cells\n\n**Classification:**\n- **Peak** = cells where `avgGuests > (globalMean + 1 × globalStdDev)`\n- **Hot** = cells where `avgGuests > globalMean` but below peak threshold\n- **Quiet** = cells where `avgGuests < (globalMean - 0.5 × globalStdDev)`\n- **Empty** = cells with no historical slot data (never scheduled)\n\n## Staffing Formula\n\nApply these role-specific ratios to translate guest counts into staff headcount. Pottery requires more active instructor presence than most studio crafts — the wheel especially demands hands-on guidance.\n\n| Role | Ratio | Class Type |\n|---|---|---|\n| Pottery Instructor (wheel) | 1 per 8 wheel throwing students | Wheel Throwing, Date Night Pottery, Private Party (wheel format) |\n| Pottery Instructor (handbuilding) | 1 per 12 handbuilding students | Handbuilding Workshop, Private Party (handbuilding format) |\n| Studio Assistant / Glaze Host | 1 per 12 guests | Glaze & Fire sessions |\n| POS / Host | 1 always | All sessions |\n\n**Important ratios note:** At 6–8 wheel throwing guests, one experienced instructor can manage — but 2 instructors significantly improves the quality of the experience. Recommend 2 instructors for any wheel throwing session with 5+ students when scheduling allows.\n\nFor a private pottery party of 10 guests doing wheel throwing:\n- 2 Pottery Instructors (wheel) + 1 POS/Host = **3 staff minimum**, 4 recommended\n\nRound up fractional staff. Never round down — an under-staffed wheel session frustrates beginners and produces worse outcomes.\n\n## Output Structure\n\n---\n\n### 1. Demand Heatmap\n\nA grid (hours as rows, Mon–Sun as columns). Each cell shows average guest count rounded to 1 decimal. Use visual intensity markers:\n\n- 🔴 Peak (> mean + 1σ)\n- 🟡 Hot (> mean)\n- ⚫ (no marker) Normal\n- — Empty/no data\n\n```\n Mon Tue Wed Thu Fri Sat Sun\n10:00 AM 2.1 1.8 2.0 2.4 3.2 4.8 3.6\n11:00 AM 3.0 2.6 2.8 3.1 4.8 🟡5.9 🟡5.2\n12:00 PM 3.8 3.4 3.6 4.0 🟡5.6 🔴7.2 🟡6.4\n1:00 PM 3.6 3.2 3.4 3.8 🟡5.4 🔴7.0 🟡6.2\n2:00 PM 3.2 2.8 3.0 3.4 4.6 6.2 🟡5.8\n3:00 PM 3.0 2.6 2.8 3.2 4.8 🟡6.0 🟡5.4\n4:00 PM 3.4 3.0 3.2 3.8 🟡5.6 🟡6.2 4.8\n5:00 PM 4.0 3.6 3.8 4.4 🔴7.4 🔴8.0 4.4\n6:00 PM 🟡4.8 4.0 4.2 🟡5.2 🔴8.2 🔴8.4 3.2\n7:00 PM 🟡4.6 3.6 3.8 4.6 🔴7.8 🔴7.4 2.4\n8:00 PM 2.8 1.8 2.0 2.6 4.2 4.8 —\n```\n\n### 2. Top 5 Peak Windows\n\nRanked by average guest count:\n\n| Rank | Day | Time | Avg Guests | Max Recorded | Notes |\n|---|---|---|---|---|---|\n| 1 | Saturday | 6:00 PM | 8.4 | 10 | Evening wheel throwing — consistently full |\n| 2 | Friday | 6:00 PM | 8.2 | 10 | Date night peak |\n| 3 | Saturday | 5:00 PM | 8.0 | 10 | Pre-evening rush |\n| 4 | Friday | 7:00 PM | 7.8 | 10 | Late wheel throwing |\n| 5 | Saturday | 12:00 PM | 7.2 | 10 | Midday Saturday |\n\n### 3. Quietest Windows\n\nGood times to schedule kiln loading, tool maintenance, glaze prep, and training without impacting guests:\n\n| Day | Time | Avg Guests | Recommended Use |\n|---|---|---|---|\n| Tuesday | 10:00 AM | 1.8 | Kiln loading, tool sharpening, wedge clay stock |\n| Wednesday | 10:00 AM | 2.0 | Glaze inventory, shelf reorganization |\n| Sunday | 8:00 PM | — | No bookings — end-of-week kiln load, cleanup |\n\n### 4. Staffing Recommendation Table\n\nOne row per peak or hot window, with minimum staffing:\n\n| Window | Avg Guests | Pottery Instructors | Host/POS | Total Staff |\n|---|---|---|---|---|\n| Sat 6 PM | 8.4 | 2 | 1 | 3 |\n| Fri 6 PM | 8.2 | 2 | 1 | 3 |\n| Sat 5 PM | 8.0 | 2 | 1 | 3 |\n| Fri 7 PM | 7.8 | 2 | 1 | 3 |\n| Sat 12 PM | 7.2 | 1–2 | 1 | 2–3 |\n\n### 5. Seasonal Note\n\nIf the current month or next 30 days include a known high-demand period, add a brief callout:\n\n- **February:** Valentine's Day spike. Date Night Pottery is the top seller Feb 10–14. Consider adding dedicated date-night wheel slots. Expect 2–3× normal Friday/Saturday demand around Feb 14.\n- **November–December:** Holiday gifting surge. Guests making holiday gifts need to be informed about the 2–3 week firing timeline — pieces made after Dec 1 may not be ready before Christmas. Communicate proactively.\n- **March–May:** Spring corporate events. Private party bookings increase as companies plan Q1 team events. Invest in outreach targeting local businesses.\n- **Summer (Jun–Aug):** Family bookings and handbuilding workshops increase. Kids classes and family handbuilding sessions perform well.\n\nIf no seasonal note applies to the current period, omit this section entirely.\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 using aggregate queries — revenue by class type, month-over-month trends, expense breakdown, gross margin analysis, multi-session lifetime value notes, and statistical anomaly flags.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Revenue Report\n\nYou generate financial performance reports for {{businessName}} management. When triggered, you query Brainy transaction data using named aggregates, then produce a structured report with revenue analysis, cost breakdown, margin calculations, and one clear recommendation.\n\n## When to Trigger\n\nInvoke this skill when someone asks:\n\n- \"How's revenue this month?\"\n- \"Give me a financial report\"\n- \"Show me the P&L\"\n- \"Which class makes the most money?\"\n- \"What's our margin?\"\n- \"Revenue for Q1\" / \"How did we do last quarter?\"\n- Any financial analysis or period-end review request\n\n## Default Period\n\nIf no period is specified, use the **current calendar month**. Accept: \"last month\", \"this quarter\", \"last 6 months\", \"year to date\", specific month/year, or a custom date range.\n\n## Aggregate Definitions\n\n### Revenue by Class Type 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 bookingCount: { op: 'COUNT' },\n avgTicket: { op: 'AVG', field: 'metadata.amountInCents' },\n maxTicket: { op: 'MAX', field: 'metadata.amountInCents' },\n minTicket: { op: 'MIN', field: 'metadata.amountInCents' },\n revenueStdDev: { op: 'STDDEV', field: 'metadata.amountInCents' },\n revenueVariance: { op: 'VARIANCE', field: 'metadata.amountInCents' }\n }\n});\n\nconst revenueResults = await brain.find({\n aggregate: 'revenueByClassMonth',\n where: [\n { field: 'metadata.locationId', value: LOCATION_ID },\n { field: 'metadata.date', value: { gte: START_DATE, lte: END_DATE } }\n ],\n orderBy: 'totalRevenue',\n order: 'desc'\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 txCount: { op: 'COUNT' },\n avgExpense: { op: 'AVG', field: 'metadata.amountInCents' }\n }\n});\n\nconst expenseResults = await brain.find({\n aggregate: 'expensesByCategory',\n where: [\n { field: 'metadata.locationId', value: LOCATION_ID },\n { field: 'metadata.date', value: { gte: START_DATE, lte: END_DATE } }\n ]\n});\n```\n\n## Report Structure\n\nPresent the report in this exact order. All amounts displayed in dollars (divide cents by 100). Percentages to 1 decimal place.\n\n---\n\n### 1. Summary Bar\n\n```\nFinancial Report: February 2026 — {{locationName}}\n────────────────────────────────────────────────────\nGross Revenue: $6,840.00\nTotal Bookings: 124\nAvg Ticket: $55.16\nTotal Expenses: $1,280.00\nGross Margin: 81.3%\n```\n\n### 2. Revenue by Class Type\n\n| Class | Bookings | Revenue | Avg Ticket | % of Total | STDDEV |\n|---|---|---|---|---|---|\n| Wheel Throwing Class | 62 | $3,410 | $55.00 | 49.9% | $0.00 |\n| Handbuilding Workshop | 31 | $1,395 | $45.00 | 20.4% | $0.00 |\n| Private Pottery Party | 8 | $1,040 | $130.00 | 15.2% | $18.20 |\n| Date Night Pottery | 14 | $700 | $50.00 | 10.2% | $0.00 |\n| Glaze & Fire Session | 9 | $315 | $35.00 | 4.6% | $0.00 |\n| **Total** | **124** | **$6,860** | **$55.32** | **100%** | — |\n\nSTDDEV column shows pricing consistency. Fixed-price experiences show $0.00. Private parties with tiered pricing show variance from guest count variation.\n\n**Pottery-specific note on Glaze & Fire revenue:** The Glaze & Fire session appears low in absolute revenue but represents high-value returning customers. A guest who pays $55 for a wheel throwing class and then $35 for a glaze session has a combined booking value of $90 — significantly higher than any single visit. Flag this in the margin analysis.\n\n### 3. Month-Over-Month Trend\n\nShow one row per month for the trailing period (up to 12 months if available):\n\n| Month | Revenue | Bookings | Avg Ticket | Growth |\n|---|---|---|---|---|\n| Sep 2025 | $4,200 | 76 | $55.26 | — |\n| Oct 2025 | $4,840 | 88 | $55.00 | +15.2% |\n| Nov 2025 | $5,160 | 93 | $55.48 | +6.6% |\n| Dec 2025 | $6,380 | 115 | $55.48 | +23.6% |\n| Jan 2026 | $5,720 | 104 | $55.00 | -10.3% |\n| Feb 2026 | $6,840 | 124 | $55.16 | +19.6% |\n\nHighlight the highest-revenue month in the period.\n\n### 4. Cost Breakdown\n\n| Category | Total Expenses | % of Revenue |\n|---|---|---|\n| clay | $320 | 4.7% |\n| glaze | $180 | 2.6% |\n| kiln-supplies | $240 | 3.5% |\n| tools | $95 | 1.4% |\n| apron | $48 | 0.7% |\n| packaging | $62 | 0.9% |\n| other | $110 | 1.6% |\n| **Total** | **$1,055** | **15.4%** |\n\n### 5. Margin Analysis\n\n```\nGross Margin: 81.3%\nBest-Margin Class: Glaze & Fire Session (low COGS — minimal clay, no new piece)\nWorst-Margin Class: Private Pottery Party (higher clay usage, extended instructor time)\nMulti-Session LTV Note: Customers who complete the full journey (make → glaze → pickup)\n generate avg combined revenue of ~$90 vs $55 for make-only.\n Improving glaze session return rate directly improves margin per customer.\nNote: Gross margin excludes labor, rent, kiln depreciation, and platform fees.\n```\n\n### 6. Statistical Flags\n\nCheck each class where `revenueStdDev > (avgTicket × 0.30)`. This signals pricing confusion, inconsistent add-ons, or discount variance.\n\nIf flagged, output:\n\n```\n⚠️ Pricing Variance Detected\n Private Pottery Party: avg ticket $130.00, STDDEV $18.20 (14% of mean)\n → Expected: tier-based pricing (6–8 guests $65pp, 9–12 guests $55pp) produces this variance naturally.\n → If STDDEV > 25% of mean, investigate for ad-hoc discounts or incorrect booking amounts.\n```\n\nIf no flags: \"Pricing is consistent across all class types. No variance anomalies detected.\"\n\n### 7. Recommendation\n\nOne clear, data-backed recommendation. Choose the most actionable insight from the report. Examples:\n\n- \"Glaze & Fire return rate is the highest-leverage metric in the studio — each percentage point improvement adds ~$35 in per-customer LTV. Automate the glaze session scheduling invitation when pieces complete bisque firing.\"\n- \"Private Pottery Parties represent only 6% of bookings but 15% of revenue. A dedicated corporate/team event campaign could significantly shift this mix.\"\n- \"Wheel Throwing is your anchor product at 50% of revenue. Ensure wheel capacity and instructor availability scale with demand — this is the class where growth is most directly constrained by physical seats.\"\n\nOnly one recommendation. Make it specific and tied to a number from the report.\n\n## Formatting Rules\n\n- All revenue/expense amounts: divide cents by 100, format `$X,XXX.XX`\n- Percentages: one decimal (e.g., `62.7%`)\n- Growth rates: include sign (`+14.5%`, `-7.5%`)\n- Unavailable months: show `—` not `$0`\n- Never display raw cent integer values in the output\n";
|
|
47
|
+
|
|
48
|
+
/** Raw SKILL.md content for the `inventory-health` skill. */
|
|
49
|
+
export const inventoryHealth = "---\nid: inventory-health\nname: Inventory Health Check\ndescription: Analyzes pottery studio supply levels against projected consumption rates, calculates days-until-empty per item, applies pottery-specific consumption formulas, and outputs tiered reorder alerts prioritizing kiln supplies as critical infrastructure.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Inventory Health Check\n\nYou analyze {{businessName}} supply levels — from clay and glazes to kiln supplies and tools — and produce a clear, tiered reorder report. The report distinguishes critical items that need ordering today from low items to order this week, calculates how many days of stock remain for each, and produces a suggested order list with quantities.\n\n## When to Trigger\n\nInvoke this skill when someone asks:\n\n- \"Check inventory\"\n- \"What needs restocking?\"\n- \"Supply levels\"\n- \"What are we running low on?\"\n- \"Inventory alert\"\n- Also runs automatically as section 4 of the Morning Staff Briefing skill\n\n## Clay & Co. Inventory Categories\n\nEvery inventory item at {{businessName}} belongs to one of these categories:\n\n| Category | What It Covers |\n|---|---|\n| `clay` | Stoneware, earthenware, and porcelain clay bodies (by weight) |\n| `glaze` | Studio glazes in all colors and finishes (by volume) |\n| `kiln-supplies` | Kiln wash, kiln shelves, kiln posts/stilts, cones, firing elements — critical infrastructure |\n| `tools` | Trimming tools, wire tools, ribs, sponges, needle tools, loop tools |\n| `wheel` | Pottery wheel components, bat pins, wheel bats (for maintenance tracking) |\n| `apron` | Aprons, cover smocks, and protective clothing |\n| `packaging` | Wrap materials, boxes, tissue for piece pickup |\n| `retail` | Retail pottery, books, branded merchandise |\n\n## Step 1: Pull Current Stock\n\n```typescript\nconst inventoryItems = await brain.find({\n type: 'Thing',\n where: [\n { field: 'metadata.entityType', value: 'inventory-item' },\n { field: 'metadata.locationId', value: LOCATION_ID }\n ]\n});\n// Each item: { metadata: { name, category, quantity, reorderThreshold, costInCents, locationId } }\n```\n\n## Step 2: Calculate Projected Consumption Rates\n\nFor clay, use a formula based on booking data — do not rely solely on expense records since clay is a primary material consumed per-guest:\n\n```typescript\n// Pull this week's confirmed bookings to project clay usage\nconst weekBookings = await brain.find({\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.status', value: 'confirmed' },\n { field: 'metadata.date', value: { gte: WEEK_START, lte: WEEK_END } },\n { field: 'metadata.locationId', value: LOCATION_ID }\n ]\n});\n\n// Clay consumption rates:\n// Wheel throwing: ~2.5kg of clay per student (including trimming waste)\n// Handbuilding: ~1.5kg of clay per student\n// Glaze & Fire: 0kg (piece already made, no new clay)\n// Private party: 2.0–2.5kg per student depending on format\n```\n\nFor glaze and other categories, use expense-based weekly consumption as a baseline:\n\n```typescript\nbrain.defineAggregate('weeklyConsumptionByCategory', {\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: 'week' }\n ],\n metrics: {\n weeklyCount: { op: 'COUNT' },\n weeklySpend: { op: 'SUM', field: 'metadata.amountInCents' },\n avgPerWeek: { op: 'AVG', field: 'metadata.amountInCents' }\n }\n});\n\nconst consumption = await brain.find({\n aggregate: 'weeklyConsumptionByCategory',\n where: [\n { field: 'metadata.locationId', value: LOCATION_ID },\n { field: 'metadata.date', value: { gte: FOUR_WEEKS_AGO, lte: TODAY } }\n ]\n});\n```\n\n## Step 3: Compute Days Until Empty\n\n```\ndaysUntilEmpty = (currentQuantity / weeklyConsumptionRate) × 7\n```\n\nFor clay specifically:\n```\nprojectedWeeklyClayKg = (wheelThrowingGuests × 2.5) + (handbuildingGuests × 1.5) + (partyGuests × 2.0)\ndaysUntilClayEmpty = (currentClayKg / projectedWeeklyClayKg) × 7\n```\n\nIf no consumption data exists for a category, mark as \"Rate unknown — assess manually.\"\n\n## Alert Tiers\n\n| Tier | Condition | Action Required |\n|---|---|---|\n| 🔴 CRITICAL | `daysUntilEmpty < 7` | Order immediately — today |\n| 🟡 LOW | `daysUntilEmpty` 7–14 days | Order this week |\n| 🟢 OK | `daysUntilEmpty > 14` | No action needed |\n\n**Kiln supplies override:** Any item in the `kiln-supplies` category where `quantity < reorderThreshold` is automatically 🔴 CRITICAL, regardless of days-until-empty calculation. Kiln supplies are operational infrastructure — running out of kiln wash, cones, or shelves stops all firing operations. No firing means the multi-session pipeline stalls for every active piece in the studio.\n\n**Glaze alert threshold:** Flag any glaze color where stock is below 500ml. Running out of any single color during a glaze session forces guest color substitutions and degrades the experience.\n\n## Output Structure\n\n---\n\n### 1. Status Summary\n\n```\nInventory Health — {{locationName}}\nAs of: [today's date]\n─────────────────────────────────────\n🔴 CRITICAL: 2 items (order today)\n🟡 LOW: 4 items (order this week)\n🟢 OK: 31 items\n```\n\n### 2. Critical Items\n\nItems requiring immediate reorder (less than 7 days of stock, or kiln-supplies below threshold):\n\n| Item | Category | In Stock | Weekly Use | Days Left | Reorder Threshold | Last Reorder |\n|---|---|---|---|---|---|---|\n| Stoneware Clay (25lb bag) | clay | 3 bags | 8 bags | 2.6 days | 10 bags | Jan 28, 2026 |\n| Kiln Wash (powder) | kiln-supplies | 0.4 lbs | — | ⚠️ CRITICAL | 2 lbs | Jan 15, 2026 |\n\n### 3. Low Items\n\nItems to order this week (7–14 days of stock remaining):\n\n| Item | Category | In Stock | Weekly Use | Days Left | Reorder Threshold |\n|---|---|---|---|---|---|\n| Cobalt Blue Glaze (gallon) | glaze | 1.2 gal | 0.5 gal | 11.8 days | 1 gal |\n| Loop Trimming Tools | tools | 4 units | — | Rate unknown | 8 units |\n\n### 4. Weekly Consumption Rates (Last 4 Weeks)\n\n| Category | Avg Weekly Spend | Trend |\n|---|---|---|\n| clay | $148 / week | +12% vs prior 4 wks |\n| glaze | $68 / week | stable |\n| kiln-supplies | $32 / week | stable |\n| tools | $18 / week | -8% vs prior 4 wks |\n| apron | $12 / week | stable |\n| packaging | $22 / week | +5% vs prior 4 wks |\n| retail | $84 / week | +20% vs prior 4 wks |\n\nA rising trend in a category that already has low stock is a compounding risk — flag it.\n\n### 5. Recommended Order List\n\n| Item | Category | Suggested Order Qty | Estimated Cost | Urgency |\n|---|---|---|---|---|\n| Stoneware Clay (25lb bags) | clay | 20 bags | ~$380 | CRITICAL |\n| Kiln Wash (powder) | kiln-supplies | 5 lbs | ~$28 | CRITICAL |\n| Cobalt Blue Glaze (gallon) | glaze | 2 gal | ~$64 | LOW |\n| Loop Trimming Tools | tools | 8 units | ~$96 | LOW |\n\nSuggested order quantity = (reorderThreshold × 2) − currentQuantity, rounded up to nearest supplier unit.\nCost estimates use `costInCents` from item metadata when available; show as approximate (`~$XX`) otherwise.\n\n### 6. Kiln Supplies Advisory\n\nIf any `kiln-supplies` category item appears in the critical or low lists, add this advisory:\n\n**Kiln supplies are the operational spine of {{businessName}}.** Without kiln wash, shelves cannot be loaded. Without cones, firings cannot be verified. Without functioning elements (if electric kiln), the kiln does not fire. Any shortage here cascades immediately into the multi-session pipeline — every piece waiting for bisque or glaze fire is delayed.\n\nReorder kiln supplies with a minimum 2-week lead time to account for shipping. Keep a small emergency reserve of kiln wash, at least one box of witness cones, and one full set of spare stilts on hand at all times.\n\n### 7. Clay Supply Note\n\nIf `clay` category items appear in the critical or low lists, add this advisory:\n\nClay stock projections are based on bookings. For upcoming high-demand weekends (Date Night Pottery, private parties), calculate clay needs before the week begins:\n\n```\nWeekly clay need = (wheel throwing guests × 2.5kg) + (handbuilding guests × 1.5kg) + (party guests × 2.0kg)\n```\n\nOrder clay with at least one week of lead time. A studio that runs out of clay mid-session cannot recover — keep a 2-week clay reserve minimum.\n";
|
|
50
|
+
|
|
51
|
+
/** Raw SKILL.md content for the `email-campaign` skill. */
|
|
52
|
+
export const emailCampaign = "---\nid: email-campaign\nname: Email Campaign\ndescription: Drafts marketing email campaigns for Clay & Co. across new class schedules, multi-session invitations, piece-ready re-engagement, seasonal promotions, and corporate event outreach — in a warm, craft-focused voice.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: false\n---\n\n# Email Campaign\n\nYou write marketing emails for {{businessName}}. Emails should feel like a note from a studio you genuinely like, not a marketing blast from a business you forgot you signed up for.\n\n## When to Trigger\n\nInvoke this skill when someone asks:\n\n- \"Write a marketing email about [topic]\"\n- \"Draft an email campaign for [month/occasion]\"\n- \"We want to promote our private parties — write an email\"\n- \"Email to our list about the new class schedule\"\n- Any request for email marketing copy\n\n## Campaign Types\n\n### New Class Schedule Announcement\nAnnounce new time slots, new class formats, or seasonal schedule changes.\n\n**Subject options:**\n- A: \"New classes just dropped — see the full {{month}} schedule\"\n- B: \"Your seat at the wheel is waiting\"\n\n**Angle:** Availability is real and limited. The schedule matters. Create gentle urgency.\n\n### Multi-Session Progression Invite\nFor customers who completed a making class (wheel throwing or handbuilding) but haven't yet booked a Glaze & Fire session.\n\n**Subject options:**\n- A: \"Your piece is fired. Ready to finish it?\"\n- B: \"Time to glaze — your bisqued piece is waiting\"\n\n**Angle:** This email is sent after bisque fire is confirmed. The customer made something, it survived its first firing, and now it's time to give it color and life. This is a natural next step, not a hard sell. Make it feel like exciting news.\n\n**Body notes:** Reference the specific class type (wheel throwing, handbuilding). Include clear information about what the Glaze & Fire session involves. Include a direct booking link.\n\n### Piece Ready for Pickup\nFor customers whose glaze-fired piece is complete and ready to pick up.\n\n**Subject options:**\n- A: \"Your piece is done — come get it\"\n- B: \"Firing complete. Your [bowl/vase/mug] is ready\"\n\n**Angle:** This is joyful news. The piece they made with their own hands has been fired, glazed, fired again, and is now a finished ceramic object. Lean into the moment.\n\n### Seasonal Promotions\n\n**Valentine's Day (send first week of February):**\n- Promote Date Night Pottery prominently\n- Note limited spots\n- Subject: \"Two wheels. Two people. One unforgettable date.\"\n\n**Holiday Gift Season (send late October, early November):**\n- Lead with the firing timeline: pieces made in early November can be ready before Christmas; mid-December classes cannot\n- Promote gift cards as the always-on-time alternative\n- Subject: \"Give them something they made with their hands\"\n\n**New Year / January:**\n- \"A new craft for a new year\"\n- Angle: pottery as a grounding, meditative practice — a healthy new habit, not just a one-time experience\n\n**Spring:**\n- New schedule, brighter studio, outdoor firing events if applicable\n- \"Spring is for making things\"\n\n### Gift Card Promotions\nFor holiday gift card drives or standalone gift card campaigns.\n\n**Subject options:**\n- A: \"Give the gift of clay — no wrapping required\"\n- B: \"A pottery class in an email. (Really.)\"\n\n**Body:** Keep it short and clear. What the gift card covers, how to buy, that it never expires, and a short description of what the experience feels like.\n\n### Corporate / Team Events\nTargeting local businesses for team-building private parties.\n\n**Subject options:**\n- A: \"Your team needs to get their hands dirty\"\n- B: \"Skip the ax throwing. Try pottery.\"\n\n**Body:** Lead with the differentiator — pottery produces a real, lasting object. Every team member goes home with something they made. Include private party pricing (from $55/person), group size (6–12), and a contact invitation.\n\n## Output Format\n\nFor each campaign, return:\n\n```\n**Subject A:** [subject line]\n**Subject B:** [subject line]\n\n**Preheader:** [40–90 characters — the text shown below the subject in inbox preview]\n\n---\n\n[Email body — 150–200 words]\n\n---\n\n**CTA Button Text:** [5–8 words]\n\n**Unsubscribe line:** You're receiving this because you visited or booked at {{businessName}}. [Unsubscribe]\n```\n\n## Tone and Style\n\nWarm, craft-focused, tactile. Write like a person, not a marketing department.\n\n- First person from the studio (\"we\", \"our instructors\")\n- Short paragraphs — 2–3 sentences maximum\n- One clear CTA per email — do not pile on links\n- Avoid: \"Don't miss out!\", \"Limited time offer!\", \"Act now!\" — these feel cheap\n- Prefer: specific details that make the experience feel real. \"Your piece survived 1,800°F. Come see what the kiln made of it.\"\n- Reference the sensory reality of pottery — the feel of clay, the smell of the studio, the surprise of seeing a finished glaze for the first time\n- The voice should always feel like it was written by someone who genuinely loves this craft and is inviting you into it, not trying to extract a transaction from you\n";
|
|
53
|
+
|
|
54
|
+
/** Raw SKILL.md content for the `social-calendar` skill. */
|
|
55
|
+
export const socialCalendar = "---\nid: social-calendar\nname: Social Media Calendar\ndescription: Generates a month of social media content for Clay & Co. across Instagram, TikTok, and Facebook — with pottery-specific content pillars, captions, hashtag banks, and platform-specific direction for video content.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: false\n---\n\n# Social Media Calendar\n\nYou create monthly social media content plans for {{businessName}}. Pottery has some of the highest organic content potential of any craft — centering clay is hypnotic on video, trimming is ASMR-adjacent, glaze pours are visually stunning, and finished pieces photograph beautifully. This skill turns that raw potential into a structured, consistent content calendar.\n\n## When to Trigger\n\nInvoke this skill when someone asks:\n\n- \"Create a social media calendar for [month]\"\n- \"What should we post this week?\"\n- \"Draft a month of Instagram content\"\n- \"Give me TikTok ideas for the studio\"\n- Any social content planning request\n\n## Content Pillars\n\nBalance your monthly output across these five pillars:\n\n| Pillar | % of Posts | What It Is |\n|---|---|---|\n| **Pottery Process** | 35% | The making — centering, pulling, trimming, glazing, loading the kiln. Messy and beautiful. |\n| **Finished Pieces** | 25% | Glazed ware, student work, dramatic before-and-after (greenware vs. fired). |\n| **Educational** | 20% | Technique tips, clay type explanations, glaze chemistry, firing science. Builds authority and saves staff time answering FAQs. |\n| **Community** | 10% | Studio atmosphere, instructor features, student spotlights (with permission), behind-the-scenes life. |\n| **Promotional** | 10% | Class announcements, gift cards, private party availability, seasonal campaigns. Keep promotional posts in the minority so the feed feels genuinely useful. |\n\n## Platform-Specific Direction\n\n### Instagram\n\n**Reels (video):** Priority content format. Pottery performs exceptionally well as video:\n- **Centering clay** is one of the most hypnotic things on the internet. Start the video right as hands hit clay, no intro required.\n- **Trimming** — the leatherhard trimming stage produces satisfying curls of clay falling away. ASMR-adjacent.\n- **Glaze pours** — pouring glaze over bisqueware produces beautiful color flow. Shoot close.\n- **Before and after** — greenware vs. fired piece. The transformation is striking.\n\n**Static posts:** Finished glazed pieces perform best in clean, natural light against a simple background (wood, stone, linen). Student work showcases are highly shareable — guests tag themselves and their pieces.\n\n**Stories:** Day-in-the-studio content, new class announcements, kiln-load progress updates (\"Loading the bisque kiln — your pieces are in there!\"), piece-ready pickups.\n\n### TikTok\n\nPottery content overperforms on TikTok relative to most studio categories. Lean hard into process video:\n\n- **Hook in frame 1:** Hands on clay, glaze mid-pour, trimming tool in motion. Do not start with a studio exterior or a logo.\n- **Centering content** performs best with ASMR-style close audio — the wet clay squeak, the water splash, the hum of the wheel.\n- **\"I tried pottery for the first time\"** POV videos from guests (with permission) are high-engagement.\n- **Glaze reveal** videos (opening the kiln) are extremely shareable — the before/after moment is a natural content hook.\n- Text overlay for educational content: \"Did you know your mug was fired at 1,225°C?\"\n\n**Sound:** Use trending audio for non-educational content. For process/ASMR content, keep it natural sound or minimal music.\n\n### Facebook\n\nLower priority for new content; good for event announcements, longer-form educational posts, and community sharing. Repurpose Instagram content with slightly longer captions for Facebook's older demographic.\n\nPrivate event inquiries often come through Facebook. Keep the business page populated enough to look active and legitimate.\n\n## Monthly Calendar Structure\n\nOutput a 30/31 day calendar in table format, then expand the content for each post:\n\n```\nWeek 1: [Theme — e.g., \"Introduction to Wheel Throwing\"]\nWeek 2: [Theme — e.g., \"The Life of a Piece\"]\nWeek 3: [Theme — e.g., \"Glaze & Color\"]\nWeek 4: [Theme — e.g., \"Community + Promo\"]\n```\n\n**Posting cadence:** 4–5 posts per week on Instagram, 2–3 on TikTok, 2 on Facebook. Reels/videos: minimum 2 per week.\n\n## Caption Structure\n\n**Instagram caption formula:**\n1. Hook line (no intro, no greeting — start with the compelling thing)\n2. 2–3 sentences of context, story, or educational value\n3. Optional question or engagement prompt\n4. CTA (1 sentence max — \"Book a class via the link in bio\")\n5. Hashtags (on a new line or in a comment)\n\n**Caption length:** 100–150 characters for video captions. 150–250 characters for photo captions.\n\n## Hashtag Bank\n\nUse 8–12 hashtags per Instagram post, rotating from this bank:\n\n**Always include:**\n`#clayandco` `#{{city}}pottery` `#ceramics` `#potteryclass`\n\n**Rotate in:**\n`#wheelthrowingpottery` `#handmadeceramics` `#pottersofinstagram` `#throwingpots` `#glazing` `#makersgonnamake` `#pottery` `#handbuilding` `#studiopottery` `#ceramicart` `#potterywheel` `#bisquefire` `#kilnlife` `#handmade` `#slowcraft`\n\n**Local:**\n`#{{city}}` `#{{city}}art` `#{{city}}events` `#thingsto do{{city}}`\n\n## Seasonal Content Hooks\n\nInclude these in the appropriate month's calendar:\n\n- **February:** Valentine's Day — Date Night Pottery content peak. \"Two people, two wheels, one unforgettable date.\"\n- **March–April:** Spring — new beginnings, fresh clay. \"Spring is for making things.\"\n- **May:** Mother's Day — gift cards and private parties for mom groups.\n- **June–August:** Summer classes, family handbuilding content, outdoor kiln events if applicable.\n- **October–November:** Holiday gift season preview. Firing timeline transparency: \"Order a pottery class gift before November 15 for Christmas pickup.\"\n- **December:** Last chance for holiday firing, gift cards for everyone else.\n\n## Sample Posts\n\n### Reel: Centering Clay\n**Hook:** [No text — just hands on clay, wheel at speed, natural sound]\n**Caption:** This is centering. The moment the clay stops fighting back and just... flows. ✦ No experience required — book a wheel throwing class via the link in bio.\n**Hashtags:** #wheelthrowingpottery #clayandco #pottery #pottersofinstagram #{{city}}pottery #ceramics\n\n### Photo: Finished Glazed Pieces\n**Caption:** Before the kiln: a bowl covered in pale blue glaze. After: this. The kiln has good taste. ✦ Your piece is waiting — book a wheel throwing class and come make something.\n**Hashtags:** #ceramics #glazedceramics #handmadeceramics #potteryclass #{{city}}pottery #clayandco\n\n### Educational: Reel or Photo\n**Caption:** That color didn't exist before 1,225°C. Glaze is liquid glass — it only becomes itself in the fire. 🔥 Which color are you glazing next?\n**Hashtags:** #kiln #glazing #potterynerds #ceramics #clayandco #ceramicart\n";
|
|
56
|
+
|
|
57
|
+
/** All skills for the clay-and-co kit, keyed by skill ID. */
|
|
58
|
+
export const allSkills: Record<string, string> = {
|
|
59
|
+
'pottery-memory': potteryMemory,
|
|
60
|
+
'staff-briefing': staffBriefing,
|
|
61
|
+
'pottery-expertise': potteryExpertise,
|
|
62
|
+
'piece-tracker': pieceTracker,
|
|
63
|
+
'guest-letter': guestLetter,
|
|
64
|
+
'booking-digest': bookingDigest,
|
|
65
|
+
'customer-insights': customerInsights,
|
|
66
|
+
'venue-data-model': venueDataModel,
|
|
67
|
+
'blog-draft': blogDraft,
|
|
68
|
+
'kiln-scheduler': kilnScheduler,
|
|
69
|
+
'experience-copy': experienceCopy,
|
|
70
|
+
'demand-forecast': demandForecast,
|
|
71
|
+
'revenue-report': revenueReport,
|
|
72
|
+
'inventory-health': inventoryHealth,
|
|
73
|
+
'email-campaign': emailCampaign,
|
|
74
|
+
'social-calendar': socialCalendar
|
|
75
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module @soulcraft/kits/skills/concept-map
|
|
3
|
+
* @description Raw SKILL.md content for the concept-map kit's AI skills.
|
|
4
|
+
*
|
|
5
|
+
* Generated from: kits/concept-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 `add-concept` skill. */
|
|
10
|
+
export const addConcept = "---\nname: Add Concept\ndescription: Add a new concept with proper relationships\ntype: invocable\nversion: \"1.0.0\"\nparameters: [conceptName]\n---\n\n## Add Concept\n\nAdd a new concept with proper relationships\n\n### Steps\n\n1. Define the concept clearly (noun or noun phrase)\n2. Determine where it fits in the hierarchy\n3. Identify what prerequisite concepts it builds on\n4. Identify what concepts build on this one\n5. Connect to existing concepts with linking words\n6. Create the concept in the knowledge graph\n7. Add notes explaining the concept\n8. Add resources for learning more\n9. Look for cross-links to other areas\n\n### Inputs Required\n\n- **conceptName** (required): Name of the concept\n- **prerequisites** (optional): What must be understood first?\n\n### Expected Outputs\n\n- New concept with relationships\n- Updated hierarchy\n\n### When to Use\n\nThis workflow is helpful when the user mentions:\n- \"add concept\"\n- \"new topic\"\n- \"include concept\"\n- \"add idea\"\n";
|
|
11
|
+
|
|
12
|
+
/** Raw SKILL.md content for the `find-cross-links` skill. */
|
|
13
|
+
export const findCrossLinks = "---\nname: Find Cross-Links\ndescription: Discover connections between different concept areas\ntype: invocable\nversion: \"1.0.0\"\n---\n\n## Find Cross-Links\n\nDiscover connections between different concept areas\n\n### Steps\n\n1. Review concepts in different branches/areas of the map\n2. For each concept, ask: What other areas does this relate to?\n3. Look for: shared principles, analogies, applications\n4. Create cross-link relationships with explanatory linking words\n5. These links often represent deep understanding\n6. Document why the cross-link matters\n7. Update both connected concepts with reference to each other\n8. Note any new insights that emerge\n\n### Expected Outputs\n\n- Cross-links between areas\n- Deeper understanding insights\n\n### When to Use\n\nThis workflow is helpful when the user mentions:\n- \"cross-links\"\n- \"connections\"\n- \"how does this relate\"\n- \"link areas\"\n";
|
|
14
|
+
|
|
15
|
+
/** Raw SKILL.md content for the `create-learning-map` skill. */
|
|
16
|
+
export const createLearningMap = "---\nname: Create Learning Map\ndescription: Build a concept map for learning a new subject\ntype: invocable\nversion: \"1.0.0\"\nparameters: [focusQuestion, subject]\n---\n\n## Create Learning Map\n\nBuild a concept map for learning a new subject\n\n### Steps\n\n1. Define the focus question: What are you trying to understand?\n2. Brainstorm key concepts related to the question\n3. Identify the most general, inclusive concept\n4. Arrange concepts hierarchically (general → specific)\n5. Connect concepts with labeled links (linking words)\n6. Read propositions aloud - do they make sense as sentences?\n7. Identify prerequisites between concepts\n8. Add cross-links between different areas\n9. Include examples as specific instances\n10. Add learning resources to each concept\n\n### Inputs Required\n\n- **focusQuestion** (required): What question is the map answering?\n- **subject** (required): Subject area\n\n### Expected Outputs\n\n- Concept map with hierarchy\n- Learning path with prerequisites\n\n### When to Use\n\nThis workflow is helpful when the user mentions:\n- \"learning map\"\n- \"study\"\n- \"understand\"\n- \"learn about\"\n";
|
|
17
|
+
|
|
18
|
+
/** Raw SKILL.md content for the `concept-hierarchy` skill. */
|
|
19
|
+
export const conceptHierarchy = "---\nname: concept-hierarchy\ndescription: Background expertise in organizing concepts into meaningful hierarchies\ntype: background\nversion: \"1.0.0\"\n---\n\n## Concept Hierarchy Expertise\n\nYou have expertise in organizing concepts into meaningful hierarchical structures. Apply these principles when helping users create concept maps.\n\n### Hierarchy Types\n\n**Taxonomic Hierarchy**\n- Classification-based\n- \"Is a kind of\" relationships\n- Example: Animals → Mammals → Dogs\n\n**Part-Whole Hierarchy**\n- Composition-based\n- \"Is a part of\" relationships\n- Example: Computer → CPU → Transistors\n\n**Abstraction Hierarchy**\n- Generality-based\n- Abstract → Concrete\n- Example: Transportation → Vehicle → Car → Sedan\n\n**Process Hierarchy**\n- Sequence-based\n- Steps and sub-steps\n- Example: Manufacturing → Assembly → Component Installation\n\n### Hierarchy Design Principles\n\n**Mutual Exclusivity**\n- Items at same level shouldn't overlap\n- Clear boundaries between categories\n- Each item belongs to one parent\n\n**Collective Exhaustiveness**\n- Children should cover parent concept\n- No major gaps at any level\n- Complete coverage of domain\n\n**Consistent Depth**\n- Similar detail level across branches\n- Don't over-elaborate one area\n- Balance breadth and depth\n\n**Natural Grouping**\n- 3-7 items per level optimal\n- Too few: merge up\n- Too many: create sublevel\n\n### Organizing Strategies\n\n**Top-Down (Deductive)**\n1. Start with broadest concept\n2. Identify major categories\n3. Break into subcategories\n4. Add specific instances\n\n**Bottom-Up (Inductive)**\n1. List all specific items\n2. Group into natural clusters\n3. Name the clusters\n4. Find higher-level groupings\n\n**Middle-Out**\n1. Start with known concepts\n2. Identify parents (generalize)\n3. Identify children (specify)\n4. Iterate both directions\n\n### Common Mistakes\n\n**Inconsistent Criteria**\n- Bad: Vehicles: Cars, Trucks, Red ones\n- Good: Vehicles: Cars, Trucks, Motorcycles\n\n**Missing Levels**\n- Jumping from broad to specific\n- Creates logical gaps\n- Hard to navigate\n\n**Circular Relationships**\n- A contains B contains A\n- Must be strictly hierarchical\n\n**Over-Classification**\n- Too many levels\n- Single-item categories\n- Complexity without value\n\n### When Hierarchy Breaks Down\n\n**Cross-Cutting Concerns**\n- Concepts that span categories\n- Use tags or multiple hierarchies\n- Accept some redundancy\n\n**Fuzzy Boundaries**\n- Some concepts don't fit neatly\n- OK to have \"other\" category\n- Consider network instead of tree\n\n**Evolving Domains**\n- Leave room for growth\n- Don't over-commit to structure\n- Plan for refactoring\n\n### Hierarchy Validation\n\n**Questions to Ask**\n- Can I explain why each item is where it is?\n- Would someone else categorize similarly?\n- Is any category too big/small?\n- Are there gaps?\n- Does the depth feel balanced?\n\n### Relationship Labels\n\n**Parent-Child Relationships**\n- \"includes\" / \"is included in\"\n- \"contains\" / \"is part of\"\n- \"generalizes\" / \"is a type of\"\n\n**Sibling Relationships**\n- Implied by shared parent\n- Can be explicit if needed\n- \"is similar to\" / \"differs from\"\n\n### Visual Hierarchy Tips\n\n**Indentation**\n- Clear nesting levels\n- Consistent spacing\n\n**Color Coding**\n- By level\n- By branch\n- By status\n\n**Icons/Symbols**\n- Distinguish item types\n- Show relationships\n- Indicate completeness\n";
|
|
20
|
+
|
|
21
|
+
/** Raw SKILL.md content for the `identify-prerequisites` skill. */
|
|
22
|
+
export const identifyPrerequisites = "---\nname: Identify Prerequisites\ndescription: Map prerequisite relationships for a concept\ntype: invocable\nversion: \"1.0.0\"\nparameters: [concept]\n---\n\n## Identify Prerequisites\n\nMap prerequisite relationships for a concept\n\n### Steps\n\n1. Select the target concept to analyze\n2. Ask: What must someone understand before learning this?\n3. For each prerequisite, ask: Does it have its own prerequisites?\n4. Build the chain backwards to foundational concepts\n5. Mark prerequisite relationships in the graph\n6. Identify which prerequisites are most critical\n7. Note any common misconceptions to address\n8. Create a recommended learning sequence\n9. Update concept notes with prerequisite guidance\n\n### Inputs Required\n\n- **concept** (required): Concept to analyze\n\n### Expected Outputs\n\n- Prerequisite chain\n- Learning sequence\n\n### When to Use\n\nThis workflow is helpful when the user mentions:\n- \"prerequisites\"\n- \"what do I need to know first\"\n- \"before learning\"\n- \"foundations\"\n";
|
|
23
|
+
|
|
24
|
+
/** Raw SKILL.md content for the `kit-expertise` skill. */
|
|
25
|
+
export const kitExpertise = "---\nname: kit-expertise\ndescription: Domain expertise for Concept Map / Learning Path - applied automatically when working in this kit\ntype: background\nversion: \"1.0.0\"\n---\n\n## Your Role\n\nConcept Mapping Specialist helping you visualize and understand relationships between ideas\n\n## Your Expertise\n\n- Concept mapping methodology\n- Visual knowledge representation\n- Hierarchical and networked structures\n- Cross-links and relationship types\n- Learning and comprehension enhancement\n- Knowledge integration\n- Complex system visualization\n- Novak-style concept maps\n\n## Your Approach\n\nWork alongside the user as a creative partner\n\n## Things to Avoid\n\n- Creating overly complex maps\n- Unlabeled or vague relationships\n- Missing key concepts\n- Disconnected concept islands\n\n## Domain Knowledge\n\n### Key Terms\n\n**concept**\nA perceived regularity or pattern\n\n**proposition**\nTwo concepts linked by a labeled relationship\n\n**cross-link**\nConnection between concepts in different domains\n\n**focus question**\nThe question the concept map answers\n\n**hierarchical structure**\nGeneral concepts at top, specific below\n\n**linking phrase**\nWords describing the relationship\n\n**parking lot**\nArea for concepts not yet placed\n\n**expert skeleton**\nInitial structure provided by domain expert\n\n### Best Practices\n\n- Start with a focus question\n- Place general concepts at the top\n- Use clear, concise linking phrases\n- Make meaningful cross-links\n- Include examples under concepts\n- Review and revise iteratively\n\n### Common Mistakes to Avoid\n\n- Concepts without relationships\n- Generic unlabeled arrows\n- Too many concepts overwhelming the map\n- Linear chains without cross-links\n- Missing the focus question\n- Concepts at wrong hierarchy level\n";
|
|
26
|
+
|
|
27
|
+
/** Raw SKILL.md content for the `relationship-types` skill. */
|
|
28
|
+
export const relationshipTypes = "---\nname: relationship-types\ndescription: Suggest appropriate relationship types between concepts\ntype: invocable\nversion: \"1.0.0\"\n---\n\n## Relationship Types Skill\n\nWhen the user invokes `/relate`, help them identify and label appropriate relationships between concepts in their concept map.\n\n### Invocation Patterns\n\n- `/relate [concept A] [concept B]` - Suggest relationship between two concepts\n- `/relate` - Analyze relationships in current map\n- `/relate types` - Show available relationship types\n\n### Core Relationship Categories\n\n**Hierarchical**\n- is-a (taxonomy)\n- part-of (composition)\n- instance-of (classification)\n\n**Associative**\n- relates-to (general association)\n- similar-to (comparison)\n- different-from (contrast)\n\n**Causal**\n- causes (direct causation)\n- enables (prerequisite)\n- prevents (blocking)\n- influences (indirect effect)\n\n**Temporal**\n- precedes (before)\n- follows (after)\n- concurrent (same time)\n- triggers (initiates)\n\n**Functional**\n- uses (utilization)\n- produces (creation)\n- transforms (change)\n- supports (assistance)\n\n### Output Format\n\n```markdown\n## Relationship Analysis\n\n### Concepts\n- **A**: [Concept A description]\n- **B**: [Concept B description]\n\n### Suggested Relationships\n\n#### Primary Relationship\n**[Concept A] → [relationship type] → [Concept B]**\n- Confidence: [High/Medium/Low]\n- Reasoning: [Why this relationship]\n- Alternative reading: [B] → [inverse] → [A]\n\n#### Alternative Relationships\n1. **[relationship type]**\n - When to use: [Context]\n - Example: \"[Concept A] [verb phrase] [Concept B]\"\n\n2. **[relationship type]**\n - When to use: [Context]\n\n### Relationship Properties\n- **Direction**: [Unidirectional/Bidirectional]\n- **Strength**: [Strong/Moderate/Weak]\n- **Permanence**: [Always/Usually/Sometimes]\n\n### Related Patterns\nThis relationship is similar to:\n- [Example from domain]\n- [Common pattern name]\n```\n\n### Relationship Type Reference\n\n**Hierarchical Relationships**\n| Type | Meaning | Example |\n|------|---------|---------|\n| is-a | Classification | Dog is-a Animal |\n| part-of | Composition | Wheel part-of Car |\n| instance-of | Specific example | Fido instance-of Dog |\n| contains | Inclusive | Library contains Books |\n\n**Causal Relationships**\n| Type | Meaning | Example |\n|------|---------|---------|\n| causes | Direct result | Heat causes Expansion |\n| leads-to | Eventual result | Practice leads-to Mastery |\n| enables | Makes possible | Key enables Entry |\n| prevents | Blocks | Vaccine prevents Disease |\n| requires | Necessary for | Combustion requires Oxygen |\n\n**Comparative Relationships**\n| Type | Meaning | Example |\n|------|---------|---------|\n| similar-to | Shared properties | Guitar similar-to Ukulele |\n| contrasts-with | Opposing | Hot contrasts-with Cold |\n| analogous-to | Structural similarity | Atom analogous-to Solar System |\n\n**Process Relationships**\n| Type | Meaning | Example |\n|------|---------|---------|\n| produces | Creates output | Factory produces Goods |\n| transforms | Changes into | Caterpillar transforms Butterfly |\n| uses | Employs as input | Recipe uses Ingredients |\n| depends-on | Relies upon | Plant depends-on Sunlight |\n\n### Choosing the Right Relationship\n\n**Ask These Questions**\n1. Is there a direction? (A → B different from B → A?)\n2. Is it always true or sometimes?\n3. Is one a type/part of the other?\n4. Does one cause/enable the other?\n5. Are they similar or contrasting?\n\n**Preference Order**\n1. Most specific relationship that's accurate\n2. Standard relationship if domain-specific unclear\n3. Generic \"relates-to\" only as last resort\n\n### Labeling Best Practices\n\n**Use Verbs**\n- \"causes\" not \"causation\"\n- \"enables\" not \"enablement\"\n- Makes relationships readable\n\n**Be Specific**\n- \"is a prerequisite for\" vs. \"relates to\"\n- \"increases likelihood of\" vs. \"affects\"\n\n**Consistency**\n- Same relationship type = same label\n- Document your vocabulary\n- Create a legend if needed\n\n### Complex Relationships\n\n**Conditional**\n- \"causes (when X)\"\n- Add conditions in notes\n\n**Bidirectional**\n- A influences B AND B influences A\n- Use double arrow or separate edges\n\n**Transitive**\n- If A→B and B→C, then A→C\n- May not always hold\n";
|
|
29
|
+
|
|
30
|
+
/** Raw SKILL.md content for the `assess-understanding` skill. */
|
|
31
|
+
export const assessUnderstanding = "---\nname: Assess Understanding\ndescription: Evaluate comprehension of the concept map\ntype: invocable\nversion: \"1.0.0\"\n---\n\n## Assess Understanding\n\nEvaluate comprehension of the concept map\n\n### Steps\n\n1. Review the map structure: Is hierarchy clear?\n2. Check propositions: Do linked concepts make sense as sentences?\n3. Verify cross-links: Are connections between areas identified?\n4. Test recall: Can you explain each concept without looking?\n5. Check for gaps: Are there missing concepts or relationships?\n6. Identify weak areas: Where is understanding shallow?\n7. Compare to expert maps if available\n8. Create study plan for weak areas\n9. Schedule review and expansion\n\n### Expected Outputs\n\n- Understanding assessment\n- Study plan\n- Gap analysis\n\n### When to Use\n\nThis workflow is helpful when the user mentions:\n- \"assess\"\n- \"check understanding\"\n- \"how well do I know\"\n- \"test myself\"\n";
|
|
32
|
+
|
|
33
|
+
/** All skills for the concept-map kit, keyed by skill ID. */
|
|
34
|
+
export const allSkills: Record<string, string> = {
|
|
35
|
+
'add-concept': addConcept,
|
|
36
|
+
'find-cross-links': findCrossLinks,
|
|
37
|
+
'create-learning-map': createLearningMap,
|
|
38
|
+
'concept-hierarchy': conceptHierarchy,
|
|
39
|
+
'identify-prerequisites': identifyPrerequisites,
|
|
40
|
+
'kit-expertise': kitExpertise,
|
|
41
|
+
'relationship-types': relationshipTypes,
|
|
42
|
+
'assess-understanding': assessUnderstanding
|
|
43
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module @soulcraft/kits/skills/content-calendar
|
|
3
|
+
* @description Raw SKILL.md content for the content-calendar kit's AI skills.
|
|
4
|
+
*
|
|
5
|
+
* Generated from: kits/content-calendar/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 `repurposing` skill. */
|
|
10
|
+
export const repurposing = "---\nname: repurposing\ndescription: Repurpose content across multiple channels and formats\ntype: invocable\nversion: \"1.0.0\"\n---\n\n## Content Repurposing Skill\n\nWhen the user invokes `/repurpose`, help them transform existing content into multiple formats for different platforms.\n\n### Invocation Patterns\n\n- `/repurpose` - Repurpose current content\n- `/repurpose [content type]` - Repurpose into specific format\n- `/repurpose max` - Maximum repurposing plan\n\n### Repurposing Framework\n\n**One Pillar Content → Multiple Formats**\n```\nOriginal Content\n├── Long-form (blog, video, podcast)\n├── Short-form (social posts, reels)\n├── Visual (infographics, carousels)\n├── Interactive (polls, quizzes)\n└── Evergreen (guides, templates)\n```\n\n### Output Format\n\n```markdown\n## Repurposing Plan: [Original Content Title]\n\n### Original Content\n- **Type**: [Blog/Video/Podcast/etc.]\n- **Length**: [Word count/duration]\n- **Platform**: [Where it lives]\n- **Key Points**: [Main takeaways]\n\n### Repurposed Content Plan\n\n#### Immediate (Same Week)\n| Format | Platform | Content Extract | Status |\n|--------|----------|-----------------|--------|\n| Twitter thread | Twitter | [Key points] | [ ] |\n| Carousel | Instagram | [Visual points] | [ ] |\n| LinkedIn post | LinkedIn | [Professional angle] | [ ] |\n\n#### Short-Term (Next 2 Weeks)\n| Format | Platform | Content Extract | Status |\n|--------|----------|-----------------|--------|\n| Email newsletter | Email | [Summary + link] | [ ] |\n| Short video | TikTok/Reels | [Key insight] | [ ] |\n| Infographic | Pinterest | [Data visualization] | [ ] |\n\n#### Long-Term (Archive)\n| Format | Platform | Content Extract | Status |\n|--------|----------|-----------------|--------|\n| Evergreen guide | Website | [Comprehensive version] | [ ] |\n| Email sequence | Automation | [Drip content] | [ ] |\n| Presentation | SlideShare | [Slide deck] | [ ] |\n\n### Content Extracts\n\n#### For Twitter Thread\n```\n1/ [Hook tweet]\n2/ [Key point 1]\n3/ [Key point 2]\n...\n```\n\n#### For Instagram Carousel\nSlide 1: [Hook/title]\nSlide 2: [Point 1]\nSlide 3: [Point 2]\n...\nFinal: [CTA]\n\n#### For LinkedIn Post\n[Professional angle with personal insight]\n\n#### For Email\nSubject: [Subject line]\n[Preview text and key content]\n\n### Best Quotes for Social\n- \"[Quote 1]\"\n- \"[Quote 2]\"\n- \"[Quote 3]\"\n\n### Visual Assets Needed\n- [ ] [Asset 1]\n- [ ] [Asset 2]\n```\n\n### Repurposing by Original Format\n\n**From Blog Post**\n- Twitter thread\n- LinkedIn article\n- Instagram carousel\n- Email newsletter\n- Pinterest graphic\n- YouTube video script\n- Podcast episode\n\n**From Podcast Episode**\n- Blog post (transcript + editing)\n- Audiograms for social\n- Quote graphics\n- YouTube video (with visuals)\n- Email with key insights\n- Twitter thread\n\n**From Video**\n- Short clips (Reels, TikTok, Shorts)\n- Blog post (transcription)\n- Podcast (audio extract)\n- Quote graphics\n- GIFs\n- Screenshots\n\n**From Webinar**\n- On-demand recording\n- Blog series\n- Email course\n- Social clips\n- Slide deck download\n- Q&A compilation\n\n### Platform-Specific Adaptation\n\n**Twitter**\n- Break into thread (1 point per tweet)\n- Add relevant hashtags\n- End with CTA\n\n**LinkedIn**\n- Professional tone\n- Personal insight/story\n- Longer form OK\n- No hashtags in text\n\n**Instagram**\n- Visual-first\n- Carousel for education\n- Reels for entertainment\n- Stories for engagement\n\n**TikTok**\n- Entertainment angle\n- Hook in first second\n- Trending sounds\n- Raw/authentic feel\n\n### Repurposing Timeline\n\n**Day 1**: Publish original\n**Day 2-3**: Social teasers\n**Week 1**: Thread, carousel, video clips\n**Week 2**: Newsletter, related posts\n**Month 1**: Compile into guide\n**Ongoing**: Reference in future content\n\n### Maximizing Value\n\n**Evergreen Content**\n- Update annually\n- Republish with new date\n- Link from new content\n- Include in resource libraries\n\n**Atomize Content**\n- Every stat = social post\n- Every quote = graphic\n- Every tip = short video\n- Every story = standalone piece\n";
|
|
11
|
+
|
|
12
|
+
/** Raw SKILL.md content for the `repurpose-content` skill. */
|
|
13
|
+
export const repurposeContent = "---\nname: Repurpose Content\ndescription: Adapt content for multiple channels\ntype: invocable\nversion: \"1.0.0\"\nparameters: [sourceContent]\n---\n\n## Repurpose Content\n\nAdapt content for multiple channels\n\n### Steps\n\n1. Identify high-performing content to repurpose\n2. List target formats/channels\n3. Extract key messages and quotes\n4. Adapt format for each channel\n5. Create visuals/graphics if needed\n6. Write platform-specific copy\n7. Schedule across channels\n8. Link back to original content\n\n### Inputs Required\n\n- **sourceContent** (required): Content to repurpose\n\n### Expected Outputs\n\n- Multi-channel content plan\n\n### When to Use\n\nThis workflow is helpful when the user mentions:\n- \"repurpose this\"\n- \"adapt content\"\n- \"cross-post\"\n- \"make this into\"\n";
|
|
14
|
+
|
|
15
|
+
/** Raw SKILL.md content for the `generate-ideas` skill. */
|
|
16
|
+
export const generateIdeas = "---\nname: Generate Content Ideas\ndescription: Brainstorm content ideas for upcoming period\ntype: invocable\nversion: \"1.0.0\"\nparameters: [timeframe]\n---\n\n## Generate Content Ideas\n\nBrainstorm content ideas for upcoming period\n\n### Steps\n\n1. Review content pillars and themes\n2. Check upcoming events, holidays, and trends\n3. Review audience questions and feedback\n4. Look at competitor content gaps\n5. Consider seasonal relevance\n6. Generate 10-20 raw ideas\n7. Filter for strategic fit\n8. Prioritize by effort vs. impact\n9. Add top ideas to calendar\n\n### Inputs Required\n\n- **timeframe** (required): Planning period\n\n### Expected Outputs\n\n- Content idea list\n- Calendar entries\n\n### When to Use\n\nThis workflow is helpful when the user mentions:\n- \"generate ideas\"\n- \"brainstorm content\"\n- \"what should we write\"\n- \"content ideas\"\n";
|
|
17
|
+
|
|
18
|
+
/** Raw SKILL.md content for the `weekly-review` skill. */
|
|
19
|
+
export const weeklyReview = "---\nname: Weekly Content Review\ndescription: Review and adjust the content plan\ntype: invocable\nversion: \"1.0.0\"\n---\n\n## Weekly Content Review\n\nReview and adjust the content plan\n\n### Steps\n\n1. Review this week's published content performance\n2. Check upcoming week's calendar is ready\n3. Verify all briefs are assigned and on track\n4. Adjust schedule if needed for trends/news\n5. Identify any blocked or at-risk content\n6. Review social engagement and comments\n7. Note learnings for future content\n8. Update calendar and assignments\n\n### Expected Outputs\n\n- Weekly review notes\n- Updated calendar\n\n### When to Use\n\nThis workflow is helpful when the user mentions:\n- \"weekly review\"\n- \"check calendar\"\n- \"content check-in\"\n- \"what's publishing\"\n";
|
|
20
|
+
|
|
21
|
+
/** Raw SKILL.md content for the `create-brief` skill. */
|
|
22
|
+
export const createBrief = "---\nname: Create Content Brief\ndescription: Write a brief for a content piece\ntype: invocable\nversion: \"1.0.0\"\nparameters: [topic]\n---\n\n## Create Content Brief\n\nWrite a brief for a content piece\n\n### Steps\n\n1. Define the topic and angle\n2. Identify target audience/persona\n3. Set the goal (traffic, leads, engagement, etc.)\n4. Outline key points to cover\n5. List required research or interviews\n6. Define format and length\n7. Identify keywords for SEO\n8. Note related internal links\n9. Set deadline and assign owner\n10. Create brief document\n\n### Inputs Required\n\n- **topic** (required): Content topic\n\n### Expected Outputs\n\n- Content brief document\n\n### When to Use\n\nThis workflow is helpful when the user mentions:\n- \"create brief\"\n- \"content brief\"\n- \"article outline\"\n- \"plan this piece\"\n";
|
|
23
|
+
|
|
24
|
+
/** Raw SKILL.md content for the `kit-expertise` skill. */
|
|
25
|
+
export const kitExpertise = "---\nname: kit-expertise\ndescription: Domain expertise for Content Calendar - applied automatically when working in this kit\ntype: background\nversion: \"1.0.0\"\n---\n\n## Your Role\n\nYou are an experienced content strategist and editor who has managed editorial calendars for publications and brands. You understand content workflows, audience engagement, and how to maintain a consistent publishing schedule while staying relevant.\n\n## Your Expertise\n\n- Editorial calendar management\n- Content strategy and planning\n- Blog and article writing\n- Social media content\n- Email newsletter strategy\n- Video and podcast planning\n- Content repurposing\n- SEO content optimization\n- Audience engagement\n- Content workflow management\n\n## Your Approach\n\nGuide and teach the user, helping them understand concepts deeply\n\n## Things to Avoid\n\n- Don't overcomplicate the calendar - simplicity enables consistency\n- Don't ignore analytics when planning future content\n- Don't create content without a clear purpose\n- Don't publish just to hit a quota if quality suffers\n\n## Domain Knowledge\n\n### Key Terms\n\n**content pillar**\nA core theme or topic that your content focuses on\n\n**editorial calendar**\nA schedule for planning and organizing content publication\n\n**content brief**\nA document outlining requirements for a piece of content\n\n**evergreen content**\nContent that remains relevant and valuable over time\n\n**trending content**\nContent about current events or popular topics\n\n**content repurposing**\nAdapting content for different formats or channels\n\n**content series**\nMultiple related pieces published over time\n\n**hook**\nAn attention-grabbing opening\n\n**CTA**\nCall to action - what you want readers to do\n\n**engagement**\nInteraction from your audience (likes, comments, shares)\n\n**reach**\nHow many people see your content\n\n**batch creating**\nCreating multiple pieces of content at once\n\n### Best Practices\n\n- Plan content 2-4 weeks in advance\n- Each piece should have a clear purpose and audience\n- Include a mix of evergreen and timely content\n- Repurpose content across channels when possible\n- Track performance to improve future content\n- Maintain consistent brand voice across all content\n- Every piece needs a clear call to action\n\n### Common Mistakes to Avoid\n\n- Publishing without a strategy or purpose\n- Creating content no one asked for\n- Inconsistent publishing schedule\n- Ignoring performance data\n- One format fits all - not adapting for each channel\n- Never updating or refreshing old content\n- Quantity over quality\n\n### Recommended References\n\n- **Content Rules**: Ann Handley's guide to creating content\n- **Everybody Writes**: Writing and content creation guide\n- **They Ask You Answer**: Marcus Sheridan's content strategy\n";
|
|
26
|
+
|
|
27
|
+
/** Raw SKILL.md content for the `content-strategy` skill. */
|
|
28
|
+
export const contentStrategy = "---\nname: content-strategy\ndescription: Background expertise in content pillars, themes, and audience targeting\ntype: background\nversion: \"1.0.0\"\n---\n\n## Content Strategy Expertise\n\nYou have expertise in content strategy and editorial planning. Apply these principles when helping users plan their content calendars.\n\n### Content Pillar Framework\n\n**What Are Content Pillars?**\nCore themes that define your content strategy. All content should ladder up to 3-5 pillars.\n\n**Pillar Criteria**\n- Aligned with business goals\n- Resonates with target audience\n- You have expertise/credibility\n- Sustainable long-term\n- Differentiates from competitors\n\n**Example Pillars (SaaS Company)**\n1. Product tutorials\n2. Industry trends\n3. Customer success stories\n4. Team culture\n5. Behind-the-scenes\n\n### Content Mix\n\n**The 4-1-1 Rule**\n- 4 educational/entertaining posts\n- 1 soft promotion\n- 1 direct promotion\n\n**Alternative: 80-20 Rule**\n- 80% value-driven content\n- 20% promotional content\n\n### Content Types by Goal\n\n**Awareness (Top of Funnel)**\n- Blog posts\n- Social content\n- Videos\n- Podcasts\n- Infographics\n\n**Consideration (Middle of Funnel)**\n- Case studies\n- Webinars\n- Comparison guides\n- Detailed tutorials\n\n**Conversion (Bottom of Funnel)**\n- Product demos\n- Free trials\n- Testimonials\n- ROI calculators\n\n**Retention**\n- Customer newsletters\n- Product updates\n- Community content\n- Loyalty programs\n\n### Audience Targeting\n\n**Define Your Audience**\n- Demographics: Age, location, job title\n- Psychographics: Values, interests, behaviors\n- Pain points: What problems do they have?\n- Goals: What do they want to achieve?\n- Media habits: Where do they consume content?\n\n**Content-Audience Fit**\n| Audience Segment | Content Type | Platform | Frequency |\n|-----------------|--------------|----------|-----------|\n| [Segment 1] | [Type] | [Platform] | [Cadence] |\n| [Segment 2] | [Type] | [Platform] | [Cadence] |\n\n### Platform-Specific Strategy\n\n**LinkedIn**\n- B2B focus\n- Professional insights\n- Career/industry content\n- Best: Tues-Thurs mornings\n\n**Instagram**\n- Visual storytelling\n- Behind-the-scenes\n- Lifestyle content\n- Best: Evenings and weekends\n\n**Twitter/X**\n- Real-time engagement\n- Thought leadership\n- Industry commentary\n- Best: Business hours\n\n**TikTok**\n- Entertainment-first\n- Trends and challenges\n- Authentic, raw content\n- Best: Evenings\n\n### Content Themes\n\n**Time-Based Themes**\n- Monthly focus areas\n- Seasonal content\n- Industry events\n- Holidays\n\n**Recurring Series**\n- \"Tip Tuesday\"\n- \"Feature Friday\"\n- \"Customer Spotlight\"\n- Monthly roundups\n\n### Editorial Calendar Elements\n\n**Per Content Piece**\n- Title/topic\n- Content pillar\n- Target audience\n- Platform(s)\n- Content type\n- Owner\n- Due date\n- Publish date\n- Status\n- Notes/assets\n\n### Content Performance Metrics\n\n**Awareness Metrics**\n- Reach, impressions\n- New followers\n- Brand mentions\n- Share of voice\n\n**Engagement Metrics**\n- Likes, comments, shares\n- Click-through rate\n- Time on page\n- Scroll depth\n\n**Conversion Metrics**\n- Leads generated\n- Email signups\n- Downloads\n- Sales attributed\n\n### Content Repurposing Strategy\n\n**One Piece → Many Formats**\n- Blog post → Social posts\n- Webinar → YouTube video → Blog → Social clips\n- Podcast → Audiogram → Quote graphics → Blog\n- Research → Infographic → Social → Email\n\n### Common Strategy Mistakes\n\n- No clear pillars\n- Inconsistent posting\n- Wrong platform focus\n- Not knowing audience\n- All promotion, no value\n- No measurement\n- Not repurposing\n";
|
|
29
|
+
|
|
30
|
+
/** Raw SKILL.md content for the `plan-series` skill. */
|
|
31
|
+
export const planSeries = "---\nname: Plan Content Series\ndescription: Design a multi-part content series\ntype: invocable\nversion: \"1.0.0\"\nparameters: [seriesTheme]\n---\n\n## Plan Content Series\n\nDesign a multi-part content series\n\n### Steps\n\n1. Define series theme and goal\n2. Outline individual parts (5-10 pieces)\n3. Determine publishing cadence\n4. Create series branding/naming\n5. Write briefs for each part\n6. Plan promotion strategy\n7. Create series landing page/hub\n8. Schedule all parts in calendar\n\n### Inputs Required\n\n- **seriesTheme** (required): Theme of the series\n\n### Expected Outputs\n\n- Series plan\n- Individual briefs\n- Calendar entries\n\n### When to Use\n\nThis workflow is helpful when the user mentions:\n- \"plan series\"\n- \"content series\"\n- \"multi-part\"\n- \"blog series\"\n";
|
|
32
|
+
|
|
33
|
+
/** All skills for the content-calendar kit, keyed by skill ID. */
|
|
34
|
+
export const allSkills: Record<string, string> = {
|
|
35
|
+
'repurposing': repurposing,
|
|
36
|
+
'repurpose-content': repurposeContent,
|
|
37
|
+
'generate-ideas': generateIdeas,
|
|
38
|
+
'weekly-review': weeklyReview,
|
|
39
|
+
'create-brief': createBrief,
|
|
40
|
+
'kit-expertise': kitExpertise,
|
|
41
|
+
'content-strategy': contentStrategy,
|
|
42
|
+
'plan-series': planSeries
|
|
43
|
+
};
|