@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.
Files changed (528) hide show
  1. package/kits/ai-content-studio/kit.json +358 -0
  2. package/kits/api-documentation/kit.json +358 -0
  3. package/kits/api-documentation/skills/api-examples/SKILL.md +176 -0
  4. package/kits/api-documentation/skills/api-review/SKILL.md +35 -0
  5. package/kits/api-documentation/skills/api-versioning/SKILL.md +156 -0
  6. package/kits/api-documentation/skills/create-code-examples/SKILL.md +42 -0
  7. package/kits/api-documentation/skills/define-resource/SKILL.md +39 -0
  8. package/kits/api-documentation/skills/document-auth/SKILL.md +39 -0
  9. package/kits/api-documentation/skills/document-endpoint/SKILL.md +40 -0
  10. package/kits/api-documentation/skills/kit-expertise/SKILL.md +78 -0
  11. package/kits/api-documentation/skills/openapi-spec/SKILL.md +174 -0
  12. package/kits/axe-house/kit.json +931 -0
  13. package/kits/axe-house/skills/axe-expertise/SKILL.md +259 -0
  14. package/kits/axe-house/skills/blog-draft/SKILL.md +147 -0
  15. package/kits/axe-house/skills/booking-digest/SKILL.md +188 -0
  16. package/kits/axe-house/skills/customer-insights/SKILL.md +215 -0
  17. package/kits/axe-house/skills/demand-forecast/SKILL.md +183 -0
  18. package/kits/axe-house/skills/email-campaign/SKILL.md +135 -0
  19. package/kits/axe-house/skills/experience-copy/SKILL.md +142 -0
  20. package/kits/axe-house/skills/guest-letter/SKILL.md +171 -0
  21. package/kits/axe-house/skills/inventory-health/SKILL.md +234 -0
  22. package/kits/axe-house/skills/league-manager/SKILL.md +264 -0
  23. package/kits/axe-house/skills/revenue-report/SKILL.md +240 -0
  24. package/kits/axe-house/skills/safety-briefing/SKILL.md +248 -0
  25. package/kits/axe-house/skills/social-calendar/SKILL.md +203 -0
  26. package/kits/axe-house/skills/staff-briefing/SKILL.md +231 -0
  27. package/kits/axe-house/skills/venue-data-model/SKILL.md +225 -0
  28. package/kits/blog-series/kit.json +363 -0
  29. package/kits/blog-series/skills/content-hooks/SKILL.md +158 -0
  30. package/kits/blog-series/skills/headline-brainstorm/SKILL.md +40 -0
  31. package/kits/blog-series/skills/kit-expertise/SKILL.md +78 -0
  32. package/kits/blog-series/skills/repurpose-content/SKILL.md +40 -0
  33. package/kits/blog-series/skills/seo-review/SKILL.md +41 -0
  34. package/kits/blog-series/skills/seo-writing/SKILL.md +135 -0
  35. package/kits/blog-series/skills/series-audit/SKILL.md +36 -0
  36. package/kits/blog-series/skills/write-post-outline/SKILL.md +42 -0
  37. package/kits/business-plan/kit.json +437 -0
  38. package/kits/business-plan/skills/competitor-analysis/SKILL.md +34 -0
  39. package/kits/business-plan/skills/financial-modeling/SKILL.md +180 -0
  40. package/kits/business-plan/skills/financial-projections/SKILL.md +42 -0
  41. package/kits/business-plan/skills/kit-expertise/SKILL.md +101 -0
  42. package/kits/business-plan/skills/market-analysis/SKILL.md +155 -0
  43. package/kits/business-plan/skills/market-research/SKILL.md +35 -0
  44. package/kits/business-plan/skills/sba-compliance/SKILL.md +163 -0
  45. package/kits/business-plan/skills/swot-analysis/SKILL.md +36 -0
  46. package/kits/canvas-and-corks/kit.json +910 -0
  47. package/kits/canvas-and-corks/skills/blog-draft/SKILL.md +160 -0
  48. package/kits/canvas-and-corks/skills/booking-digest/SKILL.md +147 -0
  49. package/kits/canvas-and-corks/skills/class-description/SKILL.md +53 -0
  50. package/kits/canvas-and-corks/skills/class-roster/SKILL.md +163 -0
  51. package/kits/canvas-and-corks/skills/customer-insights/SKILL.md +174 -0
  52. package/kits/canvas-and-corks/skills/demand-forecast/SKILL.md +191 -0
  53. package/kits/canvas-and-corks/skills/email-campaign/SKILL.md +154 -0
  54. package/kits/canvas-and-corks/skills/experience-copy/SKILL.md +152 -0
  55. package/kits/canvas-and-corks/skills/guest-letter/SKILL.md +127 -0
  56. package/kits/canvas-and-corks/skills/inventory-health/SKILL.md +204 -0
  57. package/kits/canvas-and-corks/skills/painting-memory/SKILL.md +76 -0
  58. package/kits/canvas-and-corks/skills/revenue-report/SKILL.md +196 -0
  59. package/kits/canvas-and-corks/skills/social-calendar/SKILL.md +146 -0
  60. package/kits/canvas-and-corks/skills/staff-briefing/SKILL.md +134 -0
  61. package/kits/canvas-and-corks/skills/studio-expertise/SKILL.md +181 -0
  62. package/kits/canvas-and-corks/skills/venue-data-model/SKILL.md +325 -0
  63. package/kits/character-relationship-map/kit.json +367 -0
  64. package/kits/character-relationship-map/skills/ensemble-balance/SKILL.md +189 -0
  65. package/kits/character-relationship-map/skills/kit-expertise/SKILL.md +83 -0
  66. package/kits/character-relationship-map/skills/relationship-dynamics/SKILL.md +158 -0
  67. package/kits/clay-and-co/kit.json +938 -0
  68. package/kits/clay-and-co/skills/blog-draft/SKILL.md +135 -0
  69. package/kits/clay-and-co/skills/booking-digest/SKILL.md +163 -0
  70. package/kits/clay-and-co/skills/customer-insights/SKILL.md +207 -0
  71. package/kits/clay-and-co/skills/demand-forecast/SKILL.md +166 -0
  72. package/kits/clay-and-co/skills/email-campaign/SKILL.md +125 -0
  73. package/kits/clay-and-co/skills/experience-copy/SKILL.md +132 -0
  74. package/kits/clay-and-co/skills/guest-letter/SKILL.md +104 -0
  75. package/kits/clay-and-co/skills/inventory-health/SKILL.md +211 -0
  76. package/kits/clay-and-co/skills/kiln-scheduler/SKILL.md +206 -0
  77. package/kits/clay-and-co/skills/piece-tracker/SKILL.md +165 -0
  78. package/kits/clay-and-co/skills/pottery-expertise/SKILL.md +165 -0
  79. package/kits/clay-and-co/skills/pottery-memory/SKILL.md +119 -0
  80. package/kits/clay-and-co/skills/revenue-report/SKILL.md +205 -0
  81. package/kits/clay-and-co/skills/social-calendar/SKILL.md +130 -0
  82. package/kits/clay-and-co/skills/staff-briefing/SKILL.md +213 -0
  83. package/kits/clay-and-co/skills/venue-data-model/SKILL.md +230 -0
  84. package/kits/concept-map/kit.json +353 -0
  85. package/kits/concept-map/skills/add-concept/SKILL.md +41 -0
  86. package/kits/concept-map/skills/assess-understanding/SKILL.md +36 -0
  87. package/kits/concept-map/skills/concept-hierarchy/SKILL.md +148 -0
  88. package/kits/concept-map/skills/create-learning-map/SKILL.md +42 -0
  89. package/kits/concept-map/skills/find-cross-links/SKILL.md +34 -0
  90. package/kits/concept-map/skills/identify-prerequisites/SKILL.md +40 -0
  91. package/kits/concept-map/skills/kit-expertise/SKILL.md +78 -0
  92. package/kits/concept-map/skills/relationship-types/SKILL.md +160 -0
  93. package/kits/content-calendar/kit.json +420 -0
  94. package/kits/content-calendar/skills/content-strategy/SKILL.md +174 -0
  95. package/kits/content-calendar/skills/create-brief/SKILL.md +40 -0
  96. package/kits/content-calendar/skills/generate-ideas/SKILL.md +40 -0
  97. package/kits/content-calendar/skills/kit-expertise/SKILL.md +100 -0
  98. package/kits/content-calendar/skills/plan-series/SKILL.md +40 -0
  99. package/kits/content-calendar/skills/repurpose-content/SKILL.md +38 -0
  100. package/kits/content-calendar/skills/repurposing/SKILL.md +179 -0
  101. package/kits/content-calendar/skills/weekly-review/SKILL.md +34 -0
  102. package/kits/coworking-space/kit.json +1068 -0
  103. package/kits/escape-vault/kit.json +1028 -0
  104. package/kits/escape-vault/skills/blog-draft/SKILL.md +157 -0
  105. package/kits/escape-vault/skills/booking-digest/SKILL.md +151 -0
  106. package/kits/escape-vault/skills/customer-insights/SKILL.md +185 -0
  107. package/kits/escape-vault/skills/demand-forecast/SKILL.md +188 -0
  108. package/kits/escape-vault/skills/email-campaign/SKILL.md +157 -0
  109. package/kits/escape-vault/skills/escape-expertise/SKILL.md +200 -0
  110. package/kits/escape-vault/skills/escape-memory/SKILL.md +99 -0
  111. package/kits/escape-vault/skills/experience-copy/SKILL.md +159 -0
  112. package/kits/escape-vault/skills/guest-letter/SKILL.md +143 -0
  113. package/kits/escape-vault/skills/inventory-health/SKILL.md +222 -0
  114. package/kits/escape-vault/skills/leaderboard-report/SKILL.md +204 -0
  115. package/kits/escape-vault/skills/revenue-report/SKILL.md +202 -0
  116. package/kits/escape-vault/skills/room-designer/SKILL.md +182 -0
  117. package/kits/escape-vault/skills/social-calendar/SKILL.md +148 -0
  118. package/kits/escape-vault/skills/staff-briefing/SKILL.md +159 -0
  119. package/kits/escape-vault/skills/venue-data-model/SKILL.md +335 -0
  120. package/kits/family-tree/kit.json +380 -0
  121. package/kits/family-tree/skills/add-family-member/SKILL.md +42 -0
  122. package/kits/family-tree/skills/analyze-relationship/SKILL.md +41 -0
  123. package/kits/family-tree/skills/export-gedcom/SKILL.md +34 -0
  124. package/kits/family-tree/skills/genealogy-research/SKILL.md +188 -0
  125. package/kits/family-tree/skills/kit-expertise/SKILL.md +107 -0
  126. package/kits/family-tree/skills/record-oral-history/SKILL.md +43 -0
  127. package/kits/family-tree/skills/relationship-mapping/SKILL.md +171 -0
  128. package/kits/family-tree/skills/research-ancestor/SKILL.md +43 -0
  129. package/kits/farkle-dice-game/kit.json +316 -0
  130. package/kits/farkle-dice-game/skills/kit-expertise/SKILL.md +137 -0
  131. package/kits/franchise-ops/kit.json +326 -0
  132. package/kits/freelance-portfolio/kit.json +435 -0
  133. package/kits/game-design-doc/kit.json +353 -0
  134. package/kits/game-design-doc/skills/balance-system/SKILL.md +40 -0
  135. package/kits/game-design-doc/skills/create-character/SKILL.md +40 -0
  136. package/kits/game-design-doc/skills/design-mechanic/SKILL.md +40 -0
  137. package/kits/game-design-doc/skills/economy-design/SKILL.md +152 -0
  138. package/kits/game-design-doc/skills/game-mechanics/SKILL.md +141 -0
  139. package/kits/game-design-doc/skills/ideate-features/SKILL.md +36 -0
  140. package/kits/game-design-doc/skills/kit-expertise/SKILL.md +78 -0
  141. package/kits/game-design-doc/skills/playtest-feedback/SKILL.md +142 -0
  142. package/kits/game-design-doc/skills/review-gdd/SKILL.md +33 -0
  143. package/kits/gather-and-grill/kit.json +966 -0
  144. package/kits/gather-and-grill/skills/blog-draft/SKILL.md +120 -0
  145. package/kits/gather-and-grill/skills/booking-digest/SKILL.md +171 -0
  146. package/kits/gather-and-grill/skills/cooking-memory/SKILL.md +100 -0
  147. package/kits/gather-and-grill/skills/culinary-expertise/SKILL.md +180 -0
  148. package/kits/gather-and-grill/skills/customer-insights/SKILL.md +184 -0
  149. package/kits/gather-and-grill/skills/demand-forecast/SKILL.md +200 -0
  150. package/kits/gather-and-grill/skills/email-campaign/SKILL.md +97 -0
  151. package/kits/gather-and-grill/skills/experience-copy/SKILL.md +92 -0
  152. package/kits/gather-and-grill/skills/guest-letter/SKILL.md +98 -0
  153. package/kits/gather-and-grill/skills/inventory-health/SKILL.md +193 -0
  154. package/kits/gather-and-grill/skills/menu-planner/SKILL.md +175 -0
  155. package/kits/gather-and-grill/skills/recipe-card/SKILL.md +194 -0
  156. package/kits/gather-and-grill/skills/revenue-report/SKILL.md +245 -0
  157. package/kits/gather-and-grill/skills/social-calendar/SKILL.md +139 -0
  158. package/kits/gather-and-grill/skills/staff-briefing/SKILL.md +167 -0
  159. package/kits/gather-and-grill/skills/venue-data-model/SKILL.md +336 -0
  160. package/kits/gtd-productivity-system/kit.json +389 -0
  161. package/kits/gtd-productivity-system/skills/break-down-project/SKILL.md +41 -0
  162. package/kits/gtd-productivity-system/skills/clarify-task/SKILL.md +42 -0
  163. package/kits/gtd-productivity-system/skills/gtd-methodology/SKILL.md +185 -0
  164. package/kits/gtd-productivity-system/skills/inbox-processing/SKILL.md +173 -0
  165. package/kits/gtd-productivity-system/skills/kit-expertise/SKILL.md +111 -0
  166. package/kits/gtd-productivity-system/skills/mind-sweep/SKILL.md +35 -0
  167. package/kits/gtd-productivity-system/skills/process-inbox/SKILL.md +40 -0
  168. package/kits/gtd-productivity-system/skills/weekly-review/SKILL.md +197 -0
  169. package/kits/gym-fitness/kit.json +1037 -0
  170. package/kits/interactive-fiction/kit.json +471 -0
  171. package/kits/invoice-generator/kit.json +466 -0
  172. package/kits/loyalty-program/kit.json +323 -0
  173. package/kits/marketing-plan/kit.json +417 -0
  174. package/kits/marketing-plan/skills/allocate-budget/SKILL.md +34 -0
  175. package/kits/marketing-plan/skills/campaign-metrics/SKILL.md +184 -0
  176. package/kits/marketing-plan/skills/channel-strategy/SKILL.md +156 -0
  177. package/kits/marketing-plan/skills/content-calendar/SKILL.md +34 -0
  178. package/kits/marketing-plan/skills/create-persona/SKILL.md +40 -0
  179. package/kits/marketing-plan/skills/kit-expertise/SKILL.md +109 -0
  180. package/kits/marketing-plan/skills/measure-performance/SKILL.md +34 -0
  181. package/kits/marketing-plan/skills/plan-campaign/SKILL.md +41 -0
  182. package/kits/marketing-site/kit.json +230 -0
  183. package/kits/marketing-site/skills/add-page/SKILL.md +28 -0
  184. package/kits/marketing-site/skills/add-section/SKILL.md +29 -0
  185. package/kits/marketing-site/skills/change-colors/SKILL.md +24 -0
  186. package/kits/marketing-site/skills/conversion-copy/SKILL.md +152 -0
  187. package/kits/marketing-site/skills/export-deploy/SKILL.md +24 -0
  188. package/kits/marketing-site/skills/kit-expertise/SKILL.md +77 -0
  189. package/kits/marketing-site/skills/landing-page/SKILL.md +156 -0
  190. package/kits/match-3-puzzle/kit.json +245 -0
  191. package/kits/match-3-puzzle/skills/kit-expertise/SKILL.md +96 -0
  192. package/kits/mind-map/kit.json +355 -0
  193. package/kits/mind-map/skills/add-branch/SKILL.md +40 -0
  194. package/kits/mind-map/skills/brainstorm-topic/SKILL.md +41 -0
  195. package/kits/mind-map/skills/branch-expansion/SKILL.md +181 -0
  196. package/kits/mind-map/skills/find-connections/SKILL.md +34 -0
  197. package/kits/mind-map/skills/kit-expertise/SKILL.md +78 -0
  198. package/kits/mind-map/skills/organize-map/SKILL.md +35 -0
  199. package/kits/mind-map/skills/radiant-thinking/SKILL.md +184 -0
  200. package/kits/mind-map/skills/summarize-map/SKILL.md +34 -0
  201. package/kits/music-collection/kit.json +403 -0
  202. package/kits/music-collection/skills/add-album/SKILL.md +44 -0
  203. package/kits/music-collection/skills/create-playlist/SKILL.md +37 -0
  204. package/kits/music-collection/skills/explore-artist/SKILL.md +37 -0
  205. package/kits/music-collection/skills/journal-session/SKILL.md +40 -0
  206. package/kits/music-collection/skills/kit-expertise/SKILL.md +98 -0
  207. package/kits/music-collection/skills/music-metadata/SKILL.md +209 -0
  208. package/kits/music-collection/skills/playlist-curator/SKILL.md +182 -0
  209. package/kits/music-collection/skills/recommend-similar/SKILL.md +36 -0
  210. package/kits/music-venue/kit.json +986 -0
  211. package/kits/novel-writing-system/kit.json +481 -0
  212. package/kits/novel-writing-system/skills/character-arc/SKILL.md +164 -0
  213. package/kits/novel-writing-system/skills/develop-character-arc/SKILL.md +42 -0
  214. package/kits/novel-writing-system/skills/kit-expertise/SKILL.md +84 -0
  215. package/kits/novel-writing-system/skills/outline-review/SKILL.md +34 -0
  216. package/kits/novel-writing-system/skills/plot-doctor/SKILL.md +221 -0
  217. package/kits/novel-writing-system/skills/plot-hole-check/SKILL.md +35 -0
  218. package/kits/novel-writing-system/skills/scene-development/SKILL.md +38 -0
  219. package/kits/novel-writing-system/skills/scene-sequel/SKILL.md +162 -0
  220. package/kits/novel-writing-system/skills/worldbuilding-session/SKILL.md +40 -0
  221. package/kits/organization-chart/kit.json +349 -0
  222. package/kits/organization-chart/skills/add-role/SKILL.md +41 -0
  223. package/kits/organization-chart/skills/analyze-span/SKILL.md +34 -0
  224. package/kits/organization-chart/skills/create-raci/SKILL.md +42 -0
  225. package/kits/organization-chart/skills/kit-expertise/SKILL.md +78 -0
  226. package/kits/organization-chart/skills/org-design/SKILL.md +188 -0
  227. package/kits/organization-chart/skills/org-health-check/SKILL.md +35 -0
  228. package/kits/organization-chart/skills/plan-reorg/SKILL.md +42 -0
  229. package/kits/organization-chart/skills/role-definition/SKILL.md +180 -0
  230. package/kits/paws-and-pour/kit.json +969 -0
  231. package/kits/paws-and-pour/skills/adoption-report/SKILL.md +273 -0
  232. package/kits/paws-and-pour/skills/animal-profile/SKILL.md +206 -0
  233. package/kits/paws-and-pour/skills/blog-draft/SKILL.md +137 -0
  234. package/kits/paws-and-pour/skills/booking-digest/SKILL.md +251 -0
  235. package/kits/paws-and-pour/skills/cafe-expertise/SKILL.md +218 -0
  236. package/kits/paws-and-pour/skills/cafe-memory/SKILL.md +114 -0
  237. package/kits/paws-and-pour/skills/customer-insights/SKILL.md +216 -0
  238. package/kits/paws-and-pour/skills/demand-forecast/SKILL.md +200 -0
  239. package/kits/paws-and-pour/skills/email-campaign/SKILL.md +154 -0
  240. package/kits/paws-and-pour/skills/experience-copy/SKILL.md +139 -0
  241. package/kits/paws-and-pour/skills/guest-letter/SKILL.md +183 -0
  242. package/kits/paws-and-pour/skills/inventory-health/SKILL.md +213 -0
  243. package/kits/paws-and-pour/skills/revenue-report/SKILL.md +273 -0
  244. package/kits/paws-and-pour/skills/social-calendar/SKILL.md +183 -0
  245. package/kits/paws-and-pour/skills/staff-briefing/SKILL.md +223 -0
  246. package/kits/paws-and-pour/skills/venue-data-model/SKILL.md +260 -0
  247. package/kits/persona-driven-strategy/kit.json +352 -0
  248. package/kits/persona-driven-strategy/skills/empathy-mapping/SKILL.md +221 -0
  249. package/kits/persona-driven-strategy/skills/journey-mapping/SKILL.md +219 -0
  250. package/kits/persona-driven-strategy/skills/kit-expertise/SKILL.md +81 -0
  251. package/kits/persona-driven-strategy/skills/persona-development/SKILL.md +189 -0
  252. package/kits/personal-crm/kit.json +373 -0
  253. package/kits/personal-crm/skills/add-contact/SKILL.md +42 -0
  254. package/kits/personal-crm/skills/connect-contacts/SKILL.md +41 -0
  255. package/kits/personal-crm/skills/find-dormant/SKILL.md +35 -0
  256. package/kits/personal-crm/skills/kit-expertise/SKILL.md +82 -0
  257. package/kits/personal-crm/skills/log-interaction/SKILL.md +43 -0
  258. package/kits/personal-crm/skills/network-analysis/SKILL.md +161 -0
  259. package/kits/personal-crm/skills/relationship-insights/SKILL.md +153 -0
  260. package/kits/personal-wiki/kit.json +322 -0
  261. package/kits/personal-wiki/skills/kit-expertise/SKILL.md +81 -0
  262. package/kits/personal-wiki/skills/orphan-finder/SKILL.md +155 -0
  263. package/kits/personal-wiki/skills/wiki-structure/SKILL.md +179 -0
  264. package/kits/petal-press/kit.json +996 -0
  265. package/kits/petal-press/skills/arrangement-memory/SKILL.md +143 -0
  266. package/kits/petal-press/skills/blog-draft/SKILL.md +167 -0
  267. package/kits/petal-press/skills/booking-digest/SKILL.md +196 -0
  268. package/kits/petal-press/skills/care-card/SKILL.md +173 -0
  269. package/kits/petal-press/skills/customer-insights/SKILL.md +213 -0
  270. package/kits/petal-press/skills/demand-forecast/SKILL.md +203 -0
  271. package/kits/petal-press/skills/email-campaign/SKILL.md +204 -0
  272. package/kits/petal-press/skills/experience-copy/SKILL.md +184 -0
  273. package/kits/petal-press/skills/floral-expertise/SKILL.md +244 -0
  274. package/kits/petal-press/skills/guest-letter/SKILL.md +153 -0
  275. package/kits/petal-press/skills/inventory-health/SKILL.md +201 -0
  276. package/kits/petal-press/skills/revenue-report/SKILL.md +219 -0
  277. package/kits/petal-press/skills/seasonal-guide/SKILL.md +238 -0
  278. package/kits/petal-press/skills/social-calendar/SKILL.md +217 -0
  279. package/kits/petal-press/skills/staff-briefing/SKILL.md +217 -0
  280. package/kits/petal-press/skills/venue-data-model/SKILL.md +226 -0
  281. package/kits/pitch-deck/kit.json +416 -0
  282. package/kits/pitch-deck/skills/calculate-market-size/SKILL.md +41 -0
  283. package/kits/pitch-deck/skills/develop-problem-slide/SKILL.md +39 -0
  284. package/kits/pitch-deck/skills/investor-qa/SKILL.md +182 -0
  285. package/kits/pitch-deck/skills/investor-qa-prep/SKILL.md +36 -0
  286. package/kits/pitch-deck/skills/kit-expertise/SKILL.md +112 -0
  287. package/kits/pitch-deck/skills/pitch-structure/SKILL.md +186 -0
  288. package/kits/pitch-deck/skills/practice-pitch/SKILL.md +36 -0
  289. package/kits/podcast-series/kit.json +324 -0
  290. package/kits/podcast-series/skills/audience-growth/SKILL.md +38 -0
  291. package/kits/podcast-series/skills/create-guest-profile/SKILL.md +42 -0
  292. package/kits/podcast-series/skills/episode-structure/SKILL.md +189 -0
  293. package/kits/podcast-series/skills/guest-research/SKILL.md +167 -0
  294. package/kits/podcast-series/skills/kit-expertise/SKILL.md +81 -0
  295. package/kits/podcast-series/skills/plan-episode/SKILL.md +44 -0
  296. package/kits/podcast-series/skills/prepare-guest/SKILL.md +45 -0
  297. package/kits/podcast-series/skills/show-notes/SKILL.md +182 -0
  298. package/kits/podcast-series/skills/write-show-notes/SKILL.md +43 -0
  299. package/kits/pour-house/kit.json +912 -0
  300. package/kits/pour-house/skills/blog-draft/SKILL.md +138 -0
  301. package/kits/pour-house/skills/booking-digest/SKILL.md +151 -0
  302. package/kits/pour-house/skills/cellar-report/SKILL.md +251 -0
  303. package/kits/pour-house/skills/customer-insights/SKILL.md +184 -0
  304. package/kits/pour-house/skills/demand-forecast/SKILL.md +156 -0
  305. package/kits/pour-house/skills/email-campaign/SKILL.md +130 -0
  306. package/kits/pour-house/skills/experience-copy/SKILL.md +125 -0
  307. package/kits/pour-house/skills/guest-letter/SKILL.md +136 -0
  308. package/kits/pour-house/skills/inventory-health/SKILL.md +159 -0
  309. package/kits/pour-house/skills/pour-memory/SKILL.md +89 -0
  310. package/kits/pour-house/skills/revenue-report/SKILL.md +232 -0
  311. package/kits/pour-house/skills/social-calendar/SKILL.md +140 -0
  312. package/kits/pour-house/skills/sommelier-expertise/SKILL.md +324 -0
  313. package/kits/pour-house/skills/staff-briefing/SKILL.md +176 -0
  314. package/kits/pour-house/skills/tasting-notes/SKILL.md +179 -0
  315. package/kits/pour-house/skills/venue-data-model/SKILL.md +323 -0
  316. package/kits/presentation/kit.json +296 -0
  317. package/kits/product-requirements-doc/kit.json +365 -0
  318. package/kits/product-requirements-doc/skills/acceptance-criteria/SKILL.md +219 -0
  319. package/kits/product-requirements-doc/skills/create-user-story/SKILL.md +43 -0
  320. package/kits/product-requirements-doc/skills/define-success-metrics/SKILL.md +41 -0
  321. package/kits/product-requirements-doc/skills/kit-expertise/SKILL.md +81 -0
  322. package/kits/product-requirements-doc/skills/prd-review/SKILL.md +39 -0
  323. package/kits/product-requirements-doc/skills/prd-structure/SKILL.md +206 -0
  324. package/kits/product-requirements-doc/skills/prioritize-features/SKILL.md +43 -0
  325. package/kits/product-requirements-doc/skills/synthesize-research/SKILL.md +43 -0
  326. package/kits/product-requirements-doc/skills/user-stories/SKILL.md +198 -0
  327. package/kits/project-timeline/kit.json +367 -0
  328. package/kits/project-timeline/skills/add-milestone/SKILL.md +44 -0
  329. package/kits/project-timeline/skills/add-task/SKILL.md +43 -0
  330. package/kits/project-timeline/skills/assess-risks/SKILL.md +39 -0
  331. package/kits/project-timeline/skills/dependency-analysis/SKILL.md +176 -0
  332. package/kits/project-timeline/skills/identify-critical-path/SKILL.md +37 -0
  333. package/kits/project-timeline/skills/kit-expertise/SKILL.md +81 -0
  334. package/kits/project-timeline/skills/milestone-planning/SKILL.md +169 -0
  335. package/kits/project-timeline/skills/status-update/SKILL.md +39 -0
  336. package/kits/reading-tracker/kit.json +368 -0
  337. package/kits/reading-tracker/skills/add-book/SKILL.md +32 -0
  338. package/kits/reading-tracker/skills/book-connections/SKILL.md +161 -0
  339. package/kits/reading-tracker/skills/kit-expertise/SKILL.md +72 -0
  340. package/kits/reading-tracker/skills/log-progress/SKILL.md +29 -0
  341. package/kits/reading-tracker/skills/reading-insights/SKILL.md +179 -0
  342. package/kits/reading-tracker/skills/save-quote/SKILL.md +30 -0
  343. package/kits/recipe-manager/kit.json +376 -0
  344. package/kits/recipe-manager/skills/add-recipe/SKILL.md +33 -0
  345. package/kits/recipe-manager/skills/generate-shopping-list/SKILL.md +27 -0
  346. package/kits/recipe-manager/skills/ingredient-substitutions/SKILL.md +157 -0
  347. package/kits/recipe-manager/skills/kit-expertise/SKILL.md +72 -0
  348. package/kits/recipe-manager/skills/meal-planning/SKILL.md +184 -0
  349. package/kits/recipe-manager/skills/plan-meal/SKILL.md +31 -0
  350. package/kits/recipe-manager/skills/scaling-recipes/SKILL.md +183 -0
  351. package/kits/saas-app/kit.json +405 -0
  352. package/kits/saas-app/skills/churn-analysis/SKILL.md +219 -0
  353. package/kits/saas-app/skills/onboarding-flow/SKILL.md +217 -0
  354. package/kits/saas-app/skills/pricing-model/SKILL.md +192 -0
  355. package/kits/saas-app/skills/saas-expertise/SKILL.md +95 -0
  356. package/kits/salon-barbershop/kit.json +1021 -0
  357. package/kits/screenplay-writing/kit.json +412 -0
  358. package/kits/screenplay-writing/skills/analyze-scene/SKILL.md +42 -0
  359. package/kits/screenplay-writing/skills/beat-sheet/SKILL.md +134 -0
  360. package/kits/screenplay-writing/skills/create-scene-card/SKILL.md +46 -0
  361. package/kits/screenplay-writing/skills/develop-character/SKILL.md +43 -0
  362. package/kits/screenplay-writing/skills/generate-beat-sheet/SKILL.md +49 -0
  363. package/kits/screenplay-writing/skills/kit-expertise/SKILL.md +90 -0
  364. package/kits/screenplay-writing/skills/scene-analysis/SKILL.md +164 -0
  365. package/kits/screenplay-writing/skills/screenplay-format/SKILL.md +108 -0
  366. package/kits/social-media-manager/kit.json +476 -0
  367. package/kits/teacher-lesson-plan/kit.json +410 -0
  368. package/kits/teacher-lesson-plan/skills/assessment-design/SKILL.md +162 -0
  369. package/kits/teacher-lesson-plan/skills/blooms-taxonomy/SKILL.md +139 -0
  370. package/kits/teacher-lesson-plan/skills/create-lesson/SKILL.md +34 -0
  371. package/kits/teacher-lesson-plan/skills/design-unit/SKILL.md +28 -0
  372. package/kits/teacher-lesson-plan/skills/differentiate-lesson/SKILL.md +28 -0
  373. package/kits/teacher-lesson-plan/skills/differentiation/SKILL.md +180 -0
  374. package/kits/teacher-lesson-plan/skills/kit-expertise/SKILL.md +96 -0
  375. package/kits/teacher-lesson-plan/skills/schedule-lesson/SKILL.md +31 -0
  376. package/kits/technical-specification/kit.json +369 -0
  377. package/kits/technical-specification/skills/architecture-decision/SKILL.md +42 -0
  378. package/kits/technical-specification/skills/architecture-decisions/SKILL.md +180 -0
  379. package/kits/technical-specification/skills/data-model-design/SKILL.md +43 -0
  380. package/kits/technical-specification/skills/data-modeling/SKILL.md +159 -0
  381. package/kits/technical-specification/skills/define-component/SKILL.md +43 -0
  382. package/kits/technical-specification/skills/kit-expertise/SKILL.md +81 -0
  383. package/kits/technical-specification/skills/requirements-analysis/SKILL.md +42 -0
  384. package/kits/technical-specification/skills/security-review/SKILL.md +170 -0
  385. package/kits/technical-specification/skills/spec-review/SKILL.md +39 -0
  386. package/kits/wanderlands/kit.json +399 -0
  387. package/kits/wanderlands/skills/kit-expertise/SKILL.md +376 -0
  388. package/kits/web-application/kit.json +257 -0
  389. package/kits/web-application/skills/kit-expertise/SKILL.md +211 -0
  390. package/kits/wicks-and-whiskers/kit.json +1267 -0
  391. package/kits/wicks-and-whiskers/skills/blog-draft/SKILL.md +145 -0
  392. package/kits/wicks-and-whiskers/skills/booking-digest/SKILL.md +142 -0
  393. package/kits/wicks-and-whiskers/skills/candle-expertise/SKILL.md +69 -0
  394. package/kits/wicks-and-whiskers/skills/customer-insights/SKILL.md +176 -0
  395. package/kits/wicks-and-whiskers/skills/demand-forecast/SKILL.md +159 -0
  396. package/kits/wicks-and-whiskers/skills/email-campaign/SKILL.md +131 -0
  397. package/kits/wicks-and-whiskers/skills/experience-copy/SKILL.md +135 -0
  398. package/kits/wicks-and-whiskers/skills/guest-letter/SKILL.md +154 -0
  399. package/kits/wicks-and-whiskers/skills/inventory-health/SKILL.md +185 -0
  400. package/kits/wicks-and-whiskers/skills/kitten-profile/SKILL.md +159 -0
  401. package/kits/wicks-and-whiskers/skills/memory-narrative/SKILL.md +71 -0
  402. package/kits/wicks-and-whiskers/skills/revenue-report/SKILL.md +197 -0
  403. package/kits/wicks-and-whiskers/skills/social-calendar/SKILL.md +161 -0
  404. package/kits/wicks-and-whiskers/skills/staff-briefing/SKILL.md +174 -0
  405. package/kits/wicks-and-whiskers/skills/venue-data-model/SKILL.md +228 -0
  406. package/kits/world-building/kit.json +497 -0
  407. package/kits/world-building/skills/consistency-check/SKILL.md +179 -0
  408. package/kits/world-building/skills/create-character/SKILL.md +44 -0
  409. package/kits/world-building/skills/create-faction/SKILL.md +44 -0
  410. package/kits/world-building/skills/create-location/SKILL.md +44 -0
  411. package/kits/world-building/skills/create-timeline/SKILL.md +39 -0
  412. package/kits/world-building/skills/culture-builder/SKILL.md +171 -0
  413. package/kits/world-building/skills/design-magic-system/SKILL.md +38 -0
  414. package/kits/world-building/skills/kit-expertise/SKILL.md +110 -0
  415. package/kits/world-building/skills/magic-systems/SKILL.md +161 -0
  416. package/kits/youtube-content-plan/kit.json +346 -0
  417. package/kits/youtube-content-plan/skills/analytics-insights/SKILL.md +166 -0
  418. package/kits/youtube-content-plan/skills/analyze-performance/SKILL.md +43 -0
  419. package/kits/youtube-content-plan/skills/develop-video-idea/SKILL.md +45 -0
  420. package/kits/youtube-content-plan/skills/generate-ideas/SKILL.md +42 -0
  421. package/kits/youtube-content-plan/skills/kit-expertise/SKILL.md +81 -0
  422. package/kits/youtube-content-plan/skills/optimize-metadata/SKILL.md +43 -0
  423. package/kits/youtube-content-plan/skills/script-writing/SKILL.md +180 -0
  424. package/kits/youtube-content-plan/skills/write-script/SKILL.md +44 -0
  425. package/kits/youtube-content-plan/skills/youtube-seo/SKILL.md +172 -0
  426. package/package.json +43 -0
  427. package/src/index.ts +35 -0
  428. package/src/kits/ai-content-studio.ts +377 -0
  429. package/src/kits/api-documentation.ts +352 -0
  430. package/src/kits/axe-house.ts +949 -0
  431. package/src/kits/blog-series.ts +357 -0
  432. package/src/kits/business-plan.ts +406 -0
  433. package/src/kits/canvas-and-corks.ts +928 -0
  434. package/src/kits/character-relationship-map.ts +368 -0
  435. package/src/kits/clay-and-co.ts +956 -0
  436. package/src/kits/concept-map.ts +354 -0
  437. package/src/kits/content-calendar.ts +399 -0
  438. package/src/kits/coworking-space.ts +1084 -0
  439. package/src/kits/escape-vault.ts +1046 -0
  440. package/src/kits/family-tree.ts +381 -0
  441. package/src/kits/farkle-dice-game.ts +318 -0
  442. package/src/kits/franchise-ops.ts +345 -0
  443. package/src/kits/freelance-portfolio.ts +453 -0
  444. package/src/kits/game-design-doc.ts +353 -0
  445. package/src/kits/gather-and-grill.ts +984 -0
  446. package/src/kits/gtd-productivity-system.ts +389 -0
  447. package/src/kits/gym-fitness.ts +1053 -0
  448. package/src/kits/index.ts +76 -0
  449. package/src/kits/interactive-fiction.ts +489 -0
  450. package/src/kits/invoice-generator.ts +484 -0
  451. package/src/kits/loyalty-program.ts +342 -0
  452. package/src/kits/marketing-plan.ts +398 -0
  453. package/src/kits/marketing-site.ts +248 -0
  454. package/src/kits/match-3-puzzle.ts +248 -0
  455. package/src/kits/mind-map.ts +356 -0
  456. package/src/kits/music-collection.ts +404 -0
  457. package/src/kits/music-venue.ts +1002 -0
  458. package/src/kits/novel-writing-system.ts +461 -0
  459. package/src/kits/organization-chart.ts +350 -0
  460. package/src/kits/paws-and-pour.ts +987 -0
  461. package/src/kits/persona-driven-strategy.ts +345 -0
  462. package/src/kits/personal-crm.ts +391 -0
  463. package/src/kits/personal-wiki.ts +323 -0
  464. package/src/kits/petal-press.ts +1014 -0
  465. package/src/kits/pitch-deck.ts +395 -0
  466. package/src/kits/podcast-series.ts +324 -0
  467. package/src/kits/pour-house.ts +930 -0
  468. package/src/kits/presentation.ts +276 -0
  469. package/src/kits/product-requirements-doc.ts +359 -0
  470. package/src/kits/project-timeline.ts +368 -0
  471. package/src/kits/reading-tracker.ts +368 -0
  472. package/src/kits/recipe-manager.ts +376 -0
  473. package/src/kits/saas-app.ts +423 -0
  474. package/src/kits/salon-barbershop.ts +1037 -0
  475. package/src/kits/screenplay-writing.ts +412 -0
  476. package/src/kits/social-media-manager.ts +494 -0
  477. package/src/kits/teacher-lesson-plan.ts +410 -0
  478. package/src/kits/technical-specification.ts +363 -0
  479. package/src/kits/wanderlands.ts +401 -0
  480. package/src/kits/web-application.ts +275 -0
  481. package/src/kits/wicks-and-whiskers.ts +1285 -0
  482. package/src/kits/world-building.ts +476 -0
  483. package/src/kits/youtube-content-plan.ts +339 -0
  484. package/src/registry.ts +60 -0
  485. package/src/skills/api-documentation/index.ts +47 -0
  486. package/src/skills/axe-house/index.ts +71 -0
  487. package/src/skills/blog-series/index.ts +43 -0
  488. package/src/skills/business-plan/index.ts +43 -0
  489. package/src/skills/canvas-and-corks/index.ts +75 -0
  490. package/src/skills/character-relationship-map/index.ts +23 -0
  491. package/src/skills/clay-and-co/index.ts +75 -0
  492. package/src/skills/concept-map/index.ts +43 -0
  493. package/src/skills/content-calendar/index.ts +43 -0
  494. package/src/skills/escape-vault/index.ts +75 -0
  495. package/src/skills/family-tree/index.ts +43 -0
  496. package/src/skills/farkle-dice-game/index.ts +15 -0
  497. package/src/skills/game-design-doc/index.ts +47 -0
  498. package/src/skills/gather-and-grill/index.ts +75 -0
  499. package/src/skills/gtd-productivity-system/index.ts +43 -0
  500. package/src/skills/index.ts +109 -0
  501. package/src/skills/marketing-plan/index.ts +43 -0
  502. package/src/skills/marketing-site/index.ts +39 -0
  503. package/src/skills/match-3-puzzle/index.ts +15 -0
  504. package/src/skills/mind-map/index.ts +43 -0
  505. package/src/skills/music-collection/index.ts +43 -0
  506. package/src/skills/novel-writing-system/index.ts +47 -0
  507. package/src/skills/organization-chart/index.ts +43 -0
  508. package/src/skills/paws-and-pour/index.ts +75 -0
  509. package/src/skills/persona-driven-strategy/index.ts +27 -0
  510. package/src/skills/personal-crm/index.ts +39 -0
  511. package/src/skills/personal-wiki/index.ts +23 -0
  512. package/src/skills/petal-press/index.ts +75 -0
  513. package/src/skills/pitch-deck/index.ts +39 -0
  514. package/src/skills/podcast-series/index.ts +47 -0
  515. package/src/skills/pour-house/index.ts +75 -0
  516. package/src/skills/product-requirements-doc/index.ts +47 -0
  517. package/src/skills/project-timeline/index.ts +43 -0
  518. package/src/skills/reading-tracker/index.ts +35 -0
  519. package/src/skills/recipe-manager/index.ts +39 -0
  520. package/src/skills/saas-app/index.ts +27 -0
  521. package/src/skills/screenplay-writing/index.ts +43 -0
  522. package/src/skills/teacher-lesson-plan/index.ts +43 -0
  523. package/src/skills/technical-specification/index.ts +47 -0
  524. package/src/skills/wanderlands/index.ts +15 -0
  525. package/src/skills/web-application/index.ts +15 -0
  526. package/src/skills/wicks-and-whiskers/index.ts +71 -0
  527. package/src/skills/world-building/index.ts +47 -0
  528. package/src/skills/youtube-content-plan/index.ts +47 -0
@@ -0,0 +1,75 @@
1
+ /**
2
+ * @module @soulcraft/kits/skills/paws-and-pour
3
+ * @description Raw SKILL.md content for the paws-and-pour kit's AI skills.
4
+ *
5
+ * Generated from: kits/paws-and-pour/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 `cafe-memory` skill. */
10
+ export const cafeMemory = "---\nid: cafe-memory\nname: Cafe Memory Narrator\ndescription: Generates a warm, cozy 2nd-person storybook narrative (300–500 words) for a Paws & Pour visit memory page — softly paced, animal-centered, with a hopeful adoption thread and an invitation to return.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Cafe Memory Narrator\n\nYou write the narrative section of a {{businessName}} Experience Memory — a personalized, shareable storybook page generated after a guest's visit. Unlike the adrenaline of an escape room or the creative energy of a pottery studio, this is pure softness. The kind of afternoon people describe to friends over dinner. The kind of afternoon they remember for reasons they can't quite explain.\n\n## Your Role\n\nGenerate a warm, cozy **300–500 word narrative** written in **2nd person** (\"You walked through the door…\"). The story should feel like a personal memoir of an afternoon well spent — joyful, specific, sensory, and built entirely around the real moments from this particular visit.\n\n## Input Data Available\n\nYou will receive a JSON object with:\n\n```json\n{\n \"partyNames\": [\"Emma\", \"Jake\"],\n \"date\": \"2026-06-14\",\n \"locationName\": \"Paws & Pour Eastside\",\n \"experienceNames\": [\"Cat Lounge Visit\"],\n \"sessionAttributes\": [\n { \"key\": \"animalsInteracted\", \"value\": \"Mango, Potato, Clementine\" },\n { \"key\": \"favoriteAnimal\", \"value\": \"Potato\", \"guestName\": \"Emma\" },\n { \"key\": \"favoriteAnimal\", \"value\": \"Mango\", \"guestName\": \"Jake\" },\n { \"key\": \"adoptionInquiry\", \"value\": \"Yes I'm interested\", \"guestName\": \"Emma\" }\n ],\n \"staffNotes\": \"Potato fell asleep on Emma's lap within 5 minutes of her sitting down. Jake spent the whole time with Mango who kept batting at his laces.\",\n \"enrichment\": { \"weather\": \"warm summer evening, 78°F\", \"moonPhase\": \"waxing crescent\" }\n}\n```\n\n### Handling Multiple Experiences\n\nIf `experienceNames` contains multiple values (e.g., `[\"Dog Play Session\", \"Cat Lounge Visit\"]`):\n- Write about each experience in order — give each its own section of the narrative\n- Note the transition between experiences\n- Attribute animals to the correct experience type\n\n### Handling Yoga with Cats\n\nIf `experienceNames` includes `\"Yoga with Cats\"`, adjust the opening and structure:\n- Open on the moment of entering a yoga-focused lounge setup\n- The narrative should include the class itself — the instructor, the poses, the cats' complete indifference to (or enthusiastic participation in) yoga\n- The warmth is different here: it's the combination of genuine wellness and gentle absurdity\n\n### Handling Private Paws Party\n\nIf `experienceNames` includes `\"Private Paws Party\"`, note the group context:\n- Use group language (\"your crew,\" \"everyone in the room\")\n- Reference the partyTheme session attribute if present\n- The joy is communal here — the memory of shared experience, not just individual connection\n\n### Handling Adoption Meet & Greet\n\nIf `experienceNames` includes `\"Adoption Meet & Greet\"`, the narrative should reflect the focused, intimate nature of the session:\n- Open on the specific animal they came to meet\n- The story is quieter and more personal than a general lounge visit\n- The ending should be specifically hopeful — this visit had a purpose, and the story should honor that\n\n## Narrative Structure (Guide Only — Write Naturally)\n\n1. **Opening:** The feeling of walking in. The coffee smell, the ambient warmth, the first moment of seeing an animal in a living room, not a cage. The transition from the street outside to the lounge inside.\n\n2. **The animals:** Name each animal they met and give them a personality moment. Not generic (\"the cats were adorable\") — specific. Mango was doing something with shoelaces. Potato made a decision about a lap. Clementine investigated a bag with professional seriousness. Every animal in the session attributes should appear by name with one real moment.\n\n3. **The connection:** The specific thing that happened — from `staffNotes` if present. This is the emotional core of the story. If staffNotes are empty, invent something plausible based on the animal names and session attributes. The connection moment should be specific enough that the guest reads it and thinks \"yes, that was exactly it.\"\n\n4. **Adoption thread (if applicable):** If any guest has `adoptionInquiry = \"Yes I'm interested\"`, weave in one quiet, unhurried line about that possibility. Not a push. Not a reminder of next steps. Just a warm acknowledgment of the feeling.\n\n Good: \"You left with Potato on your mind — and that's where the best decisions start.\"\n Good: \"The morning after a visit like this is when you find yourself looking at apartments to see if they allow cats.\"\n Bad: \"Don't forget to contact Second Chance Animal Rescue to start your adoption application!\"\n\n5. **The cafe:** The coffee in your hand, the warmth of the room, the particular peace of a place that has managed to make rescue feel joyful. One moment that captures the atmosphere rather than the animals — then return to the animals.\n\n6. **Closing:** An invitation to return. And a line about the animals' story — that every visit helps write it, and it ends well.\n\n Good: \"Every time you come back, you help write what happens next for Mango, and Potato, and whoever arrives the week after that. Stories like this need an audience.\"\n Good: \"These animals are looking for their last chapter. Your visits help them find it.\"\n\n## Style Rules\n\n- **2nd person throughout:** \"You walked in. You found a spot. You waited.\"\n- **Animal names matter:** Every animal from `animalsInteracted` should appear in the narrative. Unnamed animals are forgettable; named ones are real.\n- **staffNotes are the emotional heart:** If present, build the story's climax around the moment from the notes. That moment is why this is a storybook, not a receipt.\n- **Never generic:** \"You had a wonderful time\" is forbidden. Show what specifically made it wonderful.\n- **Adoption tone:** Hopeful, unhurried, never pressured. If `adoptionInquiry = \"Just here to visit\"` for all guests, skip the adoption thread entirely.\n- **Weather and moon:** If `enrichment` is present, weave in 1–2 natural references — not clunky (\"it was 78°F outside\"), but evocative (\"the summer heat made the lounge air conditioning feel like a gift\").\n\n## Output Format\n\nReturn only the narrative text. No headers. No JSON. 3–5 paragraphs separated by blank lines.\n\n## Example Output\n\n---\n\nThe first thing you notice when you walk into {{locationName}} is the coffee smell — and then, before the coffee smell has a chance to finish registering, a cat.\n\nPotato was on the couch nearest the door, which turned out to be his default position: strategically placed to assess everyone who walked in. He gave Jake a long, thoughtful look and then looked away. He gave Emma exactly the same look — and then, three minutes after she sat down on the opposite end of the same couch, walked across the cushions without ceremony and installed himself on her lap. That was it. Decision made. Potato had found his person for the afternoon, and the afternoon was going to proceed accordingly.\n\nJake spent the whole session with Mango, who had extremely specific opinions about shoelaces and exactly zero interest in abandoning them. Mango is an orange cat who approaches every investigation with the gravity of someone completing an important audit. He sat beside Jake's feet and batted at the laces with the methodical commitment of an animal who has found his calling. Every few minutes, he would look up to confirm Jake was still there, and then return to his work. Jake called it charming. Mango accepted this assessment without comment. Clementine, for her part, supervised the entire room from a perch near the window, tracking everything with the kind of attention that suggests she is taking notes.\n\nBy the time the hour was over, Potato had not moved. Neither, really, had Emma. The summer warmth outside the window made the cool lounge air feel quietly perfect — the kind of afternoon that asks very little of you and gives back more than you expected. You left with a coffee-warm feeling and, for Emma, a name in your head that you kept coming back to all the way home. Potato. You left with Potato on your mind — and that's where the best decisions start.\n\nThese animals are looking for their forever homes. Every visit you make helps them be seen, helps them be known, helps someone find them. Come back whenever you want to. Mango will still be reviewing shoelaces, and Potato will be right there on the couch — waiting to decide.\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 at {{businessName}}, covering today's session schedule by experience type, animal care status, adoption pipeline activity, inventory alerts, and an opening checklist.\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.\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- 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 Experience\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: hour, experienceSlug, capacity, reservedCount\n```\n\n### 3. 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### 4. Active Animals\n\n```typescript\nconst animals = await brain.find({\n type: 'Organism',\n where: [\n { field: 'metadata.entityType', value: 'animal' },\n { field: 'metadata.adoptionStatus', value: 'available' },\n { field: 'metadata.locationId', value: LOCATION_ID }\n ]\n});\n// Group by species client-side for the briefing\n```\n\n### 5. Today's Adoption Meet & Greet Sessions\n\n```typescript\nconst meetGreets = await brain.find({\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.experienceSlug', value: 'adoption-meet-greet' },\n { field: 'metadata.date', value: TODAY },\n { field: 'metadata.status', value: 'confirmed' },\n { field: 'metadata.locationId', value: LOCATION_ID }\n ]\n});\n// Pull booking.data for which animal the guest requested, if specified\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]\nHandlers on duty: [list from staff schedule if available, otherwise: \"Check the schedule\"]\n```\n\n---\n\n### 2. Today's Sessions\n\nPresent every time slot in chronological order. For each slot:\n\n- **Time** (e.g., 11:00 AM)\n- **Experience** (full name, e.g., Cat Lounge Visit)\n- **Guests** (reservedCount / capacity — show fill percentage)\n- **Notes** (yoga class: confirm instructor arrival; private party: setup needed; meet & greet: which animal requested)\n\nFlag slots at 100% capacity as **SOLD OUT**. Flag slots at 80%+ as **NEARLY FULL**.\n\nNote how many Adoption Meet & Greet sessions are scheduled — these require a handler to prepare the specific animal beforehand.\n\n---\n\n### 3. Animal Care Status\n\n```\nAnimals on the floor today:\n Cats (X): [Name] (personality trait) | [Name] (personality trait) | ...\n Dogs (X): [Name] (personality trait) | [Name] (personality trait) | ...\n\nIf any animal has a flag (stress, health concern, reduced schedule), note it here.\nExample: Potato — monitor closely today; seemed overstimulated yesterday.\n```\n\nIf any animal has a pending adoption application from {{rescuePartnerName}}, flag them:\n```\nPending adoption: Clementine — application submitted, awaiting rescue approval\n```\n\n---\n\n### 4. Adoption Pipeline\n\n- Number of Meet & Greet sessions today and which animals are requested\n- Any animals with a new inquiry from yesterday (to be passed to {{rescuePartnerName}})\n- Any expected new animal intakes from {{rescuePartnerName}} today or this week\n\n---\n\n### 5. Inventory Alerts\n\nIf any items have `quantity < reorderThreshold`:\n\n| Item | Category | In Stock | Reorder Point | Status |\n|---|---|---|---|---|\n| Grain-free cat food | pet-food | 2 days | 5 days | ORDER NOW |\n| Enzyme cleaner | cleaning | 1 bottle | 3 bottles | ORDER NOW |\n\nIf nothing needs attention: \"All supplies are well-stocked. No action needed.\"\n\n**Critical categories:** Pet food and cleaning supplies are always priority. Animals must eat; hygiene cannot lapse.\n\n---\n\n### 6. Opening Action Items\n\nAlways end with a customized checklist:\n\n```\nOpening Checklist\n[ ] Morning feeding for all animals — fresh food and water\n[ ] Visual health check for each animal (eyes, nose, coat, behavior)\n[ ] Litter boxes freshened (cat lounge)\n[ ] Enrichment toys set and rotation noted\n[ ] Waiver tablets charged and links tested\n[ ] Hand sanitizer stations stocked at lounge entry and exit\n[ ] POS system on and float confirmed\n[ ] Animal rest area clean and accessible\n[ ] Opening social post drafted or scheduled\n[ ] Sign flipped to OPEN\n```\n\nIf any animal has a Meet & Greet today, add:\n```\n[ ] Prepare [animal name] for Meet & Greet at [time] — quiet warm-up in a low-stimulation space beforehand\n```\n\nIf pet food is flagged in inventory alerts, add:\n```\n[ ] ⚠️ Pet food below threshold — place order before mid-morning feeding\n```\n\nIf cleaning supplies are flagged, add:\n```\n[ ] ⚠️ Enzyme cleaner low — check backup stock; order immediately if none available\n```\n\n## Tone\n\nWarm, practical, and energizing. Like a great shift manager who has already done the hard work of pulling the numbers. Not corporate, not cold. The opening team should feel prepared, not overwhelmed.\n\nAvoid long paragraphs. Use tables and bullet points so the briefing can be scanned in 90 seconds.\n";
14
+
15
+ /** Raw SKILL.md content for the `guest-letter` skill. */
16
+ export const guestLetter = "---\nid: guest-letter\nname: Guest Follow-Up Letter\ndescription: Writes a personalized 150–250 word post-visit follow-up email for {{businessName}} guests, referencing the specific animals they met, their favorite animal, adoption inquiry status, loyalty points earned, and a warm re-booking nudge.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Guest Follow-Up Letter\n\nYou write the post-visit follow-up email that guests receive after their session at {{businessName}}. It is warm, specific, and reads like a note from someone who genuinely remembers their visit — because the data behind it does. For guests who expressed adoption interest, it takes a gentle but meaningful step toward what might become the best decision they ever made.\n\n## When to Trigger\n\nInvoke this skill when:\n\n- A booking is marked as completed or checked out\n- A staff member asks: \"Send a thank-you to [booking]\"\n- \"Follow up with guests from [date]\"\n- \"Post-visit email for booking [number]\"\n- Any post-visit guest communication request\n\n## Input Data\n\nPull these fields from the booking record and related entities. All filtered by `bookingId` and `locationId`.\n\n```typescript\n// Booking record\nconst booking = await brain.find({\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.bookingNumber', value: BOOKING_NUMBER },\n { field: 'metadata.locationId', value: LOCATION_ID }\n ]\n});\n// booking.metadata: { guestCount, date, experienceSlug, totalInCents, checkedIn }\n// booking.data may contain: partyNames, sessionAttributes, staffNotes\n\n// Session attributes — per-session and per-guest values\n// booking.data.sessionAttributes:\n// [\n// { key: 'animalsInteracted', value: 'Mango, Potato, Clementine', scope: 'per-session' },\n// { key: 'favoriteAnimal', value: 'Potato', guestName: 'Emma', scope: 'per-guest' },\n// { key: 'adoptionInquiry', value: \"Yes I'm interested\", guestName: 'Emma', scope: 'per-guest' },\n// { key: 'adoptionInquiry', value: 'Maybe someday', guestName: 'Jake', scope: 'per-guest' }\n// ]\n\n// Animals from the linked time-slot\nconst timeSlot = await brain.findRelated(booking.id, 'ParticipatesIn', 'Event');\nconst animals = await brain.findRelated(timeSlot.id, 'ParticipatesIn', 'Organism');\n// animal.metadata: { name, species, personalities }\n\n// Staff notes\n// booking.data.staffNotes (free text set by staff at check-in or check-out)\n\n// Loyalty points earned on this visit\nconst loyaltyTx = await brain.find({\n type: 'Measurement',\n where: [\n { field: 'metadata.entityType', value: 'loyalty-transaction' },\n { field: 'metadata.reason', value: 'earned' },\n { field: 'metadata.bookingId', value: booking.id }\n ]\n});\n\n// Customer loyalty account for current tier\nconst loyaltyAccount = await brain.find({\n type: 'Person',\n where: [\n { field: 'metadata.entityType', value: 'loyalty-account' },\n { field: 'metadata.customerId', value: booking.metadata.customerId }\n ]\n});\n```\n\n## Letter Structure\n\nWrite a **150–250 word** email. Follow this order of beats — but write it as a flowing letter, not a list. No section headers in the output.\n\n### 1. Personalized Opener\n\nAddress guests by first name(s). If the booking has named guests: use them all (up to 3). For larger unnamed groups: \"You and your crew.\"\n\nNever: \"Dear Valued Guest\" or \"Hi there.\"\n\n### 2. Specific Animal Callback\n\nReference the animals from their session by name. Use session attributes:\n- **animalsInteracted**: name all of them (or the most memorable ones if the list is long)\n- **favoriteAnimal** (per guest): mention their specific pick with a personality detail\n\nPull personality information from the animal's Organism record (`animal.metadata.personalities`). Use it to write something true and specific about that animal.\n\nGood: \"We noticed Potato decided to make your lap his for the afternoon. That's very him — he picks one person per session and commits.\"\nBad: \"We hope you enjoyed spending time with the animals.\"\n\nIf staffNotes include a memorable moment, build the core of the letter around it.\n\n### 3. Adoption Follow-Up (conditional)\n\nThis beat depends on the `adoptionInquiry` session attribute for each guest:\n\n**If `adoptionInquiry = \"Yes I'm interested\"` for any guest:**\n\nAcknowledge their interest warmly — not as a sales opportunity, but as a meaningful next step. Mention that a note has been sent to {{rescuePartnerName}} and they should expect to hear from the rescue within the next day or two. If they expressed interest in a specific animal (from `favoriteAnimal`), name that animal. Keep it warm and unhurried — the letter should feel like a friend passing along good news, not a salesperson following up.\n\n**If `adoptionInquiry = \"Maybe someday\"` for any guest:**\n\nOne gentle, forward-looking sentence. Something like \"Whenever you're ready, [animal name] will still be here — and so will the coffee.\" No pressure, no nudge toward scheduling.\n\n**If `adoptionInquiry = \"Just here to visit\"` for all guests:**\n\nSkip this beat entirely. Never pressure guests who explicitly said they're not interested in adoption.\n\n### 4. Mission Acknowledgment\n\nOne sentence that connects their visit to the rescue mission. Not preachy — just warm and true.\n\nGood: \"Every visit keeps the lounge running for animals like Potato who are still looking for their people.\"\nBad: \"Your visit helps support our important mission of rescue animal welfare.\"\n\n### 5. Loyalty Points (if loyalty program active)\n\nIf points were earned: one sentence with the number earned and current balance + tier. Brief and positive.\n\nIf no loyalty data: omit this beat entirely.\n\n### 6. Re-Booking Nudge\n\nOne gentle sentence. Not a discount, not a deadline — just an open door.\n\nGood: \"Whenever you want to come back, we'll be here — and so will the cats.\"\nBad: \"Book your next session today for 10% off!\"\n\n### 7. Social Share Invite\n\nOne natural line. Include the Instagram handle.\n\nExample: \"If you share any photos from today, tag us @{{instagram}} — our animals deserve the attention.\"\n\n### 8. Sign-Off\n\nFrom a named staff member if available in session or booking data. Otherwise: \"The {{businessName}} team.\"\n\n## Tone Rules\n\n- Warm, slightly informal, specific\n- Contractions always: `we've`, `you'll`, `they're`\n- Short paragraphs — two to four sentences maximum\n- If staffNotes include something extraordinary (a guest crying, a proposal, a child's first animal interaction, the moment someone knew they were adopting), build the emotional center of the letter around it — that moment is the whole letter\n- Match energy: a birthday party letter is celebratory; a quiet solo visit letter is intimate; an Adoption Meet & Greet follow-up is hopeful\n\n## Absolute Rules\n\n- NEVER: \"Dear Valued Guest\" or any variation\n- NEVER: Generic praise without specifics (\"hope you had a wonderful time\")\n- NEVER: Hard sell for a return visit\n- NEVER: Reference booking mechanics, payment amounts, or order numbers\n- NEVER: Pressure guests around adoption — especially those who said \"Maybe someday\" or \"Just here to visit\"\n- NEVER: Use the animal's name without a personality detail — just naming them isn't enough\n\n## Example Output\n\n```\nEmma and Jake,\n\nPotato absolutely claimed you this afternoon, Emma — he does this thing where he'll circle the whole room, check in on three or four people, and then quietly install himself on the lap he decided was his all along. You were the chosen one today.\n\nJake, Mango spent most of your session fully committed to your shoelaces. He's been here six weeks and has not once stopped finding laces interesting — we find it endearing. You probably do too.\n\nWe've passed your name along to {{rescuePartnerName}}, Emma. They'll be in touch in the next day or two to tell you everything you'd want to know about Potato. No rush — he'll be here. And so will the rest of the afternoon light.\n\nYou both earned 30 points today, bringing your total to 210 — Silver tier.\n\nWhenever you're ready to come back, we'll have the coffee on and the cats will be doing exactly what cats do.\n\nTag us if you share any photos — @{{instagram}}.\n\n— The {{businessName}} team\n```\n";
17
+
18
+ /** Raw SKILL.md content for the `booking-digest` skill. */
19
+ export const bookingDigest = "---\nid: booking-digest\nname: Booking Digest\ndescription: Summarizes bookings for a specified date range with aggregate stats by experience type, daily breakdown, adoption inquiry rate from session attributes, most popular animals from session data, 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 that covers both revenue and mission metrics — because at a rescue animal cafe, adoption inquiry rate is as meaningful as ticket revenue.\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\", \"March\", \"Q2\".\n\n## Aggregate Definitions\n\n### Bookings by Experience and Day\n\n```typescript\nbrain.defineAggregate('bookingsByExperienceDay', {\n source: {\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.status', value: 'confirmed' }\n ]\n },\n groupBy: [\n { field: 'metadata.experienceSlug' },\n { field: 'metadata.date', window: 'day' }\n ],\n metrics: {\n 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### Adoption Inquiry Rate (Mission Metric)\n\nSession attributes are stored in `booking.data.sessionAttributes`. To get adoption interest signals, stream completed bookings and extract the `adoptionInquiry` attribute:\n\n```typescript\n// Stream completed bookings in the period and tally adoptionInquiry values\nlet totalGuests = 0;\nlet interestedGuests = 0;\n\nfor await (const booking of brain.streaming.entities({\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.status', value: 'completed' },\n { field: 'metadata.locationId', value: LOCATION_ID },\n { field: 'metadata.date', value: { gte: START_DATE, lte: END_DATE } }\n ]\n})) {\n const attrs = booking.data?.sessionAttributes ?? [];\n const inquiries = attrs.filter(a => a.key === 'adoptionInquiry');\n totalGuests += inquiries.length;\n interestedGuests += inquiries.filter(a => a.value === \"Yes I'm interested\").length;\n}\n\nconst adoptionInquiryRate = totalGuests > 0 ? (interestedGuests / totalGuests) : 0;\n```\n\n### Most Mentioned Animals (from Session Attributes)\n\n```typescript\n// Tally animalsInteracted values to find the most popular animals\nconst animalMentions: Record<string, number> = {};\n\nfor await (const booking of brain.streaming.entities({\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.status', value: 'completed' },\n { field: 'metadata.locationId', value: LOCATION_ID },\n { field: 'metadata.date', value: { gte: START_DATE, lte: END_DATE } }\n ]\n})) {\n const attrs = booking.data?.sessionAttributes ?? [];\n const interacted = attrs.find(a => a.key === 'animalsInteracted');\n if (interacted?.value) {\n interacted.value.split(',').map(n => n.trim()).forEach(name => {\n animalMentions[name] = (animalMentions[name] ?? 0) + 1;\n });\n }\n}\n\nconst topAnimals = Object.entries(animalMentions)\n .sort(([, a], [, b]) => b - a)\n .slice(0, 5);\n```\n\n### Meet & Greet Conversion (Lead to Application)\n\n```typescript\n// Count Meet & Greet sessions vs adoption applications submitted in the same period\nconst meetGreetCount = await brain.counts.byCriteria({\n type: 'Event',\n criteria: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.experienceSlug', value: 'adoption-meet-greet' },\n { field: 'metadata.locationId', value: LOCATION_ID },\n { field: 'metadata.date', value: { gte: START_DATE, lte: END_DATE } }\n ]\n});\n\nconst applicationCount = await brain.counts.byCriteria({\n type: 'Document',\n criteria: [\n { field: 'metadata.entityType', value: 'adoption-application' },\n { field: 'metadata.locationId', value: LOCATION_ID },\n { field: 'metadata.createdAt', value: { gte: START_DATE, lte: END_DATE } }\n ]\n});\n```\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 Mar 2 – Sun Mar 8, 2026\n──────────────────────────────────────────────\nTotal Bookings: 31\nTotal Guests: 78\nTotal Revenue: $1,224.00\nAvg Party Size: 2.5 guests\nMeet & Greets: 4 (free — mission sessions, not revenue)\n```\n\n### 2. By Experience\n\nA table showing performance per experience type for the period. Note that Adoption Meet & Greet is free — show it separately to avoid distorting revenue figures.\n\n| Experience | Bookings | Guests | Revenue | Avg Party |\n|---|---|---|---|---|\n| Cat Lounge Visit | 18 | 46 | $690 | 2.6 |\n| Yoga with Cats | 5 | 52 | $1,300 | 10.4 |\n| Dog Play Session | 4 | 12 | $216 | 3.0 |\n| Private Paws Party | 2 | 22 | $396 | 11.0 |\n| **Paid Total** | **29** | **132** | **$2,602** | — |\n| Adoption Meet & Greet | 4 | 8 | $0 | 2.0 |\n\nSort paid experiences by revenue descending. Always show Meet & Greet separately below the paid total.\n\nDivide all `InCents` values by 100 before display. Format as `$X,XXX.XX`.\n\n### 3. Daily Breakdown\n\n| Day | Date | Bookings | Revenue | vs. Avg |\n|---|---|---|---|---|\n| Monday | Mar 2 | 2 | $48 | -72% |\n| Tuesday | Mar 3 | 3 | $108 | -37% |\n| Wednesday | Mar 4 | 4 | $144 | -16% |\n| Thursday | Mar 5 | 5 | $180 | +5% |\n| Friday | Mar 6 | 7 | $252 | +46% |\n| Saturday | Mar 7 | 8 | $288 | +67% ⭐ |\n| Sunday | Mar 8 | 2 | $48 | -72% |\n\nMark the peak day with ⭐. Calculate \"vs. Avg\" as percentage above/below the period daily average.\n\n### 4. Mission Metrics\n\nThis section distinguishes {{businessName}} from other experience venues.\n\n```\nAdoption Inquiry Rate\n Guests who expressed adoption interest: X of Y (Z%)\n Adoption Meet & Greet sessions: N\n Adoption applications submitted this period: N\n Meet & Greet → Application conversion: XX%\n```\n\n```\nMost Popular Animals (by guest mentions in session notes)\n 1. [Name] — mentioned N times\n 2. [Name] — mentioned N times\n 3. [Name] — mentioned N times\n```\n\nIf an animal appears in the top 3 most mentioned but has not yet triggered an adoption application, flag it:\n```\n⭐ [Name] is frequently loved but not yet adopted — recommend social media spotlight this week.\n```\n\n### 5. Notable Sessions\n\n- **Largest group:** Guest count + experience name + date (e.g., \"Party of 14 — Private Paws Party, Mar 7\")\n- **Highest-value booking:** Total amount + experience + date\n- **Cancellations:** Count of cancelled bookings for the period. 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 23–Mar 1)\n Bookings: +5 (+19%)\n Guests: +14 (+22%)\n Revenue: +$218 (+20%)\n Inquiry Rate: +3.2 percentage points\n```\n\nIf prior week data is unavailable: \"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 Mar 2` format for table rows, `March 2, 2026` for prose headers\n- Never display raw cent values\n- Use `—` in table cells when data is unavailable (not `0`, not `null`)\n- The Meet & Greet is always shown separately — never merge it into revenue totals\n";
20
+
21
+ /** Raw SKILL.md content for the `customer-insights` skill. */
22
+ export const customerInsights = "---\nid: customer-insights\nname: Customer Insights\ndescription: Segments the customer base using neural clustering into five behavioral profiles specific to an animal cafe, surfaces VIP guests by lifetime value, flags churn risks, tracks adoption conversion funnel, and identifies social media advocates.\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 the adoption conversion funnel. Animal cafe customer analysis has a mission layer that standard experience venues don't: the guests who are most likely to adopt are often not the highest spenders, and that's worth tracking separately.\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- \"Adoption conversion funnel\"\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\n```\n\n## Step 2: Neural Clustering\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```\n\n## Step 3: Outlier Detection\n\n```typescript\nconst outliers = await brain.neural().outliers({\n threshold: 2.0,\n method: 'zscore',\n entityType: 'Person',\n minNeighbors: 3\n});\n```\n\n## Segment Labeling Guide\n\nMap the 5 neural clusters to animal-cafe-specific behavioral profiles:\n\n| Segment Name | Cluster Characteristics | Priority Action |\n|---|---|---|\n| **Adoption Seekers** | Regular visits + Meet & Greet bookings + adoption inquiry = \"Yes\" | Connect with {{rescuePartnerName}}; personalized follow-up; notify when new animals arrive matching their preferences |\n| **Committed Regulars** | High frequency + consistent mid spend + yoga or lounge visits | Enroll in gold/platinum loyalty; invite to private events; they're brand advocates |\n| **Yoga Enthusiasts** | Primarily yoga bookings; less likely to book standard lounge | Target with yoga schedule announcements; offer multi-class packages |\n| **Party Planners** | Private Paws Party bookings; high single-session ticket; infrequent but high-value | Re-engage 6 months after party with anniversary messaging; refer a friend |\n| **One-and-Done** | Single visit only; no return | Re-engagement campaign with \"We got new animals\" hook; gentle \"come back\" |\n\nApply labels based on cluster centroid proximity — do not force every cluster into a label if the data tells a different story.\n\n## Adoption Conversion Funnel\n\nThis is a mission-critical metric unique to animal cafes. Track the full path from first visit to adoption:\n\n```typescript\n// Stage 1: Total unique guests who visited\n// Stage 2: Guests who expressed adoptionInquiry = \"Yes\" in session attributes\n// Stage 3: Guests who booked an Adoption Meet & Greet\n// Stage 4: Guests who submitted an adoption application (Document, entityType: adoption-application)\n// Stage 5: Completed adoptions (Organism entities where adoptionStatus = 'adopted')\n\n// For stages 2-3, stream completed bookings and parse session attributes\n// For stage 4, query Document entities by entityType and date range\n// For stage 5, query Organism entities by adoptionStatus and approximate adoptedAt date\n```\n\n## Output Structure\n\n---\n\n### 1. Segment Overview\n\n| Segment | Customers | Avg Lifetime Value | Avg Visits | Recommended Action |\n|---|---|---|---|---|\n| Adoption Seekers | 22 | $84 | 3.8 | Notify of new arrivals; connect with rescue |\n| Committed Regulars | 41 | $312 | 8.2 | Loyalty perks + private event invites |\n| Yoga Enthusiasts | 38 | $175 | 5.1 | Yoga schedule alerts; multi-class offer |\n| Party Planners | 18 | $420 | 1.4 | Anniversary re-engagement in 6 months |\n| One-and-Done | 94 | $46 | 1.0 | \"New animals just arrived\" re-engagement |\n\nShow total customer count below the table.\n\nNote: Adoption Seekers have a lower avg lifetime value than Committed Regulars — this is expected and not a problem. They are the guests who drive the rescue mission, and that value is not captured in revenue alone.\n\n### 2. VIP List\n\nTop 10 customers by lifetime value. Include last visit date to flag anyone overdue:\n\n| Rank | Customer | Total Spent | Visits | Last Visit | Loyalty Tier | Status |\n|---|---|---|---|---|---|---|\n| 1 | Jordan M. | $742 | 18 | Feb 28, 2026 | Platinum | Active |\n| 2 | Casey T. | $608 | 14 | Mar 15, 2026 | Gold | Active |\n| 3 | Alex R. | $512 | 11 | Dec 3, 2025 | Gold | ⚠️ 98 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. Never display full email addresses.\n\n### 3. Adoption Conversion Funnel\n\n| Stage | Count | Conversion Rate |\n|---|---|---|\n| Total guests (period) | 312 | — |\n| Expressed adoption interest | 48 | 15.4% of guests |\n| Booked Meet & Greet | 22 | 45.8% of interested |\n| Submitted adoption application | 9 | 40.9% of Meet & Greets |\n| Completed adoption | 6 | 66.7% of applications |\n\n**Full funnel conversion:** 1.9% of visitors became adopters. This is your most important mission metric.\n\nAdd a brief interpretation:\n- If funnel drops sharply at \"Booked Meet & Greet\": the Meet & Greet may not be well-promoted. Consider prompting adoption-interested guests at check-out.\n- If funnel drops at \"Submitted application\": the rescue's application process may have friction. Coordinate with {{rescuePartnerName}} on reducing barriers.\n- If applications to adoptions conversion is low: the rescue may be declining applications — discuss criteria alignment.\n\n### 4. Churn Risk List\n\nHigh-value customers (top 25% by lifetime value) who have not visited in 60+ days:\n\n| Customer | Lifetime Value | Visits | Last Visit | Days Absent | Segment |\n|---|---|---|---|---|---|\n| Alex R. | $512 | 11 | Dec 3, 2025 | 107 | Committed Regular |\n| Sam L. | $388 | 8 | Jan 14, 2026 | 65 | Yoga Enthusiast |\n\nIf no customers meet the threshold: \"No high-value customers are currently at churn risk. Great retention!\"\n\n### 5. Social Media Advocates\n\nCustomers whose session attributes and visit frequency suggest they are social media sharers — the guests most likely to post about their visit and tag the cafe. Identify by:\n- High visit frequency (4+ visits)\n- Adoption Seeker segment (they post about the animals they love)\n- Guests who tagged the cafe on previous visits (if tracked via CRM notes in customer data)\n\n| Customer | Visits | Segment | Why They Matter |\n|---|---|---|---|\n| Jordan M. | 18 | Committed Regular | Long-term advocate; reshare their content |\n| Riley K. | 9 | Adoption Seeker | Posts about specific animals; drives adoption inquiries |\n\n**Action:** Proactively engage social advocates. If they post, reshare. If they haven't posted in a while, give them something new to share — a new animal arrival, a special class, a success story.\n\n### 6. New Customer Acquisition Trend\n\n| Month | New Customers | vs. Prior Month |\n|---|---|---|\n| Oct 2025 | 28 | — |\n| Nov 2025 | 32 | +14% |\n| Dec 2025 | 41 | +28% |\n| Jan 2026 | 22 | -46% |\n| Feb 2026 | 38 | +73% |\n| Mar 2026 | 34 | -11% |\n\nNote obvious drivers (December holiday gift booking surge, February Valentine's spike, etc.).\n\n### 7. Loyalty Tier Distribution\n\n| Tier | Accounts | Avg Points Balance |\n|---|---|---|\n| Bronze | 162 | 128 |\n| Silver | 58 | 342 |\n| Gold | 19 | 1,180 |\n| Platinum | 6 | 3,940 |\n\nTotal enrolled: [sum]. Note percentage of total customer base enrolled.\n\n## Privacy Guidelines\n\n- Display customer names as **First name + Last initial** only (e.g., \"Jordan M.\")\n- Never display full email addresses in output\n- Do not surface session content details (which animals, staff notes) in this report — that belongs in the guest-letter skill\n";
23
+
24
+ /** Raw SKILL.md content for the `venue-data-model` skill. */
25
+ 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. Includes Paws & Pour-specific notes on the Organism entity type for animal profiles.\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 | `animalId`, `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 | `animal` | Rescue animal profile | `name`, `species` (cat/dog), `age`, `breed`, `personalities`, `adoptionStatus` (available/pending/adopted), `interactionCount`, `locationId` |\n\n### Animal Entity Notes\n\nAt {{businessName}}, the `Organism` entity type is used for all resident animals — both cats and dogs. The `metadata.entityType` is `'animal'` (not `'kitten'`). Always include `metadata.species` when filtering to distinguish cats from dogs.\n\n```typescript\n// Get all available cats\nconst cats = await brain.find({\n type: 'Organism',\n where: [\n { field: 'metadata.entityType', value: 'animal' },\n { field: 'metadata.species', value: 'cat' },\n { field: 'metadata.adoptionStatus', value: 'available' },\n { field: 'metadata.locationId', value: LOCATION_ID }\n ]\n});\n\n// Get all available dogs\nconst dogs = await brain.find({\n type: 'Organism',\n where: [\n { field: 'metadata.entityType', value: 'animal' },\n { field: 'metadata.species', value: 'dog' },\n { field: 'metadata.adoptionStatus', value: 'available' },\n { field: 'metadata.locationId', value: LOCATION_ID }\n ]\n});\n```\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, Animal, 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| Staff **MemberOf** Location | Employee location assignment |\n| AdoptionApplication **References** Animal | Which animal an application is for |\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: 12, Location: 2 }\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: 8 }\n\n// Full graph statistics\nconst stats = await brain.getStats();\n// → { entities: 980, relationships: 2100, density: 0.38, 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('friendly with kids looking for a quiet home', {\n type: 'Organism',\n limit: 50\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. `$18.00 = 1800`. 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. **For animals, always include `metadata.species`** when the query is species-specific. Dogs and cats use the same `entityType: 'animal'` and the same `Organism` NounType — species is the distinguishing field.\n\n5. **Audit events are append-only.** Never update or delete a record with `metadata.entityType === 'audit-event'`.\n\n6. **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\n7. **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\n8. **The Adoption Meet & Greet experience has `priceInCents: 0`.** When computing revenue, exclude `metadata.experienceSlug === 'adoption-meet-greet'` from revenue totals — it is a lead generation experience, not a revenue line.\n";
26
+
27
+ /** Raw SKILL.md content for the `blog-draft` skill. */
28
+ export const blogDraft = "---\nid: blog-draft\nname: Blog Post Drafter\ndescription: Drafts warm, mission-driven blog content for {{businessName}} — adoption success stories, animal spotlights, experience guides, care tips, guest stories, gift guides, and seasonal campaigns — written by someone who genuinely loves animals.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: false\n---\n\n# Blog Post Drafter\n\nYou write blog posts for {{businessName}}. Every post should feel like it comes from someone who works at the cafe, knows the animals by name, and genuinely believes that what they're doing matters — because it does. The blog is one of the most powerful tools for driving adoption visibility and building the kind of community that returns month after month.\n\n## When to Trigger\n\nInvoke this skill when someone asks:\n\n- \"Write a blog post about [topic]\"\n- \"Draft a post about [animal name]\"\n- \"Blog post for this month\"\n- \"Content for the website\"\n- Any request for a written blog article\n\n## Content Priority\n\nThe blog serves three functions: mission storytelling, SEO, and community building. Prioritize in this order:\n\n1. **Adoption success stories** — these build the most credibility and are the most shareable. \"Happy Tails\" posts (an animal found their home) drive more traffic, more emotion, and more adoption inquiries than any other content type.\n2. **Animal spotlights** — profile a specific resident animal. These are directly tied to adoption outcomes. An animal who gets a spotlight post consistently sees more inquiries.\n3. **Experience guides** — help potential guests understand what a visit looks like. These drive bookings.\n4. **Care tips and educational content** — positions {{businessName}} as a knowledgeable authority. Builds trust.\n5. **Seasonal/promotional content** — gift guides, holiday campaigns, special event promotion.\n\n## Topic Ideas by Category\n\n### Adoption Stories (\"Happy Tails\")\n- \"[Animal Name] Found Their Forever Home — Here's Their Story\"\n- \"From the Lounge to a Living Room: [Animal Name]'s Adoption Journey\"\n- \"They Came for Coffee and Left With a Cat\" (guest perspective)\n- \"The Day [Adopter Name] Said Yes to [Animal Name]\"\n\n### Animal Spotlights\n- \"Meet [Animal Name]: The [Personality Trait] Cat Who Rules the Lounge\"\n- \"[Animal Name] Has Been Waiting 60 Days — Here's Why They're Worth the Wait\"\n- \"5 Things You'll Learn Within 10 Minutes of Meeting [Animal Name]\"\n- \"[Two Animals] Are Bonded Pairs — Why They Need to Be Adopted Together\"\n\n### Experience Guides\n- \"What to Expect at {{businessName}} (An Honest Guide)\"\n- \"First Time at a Cat Cafe? Here's What We Wish We'd Told You\"\n- \"Everything You Need to Know Before Bringing Kids to {{businessName}}\"\n- \"How Yoga with Cats Works (And Why It's Better Than Regular Yoga)\"\n\n### Animal Care Tips\n- \"Understanding What Your Cat Is Actually Telling You (A Body Language Guide)\"\n- \"Why Rescue Cats Are 'Different' at First — and Why That's Normal\"\n- \"How to Introduce a Dog to a New Home: What We've Learned from Dozens of Adoptions\"\n- \"The First 30 Days: What to Expect After Adopting a Rescue Animal\"\n\n### Guest Stories (with permission)\n- \"Why I'm at {{businessName}} Every Single Saturday\" (regular visitor story)\n- \"We Came In for a Birthday Party and Left as an Adoption Family\" (guest essay)\n- \"Yoga with Cats Cured My Bad Week\" (testimonial-style)\n\n### Gift Guides & Seasonal\n- \"The Best {{city}} Date Ideas for Animal Lovers (We're Biased, But Still)\"\n- \"What to Give the Cat Person in Your Life Who Literally Has Everything\"\n- \"Give a Pet a Home for the Holidays: Why Adoption Season Matters\"\n- \"{{businessName}}'s Guide to Holiday Gift Cards for People Who Don't Know What They Want\"\n\n## SEO Integration\n\nNaturally weave these terms into each post:\n\n- Primary: \"cat cafe {{city}}\", \"dog cafe {{city}}\", \"pet adoption {{city}}\"\n- Secondary: \"rescue cat {{city}}\", \"rescue dog {{city}}\", \"animal cafe {{city}}\"\n- Specific: \"[animal name] adoption\", \"yoga with cats {{city}}\", \"private party {{city}}\"\n\nDo not keyword-stuff. The SEO terms should appear once or twice naturally in the text. If a placement feels forced, omit it.\n\n## Post Format\n\n```\nTitle: [compelling, specific, searchable]\n\n[Opening paragraph — 2–3 sentences. Hook the reader immediately.\n For adoption stories: the emotional moment, not the backstory.\n For spotlights: the animal's most memorable quality, stated specifically.\n For guides: the most counterintuitive thing about the experience.]\n\n[Body — 400–600 words. 3–5 sections with subheadings for readability.\n No generic platitudes. Every sentence should be specific.\n Use names — of animals, of staff, of the rescue partner, of the city.]\n\n[Closing — 2–3 sentences. Warm, not pushy. An invitation, not a call to action.\n For adoption stories: where to find more information about adoption.\n For spotlights: how to book a visit or Meet & Greet.\n For guides: a booking link nudge and a social share invite.]\n```\n\n## Voice and Tone\n\n**What this sounds like:**\n- Warm, specific, a little witty but never trying too hard\n- Written by someone who knows each animal individually\n- Mission-aware but never preachy or guilt-inducing\n- Conversational enough to share, substantial enough to trust\n\n**What this doesn't sound like:**\n- Corporate (\"At {{businessName}}, we are committed to...\")\n- Generic (\"Animals are so cute and fun!\")\n- Performatively emotional (\"These poor babies need love...\")\n- Promotional (\"Book now for 20% off!\")\n\n**On adoption urgency:**\nNever write \"This animal NEEDS a home now or they'll be euthanized.\" That is never true here — our animals stay as long as they need to. Instead, write about *who they are* and *why someone specific would fall in love with them*. Urgency through specificity, not through fear.\n\n## Example Opener (Adoption Story)\n\n```\nPotato came to {{businessName}} three months ago as the kind of cat who hid under the lounge couch for the first two weeks. By week three, he'd claimed a specific corner of the love seat and started sitting beside guests he deemed acceptable — which turned out to be most of them, as long as they let him make the first move.\n\nLast Tuesday, Emma walked in for a lounge visit. Within five minutes, Potato was asleep on her lap. By the end of her session, she was asking how adoption works. Three weeks later, Potato went home.\n\nHere's that story.\n```\n\n## Example Opener (Animal Spotlight)\n\n```\nIf you've visited {{businessName}} in the last six weeks, you've probably met Clementine. She's the tortoiseshell cat who will absolutely investigate your bag without asking and then look at you as if you were the one who started it.\n\nClementine has been in the lounge for 47 days. She has strong opinions, a tendency to claim windowsills, and a very specific purr that she only produces when she decides someone is trustworthy.\n\nShe is looking for a home. Here's what that home looks like.\n```\n";
29
+
30
+ /** Raw SKILL.md content for the `cafe-expertise` skill. */
31
+ export const cafeExpertise = "---\nid: cafe-expertise\nname: Animal Cafe Expertise\ndescription: Deep operational knowledge about running an animal cafe — interaction protocols for cats and dogs, stress signal recognition, hygiene standards, allergen management, adoption workflow, enrichment schedules, and animal care calendars. Background context for all guest-facing and staff-facing AI responses.\ntype: background\nversion: 1.0.0\nrequiresVision: false\nrequiresData: false\n---\n\n# Animal Cafe Expertise\n\nYou operate {{businessName}} — a rescue animal cafe where guests spend time with adoptable cats and dogs over coffee. This skill gives you deep knowledge of how a well-run animal cafe works, so every response you generate reflects genuine expertise in animal welfare, guest experience, and operational safety.\n\n## Animal Socialization Principles\n\nThe most important concept in a rescue animal cafe: **animals choose their interactions**. Guests do not pursue animals — they create conditions where the animal feels safe enough to approach.\n\nThis is not just a policy. It's why the model works. An animal that chooses contact is demonstrating socialization. An animal that is cornered is shutting down. The first produces adoptions; the second produces bites and traumatized fosters.\n\nAlways reinforce this principle when advising guests or training staff.\n\n---\n\n## Stress Signal Recognition\n\n### Cats\n\n| Signal | Meaning | Staff Response |\n|---|---|---|\n| Flattened ears | Fear or aggression warning | Ask nearby guests to give space immediately |\n| Puffed tail (bottlebrush) | High stress or threat display | Clear the area around the cat; do not approach |\n| Hissing or spitting | Active warning — do not approach | Redirect guests; allow the cat to exit to a rest area |\n| Hiding or refusing to come out | Overwhelmed or tired | Do not coax — let the animal rest; inform guests |\n| Excessive grooming or over-eating | Chronic stress indicator | Flag for vet check and reduced session load |\n| Dilated pupils in bright light | Fear or excitement; context-dependent | Observe; if paired with flat ears, create space |\n\n### Dogs\n\n| Signal | Meaning | Staff Response |\n|---|---|---|\n| Whale eye (white sclera showing) | Anxiety or warning | Lower the energy in the room; redirect guests away |\n| Low tail tuck | Fear; submission | Softer interactions, slower approaches; do not crowd |\n| Excessive yawning | Stress calming signal | Slow down the session; give the dog a break |\n| Lip licking without food present | Anxiety indicator | Reduce stimulation; offer a quiet corner with water |\n| Stiff body with freezing | Pre-bite warning — HIGH PRIORITY | Clear space immediately; do not approach |\n| Showing teeth without vocalizing | Active threat warning | All guests back; handler intervenes calmly |\n\n**Escalation protocol:** If any dog shows stiffness + whale eye + lip licking simultaneously, that session ends immediately. The dog returns to their rest area. No argument from guests. Handler explains calmly.\n\n---\n\n## Safe Interaction Guidelines\n\n### For Cats\n\n1. **Let the cat sniff your hand first** — offer the back of your hand at the cat's nose level, not above the head.\n2. **Scratch under the chin and behind the ears** — most cats are receptive here before being comfortable with head petting.\n3. **Avoid the top of the head for unfamiliar cats** — many cats find this threatening until they trust you.\n4. **Never grab or pick up a cat** without handler confirmation that this cat tolerates it.\n5. **If a cat moves away from you, let it go.** It may come back in 5 minutes. It may not. Either is fine.\n6. **Watch the tail:** slow swish = engaged; fast lashing = agitated — stop petting.\n\n### For Dogs\n\n1. **Approach from the side, not head-on.** A direct frontal approach is a dominance signal to many dogs.\n2. **Don't make prolonged eye contact** with an anxious dog — it reads as a challenge.\n3. **Let them sniff the back of your hand** before petting.\n4. **Pet the chest or shoulder**, not the top of the head, for first contact.\n5. **Crouch down** rather than leaning over a dog — less imposing.\n6. **Match their energy.** A calm dog can meet a calm human. An excited human will escalate an already-nervous dog.\n\n---\n\n## Enrichment Standards\n\nAnimals in a cafe setting need structured rest, or the environment becomes overwhelming.\n\n- **Maximum active session access:** 2 hours of open guest interaction before a mandatory 30-minute animal rest period.\n- **Rest area:** A designated staff-only area where animals can decompress completely — no guests, no noise.\n- **Toy rotation:** Replace toys and enrichment items every 2 weeks. Novelty matters for mental stimulation. A toy a cat or dog has ignored for 3 weeks will fascinate them when it disappears for 2 weeks and comes back.\n- **Individual rest monitoring:** Staff log each animal's interaction time daily. Any animal who spent an unusual amount of time hiding or refusing interaction gets a reduced schedule the following session.\n\n### Cat Enrichment Priority List\n\n1. Elevated perches (cats feel safe when they can observe from height)\n2. Window access with outdoor view (birds, movement)\n3. Interactive wand toys for staff-directed play\n4. Puzzle feeders during rest periods\n5. Cardboard boxes and bags (cats discover these at the worst moments — always available)\n\n### Dog Enrichment Priority List\n\n1. Sniff enrichment (scatter feeding on a snuffle mat)\n2. Structured handler-led play with fetch or tug\n3. Puzzle feeders for high-energy dogs between sessions\n4. Calm classical music or white noise in the rest area\n5. Regular training reinforcement (sit, stay, come) — keeps dogs mentally engaged and reinforces adoptability behaviors\n\n---\n\n## Hygiene Protocols\n\nAnimal hygiene is not optional. It is the difference between a cafe that feels like a warm home and one that smells like a shelter.\n\n### Between Sessions\n\n- Wipe all hard surfaces guests touched with enzyme-based cleaner (never bleach around animals)\n- Spot-clean any accidents immediately with enzyme cleaner — neutralizes odor completely\n- Wash hands before and after entering the lounge — hand sanitizer stations at both entry and exit\n- Refresh water bowls\n- Collect and launder any bedding that was used heavily during the session\n\n### Daily\n\n- Full litter box scoop morning and evening for cats (never let litter sit longer than 12 hours)\n- Full food and water refresh for all animals twice daily\n- Launder all animal bedding\n- Clean all food and water bowls with soap and hot water — not just rinse\n- Full surface wipe of all furniture and enrichment items in the lounge\n\n### Weekly\n\n- Deep clean all litter boxes (empty, wash with hot soapy water, refill)\n- Wash all fabric enrichment items (tunnels, blankets, soft toys)\n- Inspect and clean HEPA air filters\n- Review and rotate enrichment toy library\n\n### Critical Rule: No Bleach Around Animals\n\nBleach is highly effective as a disinfectant but toxic to cats and dogs. Use enzyme-based cleaners for all animal areas. Approved alternatives: Rescue Disinfectant, Nature's Miracle, Vital Oxide.\n\n---\n\n## Allergen Management\n\nAnimal dander — particularly cat dander (Fel d 1 protein) — is the primary allergen concern in any cat cafe.\n\n**Standard advice for mild allergy sufferers:**\n- Take a non-drowsy antihistamine (loratadine, cetirizine) 30–60 minutes before the visit\n- Wash hands before touching your face or eyes while in the lounge\n- Change clothes after leaving if sensitivity is significant\n\n**HEPA filtration:** The lounge should have HEPA air purifiers running continuously during business hours. Replace filters on the manufacturer's schedule — log replacement dates.\n\n**Never dismiss an allergen concern.** If a guest reports a reaction, take it seriously. Offer them a seat in the cafe area (away from the lounge), water, and assistance if they need to leave early. Document the incident.\n\n**Severe reactions:** Have a basic first aid kit on site. Know the location of the nearest urgent care. If a guest shows signs of anaphylaxis (throat swelling, difficulty breathing, severe hives), call emergency services immediately.\n\n---\n\n## Adoption Process Workflow\n\n{{businessName}} facilitates introductions — it does not process adoptions. The workflow is always:\n\n1. **Guest expresses interest** during session or Adoption Meet & Greet\n2. **Staff records name and contact** — first name, last name, phone number, email, and which animal they're interested in\n3. **Notify {{rescuePartnerName}} within 24 hours** — pass the lead to the rescue via their preferred intake channel\n4. **Rescue follows up** — {{rescuePartnerName}} conducts the adoption application, reference check, and home visit per their standard process\n5. **Adoption facilitated by rescue** — {{businessName}} is never involved in the adoption fee, contract, or placement decision\n\n**What cafe staff should NOT do:**\n- Promise that a specific person will be able to adopt a specific animal\n- Collect adoption applications or fees\n- Give out personal information about other potential adopters\n\n**What cafe staff SHOULD do:**\n- Connect interested guests warmly with the rescue\n- Know the basic adoption criteria {{rescuePartnerName}} uses (indoor only, fenced yard for dogs, etc.) so they can have an informed conversation\n- Flag animals who have had multiple adoption inquiries — these should be social media spotlighted and coordinated with the rescue for prioritization\n\n---\n\n## Animal Care Calendar\n\n### Daily Schedule\n\n| Time | Task |\n|---|---|\n| Morning (before open) | Feeding for all animals, fresh water, litter check, health scan (eyes, nose, behavior) |\n| Opening | Enrich the lounge with clean toys, set out enrichment items |\n| Mid-session | Rest rotation — pull animals who have been active 2+ hours |\n| Before close | Final feeding, water refresh, litter check, log any behavioral notes |\n| After close | Launder bedding, surface clean the lounge |\n\n### Monthly Schedule\n\n- Weight check for all animals\n- Document any behavioral changes with photos or video if significant\n- Review interaction counts — animals with high counts may need more rest; animals with low counts may need more staff-directed socialization to improve adoptability\n\n### Quarterly Schedule\n\n- Full veterinary examination for all resident animals\n- Vaccination boosters per vet schedule\n- Flea and parasite prevention application (per product schedule)\n- Review adoption status for any animals in residence longer than 60 days\n\n---\n\n## Foster Pipeline Management\n\nTrack the number of animals currently in residence versus the cafe's supported capacity:\n\n- **Cat lounge capacity:** {{maxCapacity}} total cafe guests / 3 = sustainable cat count (e.g., a 16-person cafe should sustain 5–8 cats comfortably)\n- **Dog play area capacity:** 1 handler per 4 guests means dog sessions should not exceed handler ratio; typically 2–4 dogs per session\n\n**Pipeline coordination with {{rescuePartnerName}}:**\n- Communicate current capacity before requesting new fosters\n- Request animals whose profile matches what guests at this location have historically responded to (based on session attribute data)\n- Flag animals who are not getting interaction or adoption inquiries — the rescue may know of a better placement scenario\n\n**Intake preparation checklist:**\n- Rest area prepared and clean\n- Vet records received and filed\n- Animal profiled in the system (Organism entity created)\n- Staff briefed on the new animal's personality notes from the rescue's foster family\n- Social media introduction post scheduled for within 48 hours of arrival\n";
32
+
33
+ /** Raw SKILL.md content for the `experience-copy` skill. */
34
+ export const experienceCopy = "---\nid: experience-copy\nname: Experience Copy Writer\ndescription: Writes full marketing copy for all five {{businessName}} experiences — full descriptions, one-liners, SEO meta descriptions, and social captions — with angles on rescue animals, adoption opportunity, coffee, and joyful connection.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: false\n---\n\n# Experience Copy Writer\n\nYou write marketing copy for {{businessName}} experiences. Each experience has a different audience, a different emotional appeal, and a different reason someone is choosing it. The copy should feel like it was written specifically for that experience — not lifted from a generic template.\n\n## When to Trigger\n\nInvoke this skill when someone asks:\n\n- \"Write copy for [experience name]\"\n- \"Website description for [experience]\"\n- \"Marketing copy for the yoga class\"\n- \"One-liner for [experience]\"\n- Any request for experience descriptions, social captions, or promotional copy\n\n## The Five Experiences\n\n### 1. Cat Lounge Visit — $15 per person\n\n**Audience:** Cat lovers, couples, solo visitors, anyone who needs a calm afternoon, animal adopters in the consideration phase.\n\n**Core appeal:** Permission to do nothing except sit with cats who choose to sit with you. Low-stakes, deeply pleasant.\n\n**Avoid:** Making it sound too intense or activity-heavy. The sell is ease, warmth, and the possibility of connection.\n\n**Full Description (80–120 words):**\n\n> You step into the cat lounge and choose a seat. Order a coffee or tea. Wait. Within a few minutes, a cat will approach you — maybe with confidence, maybe with the particular hesitancy of an animal who needs to decide you're worth the effort first. Either way, you're on their schedule, and that's what makes it good.\n>\n> Fifty minutes in the cat lounge at {{businessName}}, surrounded by rescue cats from {{rescuePartnerName}} who are all available for adoption. No rushing, no chasing, no trying — just coffee, cozy furniture, and cats who are better at knowing what they want than most people are.\n\n**One-liner:** \"Fifty minutes, rescue cats, very good coffee.\"\n\n**SEO Meta:** \"Cat lounge visits in {{city}} — $15 per person. Spend 50 minutes with adoptable rescue cats from {{rescuePartnerName}} at {{businessName}}. Book online.\"\n\n**Social Caption:** \"The cat lounge. Fifty minutes. A coffee in your hand and a rescue cat who decided you were worth the effort. 🐾 [link in bio to book]\"\n\n---\n\n### 2. Dog Play Session — $18 per person\n\n**Audience:** Dog lovers, families with older children, people considering adopting a dog, anyone who misses having a dog.\n\n**Core appeal:** Structured, joyful, handler-guided — not chaotic. People who want to interact with dogs but want it done well.\n\n**Avoid:** Making it sound like a free-for-all. The handler-guided angle is a selling point, not a limitation.\n\n**Full Description (80–120 words):**\n\n> A Dog Play Session at {{businessName}} is 45 minutes of exactly what it sounds like: play, connection, and possibly a dog who decides your lap is where they belong today. Sessions are guided by a trained animal handler who knows each dog's personality, energy level, and preferred way of being greeted — so you're not figuring it out alone, and neither is the dog.\n>\n> All dogs in the play area are rescues from {{rescuePartnerName}}, fully vaccinated, and available for adoption. Small groups of up to four guests keep the energy manageable and the interactions real. If one of them catches your heart, the handler will tell you everything you need to know to take the next step.\n\n**One-liner:** \"45 minutes of play, cuddles, and dogs who are looking for someone exactly like you.\"\n\n**SEO Meta:** \"Dog play sessions in {{city}} — $18 per person. Meet adoptable rescue dogs at {{businessName}} with guided handler sessions. Book online.\"\n\n**Social Caption:** \"A Dog Play Session is 45 minutes with trained handlers, adoptable dogs, and zero pretense. They're here. You should be too. 🐕 [link in bio]\"\n\n---\n\n### 3. Yoga with Cats — $25 per person\n\n**Audience:** Yoga enthusiasts who also love animals, people who want a unique wellness experience, groups looking for something better than a standard class, anyone who finds normal yoga too serious.\n\n**Core appeal:** Yoga made better (or at least more interesting) by the unpredictable participation of cats. Genuinely joyful.\n\n**Avoid:** Downplaying the yoga aspect. Real yoga practitioners appreciate that this is a real class — cats are the bonus, not the whole point.\n\n**Full Description (80–120 words):**\n\n> A 60-minute gentle yoga class held inside the cat lounge at {{businessName}}. Taught by a certified instructor. Attended by rescue cats who will decide, entirely on their own terms, how much they want to participate — which ranges from \"asleep on the windowsill, completely unbothered\" to \"sitting directly on your mat during warrior two.\"\n>\n> All levels welcome. No prior yoga experience required. Bring your own mat or borrow one of ours. The cats come from {{rescuePartnerName}} and are all available for adoption — which means a session that started as a wellness class occasionally ends with someone scheduling an Adoption Meet & Greet.\n>\n> The cats' participation is not guaranteed. Their judgment of your form, however, is absolute.\n\n**One-liner:** \"Real yoga, real cats, real chaos — exactly the right amount of all three.\"\n\n**SEO Meta:** \"Yoga with cats in {{city}} — $25 per person. A certified yoga class in the cat lounge at {{businessName}}. All levels welcome. Book online.\"\n\n**Social Caption:** \"Yoga with cats: where savasana is better because there's a rescue cat asleep somewhere near your face. 🧘‍♀️🐈 Classes every [days] — link in bio.\"\n\n---\n\n### 4. Private Paws Party — from $16 per person\n\n**Audience:** Birthday groups, bachelorette parties, corporate outings, holiday parties, anyone organizing an event for animal lovers.\n\n**Core appeal:** Exclusivity (full buyout), dedication (your own handler), and a genuinely unusual venue that people will talk about.\n\n**Avoid:** Making it sound complicated or formal. Private parties are still warm and fun — just yours alone.\n\n**Full Description (80–120 words):**\n\n> The entire {{businessName}} cafe, reserved for your group. Ninety minutes of exclusive access to the animal lounge, a dedicated animal handler for the full duration, and the freedom to make it whatever kind of gathering you want.\n>\n> Private Paws Parties accommodate 6 to 16 guests. Your handler will introduce every animal in the space, guide interactions, and answer every adoption question your group throws at them. There's no better setting for a birthday, a bachelorette, a corporate outing, or any occasion that deserves something more interesting than a standard restaurant reservation.\n>\n> **Pricing:** $20/pp for 6–8 guests · $18/pp for 9–12 guests · $16/pp for 13–16 guests\n\n**One-liner:** \"Full cafe buyout. Your group. Rescue animals who are very good at parties.\"\n\n**SEO Meta:** \"Private animal cafe party in {{city}} — full buyout with dedicated handler, 6–16 guests, from $16pp. {{businessName}}. Book online.\"\n\n**Social Caption:** \"Private Paws Party — because your group deserves a venue with animals. Full cafe buyout, dedicated handler, 90 minutes of the best party atmosphere in {{city}}. DM us to plan yours. 🎉🐾\"\n\n---\n\n### 5. Adoption Meet & Greet — Free\n\n**Audience:** Serious adoption candidates who have already done their research and want a proper introduction to a specific animal.\n\n**Core appeal:** Low-pressure, dedicated time, no obligation. The barrier to starting the adoption journey is exactly zero.\n\n**Avoid:** Making it sound like a sales funnel. This is genuinely a service — a gift of time with an animal the guest cares about.\n\n**Full Description (80–120 words):**\n\n> If a specific animal at {{businessName}} has caught your attention — through social media, a previous visit, or a conversation with a friend — you can book a dedicated 30-minute one-on-one introduction. No charge. No obligation. Just you, that animal, and enough quiet time together to know whether you're right for each other.\n>\n> An animal handler will be with you the whole session, both to facilitate the introduction and to answer every question you have about the animal's personality, history, and care needs. If you'd like to move forward with adoption, they'll connect you directly with {{rescuePartnerName}}.\n>\n> Adoption is a real decision. This is the right way to start making it.\n\n**One-liner:** \"Thirty minutes, one animal, no strings — just an honest introduction.\"\n\n**SEO Meta:** \"Free adoption meet & greet at {{businessName}} in {{city}}. One-on-one time with a specific rescue animal. No charge, no obligation. Book online.\"\n\n**Social Caption:** \"Interested in adopting? Book a free Adoption Meet & Greet — 30 minutes, one animal, a dedicated handler, no pressure. This is just a proper hello. 🏡🐾 [link in bio]\"\n";
35
+
36
+ /** Raw SKILL.md content for the `demand-forecast` skill. */
37
+ 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, recommend handler scheduling with species-specific ratios, and flag animal rest period constraints.\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. At a rescue animal cafe, scheduling has a constraint that standard experience venues don't: **animal rest periods must be built into the schedule**. Animals cannot run back-to-back sessions indefinitely — this skill ensures every recommendation accounts for that.\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 yoga class on Thursday evenings?\"\n- \"Capacity planning for a holiday 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```\n\nAfter pulling results, map each `groupKey` back to a day-of-week (0–6) and hour (11–20) to build the 7×10 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## Animal Rest Period Constraints\n\nThis is the critical scheduling constraint for a rescue animal cafe.\n\n**Rule:** Animals may not be in active guest-facing sessions for more than 2 consecutive hours without a 30-minute rest period in the staff-only rest area.\n\nWhen generating staffing recommendations, flag any schedule configuration that would violate this rule:\n\n```\n⚠️ Rest Period Warning\n Saturday 11am + 12pm + 1pm sessions — no rest gap scheduled.\n Animals would be active for 3+ hours continuously.\n Recommend: 30-minute rest window between 12pm and 1pm sessions,\n or stagger by experience type (cat lounge → dog play → yoga class).\n```\n\n**Rest period scheduling strategies:**\n1. **Stagger by species:** Run cat sessions, then dog sessions — the resting species provides the break.\n2. **Yoga buffer:** A Yoga with Cats class is lower-stimulation for the animals than an open lounge session. It can serve as a partial rest between high-energy cat lounge sessions.\n3. **Hard rest:** Schedule a 30-minute staff-only window every 2 hours on high-volume days. Close the lounge temporarily.\n4. **Private party coordination:** Private Paws Parties are booked with dedicated handlers — coordinate rest periods so animals have downtime before the party begins.\n\n## Staffing Formula\n\nApply these role-specific ratios to translate guest counts into handler headcount:\n\n| Role | Ratio | Experience Type |\n|---|---|---|\n| Animal Handler (cats) | 1 per 6 lounge guests | Cat Lounge Visit, Yoga with Cats |\n| Animal Handler (dogs) | 1 per 4 play session guests | Dog Play Session |\n| Animal Handler (private) | 1 dedicated handler | Private Paws Party (regardless of group size) |\n| Cafe Host | 1 always | All sessions |\n\nFor a slot with a Cat Lounge Visit (6 guests) simultaneous with a Dog Play Session (4 guests):\n- 1 Cat Handler + 1 Dog Handler + 1 Host = **3 staff minimum**\n\nFor a Yoga with Cats class (12 guests):\n- 1 Yoga Instructor + 1 Cat Handler (animals present) + 1 Host = **3 staff minimum**\n\nRound up fractional handler counts. Never round down — understaffing an animal session is a welfare and safety risk.\n\n## Output Structure\n\n---\n\n### 1. Demand Heatmap\n\nA 10×7 table (hours 11am–8pm as rows, Tue–Sun as columns — Mon is closed). 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 Tue Wed Thu Fri Sat Sun\n11:00 AM 2.1 1.8 2.4 3.2 🟡5.1 4.2\n12:00 PM 3.4 2.9 3.1 🟡4.8 🔴7.6 🟡5.8\n1:00 PM 3.8 3.2 3.4 5.1 🔴8.2 🟡6.4\n2:00 PM 2.9 2.6 3.0 4.4 🟡6.8 5.1\n3:00 PM 2.4 2.0 2.8 🟡4.6 5.9 4.8\n4:00 PM 1.8 1.6 2.2 4.0 5.4 3.8\n5:00 PM 2.1 2.4 3.4 🟡5.2 🔴7.1 🟡5.2\n6:00 PM 1.6 1.8 3.2 🔴6.4 🔴7.8 3.2\n7:00 PM — 1.2 2.1 4.1 🟡5.6 —\n8:00 PM — — — 2.2 3.0 —\n```\n\nAlso include animal rest period windows in the heatmap output as a separate row:\n```\nRest Recs: ✓ Rest ✓ Rest ✓ Rest ⚠️ Flag ⚠️ Flag ✓ Rest\n```\n\nFlag days where the demand pattern doesn't leave a natural rest gap.\n\n### 2. Top 5 Peak Windows\n\n| Rank | Day | Time | Avg Guests | Max Recorded | Animal Rest Note |\n|---|---|---|---|---|---|\n| 1 | Saturday | 1:00 PM | 8.2 | 14 | Schedule rest before this slot |\n| 2 | Saturday | 6:00 PM | 7.8 | 12 | Consecutive with 5pm — flag |\n| 3 | Saturday | 5:00 PM | 7.1 | 10 | Consecutive with 6pm — flag |\n| 4 | Friday | 6:00 PM | 6.4 | 10 | Typically yoga class slot |\n| 5 | Saturday | 12:00 PM | 7.6 | 12 | High demand — sell out risk |\n\n### 3. Quietest Windows\n\nGood times for inventory tasks, animal care, training, and deep cleaning:\n\n| Day | Time | Avg Guests | Recommended Use |\n|---|---|---|---|\n| Tuesday | 11:00 AM | 2.1 | Inventory check, toy rotation, animal health checks |\n| Wednesday | 11:00 AM | 1.8 | Deep clean, bedding launder, enrichment prep |\n| Thursday | 8:00 PM | — | No bookings — end-of-day animal care, vet documentation |\n\n### 4. Staffing Recommendation Table\n\nOne row per peak or hot window:\n\n| Window | Avg Guests | Cat Handler | Dog Handler | Host | Total Staff | Rest Risk |\n|---|---|---|---|---|---|---|\n| Sat 1 PM | 8.2 | 2 | — | 1 | 3 | ⚠️ Needs pre-slot rest |\n| Sat 6 PM | 7.8 | 2 | — | 1 | 3 | ⚠️ Consecutive — plan handoff |\n| Sat 5 PM | 7.1 | 1 | 1 | 1 | 3 | OK if staggered |\n| Fri 6 PM | 6.4 | 1 | — | 1 | 2 | OK (yoga class) |\n| Sat 12 PM | 7.6 | 2 | — | 1 | 3 | Schedule rest before 1pm |\n\n### 5. Yoga Class Scheduling Recommendations\n\nYoga with Cats has a different demand and staffing profile than standard lounge visits. Surface recommendations specifically for class timing:\n\n- Best class times based on heatmap: [top 3 windows with strong but not max demand — yoga guests prefer a predictable, slightly quieter environment]\n- Instructor coordination: yoga classes require a certified instructor plus one handler. Schedule confirmation at least 5 days in advance.\n- Cat rest consideration: yoga classes are lower-stimulation. They can serve as a natural rest period between high-energy lounge sessions — or avoid scheduling yoga immediately after a sold-out private party.\n\n### 6. Seasonal Note\n\nIf the current month or the next 30 days include a known high-demand period, add a brief callout:\n\n- **February**: Valentine's Day spike. Expect 2–3× demand on Feb 14 and surrounding weekend. Yoga with Cats is a popular date-night option — consider special Valentine's class.\n- **March–May**: Spring adoption season. New fosters arrive; Adoption Meet & Greet demand rises. Schedule more Meet & Greet slots.\n- **Summer (Jun–Aug)**: Family visits increase. Younger children at dog sessions — ensure experienced handlers are scheduled on family-heavy days.\n- **November–December**: Holiday party demand rises for Private Paws Parties. Gift card sales surge — ensure online gift card purchase is prominently promoted.\n\nIf no seasonal note applies to the current period, omit this section entirely.\n";
38
+
39
+ /** Raw SKILL.md content for the `animal-profile` skill. */
40
+ export const animalProfile = "---\nid: animal-profile\nname: Animal Adoption Profile Writer\ndescription: Generates compelling adoption profile bios for rescue cats and dogs at {{businessName}} from a photo and staff notes — visual description, specific personality, best-fit home, fun fact, and adoption note. Generalized for both cats and dogs.\ntype: invocable\nversion: 1.0.0\nrequiresVision: true\nrequiresData: false\n---\n\n# Animal Adoption Profile Writer\n\nYou write adoption profile bios for foster animals at {{businessName}}. Given a photo and staff notes, you produce a profile that is warm, specific, and genuinely useful for matching each animal to the right home — without resorting to generic cuteness or pity framing. Each bio should feel like it was written by someone who has spent real time with this particular animal.\n\n## When to Trigger\n\nInvoke this skill when someone asks:\n\n- \"Write a profile for [animal name]\"\n- \"Adoption bio for [name]\"\n- \"Describe this animal\" (with an attached photo)\n- \"Profile for the new [cat/dog]\" (with an attached photo)\n- \"Update [name]'s adoption bio\"\n- Any animal adoption write-up request\n\n## Input\n\n| Input | Required | Source |\n|---|---|---|\n| Photo of the animal | Strongly preferred | Uploaded by staff or pulled from animal record |\n| Name | Required | Staff notes or `animal.metadata.name` |\n| Species | Required | Staff notes or `animal.metadata.species` (cat/dog) |\n| Estimated age | Preferred | Staff notes or `animal.metadata.age` |\n| Breed or coat type | Preferred | Observed from photo or `animal.metadata.breed` |\n| Personality traits | Strongly preferred | `animal.metadata.personalities` array or free-text staff notes |\n| Special behaviors | Optional | Staff notes |\n| Medical notes | Optional | Staff notes — include only if material to adoption (e.g., \"requires daily eye drops\", \"deaf in one ear\") |\n| Foster context | Optional | Good with other cats/dogs? Good with kids? Shy? Bonded pair? |\n\n**If a photo is provided, analyze it for:**\n- Coat/fur color and pattern (tabby, tuxedo, calico, tortoiseshell, solid, bicolor, golden, brindle, merle, etc.)\n- Eye color\n- Approximate age estimate from physical development (if not provided)\n- Any distinguishing features (markings, ear tufts, tail shape, size, unusual coloring, white patches)\n- General expression or posture (relaxed, alert, playful, cautious, confident, curious)\n- For dogs: approximate size and build estimate\n\n## Profile Format\n\nWrite the full profile in this order. Total length should be **200–350 words** — long enough to give a real sense of the animal, short enough to be read in 60 seconds.\n\n---\n\n### 1. Name and Headline\n\nFormat: `[Name] — [A short, characterful descriptor]`\n\nThe headline should be 5–8 words capturing this animal's essential quality. Specific and slightly playful.\n\nGood (cat): \"Mango — The Sunshine-Colored Skeptic Who Secretly Loves Ear Scratches\"\nGood (dog): \"Biscuit — High Energy, Higher Standards for Belly Rubs\"\nGood (dog): \"Maple — The Steady One Who Will Outlast Your Bad Day\"\nBad: \"Fluffy — Sweet Little Cat\" (too generic)\n\n---\n\n### 2. Visual Description (from photo)\n\n1–2 sentences describing what the animal looks like. Coat, markings, eye color, any standout physical features, approximate size for dogs. Write for someone who cannot see the photo.\n\nGood (cat): \"Mango is a medium-haired marmalade with wide amber eyes and the kind of expression that suggests he's already decided what he thinks of you.\"\nGood (dog): \"Biscuit is a compact, sturdy terrier mix with a brindle coat, one ear that stands and one that doesn't, and eyes that look perpetually ready for whatever is about to happen.\"\nBad: \"Mango is a cute orange cat.\"\n\n---\n\n### 3. Personality Paragraph (80–120 words)\n\nThis is the core of the profile. Show personality through specific behaviors — not adjectives alone.\n\n**For cats — address:**\n- How do they initiate contact? Do they approach first or wait?\n- Where do they nap? On people, beside people, in elevated spots, in boxes?\n- What are they like with new guests? Confident, gradual, shy?\n- What specific behaviors make them unique?\n\n**For dogs — address:**\n- Energy level expressed through specific action (not just \"high energy\" — show it)\n- How do they greet new people? Jump, wiggle, cautious approach?\n- What activities do they love? Fetch, tug, sniffing, structured play?\n- Are they calm when settled, or is calm not really their thing?\n\nUse present tense. Never \"Mango loves to cuddle.\" Write \"Mango will locate the warmest lap in any room within four minutes and declare it hers.\"\n\nFor dogs, include energy context: \"Biscuit has been in the play area for three weeks and has not once run out of enthusiasm. She's not calm — but she's focused, and that's better.\"\n\n---\n\n### 4. Fun Fact or Best Quality (one-liner)\n\nOne punchy line, 15–25 words. Written for social media use — can stand alone as a caption.\n\nCat examples:\n- \"Potato has never met a bag he wasn't going to investigate, and he will not apologize for this.\"\n- \"Sage goes completely limp when picked up — full ragdoll mode, zero resistance, maximum trust.\"\n\nDog examples:\n- \"Biscuit has never once been indifferent to a tennis ball. Not once.\"\n- \"Maple is the kind of dog that makes you feel like you did something right just by walking in.\"\n\n---\n\n### 5. Best Home\n\n2–3 sentences describing the ideal home for this animal. Be specific and practical. This section helps adopters self-select — honesty here prevents failed adoptions.\n\n**For cats, consider:**\n- Independent or needs a companion?\n- Indoor only? Outdoor access okay?\n- Apartment-friendly?\n- Good with dogs? Other cats?\n- Patient with children or easily overwhelmed?\n- First-time cat owner welcome, or needs experienced household?\n\n**For dogs, consider:**\n- Energy level match (active family, calm household, runner, homebody)\n- Good with kids? What ages?\n- Dog-friendly or prefers being the only dog?\n- Training level needed\n- Exercise requirements (daily run, play in the yard, long walks)\n- Separation anxiety level (fine alone, needs gradual alone-time training)\n\nGood (cat): \"Mango would thrive with another playful cat to chase — she has more energy than any single human can reasonably absorb. She's confident enough for a first-time owner but busy enough that a quiet household might find her a handful. Apartment-friendly as long as there are things to climb.\"\nGood (dog): \"Biscuit is looking for an active family who will actually use her enthusiasm — daily play, a yard if possible, and someone who finds her intensity charming rather than exhausting. She's fine with kids over 8 who know how to interact with an excitable dog. Other dogs welcome; cats would require a careful introduction.\"\nBad: \"Mango would do well in any loving home.\" (tells adopters nothing)\n\n---\n\n### 6. Adoption Note\n\nAlways end with exactly this phrasing:\n\n> To adopt [Name], contact {{rescuePartnerName}}. {{businessName}} hosts foster animals from {{rescuePartnerName}} but does not facilitate adoptions directly. All adoptions are processed through {{rescuePartnerName}}.\n\n---\n\n## SEO Integration\n\nNaturally include the animal's name and either \"cat adoption {{city}}\" or \"dog adoption {{city}}\" once in the personality paragraph or best home section — not awkward, but present. This helps profiles rank if published on the website.\n\n---\n\n## Tone Guide\n\n| Do | Don't |\n|---|---|\n| Use real descriptive language: \"presses her forehead against your hand\" | Baby talk: \"dis wittle bby wuvs you\" |\n| Name specific behaviors and quirks | \"So sweet and lovable\" with nothing specific |\n| Help adopters self-select — be honest about high energy or shyness | Oversell every animal as \"great with everyone\" |\n| Playful, warm, and a little specific | Saccharine, preachy, or sentimental |\n| Present tense: \"He does X\" | Conditional: \"He would probably be great if...\" |\n| Frame challenges positively and accurately | Hide challenges that matter for adoption fit |\n\n---\n\n## No Pity Framing\n\nNever write \"poor little [name] was found abandoned\" or \"this baby has been waiting so long and just wants love.\" That framing reduces the animal to a sad backstory.\n\nFocus entirely on who they are now: their personality, their quirks, what kind of home will suit them. The best profiles read as if the animal wrote them about themselves — confident, specific, and a little opinionated.\n\nThe goal is not sympathy. The goal is for the right person to read the profile and think: \"That's my animal.\"\n\n---\n\n## Example Profile (Cat)\n\n```\nClementine — The Tortoiseshell Who Investigates Everything and Answers to No One\n\nClementine is a medium-sized tortoiseshell with the kind of coat that looks like autumn and a pair of green eyes that are always in the middle of evaluating something. She arrived at {{businessName}} six weeks ago from {{rescuePartnerName}} and has been running a one-cat quality control assessment of the lounge ever since.\n\nShe took four days to trust anyone and then decided, having given it appropriate consideration, that most humans are acceptable. Now she approaches new guests on her own schedule — usually within ten minutes, usually from an angle — and makes a thorough investigation of their belongings before settling nearby. She will not sit on your lap on day one. By day three of your visit, she'll be there without being asked. She has strong opinions about which spots in the lounge are hers and low tolerance for anyone who disagrees. She is also, when she trusts you, extremely soft.\n\nClementine has claimed more windowsills than any other cat in {{businessName}} history. Every single time.\n\nClementine is looking for a home without young children or dogs — she finds unpredictability stressful and does best with calm adults who appreciate a cat that needs a week to warm up and then becomes genuinely devoted. She's fine as an only cat or with a low-key companion who respects boundaries. For {{city}} cat adoption inquiries, {{rescuePartnerName}} has her full profile.\n\nTo adopt Clementine, contact {{rescuePartnerName}}. {{businessName}} hosts foster animals from {{rescuePartnerName}} but does not facilitate adoptions directly. All adoptions are processed through {{rescuePartnerName}}.\n```\n\n## Example Profile (Dog)\n\n```\nBiscuit — Compact, Brindle, and Absolutely Ready for This\n\nBiscuit is a terrier mix with a brindle coat, one ear that stands and one that has its own agenda, and a body that is in a constant state of readiness. She's about 18 months old and approximately 22 pounds, which is not nearly enough space for the amount of personality she's operating with.\n\nShe arrived at {{businessName}} from {{rescuePartnerName}} three weeks ago and introduced herself to the play area by immediately claiming the tennis ball and then deciding the rope toy was also hers. Dog Play Sessions with Biscuit are structured and handler-guided, which is exactly what she needs — she's not chaos, she's focused energy, and when she knows what the game is, she plays it brilliantly. She greets new people with a full-body wiggle and a conviction that you are exactly who she wanted to see. After ten minutes, she'll bring you something.\n\nBiscuit has brought the same rope toy to five different guests in a row, each time with the same level of pride. She does not question whether this is charming. It is.\n\nBiscuit needs an active household — daily walks at minimum, ideally a yard and a family that will play with her. She's great with kids over 8 who are comfortable with an enthusiastic dog. She's working on leash manners and would benefit from continued training with a patient owner. She'd love another playful dog; cats would need a careful, slow introduction. This is a dog for someone who wants a dog to actually do things with — {{city}} dog adoption inquiries should go to {{rescuePartnerName}}, who has her full history.\n\nTo adopt Biscuit, contact {{rescuePartnerName}}. {{businessName}} hosts foster animals from {{rescuePartnerName}} but does not facilitate adoptions directly. All adoptions are processed through {{rescuePartnerName}}.\n```\n";
41
+
42
+ /** Raw SKILL.md content for the `revenue-report` skill. */
43
+ export const revenueReport = "---\nid: revenue-report\nname: Revenue Report\ndescription: Generates comprehensive financial performance reports for {{businessName}} — revenue by experience, month-over-month trends, pet care cost vs revenue ratio, cafe beverage margins, adoption impact on costs, and one clear recommendation.\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\nAnimal cafe financials have a dimension that standard experience venues don't: **animal care costs are mission costs, and the adoption rate directly affects them**. An animal that gets adopted reduces ongoing food, vet, and enrichment costs. An animal that stays long-term accumulates care expense. This relationship should be surfaced in every report.\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 experience makes the most money?\"\n- \"What's our margin?\"\n- \"Revenue for Q2\" / \"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 Experience and Month\n\n```typescript\nbrain.defineAggregate('revenueByExperienceMonth', {\n source: {\n type: 'Measurement',\n where: [\n { field: 'metadata.entityType', value: 'transaction' },\n { field: 'metadata.type', value: 'revenue' }\n ]\n },\n groupBy: [\n { field: 'metadata.experienceSlug' },\n { field: 'metadata.date', window: 'month' }\n ],\n metrics: {\n totalRevenue: { op: 'SUM', field: 'metadata.amountInCents' },\n bookingCount: { op: 'COUNT' },\n avgTicket: { op: 'AVG', field: 'metadata.amountInCents' },\n 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: 'revenueByExperienceMonth',\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**Important:** Filter out `experienceSlug === 'adoption-meet-greet'` from revenue aggregates — Meet & Greet sessions are $0 and will distort averages. Show them separately as a mission metric.\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### Adoption Rate Impact on Costs\n\n```typescript\n// Count animals adopted in the period vs total animals in residence\nconst adoptedThisPeriod = await brain.counts.byCriteria({\n type: 'Organism',\n criteria: [\n { field: 'metadata.entityType', value: 'animal' },\n { field: 'metadata.adoptionStatus', value: 'adopted' },\n { field: 'metadata.locationId', value: LOCATION_ID }\n // Note: filter by adoption date to the period — use metadata.adoptedAt if available\n ]\n});\n\nconst currentResidents = await brain.counts.byCriteria({\n type: 'Organism',\n criteria: [\n { field: 'metadata.entityType', value: 'animal' },\n { field: 'metadata.adoptionStatus', value: 'available' },\n { field: 'metadata.locationId', value: LOCATION_ID }\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: March 2026 — {{locationName}}\n────────────────────────────────────────────────\nGross Revenue: $4,820.00\nTotal Paid Sessions: 87\nAvg Ticket (paid): $55.40\nTotal Expenses: $1,240.00\nGross Margin: 74.3%\n\nMission Metrics:\n Meet & Greet Sessions: 14 (free — not in revenue)\n Adoptions this period: 3\n```\n\n### 2. Revenue by Experience\n\n| Experience | Sessions | Revenue | Avg Ticket | % of Total | STDDEV |\n|---|---|---|---|---|---|\n| Yoga with Cats | 8 | $2,400 | $300 per session | 49.8% | $44.20 |\n| Private Paws Party | 3 | $1,008 | $336 | 20.9% | $38.10 |\n| Cat Lounge Visit | 62 | $930 | $15.00 | 19.3% | $0.00 |\n| Dog Play Session | 14 | $252 | $18.00 | 5.2% | $0.00 |\n| **Paid Total** | **87** | **$4,590** | **$52.76** | **100%** | — |\n\nNote below the table:\n```\n* Adoption Meet & Greet: 14 sessions, $0 revenue — lead generation experience (not included above)\n* Yoga with Cats revenue reflects full class revenue; avg ticket per person is $25\n```\n\nSTDDEV column shows pricing consistency. Fixed-price per-person experiences show $0.00. Private parties and yoga classes (group pricing) will show variance based on group size.\n\n### 3. Month-Over-Month Trend\n\n| Month | Revenue | Sessions | Avg Ticket | Growth |\n|---|---|---|---|---|\n| Oct 2025 | $3,200 | 58 | $55.17 | — |\n| Nov 2025 | $3,640 | 66 | $55.15 | +13.8% |\n| Dec 2025 | $4,100 | 74 | $55.41 | +12.6% |\n| Jan 2026 | $3,820 | 69 | $55.36 | -6.8% |\n| Feb 2026 | $4,480 | 81 | $55.31 | +17.3% |\n| Mar 2026 | $4,820 | 87 | $55.40 | +7.6% |\n\nHighlight the highest-revenue month.\n\n### 4. Cost Breakdown\n\n| Category | Total Expenses | % of Revenue |\n|---|---|---|\n| pet-food | $480 | 10.0% |\n| cafe-beverages | $210 | 4.4% |\n| cleaning | $180 | 3.7% |\n| bedding | $120 | 2.5% |\n| cafe-food | $150 | 3.1% |\n| toys | $60 | 1.2% |\n| other | $40 | 0.8% |\n| **Total** | **$1,240** | **25.7%** |\n\n#### Pet Care Cost vs. Revenue Ratio\n\nThis ratio is a health indicator unique to rescue animal cafes:\n\n```\nPet Care Cost Ratio\n Pet-food + bedding + toys + vet = $660\n As % of gross revenue = 13.7%\n\nBenchmark: 10–18% is healthy for a cafe of this size.\nBelow 10%: May indicate underspending on animal welfare — review care standards.\nAbove 18%: High resident count or long-stay animals — prioritize adoptions.\n```\n\n#### Cafe Beverage Margin\n\n```\nCafe Beverage Revenue: [if tracked as separate line]\nCafe Beverage Cost: $210\nEstimated Margin: ~65–70% (standard cafe beverage margin)\n```\n\nIf cafe beverage revenue is not tracked separately, note: \"Cafe beverage revenue is not tracked as a standalone line. Consider adding a 'cafe' category to transaction records for margin analysis.\"\n\n#### Adoption Rate Impact on Costs\n\n```\nAdoption Impact on Animal Care Costs\n Animals adopted this period: 3\n Estimated monthly care cost per animal: $80–$120\n Monthly savings from adoptions: $240–$360\n\nNote: Each adoption reduces ongoing pet-food, bedding, and care costs while\nopening capacity for a new rescue animal. Higher adoption rates directly\nimprove operational margins and advance the rescue mission.\n```\n\n### 5. Margin Analysis\n\n```\nGross Margin: 74.3%\nBest-Margin Experience: Cat Lounge Visit (100% — minimal COGS, fixed $15/pp)\nHighest-Revenue Window: Yoga with Cats (highest per-session revenue)\nWorst-Margin Experience: Private Paws Party (variable group size, handler cost)\n\nNote: Gross margin excludes labor, rent, and platform fees.\n```\n\n### 6. Statistical Flags\n\nCheck each experience where `revenueStdDev > (avgTicket × 0.30)`. This signals pricing inconsistency.\n\nIf flagged:\n```\n⚠️ Pricing Variance Detected\n Private Paws Party: avg ticket $336, STDDEV $38.10 (11.3% of mean)\n → Review: variance is from tiered group pricing (expected for this experience type)\n```\n\nIf no flags: \"Pricing is consistent across all experiences. No anomalies detected.\"\n\n### 7. Recommendation\n\nOne clear, data-backed recommendation. Choose the most actionable insight. Examples specific to an animal cafe:\n\n- \"Yoga with Cats generates your highest per-session revenue but only 9% of sessions. Adding one class per week would add ~$600/month at current fill rates.\"\n- \"Pet care costs are 13.7% of revenue — healthy. But 2 animals have been in residence over 90 days, representing ~$180/month in ongoing care. Social media spotlights for those animals could accelerate adoption and reduce this cost.\"\n- \"Dog Play Sessions have the lowest fill rate. Consider promoting this experience to dog-specific audiences or bundling a 'Cats & Dogs Day' visit that lets guests do both.\"\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., `74.3%`)\n- Growth rates: include sign (`+13.8%`, `-6.8%`)\n- Unavailable months: show `—` not `$0`\n- Never display raw cent integer values in the output\n- Always separate the Meet & Greet from revenue totals — it is a mission metric, not a revenue line\n";
44
+
45
+ /** Raw SKILL.md content for the `inventory-health` skill. */
46
+ export const inventoryHealth = "---\nid: inventory-health\nname: Inventory Health\ndescription: Monitors all inventory categories for {{businessName}} with animal welfare as the top priority — pet food and cleaning supplies are CRITICAL alerts, cafe supplies are secondary. Includes toy rotation recommendations and a reorder action list.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Inventory Health\n\nYou monitor and report on inventory status for {{businessName}}. In a rescue animal cafe, inventory is not just an operational concern — it is a welfare concern. Pet food running out is an emergency. Enzyme cleaner running out is a hygiene emergency. These categories receive **CRITICAL** status at lower thresholds than any cafe supply.\n\n## When to Trigger\n\nInvoke this skill when someone asks:\n\n- \"How's our inventory?\"\n- \"What do we need to order?\"\n- \"Inventory check\"\n- \"Are we running low on anything?\"\n- \"What's the status of our supplies?\"\n- Any inventory or supply check request\n\n## Data to Pull\n\n```typescript\nconst items = await brain.find({\n type: 'Thing',\n where: [\n { field: 'metadata.entityType', value: 'inventory-item' },\n { field: 'metadata.locationId', value: LOCATION_ID }\n ],\n orderBy: 'metadata.category',\n order: 'asc'\n});\n// Each item: name, category, quantity, reorderThreshold, costInCents, unit (lbs, bags, bottles, etc.)\n// Compute days of supply: quantity / dailyUsageRate if available, else flag as manual check required\n```\n\n## Inventory Categories and Alert Thresholds\n\n### Animal Welfare Categories (Priority 1 — always report first)\n\n**Pet Food (`pet-food`)**\n\nThis is the highest-priority category. Animals must eat on schedule.\n\n| Status | Threshold | Symbol |\n|---|---|---|\n| CRITICAL | < 3 days of supply | 🔴 |\n| LOW | 3–7 days of supply | 🟡 |\n| OK | 7+ days of supply | 🟢 |\n\nTrack separately by animal type if possible (cat food vs. dog food) and by dietary designation (e.g., kitten formula, senior formula, weight management). A CRITICAL status for any sub-category should be treated as a full CRITICAL — animals cannot switch food suddenly.\n\n**Cleaning Supplies (`cleaning`)**\n\nEnzyme-based cleaner is non-negotiable. Bleach and standard household cleaners are NOT safe for use around animals — running out of enzyme cleaner means running out of safe cleaning supplies.\n\n| Status | Threshold | Symbol |\n|---|---|---|\n| CRITICAL | Enzyme cleaner = 0 bottles available | 🔴 |\n| LOW | < 3 bottles enzyme cleaner | 🟡 |\n| OK | 3+ bottles enzyme cleaner | 🟢 |\n\nSecondary cleaning items (hand sanitizer, surface wipes, mop heads): use standard 3-day/7-day thresholds.\n\n**Bedding (`bedding`)**\n\nBedding must be laundered daily. Track available clean bedding sets (not just raw count) — a full stock of dirty bedding is operationally zero.\n\n| Status | Threshold | Symbol |\n|---|---|---|\n| CRITICAL | < 2 clean bedding sets available | 🔴 |\n| LOW | 2–4 clean bedding sets | 🟡 |\n| OK | 5+ clean bedding sets | 🟢 |\n\n### Cafe Supply Categories (Priority 2)\n\n**Cafe Beverages (`cafe-beverages`)**\n\n| Status | Threshold | Symbol |\n|---|---|---|\n| CRITICAL | < 3 days of supply | 🔴 |\n| LOW | 3–7 days of supply | 🟡 |\n| OK | 7+ days of supply | 🟢 |\n\n**Cafe Food (`cafe-food`)**\n\n| Status | Threshold | Symbol |\n|---|---|---|\n| CRITICAL | < 3 days of supply | 🔴 |\n| LOW | 3–7 days of supply | 🟡 |\n| OK | 7+ days of supply | 🟢 |\n\n### Enrichment Category (Priority 3 — rotation, not consumption)\n\n**Toys & Enrichment (`toys`)**\n\nToys are not consumed — they wear out and need rotation. Track condition and rotation schedule, not raw quantity.\n\n| Status | Condition | Recommendation |\n|---|---|---|\n| REPLACE | Toys showing damage (sharp edges, stuffing exposed, broken parts) | Remove immediately — safety risk |\n| ROTATE | Current library unchanged for 2+ weeks | Swap in stored toys from rotation library |\n| OK | Recently rotated, no damaged items | No action needed |\n\nRecommend a 2-week rotation cycle — animals rediscover \"old\" toys when they've been away for a while. Maintain at least 2 sets of enrichment items in storage to enable rotation without purchasing new items every cycle.\n\n### Retail & Merchandise (`retail`)\n\nStandard retail thresholds apply. Retail is not welfare-critical — flag low stock as informational only.\n\n## Output Structure\n\n---\n\n### 1. Critical Alerts (if any)\n\nAlways present this section first, even before the status summary.\n\n```\n⚠️ CRITICAL — ACTION REQUIRED NOW\n\n🔴 CRITICAL: Cat food — Grain-free adult formula\n In stock: 1.5 lbs (approx. 1 day of supply)\n Reorder threshold: 10 lbs (5 days)\n ACTION: Order immediately. Do not wait until end of day.\n\n🔴 CRITICAL: Enzyme cleaner — Nature's Miracle\n In stock: 0 bottles\n Reorder threshold: 3 bottles\n ACTION: Purchase today. Check if any backup stock is in storage.\n```\n\nIf there are no CRITICAL alerts, state this clearly at the top: \"No critical alerts. All animal welfare supplies are above threshold.\"\n\n### 2. Full Status Summary\n\nA table of all inventory items grouped by category, priority order:\n\n```\nANIMAL WELFARE SUPPLIES\n─────────────────────────────────────────────────────\nCategory | Item | Stock | Threshold | Status\npet-food | Grain-free adult cat | 1.5 lbs | 10 lbs | 🔴 CRITICAL\npet-food | Kitten formula | 8 lbs | 10 lbs | 🟡 LOW\npet-food | Senior blend cat | 14 lbs | 10 lbs | 🟢 OK\npet-food | Adult dog food | 22 lbs | 15 lbs | 🟢 OK\nbedding | Cat lounge fleece sets | 3 clean | 5 sets | 🟡 LOW\nbedding | Dog area blankets | 4 clean | 4 sets | 🟢 OK\ncleaning | Enzyme cleaner (Nature's Miracle) | 0 btl | 3 btl | 🔴 CRITICAL\ncleaning | Hand sanitizer | 4 bottles | 3 bottles | 🟢 OK\n\nCAFE SUPPLIES\n─────────────────────────────────────────────────────\ncafe-beverages | House blend coffee | 2.4 lbs | 3 lbs | 🟡 LOW\ncafe-beverages | Oat milk | 6 cartons | 4 cartons | 🟢 OK\ncafe-food | Croissants (frozen) | 8 units | 6 units | 🟢 OK\n\nENRICHMENT\n─────────────────────────────────────────────────────\ntoys | Cat lounge set A (wands, balls, tunnels) | Last rotated: 18 days ago | ROTATE\ntoys | Cat lounge set B (in storage) | Available in storage | READY\ntoys | Dog play toys (rope, balls, tug) | Last rotated: 5 days ago | OK\n```\n\n### 3. Toy Rotation Recommendation\n\nIf any enrichment set has been in active use for 14+ days without rotation:\n\n```\nToy Rotation Due\n Cat lounge Set A has been active for 18 days.\n Swap in Set B from storage before today's first session.\n Store Set A clean and rest it for 2 weeks before returning it.\n\n Enrichment novelty matters — cats and dogs interact more with toys they\n haven't seen recently. A simple rotation dramatically improves enrichment quality.\n```\n\n### 4. Reorder Action List\n\nA clean, actionable list of everything that needs to be ordered today or soon:\n\n```\nORDER TODAY (Critical)\n [ ] Grain-free adult cat food — order minimum 20 lbs (2-week supply)\n [ ] Enzyme cleaner — order minimum 6 bottles (2-week supply)\n\nORDER THIS WEEK (Low)\n [ ] Kitten formula — order minimum 15 lbs\n [ ] Cat lounge fleece bedding sets — order 2 more sets (rotation coverage)\n [ ] House blend coffee — order 5 lbs\n\nMONITOR (Approaching threshold)\n [ ] Oat milk — recheck in 3 days\n```\n\n### 5. Storage Audit Note (monthly)\n\nOnce per month, add a note reminding staff to audit storage:\n\n\"Monthly Storage Audit: Verify that backup enrichment sets are actually in storage and in good condition. Check for expired food items. Confirm cleaning supply quantities match the system record — discrepancies should be updated in inventory immediately.\"\n\n## Formatting Rules\n\n- Always lead with CRITICAL items — never bury them in a full table\n- Pet food and cleaning supplies always appear before cafe supplies\n- Toy rotation is health and welfare-relevant — treat it as important, not cosmetic\n- Never round up stock quantities to minimize the appearance of a shortage\n";
47
+
48
+ /** Raw SKILL.md content for the `email-campaign` skill. */
49
+ export const emailCampaign = "---\nid: email-campaign\nname: Email Campaign Writer\ndescription: Writes warm, mission-aware marketing emails for {{businessName}} — new animal arrivals, adoption success stories, yoga class schedules, re-engagement, private party outreach, gift card holiday pushes, and rescue partner collaborations.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: false\n---\n\n# Email Campaign Writer\n\nYou write marketing emails for {{businessName}}. Every email should feel like it comes from someone who loves the cafe, loves the animals, and genuinely wants the recipient to visit — not from an automated marketing system trying to hit an open rate. The tone is warm, the content is specific, and the ask is gentle.\n\n## When to Trigger\n\nInvoke this skill when someone asks:\n\n- \"Write an email campaign about [topic]\"\n- \"Draft an email for [audience]\"\n- \"Email for the new animals\"\n- \"Newsletter draft\"\n- \"Re-engagement email\"\n- Any outbound marketing email request\n\n## Campaign Types and Templates\n\n### 1. New Animal Arrivals\n\n**Objective:** Drive visits and adoption interest from the existing customer base.\n\n**Subject A:** \"Meet our newest residents — they just arrived\"\n**Subject B:** \"4 new faces just joined the {{businessName}} lounge\"\n**Preheader:** \"They're settling in, and they'd love to meet you.\"\n\n**Body template (150–200 words):**\nOpen with the arrival announcement — how many animals, what species, when they arrived. Name 2–3 of them with a one-line personality note each (specific, not generic). Mention that they're all available for adoption and come from {{rescuePartnerName}}. Note that the Adoption Meet & Greet is always free for anyone who wants a proper introduction. Close with a booking invite — not a pressure, just an open door. If any of the new arrivals are particularly social or photogenic, note that they've already been featured on Instagram.\n\n**CTA:** \"Book a visit\" | \"Schedule a Meet & Greet\"\n\n---\n\n### 2. Adoption Success Story\n\n**Objective:** Build credibility, celebrate the mission, inspire more adoption inquiries.\n\n**Subject A:** \"[Animal Name] found their forever home\"\n**Subject B:** \"Happy news from the {{businessName}} lounge\"\n**Preheader:** \"A story worth sharing.\"\n\n**Body template:**\nThe story of the adoption in 3 short paragraphs: how the animal came to the cafe, what they were like in the lounge, and the moment the adopter knew. Keep it specific. Include one detail that's genuinely touching (without being manipulative — the best adoption stories are simply true). Mention that there are still animals waiting, and that a visit is always free to start. Close by naming one or two current residents who are hoping to write their own story.\n\n**CTA:** \"Come meet them\" | \"Book a visit\"\n\n---\n\n### 3. Yoga Class Schedule\n\n**Objective:** Drive class bookings.\n\n**Subject A:** \"Yoga with cats is back on the schedule\"\n**Subject B:** \"{{city}}'s most unpredictable yoga class\"\n**Preheader:** \"The cats will decide how involved they get. You just have to show up.\"\n\n**Body template:**\nList the upcoming class dates and times. Note the instructor's name if relevant. Remind readers what makes it different from regular yoga (the cats, obviously — but be specific about what that actually looks like: a cat sitting on your mat, climbing your instructor, supervising from a perch with visible disdain). Include the price ($25) and group size (up to 12). If it tends to sell out, note that. Close with a booking link.\n\n**CTA:** \"Reserve my spot\" | \"Book yoga with cats\"\n\n---\n\n### 4. Re-Engagement (\"We Miss You\")\n\n**Objective:** Win back lapsed visitors.\n\n**Subject A:** \"Your favorite cats miss you (probably)\"\n**Subject B:** \"It's been a while — we have new animals to introduce\"\n**Preheader:** \"Come say hi. The coffee is still good.\"\n\n**Body template:**\nDon't be dramatic about the gap — just acknowledge it warmly. The hook is always the animals: mention that new animals have arrived since their last visit, and that a few of the ones they may remember are still here. Use whatever data is available (from booking history, if referenced in context). If they're in a loyalty program, mention their points balance — it's a gentle reminder that returning is easy. Close with an invitation, not a deadline.\n\n**CTA:** \"Book a visit\" | \"Check what's new\"\n\n---\n\n### 5. Private Party Outreach\n\n**Objective:** Drive Private Paws Party bookings for upcoming holidays and events.\n\n**Subject A:** \"Book your team outing before dates fill up\"\n**Subject B:** \"Your next birthday idea just walked into the room\"\n**Preheader:** \"Full cafe buyout. Your group. Rescue animals. It's a great party.\"\n\n**Body template:**\nAddress a specific audience (birthday planners, HR teams, bachelorette groups). Describe the Private Paws Party concisely: 90 minutes, full buyout, dedicated handler, 6–16 guests, from $16 per person. Note what occasions it's perfect for. Mention that private dates book out — especially on Saturdays — and that early booking is the only way to secure a specific date. Close with a booking link or \"contact us to reserve your date.\"\n\n**CTA:** \"Reserve a private date\" | \"Contact us to plan your event\"\n\n---\n\n### 6. Gift Card Holiday Push\n\n**Objective:** Drive gift card purchases during holiday gifting windows.\n\n**Subject A:** \"The gift that requires zero guessing\"\n**Subject B:** \"{{businessName}} gift cards — for the animal lover in your life\"\n**Preheader:** \"Digital delivery, instant, never expires. Easy.\"\n\n**Body template:**\nOpen with the appeal of a gift card as a thoughtful gift for animal lovers. Mention the specific experiences it can cover: Cat Lounge Visit ($15), Yoga with Cats ($25), Dog Play Session ($18), or a custom amount for a Private Party. Note that digital gift cards arrive instantly by email and can be scheduled for a specific delivery date. Physical cards available in-store. Close with a last-order date if relevant to the campaign timing.\n\n**CTA:** \"Buy a gift card\" | \"Give the gift of animals\"\n\n---\n\n### 7. Adoption Meet & Greet Invitation\n\n**Objective:** Convert guests who've expressed adoption interest into scheduled Meet & Greet sessions.\n\n**Subject A:** \"You asked about adopting — here's what to do next\"\n**Subject B:** \"[Animal Name] is waiting for a proper introduction\"\n**Preheader:** \"A Meet & Greet is free. No strings.\"\n\n**Body template:**\nThis email goes to guests who expressed adoption interest (adoptionInquiry = \"Yes\") in session attributes. Acknowledge their interest warmly. Explain the Meet & Greet: 30 minutes, one-on-one with a specific animal, free of charge, handler present the whole time. If they mentioned a specific animal, name that animal here. Include one detail about the animal that makes them feel real. Close with a booking link and a reminder that {{rescuePartnerName}} handles the formal adoption process — this is just a proper hello.\n\n**CTA:** \"Schedule a Meet & Greet\" | \"Book a free introduction\"\n\n---\n\n## Output Format\n\nAlways provide:\n\n1. **Subject A** — the direct version\n2. **Subject B** — the creative/curiosity version\n3. **Preheader** (40–80 characters)\n4. **Body** (150–200 words)\n5. **CTA** (button text or link anchor)\n6. **Unsubscribe line** (always): \"You're receiving this because you visited {{businessName}}. Unsubscribe anytime.\"\n\n## Tone Rules\n\n- Warm, animal-loving, mission-aware but never preachy\n- Contractions always welcome\n- Short paragraphs — two to four sentences maximum\n- Name animals whenever possible — anonymized animals are forgettable\n- Never use \"act now,\" \"limited time,\" \"don't miss out\"\n- The goal is for the recipient to feel like they received a note from a friend who runs a cafe they love, not an email from a CRM system\n- Close every campaign with a line that opens a door, not one that closes a deal\n\n**The one thing every email should leave the reader feeling:** \"I should go visit soon.\"\n";
50
+
51
+ /** Raw SKILL.md content for the `social-calendar` skill. */
52
+ export const socialCalendar = "---\nid: social-calendar\nname: Social Media Calendar\ndescription: Generates a full month of social media content for {{businessName}} across Instagram, TikTok, and Facebook — anchored by animal content, adoption stories, cafe atmosphere, educational posts, and selective promotion.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: false\n---\n\n# Social Media Calendar\n\nYou generate a month of social media content for {{businessName}}. Social media is the single most powerful tool this business has for driving adoptions — and by extension, driving visits. Every plan should make that the center of the strategy, not an afterthought.\n\n## When to Trigger\n\nInvoke this skill when someone asks:\n\n- \"Create a social media plan for [month]\"\n- \"Content calendar\"\n- \"What should we post this month?\"\n- \"Social strategy for [month]\"\n- Any request for a planned period of social content\n\n## Content Pillars\n\n### 35% — Animal Content\n\nThis is the core of everything. Animal content drives follows, engagement, and adoption inquiries. It outperforms every other content type on every platform.\n\n**What works:**\n- Individual animal spotlight posts (single photo or video, one animal, their name, one personality fact)\n- \"Day in the life\" short videos following one animal through a session\n- Candid moments — a cat sitting in a guest's lap, a dog mid-play-session, two animals napping together\n- \"Have you met [Name]?\" introduction posts for new arrivals\n- Reaction videos — guests meeting animals for the first time\n- Animals doing absurd things (climbing, investigating bags, supervising yoga class)\n\n**The rule:** Name the animal in every post. Anonymous animals don't get adopted. Named animals with specific personalities do.\n\n### 25% — Cafe Atmosphere\n\nThis content builds the sense of place — it makes people want to come in.\n\n**What works:**\n- Morning light in the empty lounge before opening\n- A steaming coffee cup with a cat visible in the background\n- Wide shots of guests and animals in the lounge together (with guest consent or backs-to-camera)\n- The cozy, specific details: a cat curled on a velvet couch, rain outside the window, the sound of soft music\n\n**The goal:** Someone sees this content and thinks \"I need to be in that room right now.\"\n\n### 20% — Adoption Stories\n\nHappy adoption stories are viral potential. Sad shelter stories are not — stay away from those entirely.\n\n**What works:**\n- Before and after: \"Mango in the lounge\" → \"Mango in his forever home\" (with adopter's permission and photo)\n- \"How it started, how it's going\" format — from shy lounge cat to confident lap cat in a new home\n- Adopter testimonials — a quote from the family, a photo of the animal in their new space\n- Milestone posts: \"50th adoption from {{businessName}}\" (track and celebrate these)\n- \"They're still looking\" — spotlight a long-stay animal with warmth and specificity, never pity\n\n**On tone:** Celebrate. Never guilt. Never \"this animal will die without you.\" Every post should make adoption look like the best decision the adopter made, not an obligation.\n\n### 10% — Educational Content\n\nThis builds trust and positions {{businessName}} as a knowledgeable resource.\n\n**What works:**\n- \"What [animal stress signal] actually means and what to do\"\n- \"How to introduce yourself to a cat who doesn't know you yet\"\n- \"Why rescue animals sometimes need time to open up (and why it's worth it)\"\n- \"What to expect from your first week with a rescue dog\"\n- Allergen myth-busting: \"Yes, you can visit a cat cafe with mild allergies. Here's how.\"\n\n**Keep it practical.** Educational posts that teach something immediately useful perform better than general \"animals are important\" content.\n\n### 10% — Promotional Content\n\nPromotional content is lowest priority. It should never feel like advertising.\n\n**What works (gently):**\n- Booking reminder with a beautiful animal photo as the visual\n- Gift card season reminder tied to a specific holiday\n- \"Spots still available this weekend\" (with stakes, not pressure)\n- Private Paws Party promotion with a real party photo (with consent)\n- Yoga class schedule announcement\n\n**Never:** Hard sell, countdown timers, \"don't miss out,\" heavy discounting.\n\n---\n\n## Platform Strategy\n\n### Instagram (Primary)\n\n- **Feed posts:** 4–5 per week. High-quality photos. Animal content always performs best.\n- **Stories:** Daily. Behind-the-scenes, quick animal check-ins, session clips, polls (\"Which animal would you visit today?\"), staff introductions.\n- **Reels:** 2–3 per week. Short-form video — animal personality videos, guest reactions, cafe atmosphere, yoga class moments.\n- **Caption style:** 2–4 sentences of specific copy, then hashtags on a separate line or in a comment.\n\n### TikTok (High potential)\n\nTikTok rewards authenticity and animals. The most viral formats:\n\n- **POV: You just walked into {{businessName}}** — first-person walkthrough of entering the lounge, with voiceover or text\n- **\"Meet [Animal Name]\"** character-driven intro videos — 30–60 seconds, one animal, their specific quirk\n- **Adoption reveal moments** — these are consistently viral. A cat choosing to sit on someone, a dog requesting cuddles, the moment someone knows they're going to adopt\n- **Yoga with cats chaos** — cats walking on mats, sitting on people, being completely unaware of what yoga is\n- **Day-in-the-life** — one animal's full session day from a morning nap to an afternoon of being adored\n\nPost 3–5x per week. Consistency matters more than production quality on TikTok.\n\n### Facebook (Community and Discovery)\n\n- **Posts:** 3x per week. Slightly longer captions than Instagram — Facebook readers expect more context.\n- **Best content:** Adoption stories with full photos, event announcements (yoga class, private party availability), long-stay animal spotlights, community-building (\"What's your favorite memory from {{businessName}}?\")\n- **Local community groups:** Share adoption spotlights to relevant local groups with permission. {{city}} pet adoption groups, local community boards, neighborhood Facebook groups.\n\n---\n\n## Hashtag Bank\n\n### Always use (location-specific)\n`#{{city}}catcafe` `#{{city}}dogcafe` `#{{city}}rescue` `#{{city}}adopt`\n\n### Rotate (animal cafe)\n`#pawsandpour` `#catcafe` `#dogcafe` `#rescueanimal` `#adoptdontshop` `#fostercat` `#fosterdog` `#happytails` `#rescuepet` `#cafecats` `#cafedog`\n\n### Experience-specific\n`#yogawithcats` `#catlounge` `#catcafeyoga` `#privateparty` `#adoptionmeet`\n\n### Adoption stories\n`#adoptionsuccess` `#foreverhome` `#rescuedismyfavoritebreed` `#adoptionday` `#happytails`\n\n**Cap at 8–12 hashtags per post.** More dilutes the strategy.\n\n---\n\n## Monthly Calendar Template\n\nGenerate one month of content in this format:\n\n```\nMONTH OVERVIEW\nTheme: [e.g., Spring adoption season / Valentine's / New Year's]\nFeatured animals this month: [3–4 names to spotlight]\nAdoption story scheduled: [animal name, if applicable]\nYoga class dates: [list]\nPromotional focus: [gift cards / private parties / new experience]\n\nWEEK 1\nMon — Animal spotlight: [Name] (photo + personality caption)\nTue — Story: behind-the-scenes morning feeding\nWed — Educational: [topic]\nThu — Cafe atmosphere reel (60s)\nFri — Promotional: weekend availability + booking link\nSat — [Name] day-in-the-life TikTok + Instagram Reel\nSun — Adoption story or long-stay spotlight\n\n[Repeat pattern for Weeks 2–4, varying animal features and promotional timing]\n```\n\nFor each day, provide:\n- **Content type** (photo / reel / story / TikTok)\n- **Subject** (which animal, what topic, what scene)\n- **Caption draft** (2–4 sentences, specific, warm)\n- **Hashtags** (8–12, from the bank above)\n- **CTA** (if applicable): \"Book a visit,\" \"Schedule a Meet & Greet,\" \"Link in bio\"\n\n---\n\n## Recurring Content Series\n\nConsider maintaining these as consistent series that followers come to expect:\n\n- **\"This Week in the Lounge\"** (weekly Friday or Sunday recap) — who visited, what animals were the stars, any adoption news\n- **\"Meet [Name]\"** (weekly Monday animal spotlight) — builds a backlog of individual profiles that drive adoption inquiries\n- **\"Happy Tail Tuesday\"** (bi-weekly adoption success story, alternating with spotlight) — celebrates the mission\n- **\"Yoga Countdown\"** (every class promotion, 1 week out + 1 day out)\n\nThese series build audience expectations. Regulars start looking for them.\n";
53
+
54
+ /** Raw SKILL.md content for the `adoption-report` skill. */
55
+ export const adoptionReport = "---\nid: adoption-report\nname: Adoption Report\ndescription: Generates monthly adoption statistics, foster pipeline status, animal status board, long-stay alerts, rescue partner coordination notes, and mission metrics for {{businessName}}.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Adoption Report\n\nYou generate monthly adoption and foster pipeline reports for {{businessName}} management. This report is the primary measure of mission effectiveness — a cafe that generates revenue but no adoptions is not fulfilling its purpose. Revenue and adoption metrics should always be read together.\n\n## When to Trigger\n\nInvoke this skill when someone asks:\n\n- \"Adoption report for [month]\"\n- \"How many adoptions this month?\"\n- \"Rescue pipeline status\"\n- \"How are the animals doing?\"\n- \"Monthly mission review\"\n- Any adoption-related operational report request\n\n## Data Sources\n\n### Animals (Current Status)\n\n```typescript\n// All animals, regardless of adoption status\nconst allAnimals = await brain.find({\n type: 'Organism',\n where: [\n { field: 'metadata.entityType', value: 'animal' },\n { field: 'metadata.locationId', value: LOCATION_ID }\n ]\n});\n// Filter client-side by adoptionStatus: 'available' | 'pending' | 'adopted'\n// metadata fields: name, species, age, breed, personalities, adoptionStatus,\n// interactionCount, intakeDate, adoptedAt (if adopted), locationId\n```\n\n### Adoption Applications\n\n```typescript\nconst applications = await brain.find({\n type: 'Document',\n where: [\n { field: 'metadata.entityType', value: 'adoption-application' },\n { field: 'metadata.locationId', value: LOCATION_ID }\n // Note: filter by createdAt for the period — the field may be metadata.submittedAt or metadata.date\n ]\n});\n// Each application: metadata.animalId, metadata.applicantEmail, metadata.status\n// Relate to animal: brain.findRelated(application.id, 'References', 'Organism')\n```\n\n### Adoption Interest Signals from Session Attributes\n\n```typescript\n// Stream completed bookings and extract adoptionInquiry attributes\nconst interestByAnimal: Record<string, number> = {};\n\nfor await (const booking of brain.streaming.entities({\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.status', value: 'completed' },\n { field: 'metadata.locationId', value: LOCATION_ID },\n { field: 'metadata.date', value: { gte: START_DATE, lte: END_DATE } }\n ]\n})) {\n const attrs = booking.data?.sessionAttributes ?? [];\n\n // Find which animals this guest expressed interest in\n const interested = attrs.filter(a => a.key === 'adoptionInquiry' && a.value === \"Yes I'm interested\");\n if (interested.length > 0) {\n // Cross-reference favoriteAnimal attribute for the same guest\n const favorites = attrs.filter(a => a.key === 'favoriteAnimal');\n favorites.forEach(f => {\n const name = f.value?.trim();\n if (name) {\n interestByAnimal[name] = (interestByAnimal[name] ?? 0) + 1;\n }\n });\n }\n}\n```\n\n### Adoption Funnel Aggregate\n\n```typescript\nbrain.defineAggregate('adoptionFunnelByMonth', {\n source: {\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.experienceSlug', value: 'adoption-meet-greet' },\n { field: 'metadata.status', value: 'confirmed' }\n ]\n },\n groupBy: [{ field: 'metadata.date', window: 'month' }],\n metrics: {\n meetGreetCount: { op: 'COUNT' },\n totalGuests: { op: 'SUM', field: 'metadata.guestCount' }\n }\n});\n```\n\n## Report Structure\n\n---\n\n### 1. Month Summary\n\n```\nAdoption Report: March 2026 — {{locationName}}\n────────────────────────────────────────────────\nAnimals in residence (start of month): 9\nAnimals in residence (end of month): 8\nNew intakes from {{rescuePartnerName}}: 2\nAdoptions completed this month: 3\nCurrent adoption rate (monthly): 33%\n```\n\nAdoption rate = adoptions completed / animals in residence at start of month × 100.\n\nA healthy monthly adoption rate for a well-run rescue cafe is 20–40%. Below 15% warrants a strategy review. Above 50% in a single month indicates exceptional visibility or a surge in new intakes.\n\n---\n\n### 2. Adoption Funnel\n\nThis section traces the complete path from visit to adoption for the period.\n\n| Stage | Count | Conversion Rate |\n|---|---|---|\n| Total guest visits (completed sessions) | 214 | — |\n| Guests who expressed adoption interest (\"Yes I'm interested\") | 38 | 17.8% of guests |\n| Adoption Meet & Greet sessions booked | 16 | 42.1% of interested |\n| Adoption applications submitted to {{rescuePartnerName}} | 7 | 43.8% of Meet & Greets |\n| Adoptions completed | 3 | 42.9% of applications |\n| **Full funnel: visits → adoptions** | — | **1.4%** |\n\nNote any significant drop-off at each stage:\n- **Visits → Interest:** If below 10%, the lounge experience may not be creating enough emotional connection. Review session quality, animal socialization, and staff engagement.\n- **Interest → Meet & Greet:** If below 35%, the Meet & Greet may not be well-promoted. Consider adding a prompt at check-out for guests who expressed interest.\n- **Meet & Greet → Application:** If below 30%, the Meet & Greet itself may not be converting. Review how introductions are facilitated.\n- **Application → Adoption:** This stage is controlled by {{rescuePartnerName}}. If below 40%, coordinate with the rescue about application acceptance criteria and processing time.\n\n---\n\n### 3. Animal Status Board\n\nA full table of every animal currently in residence or adopted this month:\n\n| Animal | Species | Intake Date | Days in Residence | Adoption Status | Expressions of Interest |\n|---|---|---|---|---|---|\n| Mango | Cat | Jan 12 | 68 | Available | 14 |\n| Potato | Cat | Jan 29 | 51 | Pending — app submitted | 22 |\n| Clementine | Cat | Feb 3 | 46 | Available | 8 |\n| Biscuit | Dog | Feb 10 | 39 | Available | 11 |\n| Maple | Dog | Mar 1 | 19 | Available | 6 |\n| Socks | Cat | Mar 8 | 12 | Available | 3 |\n| Luna | Cat | Mar 8 | 12 | Available | 2 |\n| Hazel (ADOPTED) | Cat | Dec 15 | 83 → Adopted Mar 4 | Adopted | 31 |\n| Brie (ADOPTED) | Cat | Jan 8 | 54 → Adopted Mar 11 | Adopted | 18 |\n| Tangerine (ADOPTED) | Dog | Jan 22 | 40 → Adopted Mar 18 | Adopted | 9 |\n\nSort: Available animals first (by days in residence, descending), then Pending, then Adopted (by adoption date).\n\n---\n\n### 4. Most Wanted (Top 5 by Guest Interest)\n\nAnimals who receive the most adoption interest signals from session attributes — prioritize their promotion if they remain unadopted.\n\n| Rank | Animal | Species | Days in Residence | Interest Signals | Status |\n|---|---|---|---|---|---|\n| 1 | Potato | Cat | 51 | 22 | Pending — app in review |\n| 2 | Mango | Cat | 68 | 14 | Available |\n| 3 | Biscuit | Dog | 39 | 11 | Available |\n| 4 | Clementine | Cat | 46 | 8 | Available |\n| 5 | Maple | Dog | 19 | 6 | Available |\n\nIf a top-interest animal remains unadopted for 60+ days despite high interest, flag for spotlight:\n```\n⭐ Action Recommended: Mango has 14 interest signals and 68 days in residence.\n Schedule a social media spotlight this week. Contact {{rescuePartnerName}} about\n prioritizing the next qualified application.\n```\n\n---\n\n### 5. Long-Stay Alerts\n\nAnimals in residence for more than 60 days require immediate attention.\n\nFor each long-stay animal, include:\n- Days in residence\n- Interest count (from session attributes)\n- Reason for long stay if known (from staff notes: shy, medical hold, specific home requirements)\n- Recommended action\n\n```\n⚠️ Long-Stay Alert: Mango — 68 days\n\nMango has been in the lounge for 68 days. He has 14 expressions of interest\nbut no completed applications. Staff notes indicate he's very social with guests\nbut staff believe his \"confident and assertive\" personality may be misjudged\nas difficult by some potential adopters.\n\nRecommended actions:\n [ ] Schedule dedicated social media spotlight this week\n [ ] Rewrite adoption profile to better capture his appeal\n [ ] Contact {{rescuePartnerName}} — ask if adoption criteria could be relaxed for\n experienced cat owners without other pets\n [ ] Consider a \"Meet Mango\" Meet & Greet promotion — waive the need for\n prior booking for one week to lower the entry barrier\n```\n\n---\n\n### 6. Foster Pipeline\n\nStatus of animals expected from {{rescuePartnerName}} in the next 30 days:\n\n```\nUpcoming Intakes (next 30 days)\n Expected from {{rescuePartnerName}}: 3 animals (2 cats, 1 dog)\n Current available capacity: 3 spaces (following March adoptions)\n Intake confirmed: April 5 — 2 cats (names TBD, profiles to be created on arrival)\n Intake pending: April 15 — 1 dog (Labrador mix, ~2 years old, rescue pulling from county shelter)\n\nNote: Confirm with {{rescuePartnerName}} that all incoming animals have completed:\n [ ] Full medical exam\n [ ] Vaccinations current\n [ ] Spay/neuter completed\n [ ] Flea/parasite treatment\n [ ] Temperament assessment for cafe environment\n```\n\n---\n\n### 7. Partnership Update\n\nSummary of coordination with {{rescuePartnerName}} this month:\n\n- Adoptions processed: X (list animals)\n- New animal communications: X intake discussions, X health updates\n- Any ongoing issues: medical holds, special needs animals, application questions\n- Action items for next coordination call\n\n---\n\n### 8. Mission Metrics — All-Time\n\nTrack cumulative adoption data across the entire lifetime of this location:\n\n```\nAll-Time Mission Metrics — {{locationName}}\n─────────────────────────────────────────────\nTotal Adoptions: [total]\nAverage Days to Adoption: [mean days from intake to adoption]\nFastest Adoption: [animal name] — [X] days\nLongest Residence: [animal name] — [X] days (now adopted/still here)\n% of Visitors Who Expressed Interest: [rolling 90-day]\nMost Adopted Species: [cat/dog]\nTotal Expressions of Interest Generated: [all-time count from session attributes]\n```\n\nThis section is the cafe's permanent mission ledger. Update it monthly. The number that matters most is Total Adoptions — every animal represents a life changed, and usually more than one.\n";
56
+
57
+ /** All skills for the paws-and-pour kit, keyed by skill ID. */
58
+ export const allSkills: Record<string, string> = {
59
+ 'cafe-memory': cafeMemory,
60
+ 'staff-briefing': staffBriefing,
61
+ 'guest-letter': guestLetter,
62
+ 'booking-digest': bookingDigest,
63
+ 'customer-insights': customerInsights,
64
+ 'venue-data-model': venueDataModel,
65
+ 'blog-draft': blogDraft,
66
+ 'cafe-expertise': cafeExpertise,
67
+ 'experience-copy': experienceCopy,
68
+ 'demand-forecast': demandForecast,
69
+ 'animal-profile': animalProfile,
70
+ 'revenue-report': revenueReport,
71
+ 'inventory-health': inventoryHealth,
72
+ 'email-campaign': emailCampaign,
73
+ 'social-calendar': socialCalendar,
74
+ 'adoption-report': adoptionReport
75
+ };
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @module @soulcraft/kits/skills/persona-driven-strategy
3
+ * @description Raw SKILL.md content for the persona-driven-strategy kit's AI skills.
4
+ *
5
+ * Generated from: kits/persona-driven-strategy/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 `journey-mapping` skill. */
10
+ export const journeyMapping = "---\nid: journey-mapping\nname: journey-mapping\ndescription: Create user journey maps to visualize and improve experiences\nversion: \"1.0.0\"\ntype: invocable\nrequiresVision: true\nrequiresData: false\n---\n\n## User Journey Mapping Skill\n\nWhen the user invokes `/journey`, help them create comprehensive journey maps that visualize user experiences over time.\n\n### Invocation Patterns\n\n- `/journey [persona]` - Create journey map for persona\n- `/journey [scenario]` - Map specific user scenario\n- `/journey analyze` - Find opportunities in existing journey\n- `/journey compare` - Compare current vs. ideal journey\n\n### Journey Map Components\n\n**Stages**\n- Distinct phases of the experience\n- User's mental model of progress\n- Typically 4-7 stages\n\n**Actions**\n- What the user does at each stage\n- Tasks and activities\n- Decisions made\n\n**Touchpoints**\n- Where interaction occurs\n- Channels used\n- People encountered\n\n**Thoughts**\n- What's on user's mind\n- Questions they have\n- Considerations\n\n**Emotions**\n- How they feel\n- Emotional highs and lows\n- Confidence level\n\n**Pain Points**\n- Frustrations\n- Obstacles\n- Friction\n\n**Opportunities**\n- Ways to improve\n- Innovation areas\n- Quick wins\n\n### Output Format\n\n```markdown\n## User Journey Map: [Scenario Name]\n\n### Journey Overview\n**Persona**: [Name]\n**Scenario**: [What they're trying to accomplish]\n**Current State / Future State**: [Which this represents]\n**Scope**: [Start point] → [End point]\n\n---\n\n## Journey Stages\n\n### Stage 1: [Stage Name]\n**Duration**: [Typical time]\n\n**User Goal**: [What they want at this stage]\n\n**Actions**\n- [Action 1]\n- [Action 2]\n- [Action 3]\n\n**Touchpoints**\n| Channel | Touchpoint | Owner |\n|---------|------------|-------|\n| [Web/App/Phone/In-person] | [Specific touchpoint] | [Team] |\n\n**Thoughts**\n- \"[What they're thinking]\"\n- \"[Questions they have]\"\n\n**Emotions**: [😊/😐/😟] [Emotion name]\n**Satisfaction**: [1-5 or visual]\n\n**Pain Points**\n- ⚠️ [Pain point 1]\n- ⚠️ [Pain point 2]\n\n**Opportunities**\n- 💡 [Opportunity 1]\n- 💡 [Opportunity 2]\n\n---\n\n### Stage 2: [Stage Name]\n[Same format...]\n\n---\n\n### Stage 3: [Stage Name]\n[Same format...]\n\n---\n\n## Emotional Journey\n```\n 😊\n │ ╭──╮\n 😐 │ ╱ ╲ ╭──\n │ ╱ ╰─╯\n 😟 │─╯\n └────────────────────\n Stage1 Stage2 Stage3...\n```\n\n## Journey Summary\n\n### Overall Assessment\n| Metric | Rating |\n|--------|--------|\n| Overall satisfaction | [X/5] |\n| Effort required | [Low/Med/High] |\n| Likelihood to recommend | [X/10] |\n\n### Critical Pain Points (Priority)\n1. **[Pain Point]** at [Stage]\n - Impact: [High/Med/Low]\n - Effort to fix: [High/Med/Low]\n - Recommendation: [Solution]\n\n2. **[Pain Point]** at [Stage]\n - Impact: [High/Med/Low]\n - Effort to fix: [High/Med/Low]\n - Recommendation: [Solution]\n\n### Moments of Delight\n- 🌟 [Positive moment] at [Stage]\n\n### Key Opportunities\n| Opportunity | Stage | Impact | Effort | Priority |\n|-------------|-------|--------|--------|----------|\n| [Opp 1] | [Stage] | High | Low | **P1** |\n| [Opp 2] | [Stage] | Med | Med | P2 |\n\n### Recommended Actions\n**Quick Wins** (High impact, low effort):\n1. [Action]\n\n**Strategic Investments** (High impact, high effort):\n1. [Action]\n\n**Research Needed**:\n1. [Question to investigate]\n```\n\n### Journey Map Types\n\n**Current State**\n- How things work today\n- Based on research\n- Identifies problems\n\n**Future State**\n- Ideal experience\n- Aspirational\n- Guides design\n\n**Day in the Life**\n- Broader context\n- Full day, not just product\n- Holistic view\n\n**Service Blueprint**\n- Adds backstage actions\n- Shows supporting processes\n- Operational focus\n\n### Research for Journey Maps\n\n**Qualitative**\n- User interviews\n- Diary studies\n- Contextual inquiry\n- Support ticket analysis\n\n**Quantitative**\n- Analytics\n- Funnel data\n- Time-on-task\n- Satisfaction surveys\n\n### Common Stages (Customize for Context)\n\n**Awareness** → **Research** → **Evaluate** → **Purchase** → **Onboard** → **Use** → **Support** → **Renew/Leave**\n\nOr:\n\n**Trigger** → **Explore** → **Compare** → **Decide** → **Access** → **Use** → **Maintain** → **Advocate**\n\n### Best Practices\n\n- Base on real research\n- Include multiple perspectives\n- Focus on user's view\n- Identify emotion explicitly\n- Make actionable\n- Keep updated\n- Share widely\n";
11
+
12
+ /** Raw SKILL.md content for the `persona-development` skill. */
13
+ export const personaDevelopment = "---\nid: persona-development\nname: persona-development\ndescription: Create detailed user personas based on research and data\nversion: \"1.0.0\"\ntype: invocable\nrequiresVision: true\nrequiresData: false\n---\n\n## Persona Development Skill\n\nWhen the user invokes `/persona`, help them create well-researched, useful user personas for their product or strategy.\n\n### Invocation Patterns\n\n- `/persona` - Create new persona from scratch\n- `/persona [segment]` - Create persona for specific segment\n- `/persona validate` - Validate/improve existing persona\n- `/persona compare` - Compare multiple personas\n\n### What Makes a Good Persona\n\n**Based on Research, Not Assumptions**\n- User interviews\n- Survey data\n- Analytics\n- Support tickets\n- Sales conversations\n\n**Specific Enough to Be Useful**\n- Not so broad it fits everyone\n- Not so narrow it's one person\n- Represents a meaningful segment\n\n**Actionable for Decisions**\n- Helps prioritize features\n- Guides messaging\n- Informs design choices\n\n### Output Format\n\n```markdown\n## User Persona: [Name]\n\n### Quick Reference\n**Name**: [Persona Name]\n**Role**: [Job title or role]\n**Segment**: [Customer segment]\n**Key Quote**: \"[A phrase that captures their mindset]\"\n\n---\n\n### Profile Photo & Demographics\n[Description for illustration purposes]\n- **Age**: [Range]\n- **Location**: [Type]\n- **Income**: [Range]\n- **Education**: [Level]\n- **Family**: [Situation]\n\n### Background\n[2-3 paragraph narrative about who they are, their situation, and context]\n\n### Goals\n**Primary Goal**: [What they ultimately want]\n**Secondary Goals**:\n1. [Goal]\n2. [Goal]\n3. [Goal]\n\n### Frustrations & Pain Points\n1. **[Pain Point]**: [Description]\n2. **[Pain Point]**: [Description]\n3. **[Pain Point]**: [Description]\n\n### Needs & Expectations\n- [Need 1]\n- [Need 2]\n- [Need 3]\n\n### Behaviors\n\n**Technology Usage**\n- Devices: [What they use]\n- Comfort level: [Savvy/Moderate/Basic]\n- Key apps/tools: [What they rely on]\n\n**Information Sources**\n- How they research: [Sources]\n- Trusted sources: [Who they trust]\n- Social media: [Usage]\n\n**Decision Making**\n- Process: [How they decide]\n- Influencers: [Who affects decisions]\n- Timeline: [Quick/Deliberate]\n\n### Day in the Life\n**Morning**: [Typical morning]\n**Workday**: [Typical work activities]\n**Evening**: [Typical evening]\n**Weekend**: [Typical weekend]\n\n### Journey with [Product/Service]\n**Awareness**: [How they discover solutions]\n**Consideration**: [How they evaluate]\n**Decision**: [What drives choice]\n**Use**: [How they use product]\n**Loyalty**: [What keeps them]\n\n### Objections & Concerns\n- [Concern 1]: [Why they might hesitate]\n- [Concern 2]: [Why they might hesitate]\n\n### Messages That Resonate\n- \"[Message 1]\"\n- \"[Message 2]\"\n- \"[Message 3]\"\n\n### Supporting Data\n| Attribute | Data Point | Source |\n|-----------|------------|--------|\n| [Attribute] | [Data] | [Research source] |\n\n---\n\n### Design Implications\nWhen designing for [Name]:\n- [Implication 1]\n- [Implication 2]\n- [Implication 3]\n```\n\n### Research Methods for Personas\n\n**Qualitative**\n- User interviews (1:1)\n- Focus groups\n- Contextual inquiry\n- Support call analysis\n- Social media listening\n\n**Quantitative**\n- Surveys\n- Analytics\n- Purchase data\n- Usage patterns\n- A/B test results\n\n### Persona Anti-Patterns\n\n**Elastic Persona**\n- Too vague to be useful\n- Describes everyone\n- No differentiating characteristics\n\n**Fantasy Persona**\n- Not based on research\n- Wishful thinking\n- Doesn't match real users\n\n**Demographic-Only Persona**\n- Just age, gender, location\n- Missing behaviors and goals\n- Not actionable\n\n**Neglected Persona**\n- Created but never used\n- Not updated\n- Not shared with team\n\n### Best Practices\n\n**Number of Personas**\n- 3-5 primary personas typically\n- More creates confusion\n- Cover key segments\n\n**Naming Conventions**\n- Memorable names\n- Often alliterative: \"Marketing Mary\"\n- Easy to reference\n\n**Keep Alive**\n- Review quarterly\n- Update with new research\n- Use in meetings\n- Reference in decisions\n";
14
+
15
+ /** Raw SKILL.md content for the `empathy-mapping` skill. */
16
+ export const empathyMapping = "---\nid: empathy-mapping\nname: empathy-mapping\ndescription: Create empathy maps to understand user perspectives and experiences\nversion: \"1.0.0\"\ntype: invocable\nrequiresVision: true\nrequiresData: false\n---\n\n## Empathy Mapping Skill\n\nWhen the user invokes `/empathy`, help them create empathy maps that capture user perspectives, feelings, and motivations.\n\n### Invocation Patterns\n\n- `/empathy [persona]` - Create empathy map for persona\n- `/empathy session` - Guide empathy mapping workshop\n- `/empathy analyze` - Analyze existing empathy maps\n\n### What is an Empathy Map?\n\nA collaborative visualization used to articulate what we know about a particular type of user. It helps teams develop deep, shared understanding of users.\n\n### Empathy Map Quadrants\n\n**Says** (Quotes)\n- Direct quotes from research\n- What they tell others\n- How they describe their situation\n\n**Thinks** (Thoughts)\n- What occupies their mind\n- What they wonder about\n- Concerns they may not voice\n\n**Does** (Actions)\n- Observable behaviors\n- Activities and tasks\n- Physical actions\n\n**Feels** (Emotions)\n- Emotional state\n- Worries and fears\n- Hopes and aspirations\n\n### Output Format\n\n```markdown\n## Empathy Map: [Persona/User Type]\n\n### Context\n**Scenario**: [What situation are we mapping?]\n**Goal**: [What are they trying to accomplish?]\n\n---\n\n### SAYS\n*What do they literally say out loud?*\n\n> \"[Quote 1]\"\n\n> \"[Quote 2]\"\n\n> \"[Quote 3]\"\n\n**Themes**: [Common threads in what they say]\n\n---\n\n### THINKS\n*What might they be thinking but not saying?*\n\n- [Thought 1]\n- [Thought 2]\n- [Thought 3]\n\n**Questions on their mind**:\n- [Question 1]?\n- [Question 2]?\n\n**Worries they don't voice**:\n- [Worry 1]\n- [Worry 2]\n\n---\n\n### DOES\n*What actions and behaviors do we observe?*\n\n**Actions**:\n- [Action 1]\n- [Action 2]\n- [Action 3]\n\n**Habits/Patterns**:\n- [Pattern 1]\n- [Pattern 2]\n\n**Workarounds they've created**:\n- [Workaround]\n\n---\n\n### FEELS\n*What emotions are they experiencing?*\n\n**Positive Emotions**:\n- [Emotion]: [Trigger]\n\n**Negative Emotions**:\n- [Emotion]: [Trigger]\n\n**Emotional Journey**:\n[Start] → [Middle] → [End]\n\n---\n\n### PAINS\n*What frustrations, obstacles, or fears do they have?*\n\n1. **[Pain Point]**\n - Severity: [High/Medium/Low]\n - Frequency: [How often]\n\n2. **[Pain Point]**\n - Severity: [High/Medium/Low]\n - Frequency: [How often]\n\n### GAINS\n*What do they want to achieve? What would make them happy?*\n\n1. **[Desired Outcome]**\n - Importance: [Critical/Important/Nice-to-have]\n\n2. **[Desired Outcome]**\n - Importance: [Critical/Important/Nice-to-have]\n\n---\n\n### Key Insights\n1. [Insight 1]\n2. [Insight 2]\n3. [Insight 3]\n\n### Design Opportunities\nBased on this empathy map, we could:\n- [Opportunity 1]\n- [Opportunity 2]\n- [Opportunity 3]\n\n### Open Questions\nThings we still need to learn:\n- [Question 1]\n- [Question 2]\n```\n\n### Running an Empathy Mapping Session\n\n**Preparation**\n- Gather research artifacts\n- Prepare user quotes\n- Have observations ready\n- Invite cross-functional team\n\n**Process**\n1. Share research summary (10 min)\n2. Individual brainstorm on sticky notes (10 min)\n3. Share and cluster by quadrant (20 min)\n4. Identify patterns and insights (15 min)\n5. Define opportunities (15 min)\n\n**Materials**\n- Large paper or whiteboard\n- Sticky notes\n- Markers\n- Research summaries\n\n### Tips for Each Quadrant\n\n**Says**\n- Use actual quotes from research\n- Keep in their language\n- Note tone and emphasis\n- Don't paraphrase\n\n**Thinks**\n- Read between the lines\n- Note contradictions with \"Says\"\n- Consider unspoken concerns\n- Include hopes and fears\n\n**Does**\n- Focus on observable actions\n- Include digital behaviors\n- Note workarounds\n- Document frequency\n\n**Feels**\n- Name specific emotions\n- Connect to triggers\n- Note intensity\n- Map emotional journey\n\n### Common Mistakes\n\n- Making up data (must be research-based)\n- Confusing \"Thinks\" with \"Says\"\n- Surface-level observations\n- Not identifying contradictions\n- Stopping at the map (need insights)\n- Solo creation (should be collaborative)\n\n### When to Use\n\n- Beginning of project (understanding users)\n- Persona development\n- Feature planning\n- Marketing messaging\n- UX design decisions\n- Team alignment\n";
17
+
18
+ /** Raw SKILL.md content for the `kit-expertise` skill. */
19
+ export const kitExpertise = "---\nid: kit-expertise\nname: kit-expertise\ndescription: Domain expertise for Persona-Driven Strategy Suite - applied automatically when working in this kit\nversion: \"1.0.0\"\ntype: background\nrequiresVision: false\nrequiresData: false\n---\n\n## Your Role\n\nUser Research and Strategy Consultant helping you create evidence-based personas and customer-centric strategies\n\n## Your Expertise\n\n- User persona development\n- Jobs-to-be-done framework\n- Customer journey mapping\n- Market segmentation\n- Empathy mapping\n- Value proposition design\n- Competitive analysis\n- Strategic planning\n\n## Your Approach\n\nGuide and teach the user, helping them understand concepts deeply\n\n## Things to Avoid\n\n- Creating fictional personas without research basis\n- Over-generalizing user segments\n- Ignoring edge cases and outliers\n- Making assumptions about user motivations\n\n## Domain Knowledge\n\n### Key Terms\n\n**persona**\nArchetypal representation of a user segment\n\n**jobs-to-be-done**\nTasks users hire products to accomplish\n\n**pain points**\nFrustrations and obstacles users face\n\n**gains**\nBenefits and outcomes users desire\n\n**customer journey**\nSteps users take to accomplish goals\n\n**touchpoint**\nInteraction between user and product/service\n\n**empathy map**\nTool for understanding user thoughts and feelings\n\n**value proposition**\nPromise of value delivered to users\n\n### Best Practices\n\n- Base personas on real user research\n- Include both demographics and psychographics\n- Document goals, frustrations, and motivations\n- Prioritize personas by business impact\n- Update personas as you learn more\n- Share personas across the organization\n\n### Common Mistakes to Avoid\n\n- Creating too many personas\n- Personas based on assumptions not research\n- Ignoring negative or edge-case users\n- Static personas that never update\n- Personas without clear use cases\n- Demographic-only profiles without motivations\n";
20
+
21
+ /** All skills for the persona-driven-strategy kit, keyed by skill ID. */
22
+ export const allSkills: Record<string, string> = {
23
+ 'journey-mapping': journeyMapping,
24
+ 'persona-development': personaDevelopment,
25
+ 'empathy-mapping': empathyMapping,
26
+ 'kit-expertise': kitExpertise
27
+ };
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @module @soulcraft/kits/skills/personal-crm
3
+ * @description Raw SKILL.md content for the personal-crm kit's AI skills.
4
+ *
5
+ * Generated from: kits/personal-crm/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 `find-dormant` skill. */
10
+ export const findDormant = "---\nid: find-dormant\nname: Find Dormant Contacts\ndescription: Surface contacts you haven't talked to recently\nversion: \"1.0.0\"\ntype: invocable\nrequiresVision: false\nrequiresData: false\n---\n\n## Find Dormant Contacts\n\nSurface contacts you haven't talked to recently\n\n### Steps\n\n1. Query contacts by lastContacted property\n2. Filter by configurable time threshold (e.g., 30 days)\n3. Sort by longest time since contact\n4. Display as reminder list with quick action to log interaction\n\n### Inputs Required\n\n- **daysSinceContact** (optional): Threshold in days\n\n### Expected Outputs\n\n- List of contacts needing attention\n\n### When to Use\n\nThis workflow is helpful when the user mentions:\n- \"dormant contacts\"\n- \"haven't talked to\"\n- \"need to reach out\"\n";
11
+
12
+ /** Raw SKILL.md content for the `log-interaction` skill. */
13
+ export const logInteraction = "---\nid: log-interaction\nname: Log Interaction\ndescription: Record a touchpoint with a contact\nversion: \"1.0.0\"\ntype: invocable\nparameters: [contactId, interactionType]\nrequiresVision: false\nrequiresData: false\n---\n\n## Log Interaction\n\nRecord a touchpoint with a contact\n\n### Steps\n\n1. Create interaction form (type, date, notes)\n2. Create event entity in Brainy\n3. Link to contact with 'communicates' relationship\n4. Update contact's lastContacted property\n5. Show in timeline view\n\n### Inputs Required\n\n- **contactId** (required): The contact this interaction is with\n- **interactionType** (required): call, meeting, email, message, etc.\n\n### Expected Outputs\n\n- Interaction event\n- Updated contact\n\n### When to Use\n\nThis workflow is helpful when the user mentions:\n- \"log interaction\"\n- \"add touchpoint\"\n- \"record meeting\"\n\n### Execution Mode\n\nThis workflow can be executed automatically when triggered. Proceed through the steps without waiting for confirmation at each step.\n";
14
+
15
+ /** Raw SKILL.md content for the `relationship-insights` skill. */
16
+ export const relationshipInsights = "---\nid: relationship-insights\nname: relationship-insights\ndescription: Analyze relationship patterns and suggest follow-up actions\nversion: \"1.0.0\"\ntype: invocable\nrequiresVision: false\nrequiresData: false\n---\n\n## Relationship Insights Skill\n\nWhen the user invokes `/insights`, help them analyze their relationship patterns and identify follow-up opportunities.\n\n### Invocation Patterns\n\n- `/insights` - Overall relationship health analysis\n- `/insights [contact]` - Insights for specific relationship\n- `/insights follow-up` - Generate follow-up recommendations\n- `/insights dormant` - Find neglected relationships\n\n### Relationship Analysis Framework\n\n**Relationship Strength Indicators**\n- Contact frequency\n- Interaction depth (casual vs. meaningful)\n- Response time\n- Reciprocity (who initiates)\n- Context diversity (work, social, etc.)\n\n**Relationship Categories**\n- Inner Circle (frequent, deep)\n- Active Network (regular contact)\n- Dormant (past active, now quiet)\n- Acquaintances (surface level)\n- New Connections (potential to develop)\n\n### Output Format\n\n```markdown\n## Relationship Insights: [Network/Contact]\n\n### Network Overview\n- **Total Contacts**: X\n- **Active (30 days)**: X\n- **Dormant (90+ days)**: X\n- **Inner Circle**: X\n\n### Health Metrics\n| Metric | Status | Recommendation |\n|--------|--------|----------------|\n| Contact Frequency | 🟢/🟡/🔴 | [Action] |\n| Relationship Depth | 🟢/🟡/🔴 | [Action] |\n| Reciprocity Balance | 🟢/🟡/🔴 | [Action] |\n| Network Diversity | 🟢/🟡/🔴 | [Action] |\n\n### Follow-Up Recommendations\n\n#### High Priority (Overdue)\n1. **[Contact Name]**\n - Last contact: [Date]\n - Relationship: [Context]\n - Suggested action: [Specific outreach idea]\n - Talking point: [Relevant conversation starter]\n\n2. **[Contact Name]**\n [Same format]\n\n#### Medium Priority (Coming Due)\n[Same format]\n\n### Relationship Patterns\n\n**Strongest Connections**\n- [Contact]: [What makes it strong]\n- [Contact]: [What makes it strong]\n\n**At-Risk Relationships**\n- [Contact]: [Why at risk] → [How to strengthen]\n- [Contact]: [Why at risk] → [How to strengthen]\n\n**Dormant Worth Reviving**\n- [Contact]: [Why valuable] → [Re-engagement strategy]\n\n### Interaction Analysis\n| Month | Contacts Made | Depth Score | Top Contacts |\n|-------|--------------|-------------|--------------|\n| [Month] | X | X/5 | [Names] |\n\n### Action Items\n- [ ] [Specific follow-up 1]\n- [ ] [Specific follow-up 2]\n- [ ] [Specific follow-up 3]\n```\n\n### Follow-Up Triggers\n\n**Time-Based**\n- Birthday coming up\n- Work anniversary\n- Holiday season\n- Quarterly check-in due\n\n**Event-Based**\n- New job/promotion (congratulate)\n- Shared article/news relevant to them\n- Event you could invite them to\n- Favor you can offer\n\n**Milestone-Based**\n- Met 1 year ago\n- Completed project together\n- Introduced to your network\n\n### Conversation Starters\n\n**Reconnecting After Gap**\n- \"I was thinking about [shared experience] and it made me think of you\"\n- \"I came across [article/news] that reminded me of our conversation about...\"\n- \"It's been a while! How did [thing they mentioned] turn out?\"\n\n**Deepening Relationship**\n- \"I'd love to hear more about [thing they're passionate about]\"\n- \"Would you be open to grabbing coffee? I'd value your perspective on...\"\n- \"I remember you mentioning [interest] - have you...\"\n\n**Professional Context**\n- \"Congratulations on [achievement]! How are you finding the new role?\"\n- \"I thought of you when I saw [opportunity] - might be relevant?\"\n- \"I'm working on [project] and your expertise in [area] came to mind\"\n\n### Relationship Maintenance Cadence\n\n**Inner Circle**: Weekly-monthly\n**Active Network**: Monthly-quarterly\n**Acquaintances**: Quarterly-yearly\n**New Connections**: Within 48 hours of meeting, then monthly\n\n### Common Patterns to Watch\n\n**Positive Signs**\n- Increasing contact frequency\n- Longer conversations\n- They share personal updates\n- They introduce you to others\n- Quick response times\n\n**Warning Signs**\n- Decreasing frequency\n- Shorter, more transactional exchanges\n- One-sided initiation\n- Delayed responses\n- Avoiding deeper topics\n";
17
+
18
+ /** Raw SKILL.md content for the `network-analysis` skill. */
19
+ export const networkAnalysis = "---\nid: network-analysis\nname: network-analysis\ndescription: Analyze and visualize professional/personal networks, find connection opportunities\nversion: \"1.0.0\"\ntype: invocable\nrequiresVision: true\nrequiresData: false\n---\n\n## Network Analysis Skill\n\nWhen the user invokes `/network`, help them analyze their network structure and identify strategic connection opportunities.\n\n### Invocation Patterns\n\n- `/network` - Analyze overall network structure\n- `/network [goal]` - Find connections for specific goal\n- `/network gaps` - Identify network gaps\n- `/network clusters` - Analyze relationship clusters\n\n### Network Analysis Concepts\n\n**Network Density**\n- How interconnected are your contacts?\n- High density: tight-knit, redundant info\n- Low density: diverse, bridging opportunities\n\n**Centrality**\n- Who are the most connected people?\n- Who bridges different groups?\n- Who controls information flow?\n\n**Clusters**\n- Groups of closely connected people\n- Usually share context (work, interest, location)\n- Bridges between clusters are valuable\n\n**Structural Holes**\n- Gaps between clusters\n- Opportunities for you to bridge\n- Source of novel information\n\n### Output Format\n\n```markdown\n## Network Analysis\n\n### Network Overview\n- **Total Connections**: X\n- **Active Connections**: X (30 days)\n- **Network Density**: High/Medium/Low\n- **Clusters Identified**: X\n\n### Network Map\n```\n[Industry Cluster] ←→ YOU ←→ [Personal Cluster]\n ↓ ↓\n[Startup Cluster] [Hobby Cluster]\n```\n\n### Cluster Analysis\n\n#### Cluster 1: [Name] (X contacts)\n**Key Members**: [Names]\n**Relationship to You**: [How you know them]\n**Strengths**: [What this cluster offers]\n**Gaps**: [What's missing]\n\n#### Cluster 2: [Name] (X contacts)\n[Same format]\n\n### Strategic Connections\n\n#### Bridge Contacts (Connect Clusters)\n| Contact | Bridges | Potential |\n|---------|---------|-----------|\n| [Name] | [Cluster A] ↔ [Cluster B] | [Opportunity] |\n\n#### Connector Contacts (High Centrality)\n| Contact | Reach | Potential Intros |\n|---------|-------|------------------|\n| [Name] | X connections | [Who they could intro] |\n\n### Network Gaps\n\n| Missing Connection Type | Why Important | How to Fill |\n|------------------------|---------------|-------------|\n| [Type] | [Reason] | [Strategy] |\n\n### Goal-Specific Analysis\n**Goal**: [User's goal]\n\n**Relevant Connections**:\n1. [Contact] - [How they can help]\n2. [Contact] - [How they can help]\n\n**Missing Connections**:\n1. [Type of person needed] - [Why]\n\n**Path to Target**:\n```\nYou → [Contact] → [Their contact] → [Target]\n```\n\n### Action Plan\n1. [ ] Strengthen bridge relationship with [X]\n2. [ ] Request introduction to [Y] through [Z]\n3. [ ] Attend [event] to fill [gap]\n```\n\n### Network Building Strategies\n\n**Strengthen Existing Ties**\n- Deepen relationships with current connections\n- Increase contact frequency\n- Add value without asking\n\n**Add New Ties**\n- Target specific gaps\n- Attend relevant events\n- Engage on social media\n- Ask for warm introductions\n\n**Build Bridges**\n- Connect people in your network\n- Host gatherings that mix clusters\n- Share information across groups\n\n**Become a Connector**\n- Be generous with introductions\n- Build reputation as networker\n- Create value for your network\n\n### Network Metrics to Track\n\n**Diversity Metrics**\n- Industry diversity\n- Geographic diversity\n- Seniority diversity\n- Background diversity\n\n**Quality Metrics**\n- Response rate to your outreach\n- Reciprocity ratio\n- Referral rate\n- Introduction success rate\n\n### Networking Etiquette\n\n**Asking for Introductions**\n- Make it easy (provide context, email draft)\n- Explain why you want to connect\n- Be specific about what you're seeking\n- Follow up and report back\n\n**Making Introductions**\n- Get permission first\n- Provide context for both parties\n- Make double opt-in intros\n- Facilitate the handoff\n";
20
+
21
+ /** Raw SKILL.md content for the `kit-expertise` skill. */
22
+ export const kitExpertise = "---\nid: kit-expertise\nname: kit-expertise\ndescription: Domain expertise for Personal CRM - applied automatically when working in this kit\nversion: \"1.0.0\"\ntype: background\nrequiresVision: true\nrequiresData: false\n---\n\n## Your Role\n\nYou are a CRM and relationship management expert helping build a personal contact network application. You understand the importance of tracking not just contacts, but the relationships between people. You help users build an app that surfaces insights about their network and reminds them to stay in touch with important contacts.\n\n## Your Expertise\n\n- Contact and relationship management\n- Network visualization and analysis\n- SvelteKit 2 and Svelte 5 runes\n- Brainy knowledge graph for relationship data\n- Timeline and activity tracking\n- Search and filtering patterns\n- Notification and reminder systems\n\n## Your Approach\n\nWork alongside the user as a creative partner\n\n## Things to Avoid\n\n- Don't overcomplicate the data model - keep it focused on relationships\n- Avoid enterprise CRM complexity - this is personal\n- Don't add sales/pipeline features unless asked\n- Never store sensitive data without encryption considerations\n\n## Domain Knowledge\n\n### Key Terms\n\n**contact**\nA person in your network, stored as a Brainy 'person' entity\n\n**company**\nAn organization, stored as a Brainy 'organization' entity\n\n**interaction**\nA touchpoint with a contact (call, meeting, email), stored as 'event'\n\n**tag**\nA category label for organizing contacts, stored as 'topic'\n\n**network graph**\nVisual representation of how contacts are connected\n\n**last contact**\nDate of most recent interaction with a person\n\n**relationship strength**\nImplicit metric based on interaction frequency\n\n### Best Practices\n\n- Store contacts as 'person' entities in Brainy\n- Store companies as 'organization' entities\n- Store interactions as 'event' entities linked to contacts\n- Use 'memberOf' for person-to-company relationships\n- Use 'friendOf' for person-to-person connections\n- Use 'communicates' for interaction relationships\n- Use 'categorizes' for tag assignments\n- Track lastContacted in entity properties for reminder features\n\n### Common Mistakes to Avoid\n\n- Creating custom entity types instead of using Brainy's built-in types\n- Storing relationship data as entity properties instead of as relationships\n- Not tracking interaction dates for 'last contacted' features\n- Mixing personal and professional contact data without clear separation\n\n### Recommended References\n\n- **Brainy Entity Types**: person, organization, event, topic\n- **Brainy Relationship Verbs**: memberOf, friendOf, communicates, categorizes, references\n";
23
+
24
+ /** Raw SKILL.md content for the `add-contact` skill. */
25
+ export const addContact = "---\nid: add-contact\nname: Add New Contact\ndescription: Create a new person entity with contact details\nversion: \"1.0.0\"\ntype: invocable\nparameters: [contactData]\nrequiresVision: false\nrequiresData: false\n---\n\n## Add New Contact\n\nCreate a new person entity with contact details\n\n### Steps\n\n1. Create a form component for contact input\n2. Validate required fields (name, at least one contact method)\n3. Create person entity in Brainy with properties\n4. Optionally link to existing company\n5. Add relevant tags\n6. Redirect to contact detail page\n\n### Inputs Required\n\n- **contactData** (required): Name, email, phone, company, notes\n\n### Expected Outputs\n\n- New contact entity\n\n### When to Use\n\nThis workflow is helpful when the user mentions:\n- \"add contact\"\n- \"new person\"\n- \"create contact\"\n\n### Execution Mode\n\nThis workflow can be executed automatically when triggered. Proceed through the steps without waiting for confirmation at each step.\n";
26
+
27
+ /** Raw SKILL.md content for the `connect-contacts` skill. */
28
+ export const connectContacts = "---\nid: connect-contacts\nname: Connect Two Contacts\ndescription: Create a relationship between two people\nversion: \"1.0.0\"\ntype: invocable\nparameters: [contact1, contact2]\nrequiresVision: false\nrequiresData: false\n---\n\n## Connect Two Contacts\n\nCreate a relationship between two people\n\n### Steps\n\n1. Select two contacts to connect\n2. Choose relationship type (introduced, knows, works with)\n3. Create friendOf or worksWith relationship in Brainy\n4. Show connection in network graph\n\n### Inputs Required\n\n- **contact1** (required): First contact\n- **contact2** (required): Second contact\n\n### Expected Outputs\n\n- New relationship\n\n### When to Use\n\nThis workflow is helpful when the user mentions:\n- \"connect contacts\"\n- \"link people\"\n- \"add connection\"\n\n### Execution Mode\n\nThis workflow can be executed automatically when triggered. Proceed through the steps without waiting for confirmation at each step.\n";
29
+
30
+ /** All skills for the personal-crm kit, keyed by skill ID. */
31
+ export const allSkills: Record<string, string> = {
32
+ 'find-dormant': findDormant,
33
+ 'log-interaction': logInteraction,
34
+ 'relationship-insights': relationshipInsights,
35
+ 'network-analysis': networkAnalysis,
36
+ 'kit-expertise': kitExpertise,
37
+ 'add-contact': addContact,
38
+ 'connect-contacts': connectContacts
39
+ };