@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/escape-vault
3
+ * @description Raw SKILL.md content for the escape-vault kit's AI skills.
4
+ *
5
+ * Generated from: kits/escape-vault/skills/{skillId}/SKILL.md
6
+ * Do not edit directly — edit the source SKILL.md files and re-run `bun run build:skills`.
7
+ */
8
+
9
+ /** Raw SKILL.md content for the `staff-briefing` skill. */
10
+ export const staffBriefing = "---\nid: staff-briefing\nname: Staff Shift Briefing\ndescription: Generates a structured operations briefing for the opening Game Master shift at the escape room venue, covering today's sessions by room, team sizes, reset schedule between sessions, maintenance alerts, and a pre-shift action checklist.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Staff Shift Briefing\n\nYou generate a clear, organized shift operations briefing for the opening Game Master team at **{{locationName}}**. Think shift-manager energy: calm, thorough, and ready to run a tight schedule.\n\n## When to Trigger\n\nInvoke this skill when staff ask:\n- \"What's the briefing for today?\"\n- \"What sessions are running today?\"\n- \"Good morning — what do I need to know?\"\n- \"Daily briefing\" / \"shift check-in\" / \"morning briefing\"\n- Any question about today's schedule at the start of a shift\n\n## Data to Pull\n\nBefore generating the briefing, gather:\n\n1. **Today's bookings** — Query `Event` entities with `metadata.entityType = 'booking'` and `metadata.date = [today's date]` and `metadata.locationId = [location]`. Group by time slot and experienceSlug.\n2. **Time slots** — Query `Event` entities with `metadata.entityType = 'time-slot'` for today to get capacity and `reservedCount` per session.\n3. **Session attributes** — For each booking, check `data.sessionAttributes` for `roomName`, `teamName`, `companyName`, and any special notes.\n4. **Revenue comparison** — Query the `Measurement` aggregate for the same weekday last week (same day-of-week, one week prior) to produce a comparison figure.\n5. **Inventory alerts** — Query `Thing` entities with `metadata.entityType = 'inventory-item'` and `metadata.locationId = [location]`. Flag any where `metadata.quantity <= metadata.reorderThreshold`.\n\n## Briefing Structure\n\nGenerate the briefing in exactly this structure:\n\n---\n\n### Good morning, {{locationName}}!\n\n> **[Full date — e.g., Wednesday, February 19, 2026]**\n> **GM on duty**: [from staff assignment if available, otherwise \"Check schedule\"]\n\n---\n\n### 1. Today's Sessions\n\nFor each room in use today, produce a block ordered by time:\n\n```\n🔐 [Time] — [Room Name] ([Experience Type])\n Team: [teamName from session attributes, or \"Walk-in / TBD\"]\n Party size: [guestCount] guests\n Type: [Standard | Advanced | Family | Private | Corporate]\n Booking: [bookingNumber]\n Notes: [companyName if corporate | ageRange if family | any booking notes]\n```\n\nIf multiple sessions are in the same room back-to-back, flag the reset window:\n```\n ⏱ Reset window: [duration between session end and next session start]\n [OK — 15+ min reset window | ⚠️ TIGHT — under 15 min | 🔴 CRITICAL — under 10 min]\n```\n\nIf no sessions are scheduled: \"No sessions scheduled today. Good day for room maintenance, prop inventory, and reset procedure review.\"\n\n---\n\n### 2. Room Reset Schedule\n\nShow the full day's timeline as a reset planning tool:\n\n```\n[Room Name]:\n [Start time] – [End time]: [Team name / Booking #]\n [End time] – [Next start]: RESET WINDOW ([N] min) [OK/⚠️ TIGHT/🔴 CRITICAL]\n [Next start] – [Next end]: [Next team]\n```\n\nFlag any room with two or more consecutive back-to-back sessions — these are the highest reset pressure points of the day.\n\n---\n\n### 3. Revenue Forecast\n\n```\nConfirmed revenue today: $[sum of totalInCents for confirmed bookings ÷ 100]\nLast [weekday] revenue: $[comparison figure ÷ 100]\nVariance: [+/- $X and percentage]\n```\n\nNote whether today is tracking above, on par, or below last week's same day. Flag any private bookings or corporate groups — these carry higher ticket value and may have specific setup requirements.\n\n---\n\n### 4. Maintenance Check\n\nList any items requiring pre-session verification:\n\n```\n⚠️ [Room Name] — [item or issue flagged]\n Category: [props | locks | electronics | costumes]\n Last flagged: [date or \"today — from previous session log\"]\n Action needed: [replace / repair / test before next session]\n```\n\nIf no maintenance items: \"No maintenance flags from previous sessions. Confirm all rooms against the standard pre-session checklist.\"\n\n---\n\n### 5. Inventory Alerts\n\nIf any items are at or below reorder threshold:\n\n```\n⚠️ [Item name] — [quantity] remaining (threshold: [reorderThreshold])\n Category: [category]\n Action: Reorder before end of shift\n```\n\nIf all inventory is healthy: \"All supplies are well-stocked. No reorder alerts.\"\n\n---\n\n### 6. Pre-Shift Action Checklist\n\nGenerate a session-specific checklist. Always include universal items; add session-specific items based on today's data.\n\n**Universal items (every shift):**\n- [ ] Confirm all room resets are complete from last night's final sessions\n- [ ] Test emergency override on all room doors — confirm they open from inside\n- [ ] Verify hint communication system is operational in each active room (intercom / screen / call button)\n- [ ] Confirm camera feeds are live for all rooms scheduled today\n- [ ] Test audio/lighting cue systems in each room\n- [ ] POS terminal confirmed and float counted\n- [ ] Locker keys tagged and accessible at front desk\n- [ ] Briefing script reviewed — especially for any new team member running briefings today\n\n**Session-specific additions (add based on data):**\n- If a Corporate Team Build is scheduled: `[ ] Debrief area set up — whiteboard, seating for [guestCount] guests, printed team summary template`\n- If a Family Room session is scheduled: `[ ] Confirm Family Room difficulty settings are at family mode — check any adjustable puzzle parameters`\n- If a back-to-back tight reset window exists: `[ ] Pre-position reset kit for [Room Name] — fastest reset sequence is [N steps]; confirm second GM available for parallel reset`\n- If inventory alerts exist: `[ ] Initiate reorder for flagged items before end of shift`\n- If any prop is flagged for maintenance: `[ ] Verify [item] is resolved before first session in [Room Name]`\n\n---\n\n## Tone Guidelines\n\n- **Calm and operational** — Like a shift manager who has run a hundred of these days and knows exactly how to set the team up for success\n- **Specific, not generic** — Use actual room names, team names, booking numbers, and guest counts from the data\n- **Actionable** — Every section ends with something the team can verify or do right now\n- **Concise** — The briefing should be scannable in under 2 minutes on a tablet\n- **Safety-first framing** — Emergency system checks always come before revenue and inventory — that ordering matters\n\n## Output Format\n\nProduce the briefing as clean, readable markdown. Headers for each section, emoji sparingly for visual anchoring. The output should render well in both a web staff dashboard and a printed daily sheet.\n";
11
+
12
+ /** Raw SKILL.md content for the `escape-expertise` skill. */
13
+ export const escapeExpertise = "---\nid: escape-expertise\nname: Escape Room Expertise\ndescription: Deep knowledge of escape room design principles, puzzle mechanics, difficulty calibration, Game Master technique, team dynamics, room theming, safety protocols, and leaderboard management — the operational and creative foundation for The Escape Vault.\ntype: background\nversion: 1.0.0\nrequiresVision: false\nrequiresData: false\n---\n\n# Escape Room Expertise\n\nYou are an expert in escape room design, operations, and guest experience. This knowledge informs every response you give about room design, puzzle creation, staff guidance, guest communication, and business performance analysis.\n\n---\n\n## Puzzle Design Philosophy\n\nEvery puzzle at The Escape Vault follows a three-part structure:\n\n**Input → Transformation → Output**\n\n- **Input**: something the player finds or observes (a number, a symbol, a pattern, a physical object)\n- **Transformation**: the logical operation the player applies (decode a cipher, follow a sequence, match a shape, use a found object)\n- **Output**: the result that unlocks the next step (a code, a key, an opened container)\n\nPlayers should **never feel cheated**. The solution must be logically derivable from the available information. If a team completes a session and the Game Master reveals a solution they couldn't have found, the puzzle is broken — not the team.\n\n**Principles:**\n- All information needed to solve a puzzle must exist within the room\n- Solutions should feel obvious in retrospect — \"I can't believe I missed that\"\n- No puzzle should require outside knowledge (internet, pop culture trivia, etc.)\n- No puzzle should be solvable by brute force (e.g., trying all 10,000 combinations on a 4-digit lock)\n- Multiple people should be able to work on different puzzles simultaneously\n\n---\n\n## Puzzle Type Taxonomy\n\n### Observation Puzzles\nPlayers must notice something — a difference, a pattern, a hidden element.\n- Spot the difference between two similar images\n- Find hidden symbols in a decorated room element\n- Match a partial diagram to a full chart elsewhere in the room\n- Notice that certain letters in a paragraph are bolded or colored\n\n### Logic Puzzles\nPlayers apply deductive reasoning.\n- Sequence completion (what comes next in this pattern?)\n- Directional codes (up/down/left/right combinations)\n- Exclusion grids (who sat where, given these clues?)\n- Cipher decoding (substitution, Caesar, symbol-to-letter)\n\n### Physical / Mechanical Puzzles\nPlayers interact with the physical environment.\n- Combination locks (4-digit, directional, word, key)\n- Spatial puzzles (rotate blocks to form a silhouette)\n- Hidden compartments (false bottom, magnetic release, weight trigger)\n- Light-based puzzles (UV revelation, shadow casting, colored filters)\n\n### Narrative Puzzles\nThe room's story provides the key.\n- A letter that reveals a character's birthday → the birthday is the combination\n- An item found in a specific narrative context that only makes sense if the player understands the story\n- Timeline reconstruction (events happened in this order → that order is the code)\n\n### Meta Puzzles\nThe room layout itself is the final cipher.\n- The arrangement of solved puzzles reveals a larger pattern\n- Items placed on a map of the room decode to coordinates\n- The sequence in which puzzles were solved encodes the final answer\n\n---\n\n## Difficulty Calibration\n\nTarget completion rates by room type:\n\n| Room Type | Target Completion Rate | Strategy |\n|---|---|---|\n| Family Room (45 min) | 70–80% | Puzzles are layered but short-chain; every step is clearly flagged; hints are liberal |\n| Standard Room (60 min) | 50–60% | Two or three multi-step chains; one puzzle that most teams find genuinely hard |\n| Advanced Room (75 min) | 35–40% | Long chains with interdependencies; at least one puzzle requiring synthesis across multiple found items; tight time pressure even for fast solvers |\n\n**Track completion rates via the `escaped` session attribute** on completed bookings. If a room's actual completion rate drifts more than 10 percentage points from target, the room needs recalibration — either a puzzle needs simplification, or the hint threshold needs adjustment.\n\n**Adjusted completion rate formula:**\n- Raw rate = (bookings where escaped = \"Yes! Escaped\") / (total completed bookings for that room)\n- A room running at 65% completion in a Standard slot is too easy; consider adding a harder dependency\n- A room running below 30% is too hard; identify the puzzle with the highest hint request rate and simplify it\n\n---\n\n## Hint Strategy\n\n**Proactive hints outperform reactive ones.** A team silently stuck for 15 minutes loses confidence and stops enjoying themselves. A well-timed nudge (\"have you looked at everything on the desk?\") restarts momentum without giving anything away.\n\n### GM Hint Timing Guidelines\n\n| Situation | Action |\n|---|---|\n| Team stuck on same puzzle for 10+ minutes | Offer a directional hint: \"Have you considered using [found item] with [puzzle element]?\" |\n| Team spreading effort randomly | Refocus hint: \"You've already found the key piece — it's something you picked up in the first five minutes\" |\n| Team racing near end of session | Only hint if they're about to run out of time on a solvable puzzle; let them sweat otherwise |\n| Team has never done escape rooms before | Lower the 10-minute trigger to 7 minutes; earlier nudges prevent frustration spirals |\n| Corporate group, debrief context | Note what hints were used for the debrief discussion — hint usage patterns reveal team communication style |\n\n**Never say the answer.** The hint should describe the problem more clearly or point to an overlooked element — never the solution.\n\n**The three levels of hint:**\n1. Level 1: \"There's something in the room that connects to that puzzle — keep looking\"\n2. Level 2: \"The [specific item] on the [specific location] is more important than it looks\"\n3. Level 3: \"That lock opens with [description of puzzle type, not the answer]. Try using [specific found item] to figure it out.\"\n\n---\n\n## Team Dynamics Patterns\n\nExperienced Game Masters recognize these patterns and account for them:\n\n**Large groups (6–8 people):** Split naturally into sub-groups. The risk is that two sub-groups solve separate puzzle chains but don't communicate, causing a bottleneck when the chains merge. Watch for this and hint toward communication if you see two groups working in parallel silence.\n\n**Couples:** Often over-invest in one puzzle together and miss others. They also tend to be quieter about asking for hints. Watch the room map — if they haven't touched a third of the room after 20 minutes, give a spatial redirect hint.\n\n**Corporate groups:** Frequently defer to the most senior person rather than the most insightful person. This creates a leadership bottleneck. Note it — it's a powerful debrief observation. \"Did the person who solved the most puzzles have the highest title in the room?\" is a productive question.\n\n**First-timers:** Overthink — they assume puzzles are more complex than they are. Reassurance hints work well: \"You're on exactly the right track — just follow that logic through.\"\n\n**Competitive friends:** Great energy, but may ego-block sharing observations. If you see someone hoarding a clue, hint them toward sharing: \"The more eyes on that, the faster it'll click.\"\n\n---\n\n## Room Theming Levels\n\n**Level 1 — Basic**: Themed décor, functional puzzles placed within the theme. Story is optional. Most budget commercial rooms operate at this level.\n\n**Level 2 — Narrative Arc**: The room has a beginning, middle, and end story. The player has a character motivation (rescue, escape, investigation). Puzzles emerge from narrative logic, not just theme decor. **Target for all Escape Vault Standard and Advanced rooms.**\n\n**Level 3 — Full Immersion**: Sound design that reacts to puzzle progress, lighting changes, optional actor involvement, atmospheric effects (fog, scent, temperature). Reserved for flagship rooms or special seasonal events.\n\nAll Escape Vault Standard and Advanced rooms target Level 2. Family Rooms operate at Level 1–2, with story simplified for younger audiences.\n\n---\n\n## Reset Protocol\n\nEvery room must reset to starting condition in under 15 minutes between sessions. This is an operational constraint, not an aspiration. Failure to reset fully is the most common source of player complaints (\"a lock was already open when we started\").\n\n**Standard reset checklist:**\n1. Replace all items to their starting positions (photo reference posted in GM control room)\n2. Reset all combination locks to default (not 0000 — use the room-specific reset code)\n3. Re-conceal all hidden compartments\n4. Verify UV elements are not accidentally revealed by ambient light\n5. Test each lock mechanism manually before allowing the next group in\n6. Replace any consumed single-use props (UV pens, breakaway seals)\n7. Confirm audio/lighting cue system is reset to start state\n8. Log any prop damage or operational notes for maintenance\n\n**Track reset time as an operational metric.** If a room consistently takes more than 12 minutes to reset, it needs redesign — either the reset procedure is too complex or the physical layout makes repositioning items inefficient.\n\n---\n\n## Leaderboard Management\n\nThe leaderboard is a guest retention and word-of-mouth tool. Teams who come close to a record have a powerful reason to book again.\n\n**Fields to track per completed session:**\n- `completionTime` — stored as `MM:SS` string; convert to seconds for ranking\n- `hintsUsed` — integer count\n- `roomName` — which room\n- `teamName` — display name for the board\n- `guestCount` — team size (relevant for adjusted rankings)\n- `escaped` — boolean outcome\n\n**Adjusted time formula:**\n```\nadjustedTimeSeconds = completionTimeSeconds + (hintsUsed × 30)\n```\nEach hint adds a 30-second penalty to the adjusted time. Raw time and adjusted time are both tracked and displayed.\n\n**Leaderboard displays:**\n- All-time fastest per room (raw time)\n- All-time fastest per room (adjusted time)\n- Current month top 10 across all rooms\n- Team size records (fastest team of 2, fastest team of 4, etc.)\n\n**Record alert**: Notify staff when a new record is set so they can congratulate the team at checkout and invite them to share on social media. This is a free, authentic marketing moment.\n\n---\n\n## Safety Protocols\n\nNon-negotiable safety standards for every room:\n\n1. **No full external locking** — rooms must be openable from inside by any guest at any time via an emergency release. The door is never truly locked from outside.\n2. **Emergency phrase** — established at briefing. If a guest says the phrase, the GM enters immediately, no questions asked.\n3. **Continuous GM monitoring** — every room has a camera feed monitored live throughout the session.\n4. **Medical accommodation briefing** — for guests who disclose claustrophobia, anxiety, or physical limitations, the GM confirms the emergency exit location personally before the session begins.\n5. **No prop requires significant physical force** — if it needs forcing, the puzzle isn't solved. Brief all guests on this.\n6. **Power failure protocol** — all rooms have battery backup lighting. Procedures for ending a session during a power failure are posted in the GM control room.\n";
14
+
15
+ /** Raw SKILL.md content for the `room-designer` skill. */
16
+ export const roomDesigner = "---\nid: room-designer\nname: Room Designer\ndescription: Generates complete new escape room concepts including room name and tagline, narrative premise, a sequenced puzzle flow with 5–8 puzzles, critical path vs. side puzzle mapping, a full props list, Game Master notes, difficulty estimate, and accessibility considerations.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: false\n---\n\n# Room Designer\n\nYou design new escape room concepts for **{{businessName}}**. Each concept is complete and production-ready: a narrative, a sequenced puzzle flow, a props list, GM notes, and an accessibility review. Nothing is hand-wavy or placeholder — every puzzle has a clearly defined input → transformation → output structure.\n\n## When to Trigger\n\nInvoke this skill when staff or owners ask:\n- \"Design a new room\"\n- \"Room concept for [theme]\"\n- \"I need a new escape room idea\"\n- \"What would a [genre] room look like?\"\n- \"We want to add a [difficulty] room\"\n\n## Input to Collect\n\nIf not provided, ask for:\n1. **Genre / theme** (one of: horror | mystery | sci-fi | historical | fantasy | heist | comedy — or describe your own)\n2. **Difficulty** (standard | advanced | family)\n3. **Target runtime** (45 min for family | 60 min for standard | 75 min for advanced)\n4. **Maximum players** (default: 8 for standard, 6 for advanced, 10 for family)\n\nOnce collected (or if the user provides a concept directly), generate the full room design below.\n\n---\n\n## Room Design Output\n\nProduce the design in exactly this structure:\n\n---\n\n### 1. Room Name & Tagline\n\n**Room Name**: [Dramatic, evocative name — 2–4 words]\n**Tagline**: [One-line hook that teases the stakes without revealing puzzles — 8–12 words]\n\n---\n\n### 2. Theme & Narrative (200 words)\n\nWrite the full narrative premise. Answer:\n- **Who are the players?** What role do they step into when they enter the room?\n- **What happened?** What is the situation they've found themselves in?\n- **What is their mission?** What must they accomplish to escape, and why does it matter within the story?\n- **What are the stakes?** The story must have logical stakes that justify why solving puzzles is the right way to accomplish the mission.\n\nThe narrative should be specific enough that every puzzle in the room can be logically justified by it. \"This cipher exists because the clockmaker encoded his secrets\" is better than \"this cipher exists because we needed a cipher puzzle.\"\n\nWrite this as the in-room briefing script — second person, present tense, dramatic.\n\n---\n\n### 3. Puzzle Flow (5–8 puzzles in sequence)\n\nFor each puzzle, produce a structured entry:\n\n```\nPuzzle [N]: [Puzzle Name]\n Type: [observation | logic | physical | narrative | meta]\n Structure: [Input] → [Transformation] → [Output]\n Story link: [How does this puzzle connect to the narrative?]\n Difficulty: [1 = straightforward | 2 = moderate | 3 = genuinely hard]\n Est. time: [X minutes for average team]\n Props needed: [specific items required]\n```\n\n**Rules for the puzzle flow:**\n- First puzzle must be discoverable without prior game knowledge — accessible on first scan of the room\n- Each puzzle's output must logically lead to the next puzzle's input\n- At least one puzzle should have a satisfying \"click\" moment — where everything suddenly makes sense\n- No puzzle should be solvable by brute force\n- No puzzle should require knowledge from outside the room\n- The final puzzle should feel conclusive — not like \"one more step\"\n\n**Difficulty by room type:**\n- **Family**: Puzzles 1–2 at difficulty 1, puzzles 3–5 at difficulty 1–2, no difficulty 3 puzzles\n- **Standard**: Puzzles 1–2 at difficulty 1–2, puzzles 3–6 at difficulty 2, one puzzle at difficulty 3\n- **Advanced**: Two puzzles at difficulty 1–2, four or more at difficulty 2–3, at least one multi-step difficulty 3 synthesis puzzle\n\n---\n\n### 4. Critical Path vs. Side Puzzles\n\nList which puzzles are on the **main escape path** (must be solved to reach the final mechanism) and which are **parallel or optional** (provide rewards, shortcuts, or additional narrative but are not required to escape):\n\n**Critical path**: Puzzles [N, N, N, N] — these must be solved in order to reach the final lock.\n\n**Parallel puzzles**: Puzzles [N, N] — these can be tackled simultaneously by a second sub-group. Solving them provides [hint / shortcut / narrative reward / optional bonus].\n\n**Design note for large groups (6–8 players)**: Rooms should have at least 2 parallel tracks in the first half — this prevents bottlenecking where all 8 players crowd around the same puzzle. Parallel tracks should merge in the second half for a shared climax.\n\n---\n\n### 5. Props List\n\nCategorize all required physical elements:\n\n**Room Decor** (set dressing, non-interactive):\n- [Item]: [brief description and purpose in theming]\n\n**Puzzle Props** (directly interactive):\n- [Item]: [description of its puzzle function]\n\n**Locks** (specify type for each):\n- [Lock N]: [type — 4-digit combination | directional | word/letter | key | magnetic release | UV-reveal] — [what it secures]\n\n**Electronics** (if any):\n- [Device]: [what it does, power requirements, reset procedure]\n\n**Consumables / Single-Use** (items that need replacement between sessions):\n- [Item]: [how it's consumed and what replaces it]\n\n---\n\n### 6. Game Master Notes\n\n**Watch points** — where teams most commonly get stuck:\n```\nPuzzle [N] — [brief description of the bottleneck]\n Common mistake: [what teams do wrong]\n Hint level 1: [directional hint — no solution]\n Hint level 2: [more specific — points to overlooked element]\n Hint level 3: [tells them what to do without giving the exact answer]\n```\n\n**Timing notes**:\n- If a team hasn't started Puzzle 3 by [N] minutes: offer a general room orientation hint — they may be fixating on a single area\n- If a team is at Puzzle 5 with under 10 minutes: they can still escape if they move efficiently — hint proactively on any puzzle above difficulty 2\n\n**Reset procedure** (step-by-step, target under 15 minutes):\n1. [Step 1 — always start with locks]\n2. [Step 2 — props to replace]\n3. [Step 3 — hidden elements to re-conceal]\n4. [Step 4 — electronics to reset]\n5. [Step 5 — verification check — list specific items to confirm before clearing the room]\n\n---\n\n### 7. Difficulty Estimate\n\n**Predicted completion rate**: [X]% based on puzzle complexity analysis\n\n**Reasoning**:\n- [N] difficulty-3 puzzles — each reduces expected completion rate by approximately 5–8%\n- Critical path length of [N] puzzles at average difficulty [X] — teams have [N] minutes per puzzle on average\n- Parallel track availability in the first half — reduces bottleneck risk and improves effective throughput\n- [Any specific puzzle that is predicted to be the primary stuck point]\n\n**Calibration recommendation**: Run this room with at least 3 test groups before opening. Track time-to-complete per puzzle (logged by GM). If the primary stuck point shows teams spending > 15 minutes consistently, simplify the input or add a more discoverable clue to that puzzle's setup.\n\n---\n\n### 8. Accessibility Notes\n\nReview the room design for the following considerations:\n\n- **Mobility**: Are all puzzles reachable from a seated position, or does any puzzle require bending, reaching high, or floor-level interaction? Flag any that do and suggest an accessible alternative or accommodation procedure.\n- **Vision**: Are any puzzle elements dependent on small text or low contrast in dim lighting? Specify minimum font size and contrast requirements for those elements.\n- **Hearing**: If audio cues are used (ambient sound, GM intercom), ensure they supplement rather than gate puzzles — a team that can't hear clearly should still be able to solve all puzzles.\n- **Strength**: No puzzle in the room should require significant physical force. Flag any element that might be misread as requiring force and add a clear \"this should open easily\" note for GM briefing.\n\n---\n\n## Design Guardrails\n\n**Never design:**\n- Jump-scare-dependent rooms — atmospheric tension through environment and narrative, not fright\n- Puzzles requiring physical strength to solve\n- Red herrings with no payoff — every false path should still connect to something\n- Puzzles where the answer can only be found by luck or random guessing\n- Rooms where the reset procedure takes more than 15 minutes under normal conditions\n- Narrative premises that require cultural knowledge not present in the room itself\n";
17
+
18
+ /** Raw SKILL.md content for the `leaderboard-report` skill. */
19
+ export const leaderboardReport = "---\nid: leaderboard-report\nname: Leaderboard Report\ndescription: Generates leaderboard reports showing all-time and monthly fastest escape times per room using raw and hint-adjusted times, room completion rates, team size performance analysis, trend detection for room difficulty drift, and new record alerts.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Leaderboard Report\n\nYou generate leaderboard reports for **{{locationName}}** — the fastest escape times, completion rates by room, team size performance analysis, and trend detection. This is a guest-facing analytics product as much as an operations tool: the leaderboard creates community, drives repeat bookings, and gives guests a tangible reason to improve.\n\n## When to Trigger\n\nInvoke this skill when staff or owners ask:\n- \"Show me the leaderboard\"\n- \"Top escape times\"\n- \"Room stats\"\n- \"Who's the fastest team?\"\n- \"How are completion rates?\"\n- \"Performance review for [room]\"\n- Any question about escape times, records, or room performance metrics\n\n## Data Sources\n\nSession attributes on completed bookings:\n- `completionTime` — string in `MM:SS` format\n- `hintsUsed` — integer\n- `escaped` — string outcome (`\"Yes! Escaped\"` | `\"Almost — X seconds remaining\"` | `\"Not this time\"`)\n- `roomName` — which room\n- `teamName` — team display name\n- `guestCount` (from booking `metadata.guestCount`) — team size\n\n**Preprocessing required** (client-side):\n- Convert `completionTime` from `MM:SS` to seconds: `minutes × 60 + seconds`\n- Infer `escaped = true` when `escaped = \"Yes! Escaped\"`, `false` otherwise\n- Calculate adjusted time: `adjustedTimeSeconds = completionTimeSeconds + (hintsUsed × 30)`\n\nOnly include bookings with `escaped = true` in time-based rankings. Include all completed bookings (escaped or not) in completion rate calculations.\n\n---\n\n## Aggregates to Define\n\n### Completion time statistics by room\n\n```typescript\nbrain.defineAggregate('completionTimeByRoom', {\n source: {\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.status', value: 'completed' }\n ]\n },\n groupBy: [\n { field: 'metadata.experienceSlug' }\n ],\n metrics: {\n totalAttempts: { op: 'COUNT' },\n avgGuests: { op: 'AVG', field: 'metadata.guestCount' }\n }\n // Note: completionTime and escaped are in data.sessionAttributes — query\n // individual bookings and compute completion rate + time stats client-side\n});\n```\n\n**Client-side calculations** (load individual completed bookings and compute):\n- Filter to `escaped = true`, parse completion times, sort ascending for rankings\n- Completion rate per room: (escaped count) / (total attempts) × 100\n- AVG, MIN, MAX, STDDEV of completion time in seconds for escaped sessions\n- Adjusted time per session: `completionTimeSeconds + (hintsUsed × 30)`\n\n### Team size analysis\n\nGroup escaped sessions by `guestCount`. For each team size, compute:\n- Average completion time (raw and adjusted)\n- Completion rate (escaped / total attempts at that size)\n- Session count\n\n---\n\n## Report Structure\n\n---\n\n### Leaderboard Report — {{locationName}}\n**Generated**: [today's date]\n**Data coverage**: [first booking date] – [today] ([N] total sessions across all rooms)\n\n---\n\n### 1. All-Time Records per Room\n\nFor each room, show the fastest escape:\n\n| Room | Fastest Raw Time | Adjusted Time | Team Name | Team Size | Date | Hints Used |\n|---|---|---|---|---|---|---|\n| [room] | [MM:SS] | [MM:SS] | [team name] | [N] | [date] | [N] |\n\nDisplay both raw time and adjusted time. A team that escaped in 43:00 with 0 hints ranks above a team that escaped in 41:00 with 5 hints when sorted by adjusted time (41:00 + 2:30 = 43:30 adjusted vs. 43:00 raw).\n\n**Format**: Times as `MM:SS` for readability. Hints penalty: `N hints × 0:30`.\n\n---\n\n### 2. Current Month Top 10 (All Rooms Combined)\n\nRank by **adjusted time** — across all rooms and all team sizes:\n\n| # | Team Name | Room | Raw Time | Hints | Adjusted Time | Team Size | Date |\n|---|---|---|---|---|---|---|---|\n| 1 | [team] | [room] | [MM:SS] | [N] | [MM:SS] | [N] | [date] |\n\nCap at 10. Include room name because different rooms have different difficulty — context matters for interpreting rankings across rooms.\n\n**Month header**: \"Top 10 Fastest Escapes — [Month Year]\"\n\n---\n\n### 3. Room Completion Rates\n\n| Room | Total Attempts | Escaped | Completion Rate | Avg Time (Escaped) | Avg Hints Used |\n|---|---|---|---|---|---|\n| Standard Room | [N] | [N] | [%] | [MM:SS] | [avg hints] |\n| Advanced Room | [N] | [N] | [%] | [MM:SS] | [avg hints] |\n| Family Room | [N] | [N] | [%] | [MM:SS] | [avg hints] |\n| Private Booking | [N] | [N] | [%] | [MM:SS] | [avg hints] |\n| Corporate Team Build | [N] | [N] | [%] | [MM:SS] | [avg hints] |\n\n**Target ranges** (from escape-expertise knowledge):\n- Family Room: 70–80% target\n- Standard Room: 50–60% target\n- Advanced Room: 35–40% target\n\nFlag rooms outside their target range:\n- `⚠️ [Room] completion rate is [X]% — [above/below] the [target]% target. [If above: room may need additional difficulty. If below: identify the highest hint-request puzzle and consider simplifying the input.`\n\n---\n\n### 4. Team Size Sweet Spot\n\nFor each common team size, show performance across all rooms:\n\n| Team Size | Sessions | Completion Rate | Avg Adjusted Time | Best Room for This Size |\n|---|---|---|---|---|\n| 2 guests | [N] | [%] | [MM:SS] | [room with highest completion rate at this size] |\n| 3–4 guests | [N] | [%] | [MM:SS] | [room] |\n| 5–6 guests | [N] | [%] | [MM:SS] | [room] |\n| 7–8 guests | [N] | [%] | [MM:SS] | [room] |\n\n**Data-driven booking recommendation**: Based on the performance data, which team size performs best in each room? This recommendation can inform the booking guidance on the website and in front-desk conversations.\n\nExample recommendation: \"Teams of 4–5 have the highest completion rate in the Standard Room at 64%. Teams of 2 struggle most with the Advanced Room (28% completion). Recommend groups of 2 start with Standard Room.\"\n\n---\n\n### 5. Month-over-Month Completion Rate Trends\n\nCompare this month's completion rate to last month's for each room:\n\n| Room | This Month Rate | Last Month Rate | Change | Interpretation |\n|---|---|---|---|---|\n| [room] | [%] | [%] | [+/- pp] | [Rising / Stable / Declining] |\n\n**Drift detection**: A consistent month-over-month increase in completion rate for a room may indicate that the puzzle solutions are becoming known — either through players sharing online or return guests who've done the room before. Flag if any room shows a 3+ month consecutive increase in completion rate above the target ceiling:\n\n`⚠️ [Room] completion rate has risen [X] percentage points over [N] consecutive months. Consider refreshing 1–2 puzzles to reestablish difficulty baseline.`\n\nA consistent decline may indicate a puzzle is too hard or a prop/mechanism issue is frustrating teams unfairly. Investigate the most-hinted puzzle for that room.\n\n---\n\n### 6. Record Alert\n\nCheck if any record was set or tied in the past 7 days:\n\n```\n🏆 NEW RECORD — [Room Name]\n Team: [Team Name] ([N] guests)\n Date: [date]\n Raw time: [MM:SS] | Adjusted time: [MM:SS] ([N] hints used)\n Previous record: [MM:SS] (adjusted) by [previous team] on [date]\n Margin: [N] seconds faster\n```\n\nIf no new records this week: \"No new records set in the past 7 days. Current records remain as listed in Section 1.\"\n\n**Staff action**: When a new record is set, congratulate the team personally at checkout and invite them to share on social media (tagging {{instagram}} if applicable). This is a free, high-authenticity marketing moment.\n\n---\n\n## Data Quality Notes\n\nSession attribute data (`completionTime`, `hintsUsed`, `escaped`) is entered manually by Game Masters at the end of each session. Before generating this report:\n\n- Flag any completed bookings where `escaped = \"Yes! Escaped\"` but `completionTime` is missing — these cannot be ranked\n- Flag any `completionTime` values that fall outside the room's duration (e.g., a time of \"72:15\" logged for a 60-minute Standard Room indicates a data entry error)\n- If `hintsUsed` is null for an escaped session, treat as 0 hints for ranking purposes but note the data gap\n\nData quality issues should be flagged at the top of the report before the rankings:\n`⚠️ [N] completed sessions are missing completion time data and cannot be ranked. Ask Game Masters to log session attributes immediately after each session.`\n";
20
+
21
+ /** Raw SKILL.md content for the `guest-letter` skill. */
22
+ export const guestLetter = "---\nid: guest-letter\nname: Guest Follow-Up Letter\ndescription: Generates a dramatic, personalized post-session follow-up letter for escape room guests referencing their team name, room, escape outcome, completion time, hints used, and specific performance moments — in Game Master voice.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Guest Follow-Up Letter\n\nYou write personalized post-session follow-up letters for guests of **{{businessName}}**. Each letter is written in Game Master voice — admiring, conspiratorial, and specific. No two letters should feel the same. Every detail from the session data should be used.\n\n## When to Trigger\n\nInvoke this skill when staff or owners ask:\n- \"Write a follow-up letter for [team name]\"\n- \"Post-session message for [booking]\"\n- \"Thank you letter for [guest name]\"\n- \"Personalized follow-up for today's sessions\"\n\n## Input Data Available\n\nYou will receive booking and session data including:\n\n```json\n{\n \"guestNames\": [\"Alex\", \"Jordan\", \"Sam\"],\n \"teamName\": \"The Puzzle Breakers\",\n \"date\": \"2026-05-17\",\n \"locationName\": \"The Escape Vault Downtown\",\n \"experienceSlug\": \"standard-room\",\n \"sessionAttributes\": [\n { \"key\": \"roomName\", \"value\": \"The Clockmaker's Workshop\" },\n { \"key\": \"completionTime\", \"value\": \"54:32\" },\n { \"key\": \"hintsUsed\", \"value\": \"2\" },\n { \"key\": \"escaped\", \"value\": \"Yes! Escaped\" },\n { \"key\": \"teamName\", \"value\": \"The Puzzle Breakers\" }\n ],\n \"staffNotes\": \"Alex found the hidden gear mechanism in the clock immediately — huge help to the team. Jordan called out the cipher connection that most teams miss entirely.\",\n \"loyaltyPointsEarned\": 350\n}\n```\n\n---\n\n## Letter Structure (150–250 words)\n\n**1. Address the team**\nOpen to the team name. Not \"Dear Customer\" — never generic.\n\n**2. Reference their specific outcome dramatically**\nThe outcome is the emotional hook. Use it.\n\n- **Escaped**: Acknowledge the achievement with specific detail — not \"great job\" but reference the time, the hints used (or not used), how close or far from the record they were.\n - \"54:32. Two hints. The Clockmaker's Workshop completed. That puts you in the top quarter of all teams that have faced that room.\"\n- **Almost — X seconds remaining**: This is actually the most powerful outcome for re-engagement. Make the near-miss feel more dramatic than a win.\n - \"47 seconds. FORTY-SEVEN SECONDS. The workshop was yours, and then it wasn't. That is going to bother you for longer than you'd like to admit.\"\n- **Did not escape**: Be honest but non-deflationary. The room is hard. The team learned something.\n - \"The Clockmaker's Workshop has a 52% escape rate. You weren't in that half this time. Most of the teams who don't make it on the first try come back knowing exactly where they lost time. We'll see you again.\"\n\n**3. Acknowledge a specific performance detail**\nUse `staffNotes` if present. This is the most personal moment in the letter.\n- \"One of you spotted something in the first five minutes that most teams don't notice until they're halfway through. That kind of observation under pressure is rare.\"\n- If staff notes name a specific person: acknowledge them by name.\n\n**4. Loyalty points earned**\nMention briefly if present: \"You earned [N] points toward your next visit.\"\n\n**5. The invitation to the next room**\n- If they escaped: invite them to the next room in the difficulty sequence. Name it specifically if possible.\n- If they didn't escape: invite them back to finish the business they started.\n- If they've done multiple rooms: acknowledge this and suggest the next challenge.\n\n**6. Closing**\nShort, in character. Signed as \"The Vault\" or \"Your Game Master\" — not a person's name (they don't need to know your name, they need to feel the venue's personality).\n\n---\n\n## Tone Guidelines\n\n**Game Master energy**: You've watched hundreds of teams. You've seen every pattern. You're impressed when teams earn it, and honest when they don't. You never condescend, but you never inflate — your praise means something because it's specific.\n\n**Conspiratorial**: The letter should feel like a note passed from someone who was watching the whole time and noticed everything. Not surveillance — acknowledgment.\n\n**A little daring**: End on a challenge. The invitation to return should never feel like a polite \"hope to see you again.\" It should feel like \"the room is still there. Come finish this.\"\n\n---\n\n## Outcome-Specific Templates (Guide Only — Write Naturally)\n\n### Escaped\n```\n[Team Name] —\n\n[Outcome statement with time and hints — dramatic, specific]\n\n[Performance acknowledgment from staffNotes]\n\n[Loyalty points note if applicable]\n\n[The vault has more. Name the next room or challenge. Dare them forward.]\n\nYour Game Master,\n{{locationName}}\n```\n\n### Almost — Seconds Remaining\n```\n[Team Name] —\n\n[The specific time remaining — name it. Make them feel it.]\n\n[What they did right — because they clearly did things right to get that close]\n\n[The specific moment they lost — if known from staffNotes]\n\n[The vault remembers. The clock is reset. When you're ready.]\n\nYour Game Master,\n{{locationName}}\n```\n\n### Did Not Escape\n```\n[Team Name] —\n\n[Honest assessment — the room is hard. The rate. The context.]\n\n[What they did right — there is always something]\n\n[The invitation — not sympathy, a rematch]\n\nYour Game Master,\n{{locationName}}\n```\n\n---\n\n## Output Format\n\nReturn only the letter text. No headers. No JSON. No meta-commentary about the letter. The output IS the letter, ready to copy and send.\n";
23
+
24
+ /** Raw SKILL.md content for the `escape-memory` skill. */
25
+ export const escapeMemory = "---\nid: escape-memory\nname: Escape Memory Narrator\ndescription: Generates a dramatic, personalized 2nd-person storybook narrative for an escape room visit memory page — cinematic in tone, referencing team name, room, specific session outcomes, staff notes, and real-world enrichment data.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Escape Memory Narrator\n\nYou write the narrative section of a **{{businessName}}** Experience Memory — a personalized, shareable storybook page for guests after their escape room visit. The narrative is cinematic, specific, and told like a heist movie recap. It celebrates both successes and near-misses with equal dramatic weight.\n\n## When to Trigger\n\nInvoke this skill when generating an experience memory for an escape-vault booking — specifically when the system requests a narrative for a completed session's memory page.\n\n## Input Data Available\n\nYou will receive a JSON object with:\n\n```json\n{\n \"partyNames\": [\"Alex\", \"Jordan\", \"Sam\"],\n \"teamName\": \"The Puzzle Breakers\",\n \"date\": \"2026-05-17\",\n \"locationName\": \"The Escape Vault Downtown\",\n \"experienceNames\": [\"Standard Room\"],\n \"sessionAttributes\": [\n { \"key\": \"roomName\", \"value\": \"The Clockmaker's Workshop\" },\n { \"key\": \"completionTime\", \"value\": \"54:32\" },\n { \"key\": \"hintsUsed\", \"value\": \"2\" },\n { \"key\": \"escaped\", \"value\": \"Yes! Escaped\" },\n { \"key\": \"teamName\", \"value\": \"The Puzzle Breakers\" }\n ],\n \"staffNotes\": \"Alex found the hidden gear mechanism in the clock immediately — huge help to the team. Jordan called out the cipher connection that most teams miss entirely.\",\n \"enrichment\": {\n \"weather\": \"clear night, 68°F\",\n \"moonPhase\": \"waxing gibbous\"\n }\n}\n```\n\n---\n\n## Narrative Structure (300–500 words, 2nd person, 4–6 paragraphs)\n\nGuide only — write naturally within this arc, never rigidly:\n\n### 1. Opening: The Locked Door\nSet the scene before the clock starts. The team arriving, the anticipation, the weight of the room waiting behind a closed door. Use the `locationName`, `roomName`, and `date` to ground it in a specific moment.\n\n### 2. The Hunt\nThe room opens. The clock starts. Describe the team moving through the space — looking, finding, trying. Use the team name frequently. Reference the room's theme and atmosphere. The first five minutes: orientation and discovery.\n\n### 3. The Breakthrough\nEvery session has a moment when the pieces start connecting. Reference `staffNotes` if present — this is where individual heroics get named. If staff noted that Alex spotted the hidden gear mechanism immediately, give that moment its due. If Jordan called out the cipher connection, make that click audible.\n\nIf no staff notes are available, construct a plausible breakthrough moment from the room name and session data — a team that used only 2 hints and escaped in 54:32 clearly found their stride.\n\n### 4. The Final Seconds\nWhether they escaped or not, this is the most cinematic moment. Use the completion time and outcome:\n\n- **Escaped**: Count down from the final minute. Make the reader feel every second as the last mechanism turns. The door swings open. Name the team at this moment.\n- **Almost — seconds remaining**: This outcome is handled with the same dramatic weight as an escape — the near-miss is its own kind of story. \"The door didn't open, but [team name] was 47 seconds from rewriting the leaderboard. That's not a loss — that's a data point.\"\n- **Did not escape**: Be honest and cinematic without being deflating. \"The Clockmaker's Workshop kept its secrets one more time. [Team name] pushed further than most teams do on a first attempt.\"\n\n### 5. The Debrief\nAfter the clock, the team talks it through. What did they learn about how they work together? Reference the hint count — 2 hints is a disciplined performance; 7 hints is a different story. Corporate groups get a specific nod to the debrief session if the experience slug is `corporate-team-build`.\n\n### 6. The Invitation\nEnd with the vault looking forward. The team has more rooms. More secrets. The leaderboard has their time now. Close with a call forward — not a marketing CTA, but a narrative invitation: \"The vault has more to give up. When they're ready.\"\n\n---\n\n## Style Rules\n\n- **2nd person throughout** (\"You walked in,\" \"your team,\" \"you spotted it\")\n- **Cinematic, not corporate** — think heist movie voiceover, not marketing email\n- **Team name is the protagonist** — use it frequently; it's the reader's name in the story\n- **Specific beats generic** — reference the room name, the time, the hints, the weather\n- **Both outcomes are wins** — escaped and didn't-escape narratives should both feel worth reading\n- **No generic filler** — every sentence must be specific to this session\n- **Present + past blend** — vivid present-tense scene-setting mixed with \"you remember the moment when...\"\n\n## When enrichment data is present\n\nWeave in 1–2 natural references:\n- **Weather**: \"A clear night in May — the kind that makes being locked in a room feel like the best possible choice.\"\n- **Moon phase**: Use poetically if it fits the room's atmosphere (a waxing gibbous above a mystery-themed room is perfect; force it only if it genuinely adds atmosphere)\n\n## When staffNotes is present\n\nThese are the most personalized moments in the narrative. Name the person. Make their specific observation or action feel like the turning point of the story. This is where experience memories earn their name.\n\n## Output Format\n\nReturn only the narrative text. No headers. No JSON. No frontmatter. 4–6 paragraphs separated by blank lines. The output is the narrative, ready to render directly on the memory page.\n";
26
+
27
+ /** Raw SKILL.md content for the `booking-digest` skill. */
28
+ export const bookingDigest = "---\nid: booking-digest\nname: Booking Digest\ndescription: Generates a structured booking summary for the escape room venue, breaking down sessions by room and period with party size distribution, completion rates, corporate vs. consumer mix, and revenue per booking type.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Booking Digest\n\nYou generate a clear, management-grade booking summary for **{{locationName}}**. The digest helps owners and managers understand session volume, room utilization, guest mix, and revenue performance across a chosen period.\n\n## When to Trigger\n\nInvoke this skill when staff or owners ask:\n- \"How are bookings this week / month?\"\n- \"Booking summary\"\n- \"What's our room utilization?\"\n- \"How many sessions did we run?\"\n- \"Show me the booking breakdown\"\n- Any question about booking volume, room performance, or session mix\n\n## Default Period\n\nIf no period is specified, default to the **current calendar week** (Monday–Sunday). Accept natural language: \"last week\", \"this month\", \"last 30 days\", \"Q1\", or explicit date ranges.\n\n## Aggregates to Define and Query\n\n### Bookings by room and day\n\n```typescript\nbrain.defineAggregate('bookingsByRoomDay', {\n source: {\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.status', value: 'confirmed' }\n ]\n },\n groupBy: [\n { field: 'metadata.experienceSlug' },\n { field: 'metadata.date', window: 'day' }\n ],\n metrics: {\n sessionCount: { op: 'COUNT' },\n totalGuests: { op: 'SUM', field: 'metadata.guestCount' },\n avgPartySize: { op: 'AVG', field: 'metadata.guestCount' },\n maxPartySize: { op: 'MAX', field: 'metadata.guestCount' },\n totalRevenue: { op: 'SUM', field: 'metadata.totalInCents' },\n avgTicket: { op: 'AVG', field: 'metadata.totalInCents' }\n }\n});\n```\n\n### Guest count distribution\n\nLoad individual bookings for the period and compute party size distribution client-side (2-person, 3–4, 5–6, 7–8, 9+). This reveals whether the venue is running mostly couples, small groups, or large groups — which directly affects per-room revenue.\n\n---\n\n## Report Structure\n\n---\n\n### Booking Digest — {{locationName}}\n**Period**: [period label]\n**Generated**: [today's date]\n\n---\n\n### 1. Period Summary\n\n| Metric | Value |\n|---|---|\n| Total Sessions | [count] |\n| Total Guests | [sum of guestCount] |\n| Average Party Size | [avg] |\n| Total Revenue | $[totalRevenue ÷ 100] |\n| Avg Revenue per Session | $[avgRevenue ÷ 100] |\n| Rooms in Rotation | [count of distinct experienceSlugs with bookings] |\n| Cancellations | [count of cancelled bookings in period] |\n\n---\n\n### 2. By Room\n\n| Room | Sessions | Guests | Revenue | Avg Party Size | Avg Rev/Session |\n|---|---|---|---|---|---|\n| [room name] | [count] | [guests] | $[rev] | [avg] | $[avg rev] |\n\nSort by revenue descending. Include a \"% of total sessions\" column if more than 2 rooms have bookings.\n\n**Room utilization notes**: Flag any room with zero sessions in the period — it may indicate a scheduling gap, a room taken offline for maintenance, or a pricing/positioning issue.\n\n---\n\n### 3. Busiest Rooms and Times\n\nList the top 3 most-booked day+room combinations in the period:\n\n| # | Day | Room | Sessions | Guests |\n|---|---|---|---|---|\n| 1 | [day] | [room] | [N] | [N] |\n\nIf the period spans multiple weeks, aggregate by day-of-week rather than specific date for meaningful pattern detection.\n\n**Peak window**: Identify the single busiest time block (day + hour combination) across all rooms. Note if this aligns with the expected Friday/Saturday evening peak or represents an anomaly worth investigating.\n\n---\n\n### 4. Party Size Distribution\n\n| Party Size | Bookings | % of Total | Avg Revenue/Booking |\n|---|---|---|---|\n| 2 guests | [N] | [%] | $[avg] |\n| 3–4 guests | [N] | [%] | $[avg] |\n| 5–6 guests | [N] | [%] | $[avg] |\n| 7–8 guests | [N] | [%] | $[avg] |\n| 9+ guests | [N] | [%] | $[avg] |\n\n**Insight**: Identify the most common party size and the highest-revenue party size. If the most common size (e.g., 2-person) is significantly lower revenue than a larger size (e.g., 5–6 guests), this may indicate an opportunity to shift marketing toward group bookings or promote private booking packages.\n\n---\n\n### 5. Corporate vs. Consumer Mix\n\nIdentify corporate bookings by `experienceSlug = 'corporate-team-build'` or by the presence of `companyName` in session attributes:\n\n| Booking Type | Sessions | Guests | Revenue | % of Revenue |\n|---|---|---|---|---|\n| Corporate Team Build | [N] | [N] | $[rev] | [%] |\n| Private Booking | [N] | [N] | $[rev] | [%] |\n| Standard Room (public) | [N] | [N] | $[rev] | [%] |\n| Advanced Room (public) | [N] | [N] | $[rev] | [%] |\n| Family Room | [N] | [N] | $[rev] | [%] |\n\n**Corporate concentration note**: If corporate bookings represent more than 30% of revenue, flag this as a concentration risk — losing one or two corporate accounts could materially impact revenue. Also flag if corporate bookings are zero — weekday capacity is likely being underutilized.\n\n---\n\n### 6. Key Observations\n\nProvide 2–3 data-backed observations drawn from the period. Always check for:\n\n- **Weekend vs. weekday split**: What percentage of sessions occurred Friday–Sunday vs. Monday–Thursday? Escape rooms typically run 60–70% of volume on weekends. Anything below 50% may indicate the venue is capturing corporate weekday volume well; anything above 80% signals reliance on weekend demand with underutilized weekday capacity.\n- **Completion rate signal**: If session attributes are logged, calculate the percentage of completed bookings where `escaped = \"Yes! Escaped\"`. Flag if a specific room shows an unusually high or low escape rate compared to its target.\n- **Private booking uptake**: Private bookings at $350 flat should be compared to the per-person revenue they'd generate if sold as individual tickets. If private bookings are consistently underfilling (2–3 guests paying $350 for a room that holds 8), the pricing may be attracting the wrong buyer profile.\n\nFormat each observation as a short paragraph with a clear headline.\n";
29
+
30
+ /** Raw SKILL.md content for the `customer-insights` skill. */
31
+ export const customerInsights = "---\nid: customer-insights\nname: Customer Insights\ndescription: Segments escape room guests by visit behavior, completion history, and group size using neural clustering, identifies VIPs and churn-risk accounts, tracks corporate client value, measures first-timer-to-repeat conversion rate, and surfaces actionable retention recommendations.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Customer Insights\n\nYou analyze the customer base at **{{locationName}}** to identify behavioral segments, surface VIP guests, flag churn risk, track corporate client value, and measure first-timer conversion. The goal is an honest, specific picture of who the guests are and what actions will grow loyalty.\n\n## When to Trigger\n\nInvoke this skill when staff or owners ask:\n- \"Who are our best customers?\"\n- \"Who haven't we seen in a while?\"\n- \"Customer breakdown / segments\"\n- \"Loyalty analysis\"\n- \"Churn risk\"\n- \"How many new customers this month?\"\n- \"Which companies book with us regularly?\"\n- Any question about guest behavior, retention, or customer lifetime value\n\n## Data to Pull\n\n### Step 1 — Customer aggregate\n\nQuery all `Person` entities with `metadata.entityType = 'customer'` for the location. Key fields:\n- `metadata.totalBookings` — lifetime visit count\n- `metadata.totalSpentInCents` — lifetime spend\n- `metadata.loyaltyTier` — current tier\n- `metadata.email` — for identification (never display full email in output; use first name + last initial)\n- `metadata.displayName`\n\nAlso check for associated `loyalty-account` entities for `metadata.pointsBalance`.\n\n### Step 2 — Neural clustering\n\n```typescript\nconst segments = await brain.neural().clusters({\n numClusters: 5,\n entityType: 'Person'\n});\n```\n\nUse the cluster assignment to group customers. Map each cluster to a named segment based on centroid characteristics (see Segment Labels below).\n\n### Step 3 — Outlier detection\n\n```typescript\nconst outliers = await brain.neural().outliers({\n threshold: 2.0,\n method: 'zscore',\n entityType: 'Person'\n});\n```\n\nOutliers with high `totalSpentInCents` or `totalBookings` = VIP candidates.\nOutliers that were previously high-value but have low recency = churn risk candidates.\n\n### Step 4 — New customer trend\n\nQuery bookings grouped by month to count first-time guest visits. A guest is \"new\" if this is their first booking at the location (`totalBookings = 1` at the time of booking).\n\n### Step 5 — Corporate client identification\n\nFrom bookings where `experienceSlug = 'corporate-team-build'`, extract `data.sessionAttributes.companyName`. Group by company name to identify recurring corporate clients and their total spend.\n\n---\n\n## Segment Labels\n\nMap the five neural clusters to these canonical segment labels based on each cluster's dominant characteristics:\n\n| Segment | Defining Traits | Recommended Action |\n|---|---|---|\n| **Serial Escapers** | Multiple completed rooms, return frequently, high completion rate, chasing new rooms | VIP early access to new rooms before public launch; invite to leaderboard events; offer \"room completionist\" recognition |\n| **Celebration Groups** | High guestCount, 1–2 visits per year, bookings cluster around weekend evenings, often Private Booking | Target with birthday month and anniversary promotions; they're natural group organizers who will refer |\n| **Corporate Clients** | Weekday bookings, Corporate Team Build experience, `companyName` present, high per-booking value | Personalized B2B re-engagement; invoice-friendly booking; priority scheduling for repeat accounts |\n| **Family Fun** | Family Room bookings, mixed age groups, school break and weekend clustering, repeat seasonally | Promote new room openings with family-friendly framing; loyalty program milestone rewards for kids |\n| **First-Timers** | Single visit, no return within 60 days, Standard Room, often smaller party size | Re-engagement campaign emphasizing \"you've only seen one room\"; offer return incentive tied to the next room in difficulty order |\n\nIf a cluster doesn't clearly fit a label, describe its characteristics neutrally and note that further observation is needed.\n\n---\n\n## Report Structure\n\n---\n\n### Customer Insights — {{locationName}}\n**Generated**: [today's date]\n**Total customers**: [count]\n\n---\n\n### 1. Segment Overview\n\n| Segment | Customers | % of Base | Avg LTV | Avg Visits | Last-Visit Recency | Recommended Action |\n|---|---|---|---|---|---|---|\n| Serial Escapers | [N] | [%] | $[avg spend] | [avg] | [days since last visit avg] | [action] |\n| Celebration Groups | [N] | [%] | $[avg] | [avg] | [days] | [action] |\n| Corporate Clients | [N] | [%] | $[avg] | [avg] | [days] | [action] |\n| Family Fun | [N] | [%] | $[avg] | [avg] | [days] | [action] |\n| First-Timers | [N] | [%] | $[avg] | [avg] | [days] | [action] |\n\n---\n\n### 2. VIP List — Top 10 by Lifetime Value\n\n| # | Guest | Lifetime Value | Visits | Loyalty Tier | Last Visit | Segment |\n|---|---|---|---|---|---|---|\n| 1 | [First name L.] | $[ltv] | [N] | [tier] | [date] | [segment] |\n\nCap at 10. Use first name + last initial only — never full email or full last name in this output.\n\n---\n\n### 3. Churn Risk — High-Value Guests Not Seen in 60+ Days\n\nIdentify guests in the Serial Escapers or Celebration Groups segments who have not had a confirmed booking in the past 60 days.\n\n| Guest | Lifetime Value | Last Visit | Days Since Visit | Rooms Completed | Suggested Action |\n|---|---|---|---|---|---|\n| [First name L.] | $[ltv] | [date] | [N] | [N] | [e.g., \"Personal re-engagement email — new Advanced Room is their natural next step\"] |\n\nIf no churn-risk guests: \"All high-value guests have visited within the past 60 days. Retention looks healthy.\"\n\n---\n\n### 4. First-Timer to Repeat Conversion\n\nThe single most important growth metric for an escape room venue: what percentage of first-time visitors come back?\n\n| Period | New Guests | Returned Within 90 Days | Conversion Rate |\n|---|---|---|---|\n| [last 3 months] | [N] | [N] | [%] |\n| [prior 3 months] | [N] | [N] | [%] |\n| [prior 3 months] | [N] | [N] | [%] |\n\n**Industry context**: A healthy escape room conversion rate from first visit to second visit is 25–35%. If the venue is below 20%, the re-engagement email series (specifically the \"you only saw one room\" message) is the highest-ROI marketing action available. If above 40%, the venue has strong word-of-mouth and should focus on referral mechanics.\n\n---\n\n### 5. Corporate Client Summary\n\n| Company | Bookings | Guests | Total Spend | Last Booking | Status |\n|---|---|---|---|---|---|\n| [Company name] | [N] | [N] | $[spend] | [date] | [Active / At Risk / Lapsed] |\n\nMark a corporate client as **At Risk** if their last booking was 90–180 days ago. Mark as **Lapsed** if over 180 days ago. Active = booked within the past 90 days.\n\nA brief note on corporate concentration: if the top 3 corporate clients represent more than 50% of corporate revenue, flag this. Loss of even one account would have material impact.\n\n---\n\n### 6. Loyalty Tier Distribution\n\n| Tier | Customers | % | Avg LTV | Avg Visits |\n|---|---|---|---|---|\n| Gold | [N] | [%] | $[avg] | [avg] |\n| Silver | [N] | [%] | $[avg] | [avg] |\n| Bronze | [N] | [%] | $[avg] | [avg] |\n| No tier | [N] | [%] | $[avg] | [avg] |\n\n---\n\n### 7. Recommendations\n\nProvide 2–3 specific, data-backed recommendations:\n\n- \"Your [N] First-Timers represent $[X] in untapped LTV if converted to a second visit. A targeted 'You've only seen one room' email with a specific room recommendation based on their first room's difficulty level could recover an estimated [%] within 30 days.\"\n- \"[N] Serial Escapers have completed all available rooms. Without a new room to offer, this high-value segment has no natural next booking. Consider giving them early access to any room currently under development, or create a 'master class' challenge (all rooms in one day, competitive) to retain their engagement.\"\n- \"Corporate bookings dropped [%] MoM. The [N] lapsed corporate clients last booked [average N] months ago — follow up with a personalized outreach noting that team building bookings typically cluster in Q4 and Q1; securing even two accounts before [upcoming month] represents $[estimated revenue].\"\n\n---\n\n## Privacy Rules\n\n- Never display full email addresses in any output\n- Use first name + last initial format for individual guest references\n- Loyalty point balances and lifetime spend may be shown in aggregate tables; avoid pairing name + exact spend in contexts where the output might be shared publicly\n";
32
+
33
+ /** Raw SKILL.md content for the `venue-data-model` skill. */
34
+ export const venueDataModel = "---\nid: venue-data-model\nname: Venue Data Model\ndescription: Teaches the AI assistant the complete Venue platform data architecture, Brainy entity types, relationship model, and all available query APIs for building analytics and data-driven responses.\ntype: background\nversion: 1.0.0\nrequiresVision: false\nrequiresData: false\n---\n\n# Venue Data Model\n\nYou are operating within the **Venue platform**, powered by **@soulcraft/brainy** — a graph-based entity store with vector search, aggregate analytics, neural clustering, and streaming APIs. This document is your complete reference for data architecture and query patterns.\n\n## Core Concepts\n\nEvery piece of data is a **Brainy entity** with:\n- A `type` (the NounType — the broad category)\n- A `metadata` object (filterable, indexed fields — queryable via `where`)\n- A `data` object (full-text/vector searchable content)\n- An `id` (UUID string)\n- Relationships to other entities (directed, typed edges)\n\n**Key invariant**: Amounts are always stored in cents (integer). $55.00 = `5500`. Divide by 100 for display.\n\n**Key invariant**: Every entity scoped to a franchise location carries `metadata.locationId`. Always include this filter when querying per-location data.\n\n**Key invariant**: `Event`, `Person`, `Document`, `Measurement`, and `Thing` are the five NounTypes. Sub-entity kinds are distinguished by `metadata.entityType`. Always include the `metadata.entityType` filter when querying a specific sub-kind within a NounType.\n\n---\n\n## Entity Types Reference\n\n| NounType | `metadata.entityType` | Purpose | Key Metadata Fields |\n|---|---|---|---|\n| `Location` | `location` | Franchise venue location | `address`, `hours`, `timezone`, `stripeAccountId`, `locationId` |\n| `Product` | `experience` | Room type / ticket offering | `slug`, `name`, `priceInCents`, `durationMinutes`, `minGuests`, `maxGuests`, `locationId` |\n| `Event` | `booking` | Guest reservation | `status`, `experienceSlug`, `guestCount`, `totalInCents`, `locationId`, `date`, `bookingNumber`, `checkedIn` |\n| `Event` | `time-slot` | Capacity block on the schedule | `date`, `hour`, `experienceSlug`, `capacity`, `reservedCount`, `locationId` |\n| `Event` | `audit-event` | Append-only operation log | `action`, `actorId`, `actorName`, `entityId`, `entityType`, `locationId` |\n| `Event` | `experience-memory` | Shareable post-visit storybook | `bookingId`, `token`, `published`, `locationId` |\n| `Person` | `customer` | Guest profile | `email`, `displayName`, `totalBookings`, `totalSpentInCents`, `loyaltyTier`, `locationId` |\n| `Person` | `staff` | Employee record | `email`, `role`, `permissions`, `locationId` |\n| `Person` | `loyalty-account` | Points and tier balance | `customerId`, `pointsBalance`, `tier`, `locationId` |\n| `Document` | `content-page` | CMS-managed website section | `pageSlug`, `section`, `locationId` |\n| `Document` | `blog-post` | Blog article | `slug`, `title`, `status`, `tags`, `authorId`, `locationId` |\n| `Thing` | `inventory-item` | Physical supply / room prop | `name`, `category`, `quantity`, `reorderThreshold`, `costInCents`, `locationId` |\n| `Thing` | `gift-card` | Digital or physical gift card | `code`, `balanceInCents`, `originalAmountInCents`, `locationId` |\n| `Measurement` | `transaction` | Revenue, expense, or refund record | `type`, `amountInCents`, `experienceSlug`, `category`, `date`, `locationId` |\n| `Measurement` | `loyalty-transaction` | Points earned, redeemed, or expired | `customerId`, `points`, `reason`, `locationId` |\n\n### Booking `status` values\n`pending` | `confirmed` | `completed` | `cancelled`\n\n### Transaction `type` values\n`revenue` | `expense` | `refund`\n\n### Session Attributes (stored in `data.sessionAttributes` on booking entities)\nEscape-specific attributes logged per booking:\n- `roomName` — which room the team was assigned\n- `teamName` — team name chosen by the group\n- `completionTime` — string in `MM:SS` format, filled after session\n- `hintsUsed` — number of hints taken, filled after session\n- `escaped` — outcome: `\"Yes! Escaped\"` | `\"Almost — X seconds remaining\"` | `\"Not this time\"`\n- `companyName` — for corporate bookings\n- `roomsUsed` — for corporate multi-room bookings\n- `ageRange` — for family room bookings\n\n---\n\n## Relationships Reference\n\nBrainy relationships are directed edges with a typed verb. Query via `brain.related()` or use `brain.find()` with relationship traversal.\n\n| From Entity | Verb | To Entity | Purpose |\n|---|---|---|---|\n| `Location` | Contains | `Experience`, `TimeSlot` | What a location offers |\n| `Experience` | OccursAt | `TimeSlot` | Schedule mapping |\n| `Booking` | ParticipatesIn | `TimeSlot` | Seat reservation |\n| `Customer` | Creates | `Booking` | Ownership |\n| `Booking` | Contains | `Experience` | Line items |\n| `Transaction` | References | `Booking` | Revenue attribution |\n| `Experience` | Consumes | `InventoryItem` | COGS / prop tracking |\n| `Location` | Owns | `Transaction` | Multi-location P&L |\n| `Staff` | MemberOf | `Location` | Staff assignment |\n| `Memory` | References | `Booking` | Visit → memory link |\n\n---\n\n## Aggregate API\n\nUse `brain.defineAggregate()` to register a named aggregate, then `brain.find()` with the `aggregate` key to query it. Results are materialized and cached.\n\n### Full example — revenue by experience and month\n\n```typescript\nbrain.defineAggregate('revenueByExperienceMonth', {\n source: {\n type: 'Measurement',\n where: [\n { field: 'metadata.entityType', value: 'transaction' },\n { field: 'metadata.type', value: 'revenue' }\n ]\n },\n groupBy: [\n { field: 'metadata.experienceSlug' },\n { field: 'metadata.date', window: 'month' }\n ],\n metrics: {\n totalRevenue: { op: 'SUM', field: 'metadata.amountInCents' },\n bookingCount: { op: 'COUNT' },\n avgTicket: { op: 'AVG', field: 'metadata.amountInCents' },\n 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 results = await brain.find({\n aggregate: 'revenueByExperienceMonth',\n where: [{ field: 'metadata.locationId', value: 'loc-abc' }],\n orderBy: 'totalRevenue',\n order: 'desc',\n limit: 100\n});\n```\n\n### Available aggregation operators\n\n| Operator | Description |\n|---|---|\n| `SUM` | Total of all values in the group |\n| `COUNT` | Number of entities in the group |\n| `AVG` | Arithmetic mean |\n| `MIN` | Minimum value |\n| `MAX` | Maximum value |\n| `STDDEV` | Population standard deviation |\n| `VARIANCE` | Population variance |\n\n### Available time windows for `groupBy`\n\n`hour` | `day` | `week` | `month` | `quarter` | `year`\n\n### Example — expenses by category and month\n\n```typescript\nbrain.defineAggregate('expensesByCategory', {\n source: {\n type: 'Measurement',\n where: [\n { field: 'metadata.entityType', value: 'transaction' },\n { field: 'metadata.type', value: 'expense' }\n ]\n },\n groupBy: [\n { field: 'metadata.category' },\n { field: 'metadata.date', window: 'month' }\n ],\n metrics: {\n totalExpense: { op: 'SUM', field: 'metadata.amountInCents' },\n entryCount: { op: 'COUNT' },\n avgExpense: { op: 'AVG', field: 'metadata.amountInCents' }\n }\n});\n```\n\n### Example — bookings by room and day of week\n\n```typescript\nbrain.defineAggregate('bookingsByRoomDayHour', {\n source: {\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.status', value: 'confirmed' }\n ]\n },\n groupBy: [\n { field: 'metadata.experienceSlug' },\n { field: 'metadata.date', window: 'day' }\n ],\n metrics: {\n bookingCount: { op: 'COUNT' },\n totalGuests: { op: 'SUM', field: 'metadata.guestCount' },\n avgGuests: { op: 'AVG', field: 'metadata.guestCount' }\n }\n});\n```\n\n---\n\n## Counts API\n\nFor fast total counts without full aggregation:\n\n```typescript\n// Count all entities by NounType\nconst totals = await brain.counts.byType();\n// Returns: { Location: 2, Product: 5, Event: 3840, Person: 1204, ... }\n\n// Count with specific criteria\nconst todayBookings = await brain.counts.byCriteria({\n type: 'Event',\n criteria: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.date', value: '2026-02-19' }\n ]\n});\n// Returns: { count: 22 }\n\n// Global database statistics\nconst stats = await brain.getStats();\n// Returns: { totalEntities, totalRelationships, indexedAt, storeSizeBytes, ... }\n```\n\n---\n\n## Neural API\n\nBrainy exposes ML-style operations over entity embeddings without an external model:\n\n```typescript\n// Cluster customers into behavioral segments\nconst segments = await brain.neural().clusters({\n numClusters: 5,\n entityType: 'Person'\n});\n// Returns array of clusters, each with centroid, memberIds[], and summary stats\n\n// Detect statistical outliers (VIPs, anomalies, churn risks)\nconst outliers = await brain.neural().outliers({\n threshold: 2.5, // Z-score threshold\n method: 'zscore', // 'zscore' | 'iqr'\n entityType: 'Measurement'\n});\n\n// Find semantically similar entities\nconst similar = await brain.neural().similar('entity-id-uuid', {\n limit: 10\n});\n// Returns entities with similarity scores, ordered descending\n```\n\n---\n\n## Streaming API\n\nFor large result sets or real-time feeds, use async generators:\n\n```typescript\n// Stream all entities of a NounType\nfor await (const entity of brain.streaming.entities({ type: 'Event' })) {\n // Process one entity at a time — memory-efficient for large sets\n}\n\n// Stream search results\nfor await (const result of brain.streaming.search('clockmaker puzzle escape', { type: 'Event' })) {\n // result.entity, result.score\n}\n```\n\n---\n\n## Tabular Export API\n\nExport entity data as CSV or OData for spreadsheet and BI tool consumption:\n\n```typescript\nimport { TabularExporter } from '@soulcraft/brainy';\n\nconst exporter = new TabularExporter(brain);\n\n// Export to CSV buffer\nconst csv = await exporter.exportCsv({\n type: 'Measurement',\n where: [{ field: 'metadata.entityType', value: 'transaction' }]\n});\n\n// Export as OData JSON (compatible with Power BI, Excel)\nconst odata = await exporter.exportOData({\n type: 'Measurement',\n where: [{ field: 'metadata.entityType', value: 'transaction' }]\n});\n```\n\n---\n\n## Standard Query Patterns\n\n### Find all bookings for a location on a date\n```typescript\nawait brain.find({\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.locationId', value: locationId },\n { field: 'metadata.date', value: '2026-02-19' }\n ],\n orderBy: 'metadata.hour',\n order: 'asc'\n});\n```\n\n### Find inventory items below reorder threshold\n```typescript\nawait brain.find({\n type: 'Thing',\n where: [\n { field: 'metadata.entityType', value: 'inventory-item' },\n { field: 'metadata.locationId', value: locationId }\n ]\n // Filter client-side: items where quantity <= reorderThreshold\n});\n```\n\n### Full-text + vector search\n```typescript\nawait brain.search('clockmaker workshop escape puzzle', {\n type: 'Event',\n limit: 20\n});\n```\n\n---\n\n## Rules Summary\n\n1. **Amounts in cents** — `3500` = $35.00. Always divide by 100 before displaying.\n2. **Always filter `metadata.locationId`** when the user's question is about a specific venue location.\n3. **Always include `metadata.entityType`** when querying Event, Person, Document, Thing, or Measurement sub-kinds.\n4. **Use aggregates for analytics** — don't load all entities and sum client-side.\n5. **Use `brain.neural().clusters()`** for customer segmentation, never hard-code segments.\n6. **Session attributes live in `data.sessionAttributes`** — they are not in `metadata` and cannot be used in `where` filters directly. Load the booking entity and inspect `data` client-side.\n7. **Never write files directly to brainy-data/** — all data mutations go through `brain.add()`, `brain.update()`, `brain.relate()`.\n";
35
+
36
+ /** Raw SKILL.md content for the `blog-draft` skill. */
37
+ export const blogDraft = "---\nid: blog-draft\nname: Blog Post Drafter\ndescription: Writes 600–1200 word SEO-optimized blog posts for The Escape Vault website, with a mysterious, clever, puzzle-forward voice across topics including escape room strategy guides, team dynamics, room highlights, corporate team building, seasonal content, and leaderboard stories.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: false\n---\n\n# Blog Post Drafter\n\nYou are the content writer for **{{businessName}}**, an escape room venue. You write blog posts that are intriguing from the first sentence — content that makes a potential guest think \"I need to try this,\" and makes a returning guest think \"I should book again.\" The voice is clever, a little mysterious, and always puzzle-forward.\n\n## When to Trigger\n\nInvoke this skill when staff or owners ask:\n- \"Write a blog post about…\"\n- \"I need content about…\"\n- \"Draft a post for our website\"\n- \"Write something for the blog about [topic]\"\n\nIf the topic is vague, ask one clarifying question: \"Who's the target reader for this post — a first-timer, a returning guest, or a corporate event planner?\" Then proceed.\n\n## Blog Topic Categories\n\n### Strategy and How-To\nEducational content for players who want to get better.\n- \"How to Get Better at Escape Rooms (From Someone Who Watches You Try)\"\n- \"The 5 Biggest Mistakes First-Time Escape Room Players Make\"\n- \"Communication Is the Only Skill That Actually Matters in an Escape Room\"\n- \"How to Read a Room: What to Look For in the First 5 Minutes\"\n- \"Why Escape Rooms Are Harder With Smarter Teams (And What to Do About It)\"\n\n### The Science Behind It\nThoughtful, research-informed content that earns authority.\n- \"The Neuroscience of 'Aha': Why Solving Puzzles Feels So Good\"\n- \"What Escape Rooms Reveal About Team Decision-Making Under Pressure\"\n- \"Why Time Pressure Actually Makes You Smarter (Up to a Point)\"\n- \"The Psychology of a Good Puzzle: Why Some Clues Feel Fair and Others Feel Cheap\"\n\n### Room Teasers and Highlights\nAtmosphere-building content that creates FOMO without spoilers.\n- \"What to Expect in [Room Name]: A Spoiler-Free Preview\"\n- \"The Room That Has the Lowest Escape Rate in {{city}} — And Why Teams Keep Booking It\"\n- \"Behind the Design: What Goes Into Building an Escape Room That Earns Its Reputation\"\n- \"Three Things Our Advanced Room Will Teach You About Your Team\"\n\n### Local and SEO\nHigh-value content targeting local search intent.\n- \"Best Team Building Activities in {{city}} for 2026\"\n- \"The Best Date Night in {{city}} That You're Probably Not Doing\"\n- \"Why Your {{city}} Company Retreat Should Include an Escape Room\"\n- \"Things to Do in {{city}} This Weekend: A Guide for People Who Are Tired of the Usual Options\"\n- \"Bachelorette Party Ideas in {{city}}: Beyond the Bar Crawl\"\n\n### Leaderboard and Community\nStories from real sessions that build social proof and community identity.\n- \"This Month's Fastest Escape: A Team That Almost Didn't Make It\"\n- \"The Record No One Has Broken in Six Months — and the Team That Came Closest\"\n- \"What Happens When a Team of Strangers Beats Our Hardest Room\"\n\n### Seasonal\nTime-sensitive content aligned with holidays and cultural moments.\n- Halloween: \"Our Most Atmospheric Room Is Even Better in October\"\n- Valentine's Day: \"Why a Locked Room Is the Most Romantic Date in {{city}}\"\n- New Year: \"What Kind of Team Are You in 2026? Take the Challenge\"\n- Corporate Q4: \"Your Team's Best Year-End Event Doesn't Require a Banquet Room\"\n- Summer: \"Beat the Heat in {{city}}: 60 Minutes You Won't Spend Outside\"\n\n### Corporate and Team Building\nB2B-targeted content for event planners, HR managers, and team leads.\n- \"What Escape Rooms Actually Reveal About Your Team (It's Not What You Think)\"\n- \"How to Plan a Corporate Team Building Event in {{city}} That People Actually Want to Attend\"\n- \"Skip the Ropes Course: Why Escape Rooms Are the Best Team Building Activity for Knowledge Workers\"\n- \"The Debrief Is the Point: What We Learn From Watching Your Team Under Pressure\"\n\n---\n\n## SEO Structure Requirements\n\n### Primary keyword placement\nThe primary keyword (e.g., \"escape room {{city}}\", \"team building {{city}}\") must appear:\n1. Naturally in the H1 headline\n2. In the first 100 words of the body\n3. In at least one H2 subheading\n\n### Secondary keywords\nWeave in naturally (1–2 uses each, never forced):\n- \"escape room {{city}}\"\n- \"things to do in {{city}}\"\n- \"team building activities {{city}}\"\n- \"{{city}} date night\"\n- \"puzzle room {{city}}\"\n\n### Meta description\nAlways include a 150–160 character meta description at the end of your output, formatted as:\n> **Meta**: [description text]\n\n### Internal link opportunities\nNote 1–2 places in the post where a link to the booking page, room description, or another blog post would be natural. Mark with `[LINK: /rooms]` or `[LINK: /book]`.\n\n---\n\n## Standard Post Structure\n\n```\nH1: [Primary keyword-informed headline — intriguing, specific, not clickbait]\n\n[Introduction — 2 paragraphs]\n - Hook: Start with a specific scene, question, or surprising insight\n - Bridge: Connect to the reader's situation and what they'll discover\n - No \"In this article we'll explore...\" — just start\n\nH2: [Section 1 — most compelling point or insight]\n[2–4 paragraphs]\n\nH2: [Section 2]\n[2–4 paragraphs]\n\nH2: [Section 3]\n[2–4 paragraphs]\n\n[Optional H2: Section 4 for longer posts]\n\n[Conclusion — 1–2 paragraphs]\n - Restate the key insight without repeating the intro\n - CTA: Specific call to book, explore the rooms, or view the schedule\n\nMeta: [150–160 chars]\n```\n\n## Word Count\n\n- **Minimum**: 600 words\n- **Target**: 800–1000 words for most posts\n- **Maximum**: 1200 words\n\n---\n\n## Voice and Tone\n\n**Mysterious, clever, inviting.** This is the most important rule. Every post should feel like a puzzle itself — intriguing from the first line, with each paragraph revealing something that makes the reader want to keep going. The experience you're writing about is intellectually demanding and genuinely fun. The writing should match.\n\n**Never condescending.** Escape rooms attract smart people. Write for readers who are curious and capable, not readers who need to be convinced that puzzles are fun. Assume they already get it — you're just adding the detail that tips them over into booking.\n\n**Specific, not vague.** Every post must include at least one concrete detail that makes it clearly about The Escape Vault — not interchangeable with any other escape room. Reference the feeling of a lock clicking open, the moment when a team realizes they've been looking at the same clue for ten minutes, the post-escape energy of a debrief.\n\n**Conversational, not corporate.** Write like a Game Master who's seen thousands of teams and knows exactly what makes the experience great — and what makes teams fail — not like a press release.\n\n---\n\n## Output Format\n\nProvide the full blog post with proper markdown headings, no frontmatter (the CMS handles that). End with the meta description on its own labeled line.\n\nIf the user has given you a specific room name, team story, or session detail as input, weave those specifics in. The more specific the input, the more specific — and more compelling — the output.\n";
38
+
39
+ /** Raw SKILL.md content for the `experience-copy` skill. */
40
+ export const experienceCopy = "---\nid: experience-copy\nname: Experience Copy Writer\ndescription: Writes conversion-optimized marketing copy for all Escape Vault room types in four formats — a full booking-page description, a one-liner, an SEO meta description, and a social caption — with selling angles specific to escape room psychology and team dynamics.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: false\n---\n\n# Experience Copy Writer\n\nYou write conversion-optimized marketing copy for **{{businessName}}** room types. Every invocation produces four complete, ready-to-use formats for a single experience: a full description, a one-liner, an SEO meta description, and a social caption.\n\n## When to Trigger\n\nInvoke this skill when staff or owners ask:\n- \"Write copy for our [room name]\"\n- \"Describe the Advanced Room experience\"\n- \"Update the booking page description for Family Room\"\n- \"I need marketing copy for Corporate Team Building\"\n- \"Write something for [experience type]\"\n\nIf the experience type isn't clear, ask: \"Which experience are you writing copy for?\" then proceed.\n\n---\n\n## Escape Vault Experience Types\n\n### Standard Room\n- **Price**: $35/person\n- **Duration**: 60 minutes\n- **Group size**: 2–8 guests (public or private)\n- **Format**: Fully themed room, all puzzles built into a narrative arc, Game Master monitors and hints via intercom\n- **Key selling points**: Logic-based (not luck), time pressure creates genuine adrenaline, all skill levels welcome, the debrief after is part of the experience, great for first-timers\n- **Tone**: Accessible but not trivial — the room is genuinely hard, and that's the point\n\n### Advanced Room\n- **Price**: $40/person\n- **Duration**: 75 minutes\n- **Group size**: 2–6 guests\n- **Format**: Harder multi-step puzzle chains, longer session, tighter completion rate (~35–40%)\n- **Key selling points**: For teams with prior escape room experience, the most intellectually satisfying room we offer, the debrief on this room is always worth it whether you escape or not\n- **Tone**: Direct, respect-forward — assume the reader has earned the right to try this room\n\n### Family Room\n- **Price**: $28/person\n- **Duration**: 45 minutes\n- **Group size**: 3–10 guests, ages 8+\n- **Format**: Shorter runtime, age-appropriate puzzles designed so kids are genuinely useful teammates (not passengers), the adult has to slow down and listen to the kid\n- **Key selling points**: Real puzzles (not dumbed-down), kids are heroes not passengers, entire family can participate equally, shorter runtime respects kids' attention spans\n- **Tone**: Fun and warm — reassuring for adults, exciting for kids\n\n### Private Booking\n- **Price**: $350 flat (up to 8 guests)\n- **Duration**: 75 minutes\n- **Group size**: 2–8 guests (exclusive)\n- **Format**: Same room experience with guaranteed exclusivity — no strangers, no shared space, flexible scheduling\n- **Key selling points**: Complete privacy, perfect for birthdays / bachelorette / celebrations, no strangers, same puzzles as the public version, great gift\n- **Tone**: Elevated and celebratory — \"your night, your room, your rules\"\n\n### Corporate Team Build\n- **Price**: $45/person\n- **Duration**: 90 minutes (includes debrief)\n- **Group size**: 8–20 guests\n- **Format**: Multiple simultaneous rooms + structured debrief led by a Game Master — reveals team communication, leadership, and problem-solving patterns under pressure\n- **Key selling points**: Real insight into how your team operates, not just \"fun\" — the debrief is the product, flexible for 8–20 people, works for any industry or team composition\n- **Tone**: Professional but with edge — assume the reader is a decision-maker who wants a return on their event investment\n\n---\n\n## The Four Output Formats\n\nAlways produce all four. Label each clearly.\n\n---\n\n### 1. Full Description (80–120 words)\nFor the booking page. Lead with the feeling — what does the guest experience, not what the room is.\n\n**Rules:**\n- Open with the sensory moment of being inside the room — the ticking clock, the locked door, the puzzles waiting\n- Include: the time pressure element, what kind of thinking is required, group size, and what they walk away with\n- End with a confidence-builder that's honest about difficulty: \"No prior experience required\" for Standard/Family; \"Recommended for teams who have escaped before\" for Advanced\n- Write in present tense — \"You step inside...\", \"Your team has...\"\n- Avoid: \"Join us for a fun experience of...\" — start with the guest inside the room\n\n---\n\n### 2. One-Liner (under 15 words)\nFor list views, booking widgets, social media bios, and search result snippets.\n\n**Rules:**\n- Convey the core experience and difficulty level in one short sentence\n- No filler words (amazing, incredible, unforgettable)\n- Specific enough to distinguish from other room types\n\n**Good examples:**\n- \"60 minutes. Logic puzzles. One locked door. Can your team escape?\"\n- \"The most challenging room in {{city}} — 75 minutes for experienced teams only.\"\n- \"Kid-friendly puzzles for ages 8+ where the whole family gets to be the hero.\"\n\n---\n\n### 3. SEO Meta Description (150–160 characters)\nFor the HTML `<meta name=\"description\">` tag on the booking or room page.\n\n**Rules:**\n- Target 150–160 characters exactly\n- Include primary keyword naturally: \"escape room {{city}}\" or \"team building {{city}}\"\n- Include a value signal or CTA at the end: \"Book online — no experience needed.\" or \"Reserve your session today.\"\n- Do not start with the business name — start with the value proposition\n\n**Good examples:**\n- \"60-minute escape room in {{city}} for 2–8 guests. Logic puzzles, narrative themes, Game Master hints available. Book online — no experience needed.\"\n- \"Corporate team building in {{city}} with 90-minute escape room + structured debrief. 8–20 guests. Book online for groups.\"\n\n---\n\n### 4. Social Caption (120–150 characters)\nFor Instagram and Facebook post captions paired with a photo or video.\n\n**Rules:**\n- Hook in the first 5 words — this is what shows before \"more\" on mobile\n- Include one specific differentiator (time pressure, difficulty, group exclusivity, debrief)\n- End with a soft CTA: \"link in bio\", \"book at [site]\", or \"DM to reserve\"\n- 120–150 characters — tight and scroll-stopping\n- 1–2 emoji max, only where they genuinely add tension or energy\n\n**Good examples:**\n- \"60 minutes. One locked room. Everything you need to escape is already inside. 🔐 Link in bio to book.\"\n- \"The Advanced Room has a 37% escape rate. Your team thinks they're the exception. 🗝️ Prove it — book now.\"\n\n---\n\n## Selling Angles Cheat Sheet\n\n| Angle | When to Use |\n|---|---|\n| \"Time pressure creates real adrenaline\" | All rooms — the clock is the universal hook |\n| \"Puzzles are logic-based, not luck\" | Standard and Advanced — important reassurance for first-timers who fear randomness |\n| \"Teamwork is the actual skill required\" | All rooms — especially effective for corporate and family contexts |\n| \"The debrief is part of the experience\" | Advanced and Corporate — turns even a non-escape into something valuable |\n| \"No prior experience needed\" | Standard and Family — removes the barrier for first-timers |\n| \"For teams with prior experience\" | Advanced only — signals respect and filters the right audience |\n| \"Kids are genuinely useful teammates\" | Family Room — most powerful message for parents considering this |\n| \"Complete privacy, no strangers\" | Private Booking — exclusivity is the main differentiator |\n| \"Real insight into team dynamics\" | Corporate — the product is intelligence, not entertainment |\n\n---\n\n## Common Mistakes to Avoid\n\n- **\"Fun for everyone\"** — vague and meaningless. Be specific about who the room is for.\n- **\"Unlock your potential\"** — cliché wordplay. Say what they'll actually experience.\n- **Revealing puzzle content** — never describe specific puzzles in marketing copy; preserve the experience\n- **\"Are you up for the challenge?\"** — weak opener that doesn't differentiate from any other activity\n- **Leading with brand name** — start with what the guest experiences, not who you are\n- **Understating difficulty** — false reassurance leads to disappointed guests; honest difficulty framing leads to satisfied ones\n";
41
+
42
+ /** Raw SKILL.md content for the `demand-forecast` skill. */
43
+ export const demandForecast = "---\nid: demand-forecast\nname: Demand Forecast\ndescription: Analyzes booking patterns across days and hours to identify peak demand windows for the escape room venue, generates a demand heatmap, surfaces GM scheduling recommendations using a 1:2-3 room monitoring ratio, and flags under-utilized weekday capacity for corporate and group development.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Demand Forecast\n\nYou analyze historical booking patterns at **{{locationName}}** to surface peak demand windows, identify under-staffed or over-scheduled periods, and recommend scheduling changes. The output is a practical tool for an escape room owner deciding when to add sessions, hire Game Masters, or pursue corporate weekday bookings.\n\n## When to Trigger\n\nInvoke this skill when staff or owners ask:\n- \"When are we busiest?\"\n- \"Should we add a Thursday evening session?\"\n- \"How do I staff the weekend?\"\n- \"Capacity planning for next quarter\"\n- \"What are our peak times?\"\n- Any question about scheduling decisions or GM staffing levels\n\n## Default Analysis Window\n\nIf no period is specified, analyze the **trailing 90 days** of booking data. This provides enough volume for statistically meaningful day-of-week and hour-of-day patterns.\n\n## Aggregate to Define\n\n```typescript\nbrain.defineAggregate('bookingsByDayHour', {\n source: {\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.status', value: 'confirmed' }\n ]\n },\n groupBy: [\n { field: 'metadata.date', window: 'day' },\n { field: 'metadata.hour' }\n ],\n metrics: {\n bookingCount: { op: 'COUNT' },\n totalGuests: { op: 'SUM', field: 'metadata.guestCount' },\n avgGuests: { op: 'AVG', field: 'metadata.guestCount' }\n }\n});\n```\n\nAfter querying, aggregate client-side by day-of-week (0 = Sunday through 6 = Saturday) and hour to produce the 7×12 heatmap grid.\n\n## Peak Window Identification\n\nCompute the mean and standard deviation of `bookingCount` across all day+hour cells. A **peak window** is any cell where `bookingCount > mean + 1.0 × stddev`.\n\nA **quiet window** is any cell where `bookingCount < mean − 0.5 × stddev`.\n\n## GM Staffing Ratios\n\nApply these ratios when evaluating Game Master adequacy:\n\n| Scenario | GM Coverage Rule |\n|---|---|\n| 1–2 rooms running simultaneously | 1 GM can monitor and brief both rooms |\n| 3 rooms running simultaneously | 2 GMs required (1 running briefings/front desk, 1 monitoring) |\n| 4+ rooms simultaneously (corporate) | 1 GM per 2 rooms monitoring + 1 dedicated front desk |\n| Corporate Team Build | Dedicated GM for debrief in addition to room monitors |\n\nAn **understaffed window** is a peak slot where the number of simultaneous active rooms exceeds the available GMs' monitoring capacity.\n\n---\n\n## Report Structure\n\n---\n\n### Demand Forecast — {{locationName}}\n**Analysis period**: [start] – [end] ([N] days of data)\n\n---\n\n### 1. Demand Heatmap\n\nRender a 7-column (day-of-week) × rows (hours in operation, typically 10am–10pm) grid. Cell values are average confirmed booking count per slot over the analysis period.\n\nUse ASCII intensity symbols for readability in plain text:\n- `███` = top quartile (peak)\n- `▓▓▓` = third quartile (high)\n- `░░░` = second quartile (moderate)\n- ` ` = bottom quartile (low / no demand)\n\nOr, if markdown table rendering is preferred, use numeric values:\n\n```\n Sun Mon Tue Wed Thu Fri Sat\n10:00am [avg] [avg] [avg] [avg] [avg] [avg] [avg]\n11:00am ...\n12:00pm ...\n1:00pm ...\n2:00pm ...\n3:00pm ...\n4:00pm ...\n5:00pm ...\n6:00pm ...\n7:00pm ...\n8:00pm ...\n9:00pm ...\n10:00pm ...\n```\n\n**Legend**: Values are average confirmed bookings per hour slot. Bold/★ = peak (> mean + 1σ).\n\n---\n\n### 2. Top 5 Peak Windows\n\nList the five highest-demand day+hour combinations:\n\n| Rank | Day | Time | Avg Bookings | Avg Guests | Notes |\n|---|---|---|---|---|---|\n| 1 | [day] | [time] | [avg] | [avg guests] | [e.g., \"Friday evening peak — Standard rooms fill first\"] |\n\nFor each peak window, note:\n- Whether the slot is already fully scheduled or represents an untapped opportunity\n- The estimated revenue opportunity: `avgGuests × priceInCents ÷ 100` per added session\n\n---\n\n### 3. Quietest Windows\n\nList the five lowest-demand day+hour slots:\n\n| Day | Time | Avg Bookings | Recommendation |\n|---|---|---|---|\n| [day] | [time] | [avg] | [e.g., \"Strong candidate for corporate group outreach\" or \"Consider private booking discount for this slot\"] |\n\nQuiet windows are not failures — they are the natural home for corporate groups (who prefer weekday daytime), private bookings (which benefit from guaranteed exclusivity), and maintenance windows.\n\n---\n\n### 4. GM Scheduling Recommendations\n\nBased on peak windows and the GM staffing ratios above:\n\nFor each peak window where simultaneous room count approaches or exceeds single-GM capacity:\n\n```\n⚠️ [Day] [Time] — Potential GM understaffing\n Simultaneous rooms likely running: [N]\n Current GM capacity: [N] GMs scheduled (monitors [N] rooms max)\n Recommendation: Schedule second GM for this window, or cap\n simultaneous bookings to [N] rooms until coverage is confirmed.\n```\n\nIf all peaks are within single-GM capacity:\n\"All peak windows are within standard GM coverage capacity. No immediate staffing changes required.\"\n\n---\n\n### 5. Scheduling Insights\n\nProvide 3–5 plain-language insights drawn from the data. Always check for these escape-room-specific patterns:\n\n**Friday/Saturday evening peak**: The canonical demand window for escape rooms. Sessions starting 6pm–9pm Friday and Saturday are typically the most in-demand. If the data confirms this, affirm it. If it doesn't, flag it as unusual — it may indicate a pricing or visibility problem in those slots.\n\n**Weekday corporate opportunity**: Weekday 11am–3pm slots are naturally suited to corporate team builds and group events. Escape rooms typically see 20–30% of their volume from corporate bookings on weekdays. If the data shows near-zero weekday volume, the venue is leaving significant revenue on the table and should consider a targeted corporate outreach push.\n\n**Birthday/celebration group peak**: Saturday afternoons (2pm–5pm) are a natural birthday group window. Families and friend groups often book the early Saturday slot and then stay for dinner in the area. If this slot is under-booked relative to the Friday/Saturday evening peak, a targeted \"private booking birthday package\" promotion could help fill it.\n\n**Back-to-back session pressure**: If two or more rooms run consecutive sessions (< 15 minutes reset window), flag the operational risk. High-demand periods that create tight resets are a quality risk — incomplete resets are the most common source of negative reviews.\n\n**Seasonal drift**: If the analysis window spans multiple months, note any demand shift. Escape rooms often see a late-September through December peak (team-building season, holiday parties) and a February–April trough. Summer can spike for family rooms while adult sessions flatten.\n\n---\n\n### 6. Growth Opportunities\n\nBased on the combination of peak demand data and current schedule gaps, list the top 2–3 new time slots worth piloting:\n\n```\n💡 Recommended new slot: [Day] at [Time]\n Rationale: [N] existing bookings cluster in adjacent windows, suggesting\n unmet demand. Projected revenue at [N] rooms × [fill rate]% capacity: $[estimate].\n Suggested experience type: [Standard Room | Corporate Team Build | Family Room]\n GM coverage: [Can be covered by existing schedule | Requires additional GM]\n```\n";
44
+
45
+ /** Raw SKILL.md content for the `revenue-report` skill. */
46
+ export const revenueReport = "---\nid: revenue-report\nname: Revenue Report\ndescription: Generates comprehensive financial performance reports for the escape room venue, including revenue by room type with standard deviation, expense breakdown by category, month-over-month trends, room profitability analysis comparing flat-rate and per-person pricing, and one data-backed recommendation.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Revenue Report\n\nYou generate rigorous, management-grade financial performance reports for **{{locationName}}**. Reports include revenue by room type, expense breakdown, month-over-month trends, margin analysis, flat-rate vs. per-person pricing comparison, and at least one data-backed recommendation.\n\n## When to Trigger\n\nInvoke this skill when staff or owners ask:\n- \"How's revenue this month?\"\n- \"Show me the financials\"\n- \"Give me a financial report for Q3\"\n- \"What's our best-margin room?\"\n- \"Revenue vs. expenses\"\n- Any question about financial performance, profitability, or period financials\n\n## Default Period\n\nIf no period is specified, default to the **current calendar month**. Accept natural language: \"last quarter\", \"year to date\", \"last 6 months\", \"2025\", or explicit date ranges.\n\n## Aggregates to Define and Query\n\n### Revenue by room and month\n\n```typescript\nbrain.defineAggregate('revenueByRoomMonth', {\n source: {\n type: 'Measurement',\n where: [\n { field: 'metadata.entityType', value: 'transaction' },\n { field: 'metadata.type', value: 'revenue' }\n ]\n },\n groupBy: [\n { field: 'metadata.experienceSlug' },\n { field: 'metadata.date', window: 'month' }\n ],\n metrics: {\n totalRevenue: { op: 'SUM', field: 'metadata.amountInCents' },\n sessionCount: { op: 'COUNT' },\n avgRevenue: { op: 'AVG', field: 'metadata.amountInCents' },\n revenueStdDev: { op: 'STDDEV', field: 'metadata.amountInCents' },\n maxRevenue: { op: 'MAX', field: 'metadata.amountInCents' },\n minRevenue: { op: 'MIN', field: 'metadata.amountInCents' }\n }\n});\n```\n\n### Expenses by category and month\n\n```typescript\nbrain.defineAggregate('expensesByCategory', {\n source: {\n type: 'Measurement',\n where: [\n { field: 'metadata.entityType', value: 'transaction' },\n { field: 'metadata.type', value: 'expense' }\n ]\n },\n groupBy: [\n { field: 'metadata.category' },\n { field: 'metadata.date', window: 'month' }\n ],\n metrics: {\n totalExpense: { op: 'SUM', field: 'metadata.amountInCents' },\n entryCount: { op: 'COUNT' },\n avgExpense: { op: 'AVG', field: 'metadata.amountInCents' }\n }\n});\n```\n\n---\n\n## Report Structure\n\n---\n\n### Financial Performance Report — {{locationName}}\n**Period**: [period label]\n**Generated**: [today's date]\n\n---\n\n### 1. Executive Summary\n\n| Metric | Value |\n|---|---|\n| Total Revenue | $[totalRevenue ÷ 100] |\n| Total Sessions | [sessionCount] |\n| Avg Revenue per Session | $[avgRevenue ÷ 100] |\n| Total Expenses | $[totalExpense ÷ 100] |\n| Gross Profit | $[(totalRevenue − totalExpense) ÷ 100] |\n| Gross Margin | [grossProfit / totalRevenue × 100]% |\n\nIf refunds exist in the period, add: `Refunds Issued | $[refunds ÷ 100]` and note that gross figures are pre-refund.\n\n---\n\n### 2. Revenue by Room Type\n\n| Room | Sessions | Revenue | Avg / Session | Std Dev | % of Total |\n|---|---|---|---|---|---|\n| Standard Room | [count] | $[revenue] | $[avg] | $[stddev] | [%] |\n| Advanced Room | [count] | $[revenue] | $[avg] | $[stddev] | [%] |\n| Family Room | [count] | $[revenue] | $[avg] | $[stddev] | [%] |\n| Private Booking | [count] | $[revenue] | $[avg] | $[stddev] | [%] |\n| Corporate Team Build | [count] | $[revenue] | $[avg] | $[stddev] | [%] |\n\nSort by revenue descending.\n\n**High StdDev flag**: If any room has `revenueStdDev / avgRevenue > 0.30` (coefficient of variation > 30%), add a note: \"⚠️ [Room] shows high revenue variability (CV: [%]). This may indicate inconsistent booking volumes, promotional discounting, or variable party sizes.\"\n\n**Private Booking pricing analysis**: The Private Booking is flat-rate at $350 for up to 8 guests. For each booking, calculate the effective per-person rate (totalInCents ÷ guestCount). If the average effective rate is below $35/person (what they'd pay for a standard room), it means private bookings are frequently underbooked relative to their cost-per-person floor. Flag this if average party size for private bookings falls below 5 guests.\n\n---\n\n### 3. Month-over-Month Revenue Trend\n\n| Month | Revenue | Sessions | Avg / Session | MoM Change |\n|---|---|---|---|---|\n| [month] | $[revenue] | [count] | $[avg] | [+/- % vs prior month] |\n\nShow up to 12 months of history if data exists. Sort chronologically. Calculate MoM change as `(current − prior) / prior × 100`. Mark first month as `—` for MoM change.\n\nHighlight growth months with `▲` and declining months with `▼`.\n\n---\n\n### 4. Cost Breakdown by Category\n\n| Category | Transactions | Total Expense | Avg Transaction | % of Total Expense |\n|---|---|---|---|---|\n| [category] | [count] | $[expense] | $[avg] | [%] |\n\nCommon expense categories at an escape room venue: `props`, `locks`, `electronics`, `maintenance`, `payroll`, `rent`, `marketing`, `utilities`, `retail-cogs`.\n\nNote: props and locks are **not** consumed per session — they are maintained and replaced over time. Expense entries in these categories represent replacement or repair costs, not per-session COGS. This is a key difference from consumable-based venues.\n\nSort by total expense descending.\n\n---\n\n### 5. Room Profitability Analysis\n\nFor each room type, estimate gross margin using the following:\n- Revenue per session: from the aggregate\n- Estimated variable cost per session: payroll (GM time, typically 1–1.5 hours per session) + reset supply consumption + proportional prop/electronics amortization\n- Fixed cost allocation: rent + utilities proportionally allocated by room count\n\n| Room | Revenue | Est. Variable Cost | Gross Margin | Margin % |\n|---|---|---|---|---|\n| [room] | $[rev] | $[cost] | $[margin] | [%] |\n\n**Highest-margin room**: Advanced Room and Corporate Team Build typically carry the highest margin — higher per-person pricing with similar fixed cost allocation. Confirm against actual data.\n\n**Flat-rate Private Booking margin note**: Private Bookings at $350 flat have predictable revenue but variable cost — a 2-person private booking has the same GM labor and reset cost as an 8-person booking. This makes small private groups the least efficient use of capacity. If private bookings are frequently underbooked (< 5 guests average), consider a minimum party size policy or tiered private pricing.\n\n---\n\n### 6. Statistical Flags\n\nAlways check for:\n\n- **Revenue outliers**: Months or room types where revenue is > 2 standard deviations from the mean\n- **Expense spikes**: Expense categories with unusually high single-month totals (props or electronics are common — a single damaged prop batch can spike a month)\n- **High CV rooms**: Room types with coefficient of variation > 30% on per-session revenue\n- **Declining trend**: Three or more consecutive months of MoM revenue decline\n- **Corporate concentration**: If corporate team builds represent > 40% of revenue, flag as concentration risk\n\nFormat each flag as: `⚠️ [Flag title]: [One sentence description]`\n\nIf no flags: \"No statistical anomalies detected in this period.\"\n\n---\n\n### 7. Recommendation\n\nProvide exactly one, specific, data-backed recommendation citing actual numbers from the report.\n\n**Examples of well-formed recommendations:**\n- \"Advanced Room revenue averages $320/session but runs at only 42% room fill capacity on weekday evenings. Thursday and Sunday evenings show consistent demand for standard-difficulty experiences — consider converting one Standard slot per week to an Advanced offering to test demand at the higher price point.\"\n- \"Private Booking average party size is 3.2 guests, generating an effective per-person rate of $109 vs. the $350 flat rate. At this party size, the room generates 48% less revenue than it would selling 8 individual Standard tickets. A minimum party size of 5 for Private Bookings (or a tiered structure: $250 for 1–4 guests, $350 for 5–8) would increase the floor revenue per private session by approximately $[calculated amount] based on current booking patterns.\"\n\nDo not offer vague suggestions. Every recommendation must be grounded in specific numbers from this report.\n\n---\n\n## Formatting Rules\n\n- Dollars: `$1,234` format (comma-separated thousands, no cents unless amount is under $10)\n- Percentages: one decimal place\n- Empty cells: `—`\n- Negative values (MoM decline, losses): format in parentheses `($234)` following standard accounting convention\n- All tables: left-align text columns, right-align numeric columns\n";
47
+
48
+ /** Raw SKILL.md content for the `inventory-health` skill. */
49
+ export const inventoryHealth = "---\nid: inventory-health\nname: Inventory Health\ndescription: Monitors escape room prop and maintenance inventory across all rooms and categories, flags damaged props and locks approaching mechanical cycle limits, generates a room-by-room status report, and produces a prioritized maintenance and replacement queue.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Inventory Health\n\nYou generate a comprehensive prop and maintenance inventory status report for **{{locationName}}**, flagging items requiring immediate attention, tracking lock cycle counts, and producing a prioritized replacement queue. Escape room inventory behaves fundamentally differently from consumable-based venues — props and locks are not used up, they are maintained and eventually replaced based on wear cycles and condition.\n\n## When to Trigger\n\nInvoke this skill when staff or owners ask:\n- \"Check inventory\"\n- \"What needs replacing?\"\n- \"Prop status\"\n- \"Are the locks okay?\"\n- \"What should we order?\"\n- \"Maintenance queue\"\n- Any question about room props, lock mechanisms, or operational supply levels\n\n## Data to Pull\n\n### Step 1 — All inventory items\n\n```typescript\nawait brain.find({\n type: 'Thing',\n where: [\n { field: 'metadata.entityType', value: 'inventory-item' },\n { field: 'metadata.locationId', value: locationId }\n ]\n});\n```\n\nKey fields per item: `metadata.name`, `metadata.category`, `metadata.quantity`, `metadata.reorderThreshold`, `metadata.costInCents`.\n\nCheck `data` for condition notes — staff may have added condition flags (\"cracked\", \"faded\", \"mechanism stiff\", \"battery replaced\", \"needs calibration\") when logging inventory.\n\n### Step 2 — Upcoming sessions (next 7 days)\n\n```typescript\nawait brain.find({\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.locationId', value: locationId },\n { field: 'metadata.status', value: 'confirmed' }\n ]\n // Filter client-side: metadata.date >= today AND <= today+7\n});\n```\n\nFrom each booking, extract `data.sessionAttributes.roomName` to determine which rooms are active and require all props to be in service.\n\n### Step 3 — Session volume for cycle estimation\n\nQuery the trailing 30 days of confirmed bookings, grouped by room, to estimate session count per room. Use this to calculate cumulative lock cycle counts.\n\n**Lock cycle estimation**: Each session = approximately 10–15 lock uses (opening + resetting). Use `sessions × 12` as a conservative cycle estimate per lock per room. Add to any baseline count stored in inventory item data.\n\n---\n\n## Inventory Categories and Alert Logic\n\n### Props (Room Props & Decorations)\n\nProps do not deplete per session but degrade over time. Alert logic:\n- **CRITICAL**: any prop flagged with condition note containing \"broken\", \"non-functional\", or \"replace immediately\"\n- **LOW**: any prop flagged with \"worn\", \"faded\", \"cracked\", \"repair needed\" — functional but degrading\n- **OK**: no condition notes, or condition notes indicating minor cosmetic wear only\n\nProps in a \"damaged\" or \"non-functional\" state must be removed from the room before the next session. Running a session with a broken prop that guests interact with undermines the puzzle and the experience.\n\n### Locks (Locks & Mechanisms)\n\nLocks have mechanical cycle limits. Replace at 5,000 cycles; flag for inspection at 4,500.\n\n**Cycle tracking formula**:\n```\ntotalCycles = baselineCycles (stored in data) + (roomSessionsLast30Days × 12 × projectedMonthsInService)\n```\n\nIf baseline cycles are not stored, estimate from the lock's install date and average session volume.\n\n| Cycle Count | Alert Level |\n|---|---|\n| < 4,500 cycles | OK |\n| 4,500 – 4,999 cycles | LOW — inspect at next opportunity, order replacement |\n| 5,000+ cycles | CRITICAL — replace before next session |\n\nLock types to track separately: 4-digit combination, directional, word/letter, key lock, magnetic release.\n\n### Electronics (Electronics & Tech)\n\nElectronics degrade in different ways — track:\n- **Battery-powered items**: flag if battery replacement is overdue (typically every 30–60 days depending on usage)\n- **Firmware-dependent items** (smart locks, UV panels, custom electronics): flag if firmware update is available or last update was > 6 months ago\n- **UV lights**: track bulb hours; commercial UV bulbs degrade at approximately 1,000 hours\n\n| Electronics Item | Maintenance Trigger |\n|---|---|\n| UV flashlights | Battery check weekly; replacement after [N] sessions |\n| UV bulbs (fixed) | Bulb hours > 800 — inspect; > 1,000 — replace |\n| Digital locks | Firmware check quarterly |\n| Audio systems | Test before each session; no routine replacement cycle |\n| Custom Arduino / Raspberry Pi props | Log any error reports; replace failing components immediately |\n\n### Costumes (Costumes & Accessories)\n\nTrack laundering count. Most costumes can be professionally laundered 50–100 times before fabric degradation becomes noticeable. Flag if:\n- Total laundering count is unknown (no tracking = no assurance of hygiene)\n- Any item shows visible staining, tears, or odor reports from previous session\n\n### Retail (Retail & Merchandise)\n\nRetail items (branded merchandise, souvenir items, gift cards in physical form) don't deplete through room use. Track stock levels separately and flag if any SKU falls below reorder threshold. Retail COGS tracking is separate from operational inventory.\n\n### Maintenance Supplies\n\nTrack consumables used in room reset and maintenance:\n- Replacement lock hasps and shackles\n- UV-reactive ink and UV pens (single-use puzzle elements)\n- Breakaway seals and tamper-evident stickers\n- Batteries (AA, AAA, 9V) — stock at least 2 weeks of buffer\n- Cleaning supplies specific to prop materials\n\n---\n\n## Alert Tiers\n\n| Tier | Condition | Symbol |\n|---|---|---|\n| CRITICAL | Item non-functional, lock at 5,000+ cycles, or critical prop missing from room | 🔴 CRITICAL |\n| LOW | Item degrading but functional, lock at 4,500–4,999 cycles, electronics overdue for service | 🟡 LOW |\n| OK | All items within normal operating parameters | 🟢 OK |\n\n---\n\n## Report Structure\n\n---\n\n### Inventory Health — {{locationName}}\n**Report date**: [today's date]\n**Next 7 days**: [N] confirmed sessions across [N] rooms\n\n---\n\n### 1. Status Summary\n\n| Status | Items |\n|---|---|\n| 🔴 CRITICAL | [N] items |\n| 🟡 LOW | [N] items |\n| 🟢 OK | [N] items |\n\n---\n\n### 2. Critical Items — Action Required Before Next Session\n\n| Item | Room | Category | Issue | Action |\n|---|---|---|---|---|\n| [name] | [room name] | [category] | [description of issue] | Replace / Remove from room immediately |\n\nIf no critical items: \"No critical items. All props and locks are within operational parameters.\"\n\n---\n\n### 3. Low Priority — Address This Week\n\n| Item | Room | Category | Issue | Est. Days Until Critical |\n|---|---|---|---|---|\n| [name] | [room name] | [category] | [description] | [N] days |\n\n---\n\n### 4. Room-by-Room Status\n\nFor each active room, produce a status block:\n\n```\n[Room Name]\n Props: [N OK | N LOW | N CRITICAL]\n Locks: [status — cycle counts for each lock if available]\n Electronics: [status — battery/firmware check dates]\n Overall: [🟢 Ready | 🟡 Minor issues — action this week | 🔴 Not ready for session]\n```\n\nFlag any room with a CRITICAL item as **Not ready for session** until the item is resolved.\n\n---\n\n### 5. Lock Cycle Tracker\n\n| Lock ID / Name | Room | Type | Est. Cycles | Status | Action |\n|---|---|---|---|---|---|\n| [lock name] | [room] | [4-digit / directional / word / key / magnetic] | [N] | [OK / LOW / CRITICAL] | [None / Order replacement / Replace now] |\n\n---\n\n### 6. Recommended Replacement / Order List\n\nConsolidate all items requiring action into a single purchasing list:\n\n| Item | Category | Room | Priority | Suggested Qty | Notes |\n|---|---|---|---|---|---|\n| [item] | [category] | [room] | [CRITICAL / LOW] | [N] | [e.g., \"Replace directional lock — 4,800 cycles, order spare before it hits 5,000\"] |\n\n---\n\n### 7. Maintenance Notes\n\nAdd contextual notes warranted by the data:\n- If a room has no condition flags on any props: note it briefly to affirm the room is in good shape\n- If a recently introduced prop or mechanism has logged condition issues quickly: flag for design review — it may not be durable enough for session volume\n- If any room is approaching a scheduled full reset / redecoration: note props that can be retired rather than replaced\n- If batteries are low across multiple rooms simultaneously: suggest a bulk battery restock rather than room-by-room replacement\n";
50
+
51
+ /** Raw SKILL.md content for the `email-campaign` skill. */
52
+ export const emailCampaign = "---\nid: email-campaign\nname: Email Campaign Writer\ndescription: Writes complete marketing email campaigns for The Escape Vault with two A/B subject lines, a preheader, body copy, a CTA button, and an unsubscribe line — with a tone that is mysterious, a little taunting, and always daring.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: false\n---\n\n# Email Campaign Writer\n\nYou write complete, ready-to-send marketing emails for **{{businessName}}**. Every output includes two A/B subject line variants, a preheader, body copy, CTA button text, and an unsubscribe line. The tone is mysterious, a little taunting, and daring — like a Game Master who knows something you don't. Nothing is left for the user to fill in.\n\n## When to Trigger\n\nInvoke this skill when staff or owners ask:\n- \"Write an email campaign\"\n- \"Draft a marketing email\"\n- \"I need an email for [topic]\"\n- \"Re-engagement campaign\"\n- \"Email blast for this week's openings\"\n\nIf the campaign type is unclear, ask one question: \"What's the goal of this email — promote available sessions, re-engage lapsed guests, announce a new room, or reach corporate event planners?\" Then proceed.\n\n---\n\n## Campaign Types\n\n### Session Availability / Booking Promo\nGoal: Drive bookings for upcoming available sessions.\nAngle: Urgency (\"only 3 spots left in Friday's Advanced Room\"), intrigue (\"something new is locked and waiting\"), social proof (\"fastest team this month set the record last Saturday — will yours beat it?\").\n\n### Re-engagement — \"You Haven't Escaped All Our Rooms\"\nGoal: Bring back guests who haven't visited in 60+ days.\nAngle: Their unfinished business. They solved one room — or didn't. Either way, there's more. Frame it as a direct challenge: \"You've seen one. There are [N] more.\" Never guilt. Always dare.\n\n### New Room Opening\nGoal: Generate buzz and early bookings for a newly opened room.\nAngle: Tease the atmosphere and the stakes — never reveal puzzles. Describe the feeling of being inside the room, not the content of the puzzles. Make the reader feel like they already want to escape from it.\n\n### Leaderboard Shoutout\nGoal: Recognize record-setting teams and create social proof + FOMO.\nAngle: Celebrate the winning team (with permission). Note the record time. Challenge readers to beat it. Make the leaderboard feel like a living, competitive thing.\n\n### Birthday Month Promo\nGoal: Activate birthday month bookings.\nAngle: Your birthday is already a reason to be somewhere interesting — this is the interesting part. A room full of people who chose to be there, with 60 minutes to prove something.\n\n### Corporate Outreach\nGoal: Reach event planners, HR managers, and team leads.\nAngle: Professional, but still with the edge. Frame the escape room not as \"fun\" (that sounds like a reward) but as genuine team intelligence assessment. \"Find out how your team thinks before a deadline does it for you.\"\n\n### Seasonal\nGoal: Connect the escape room to a holiday, season, or cultural moment.\n- Halloween: \"The vault is darker in October.\"\n- Valentine's Day: \"The most honest conversation you'll have with your partner is when you're locked in a room together.\"\n- New Year: \"Solve more. Escape more. The vault has twelve months of puzzles ready.\"\n- Summer: \"The best way to spend 60 minutes out of the heat in {{city}}.\"\n\n---\n\n## Output Format\n\nAlways produce all six components in this exact order:\n\n---\n\n### Subject A\n[Intrigue or dare style — 35–50 characters]\n\n**Good examples:**\n- \"Think you can escape this time?\"\n- \"The record just got broken.\"\n- \"One room left unsolved.\"\n\n**Avoid**: Spammy punctuation (!!!), all caps, manufactured urgency (\"LAST CHANCE!!!\"), anything that sounds like a generic promo email.\n\n---\n\n### Subject B\n[Direct value or challenge style — 35–50 characters]\n\n**Good examples:**\n- \"New room open — come see if you escape\"\n- \"Friday Advanced Room: 3 spots left\"\n- \"Your team vs. the Vault — book now\"\n\n---\n\n### Preheader\n[85–100 characters — extends Subject A or B with complementary tension or detail]\n\nThe preheader should create a second hook that expands on the subject without repeating it. It should make not opening the email feel like an actual loss.\n\n**Good example (pairs with Subject A \"Think you can escape this time?\"):**\n\"Most teams that walk back in after a first failure say the same thing: they almost had it. Almost.\"\n\n---\n\n### Email Body\n[150–200 words — 3–4 paragraphs]\n\n**Structure:**\n1. **Opener** — Direct, tense, specific. Get into it in the first sentence. No \"we hope this email finds you well.\" This is a dare.\n2. **The offer or news** — Specific. Which room? What's available? What record was broken? What's the deal?\n3. **The reason to act** — Genuine urgency (if supported by data) or emotional stakes (\"you've been thinking about this since the last time\"). Reference {{businessName}} specifically.\n4. **Soft close** — One sentence that makes the action feel inevitable rather than solicited.\n\n**Personalization tokens**: Use `{{firstName}}` in the opener if it flows naturally. Do not overuse it.\n\n**Tone**: Like a Game Master writing to a player. Admiring, challenging, conspiratorial. Never corporate.\n\n---\n\n### CTA Button Text\n[3–5 words — action-first, specific]\n\n**Good examples:**\n- \"Accept the Challenge\"\n- \"Book Your Room\"\n- \"Claim Your Spot\"\n- \"See Open Sessions\"\n- \"Challenge the Record\"\n\n**Avoid**: \"Click Here\", \"Learn More\", \"Submit\", anything generic.\n\n---\n\n### Unsubscribe Line\n[Standard legal + brand-appropriate]\n\nAlways end with:\n> You're receiving this because you've visited {{businessName}} or signed up for our list. [Unsubscribe] | {{address}}\n\n---\n\n## Escape Vault-Specific Angles\n\nDraw from these proven hooks when appropriate:\n\n- **The unfinished room**: If a guest didn't escape last time, the most powerful angle is their unresolved tension. \"You got closer than you think. The room is still there.\" This is the highest-conversion re-engagement hook for escape rooms.\n- **The leaderboard**: Naming the current record and daring the reader to beat it creates FOMO among competitive guests. Only use if data is available.\n- **The team that almost made it**: Social proof for near-misses is uniquely powerful in escape rooms — \"67 seconds over time\" is more compelling than \"great experience!\"\n- **Corporate no-nonsense**: Corporate emails should drop the mysterious tone slightly and lean into professional value — \"what your team reveals under pressure\" framing. Still daring, but with business stakes.\n- **New room intrigue**: Never reveal puzzle content in a new room email. Describe atmosphere, stakes, and difficulty — make the email feel like the briefing before a session.\n- **Completion-gap re-engagement**: \"You've escaped [N] of our [roomCount] rooms. The vault has [remaining N] more questions for you.\" Specific, compelling, creates a clear next action.\n\n---\n\n## Length and Format Constraints\n\n- **Subject lines**: 35–50 characters firm — count carefully for mobile inbox display\n- **Preheader**: 85–100 characters — shorter preheaders get padded with repetitive email content by most clients\n- **Body**: 150–200 words — tight, daring, no filler\n- **Do not include HTML** unless explicitly asked\n- **One CTA per email** — decide the single goal and point everything toward it\n";
53
+
54
+ /** Raw SKILL.md content for the `social-calendar` skill. */
55
+ export const socialCalendar = "---\nid: social-calendar\nname: Social Media Calendar\ndescription: Creates a month of social media content for The Escape Vault across Instagram, TikTok, and Facebook — balancing atmosphere and suspense, team reaction content, behind-the-scenes, tips and challenges, and promotional posts with an escape room-specific hashtag bank.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: false\n---\n\n# Social Media Calendar\n\nYou create a complete, ready-to-execute monthly social media content calendar for **{{businessName}}**. Each post includes the scheduled day, platform, content description, full caption, and hashtags. The calendar balances content pillars and never lets promotional posts dominate the feed.\n\n## When to Trigger\n\nInvoke this skill when staff or owners ask:\n- \"Create a social media calendar\"\n- \"Plan our social content for [month]\"\n- \"What should we post this month?\"\n- \"Social media plan\"\n- \"Write a month of posts\"\n\nIf a month isn't specified, default to the next full calendar month. If specific room names, team records, or session highlights are available, incorporate them.\n\n---\n\n## Content Pillars\n\nEvery calendar must follow this approximate distribution across 20–30 posts:\n\n| Pillar | % of Posts | Purpose |\n|---|---|---|\n| Atmosphere & Suspense | 30% | Dark rooms, ticking countdowns, lock mechanisms — create the feeling of being inside |\n| Team Reactions | 25% | Post-escape celebrations, near-miss commiseration, genuine in-the-moment emotion |\n| Behind the Scenes | 20% | Prop design and build, room reset process, GM perspective, new room development |\n| Tips & Challenges | 15% | Puzzle-solving techniques, \"can you solve this?\", team communication tips |\n| Promotional | 10% (max 1 in 5) | Direct booking CTA — never more than 20% of posts |\n\nNever exceed 1 promotional post in any 5-post sequence. Audiences disengage from feeds that feel like ads.\n\n---\n\n## Platform Notes\n\n### Instagram\n- **Best for**: Atmospheric room shots, close-ups of lock mechanisms and props, team celebration photos after sessions, Reels for countdown tension and before/after room resets\n- **Caption style**: Start with a visual hook or a question that creates tension. Use line breaks. End with a soft CTA or a challenge.\n- **Hashtags**: 7–9 hashtags, placed at the end of caption or in first comment\n- **Frequency**: 5–7 posts per week (this calendar covers feed posts only)\n\n### TikTok\n- **Best for**: Countdown timer tension clips (the final 60 seconds of a session), before/after room resets (satisfying and hypnotic), \"rate your team\" challenge formats, GM perspective videos (\"what I see on the cameras\"), puzzle-solving tips\n- **Caption style**: Hook in the first sentence — TikTok captions truncate early. 100–150 chars max visible without tap.\n- **Hashtags**: 5–6 hashtags, lean into discovery\n- **Frequency**: 3–5 times per week\n- **Format notes**: Vertical video. Countdowns and clock elements are inherently TikTok-native content. Use them.\n\n### Facebook\n- **Best for**: Event announcements, room availability posts, longer community updates, leaderboard announcements, sharing blog posts, photo albums from past sessions\n- **Caption style**: More prose than Instagram. Can run 2–3 full sentences without truncation. Good for event details and corporate outreach.\n- **Hashtags**: 2–3 max\n- **Frequency**: 3–5 times per week\n\n---\n\n## Escape Vault Hashtag Bank\n\nUse in rotation — don't repeat the same hashtag set more than twice in a row:\n\n**Primary (use in almost every post):**\n`#escapevault` `#escaperoomlife` `#escaperoom` `#lockedroom`\n\n**Activity / audience tags (rotate):**\n`#teambuilding` `#datenight` `#{{city}}fun` `#groupactivity` `#bachelorette` `#puzzlelovers` `#gamenight`\n\n**Tension / atmosphere tags (rotate):**\n`#canYouEscape` `#lockedIn` `#clockistickling` `#puzzleroom` `#adventuretime` `#thinkfast`\n\n**Local tags (always include at least one):**\n`#{{city}}` `#{{city}}events` `#{{city}}escaperoom` `#thingstodoin{{city}}`\n\n**TikTok-specific:**\n`#escaperoomtiktok` `#gamemasterlife` `#satisfying` `#countdowntimer` `#teamwork`\n\n---\n\n## Calendar Format\n\nFor each post, produce a block in this format:\n\n```\n---\nDay [N] — [Day of Week, Date]\nPlatform: [Instagram | TikTok | Facebook]\nPillar: [Atmosphere | Team Reaction | Behind the Scenes | Tips & Challenges | Promotional]\n\nContent: [2–3 sentence description of the visual content — what should the video or photo show? Be specific enough that a staff member knows exactly what to film or photograph.]\n\nCaption:\n[Full caption text — 150–220 characters for Instagram/TikTok. May be longer for Facebook.]\n\nHashtags: #escapevault #escaperoom [4–6 more from the bank]\n---\n```\n\n---\n\n## Sample Posts by Pillar\n\n### Atmosphere (Instagram)\n**Content**: Close-up of a 4-digit combination lock, dimly lit, slightly out of focus in the foreground — a cipher wheel visible in the background. Cold, moody light.\n**Caption**: \"The answer is already in the room. Most teams walk past it three times before they see it. 🔐 Think you'd catch it?\"\n**Hashtags**: #escapevault #escaperoom #puzzleroom #lockedIn #{{city}}escaperoom #canYouEscape #datenight\n\n### Team Reaction (Instagram)\n**Content**: Wide shot of a team of five erupting when the final lock opens — arms up, laughing, one person is already reaching for the door handle.\n**Caption**: \"47:22. The Clockmaker's Workshop. They did it. This is the moment every team is chasing. 🗝️ Book your room — link in bio.\"\n**Hashtags**: #escapevault #escaperoomlife #teamwork #{{city}}fun #lockedIn #groupactivity #escaped\n\n### Behind the Scenes (TikTok)\n**Content**: Time-lapse of the room reset process — props being returned to start position, locks being reset, every element of the room going from post-session chaos to pristine starting condition. 45 seconds.\n**Caption**: \"15 minutes. Every time. Everything back to exactly where it started. 🔄 This is what happens between every session.\"\n**Hashtags**: #gamemasterlife #escaperoomlife #satisfying #behindthescenes #{{city}}escaperoom\n\n### Tips & Challenges (TikTok)\n**Content**: GM stands in front of a whiteboard showing a simple cipher puzzle (not from any active room). Pauses. \"Can you solve this before I reveal the answer in 10 seconds?\" Countdown shows.\n**Caption**: \"Most people solve this in 8 seconds. Some never get it. The difference isn't intelligence — it's where you look first.\"\n**Hashtags**: #puzzlelovers #escaperoom #thinkfast #countdowntimer #gamemasterlife #escapevault\n\n### Promotional (Facebook)\n**Content**: Clean graphic: room name, available session times this weekend, \"Private Booking Available\" badge. Dark background, gold accent text aligned with The Escape Vault's brand.\n**Caption**: \"Friday and Saturday sessions are filling up. Standard Room — 3 spots left Friday at 7pm. Advanced Room — open Saturday at 8pm (previous escape room experience recommended). Book at theescapevault.com → [LINK: /book]\"\n**Hashtags**: #escapevault #{{city}} #escaperoom\n\n---\n\n## Full Calendar Structure\n\nProduce a full calendar with 20–30 posts distributed across the month. Aim for:\n- Opening week: 1 atmosphere post (set the tone for the month) + 1 tip or challenge + 1 educational/BTS\n- Middle weeks: 2–3 posts per platform per week, rotating pillars\n- End of month: 1 team reaction highlight from the month's best sessions, 1 teaser for next month\n- At least 1 TikTok countdown or tension clip per week\n- At least 1 team reaction or celebration post per week\n- At least 1 leaderboard shoutout per month if data is available\n\nNumber the posts Day 1 through Day [last day of month] and distribute evenly across 5–6 posts per week across all platforms.\n";
56
+
57
+ /** All skills for the escape-vault kit, keyed by skill ID. */
58
+ export const allSkills: Record<string, string> = {
59
+ 'staff-briefing': staffBriefing,
60
+ 'escape-expertise': escapeExpertise,
61
+ 'room-designer': roomDesigner,
62
+ 'leaderboard-report': leaderboardReport,
63
+ 'guest-letter': guestLetter,
64
+ 'escape-memory': escapeMemory,
65
+ 'booking-digest': bookingDigest,
66
+ 'customer-insights': customerInsights,
67
+ 'venue-data-model': venueDataModel,
68
+ 'blog-draft': blogDraft,
69
+ 'experience-copy': experienceCopy,
70
+ 'demand-forecast': demandForecast,
71
+ 'revenue-report': revenueReport,
72
+ 'inventory-health': inventoryHealth,
73
+ 'email-campaign': emailCampaign,
74
+ 'social-calendar': socialCalendar
75
+ };
@@ -0,0 +1,43 @@
1
+ /**
2
+ * @module @soulcraft/kits/skills/family-tree
3
+ * @description Raw SKILL.md content for the family-tree kit's AI skills.
4
+ *
5
+ * Generated from: kits/family-tree/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 `record-oral-history` skill. */
10
+ export const recordOralHistory = "---\nname: Record Oral History\ndescription: Document stories and memories from family members\ntype: invocable\nversion: \"1.0.0\"\nparameters: [interviewee]\n---\n\n## Record Oral History\n\nDocument stories and memories from family members\n\n### Steps\n\n1. Identify the family member to interview\n2. Prepare questions about their life and family memories\n3. Schedule time when they can share without rushing\n4. Record or take detailed notes during the conversation\n5. Ask about: childhood, parents, grandparents, traditions, locations\n6. Document stories verbatim when possible\n7. Note the date and who shared the information\n8. Create notes in the person's profile or separate story file\n9. Identify new names or facts to research\n10. Follow up on any leads discovered\n\n### Inputs Required\n\n- **interviewee** (required): Who you're interviewing\n\n### Expected Outputs\n\n- Oral history notes\n- New research leads\n- Updated profiles\n\n### When to Use\n\nThis workflow is helpful when the user mentions:\n- \"oral history\"\n- \"interview\"\n- \"record story\"\n- \"family story\"\n- \"memories\"\n";
11
+
12
+ /** Raw SKILL.md content for the `export-gedcom` skill. */
13
+ export const exportGedcom = "---\nname: Prepare GEDCOM Export\ndescription: Prepare family tree data for export to genealogy software\ntype: invocable\nversion: \"1.0.0\"\n---\n\n## Prepare GEDCOM Export\n\nPrepare family tree data for export to genealogy software\n\n### Steps\n\n1. Review all person profiles for completeness\n2. Verify all relationships are documented\n3. Check date formats are consistent\n4. Ensure locations have consistent formatting\n5. Identify any missing critical data\n6. Note which photos/media to include\n7. Generate GEDCOM-ready summary\n8. List items needing attention before export\n\n### Expected Outputs\n\n- Export readiness report\n- Data quality checklist\n\n### When to Use\n\nThis workflow is helpful when the user mentions:\n- \"export\"\n- \"GEDCOM\"\n- \"share family tree\"\n- \"export to ancestry\"\n";
14
+
15
+ /** Raw SKILL.md content for the `relationship-mapping` skill. */
16
+ export const relationshipMapping = "---\nname: relationship-mapping\ndescription: Map complex family relationships including steps, halves, and extended family\ntype: invocable\nversion: \"1.0.0\"\n---\n\n## Family Relationship Mapping Skill\n\nWhen the user invokes `/map`, help them accurately map complex family relationships.\n\n### Invocation Patterns\n\n- `/map [relationship]` - Determine specific relationship\n- `/map [person A] to [person B]` - Find relationship between two people\n- `/map diagram` - Create relationship diagram\n- `/map calculate` - Calculate cousinship\n\n### Relationship Terminology\n\n**Direct Ancestors**\n- Parents\n- Grandparents (Grand)\n- Great-grandparents (Great-grand)\n- Great-great-grandparents (2x Great-grand)\n\n**Direct Descendants**\n- Children\n- Grandchildren\n- Great-grandchildren\n\n**Siblings**\n- Full siblings (share both parents)\n- Half-siblings (share one parent)\n- Step-siblings (no blood relation)\n\n**Extended Family**\n- Aunt/Uncle (parent's sibling)\n- Niece/Nephew (sibling's child)\n- Cousin (various degrees)\n\n### Output Format\n\n```markdown\n## Relationship Map\n\n### Relationship Query\n**Person A**: [Name]\n**Person B**: [Name]\n\n### Relationship\n**[Person A] is the [relationship] of [Person B]**\n**[Person B] is the [relationship] of [Person A]**\n\n### Relationship Path\n```\n[Common Ancestor]\n │\n [Path] ←─── Generation 1\n │\n [Path] ←─── Generation 2\n │\n [Person]\n```\n\n### Detailed Breakdown\n- Common ancestor: [Name]\n- Generations from A to common: [X]\n- Generations from B to common: [Y]\n- Relationship type: [Calculation]\n\n### Notes\n[Any complexity or special circumstances]\n```\n\n### Cousin Calculations\n\n**Same Generation**\n- First cousins: Share grandparents\n- Second cousins: Share great-grandparents\n- Third cousins: Share great-great-grandparents\n\n**Formula**\n```\nCousin degree = (shared ancestor generations - 1)\nwhere generations counted from younger person\n```\n\n**Removed**\n- Different generations from common ancestor\n- \"Once removed\" = 1 generation difference\n- \"Twice removed\" = 2 generation difference\n\n### Cousin Chart\n```\n Common Ancestor\n │\n ┌───────────────┴───────────────┐\n Child A Child B\n │ │\n Grandchild A Grandchild B\n(1st cousins) (1st cousins)\n │ │\n Great-Grand A Great-Grand B\n(1st cousin 1x removed to GC-B) (2nd cousins to GG-A)\n │ │\n 2x-Great-Grand A 2x-Great-Grand B\n(2nd cousins 1x removed) (3rd cousins)\n```\n\n### Complex Relationships\n\n**Step Relationships**\n- Step-parent: Parent's spouse (not biological)\n- Step-sibling: Step-parent's child (no blood)\n- Step-grandparent: Grandparent's spouse\n\n**Half Relationships**\n- Half-sibling: Share ONE biological parent\n- Half-aunt/uncle: Parent's half-sibling\n- Half-cousin: Follows from half-relationships\n\n**In-Law Relationships**\n- Brother/Sister-in-law: Spouse's sibling OR sibling's spouse\n- Parent-in-law: Spouse's parent\n- Child-in-law: Child's spouse\n\n**Adoptive Relationships**\n- Same terms as biological\n- Often noted separately for genealogy\n- Legal relationship is valid\n\n### Multiple Relationships\n\n**Double Cousins**\n- Two siblings marry two siblings\n- Children are cousins twice\n- Genetically closer than typical cousins\n\n**Pedigree Collapse**\n- When ancestors appear multiple times\n- Common in small communities\n- Document each line separately\n\n### Relationship Notation\n\n**Standard Abbreviations**\n- b. = born\n- d. = died\n- m. = married\n- div. = divorced\n- c. = circa (approximately)\n- bur. = buried\n- bap. = baptized\n\n### Diagramming Conventions\n\n**Symbols**\n```\n□ = Male\n○ = Female\n◇ = Unknown gender\n─ = Horizontal connection (marriage/partnership)\n│ = Vertical connection (descent)\n┬ = Union producing children\n```\n\n**Line Types**\n- Solid: Biological/confirmed\n- Dashed: Adoptive/uncertain\n- Dotted: Hypothetical/possible\n";
17
+
18
+ /** Raw SKILL.md content for the `genealogy-research` skill. */
19
+ export const genealogyResearch = "---\nname: genealogy-research\ndescription: Background expertise in genealogical research techniques and documentation\ntype: background\nversion: \"1.0.0\"\n---\n\n## Genealogy Research Expertise\n\nYou have expertise in genealogical research methods and family history documentation. Apply these principles when helping users build and research their family trees.\n\n### Research Process\n\n**Step 1: Start with Known**\n- Document what you know\n- Interview living relatives\n- Gather family documents\n- Note sources for everything\n\n**Step 2: Work Backward**\n- One generation at a time\n- Verify before extending\n- Follow all lines\n- Document dead ends\n\n**Step 3: Verify and Expand**\n- Cross-reference sources\n- Fill in details\n- Resolve conflicts\n- Note uncertainties\n\n### Source Types\n\n**Primary Sources**\n- Created at or near the time of event\n- By someone with direct knowledge\n- Examples: birth certificates, church records, census\n\n**Secondary Sources**\n- Created later\n- Based on primary sources\n- Examples: biographies, indexes, transcriptions\n\n**Original vs. Derivative**\n- Original: First recording\n- Derivative: Copy, transcription, abstract\n\n### Record Types\n\n**Vital Records**\n- Birth certificates\n- Marriage licenses\n- Death certificates\n- Divorce records\n\n**Census Records**\n- Population counts\n- Household members\n- Occupations, birthplaces\n- Available every 10 years (US)\n\n**Church Records**\n- Baptisms, christenings\n- Marriages\n- Burials\n- Membership rolls\n\n**Immigration Records**\n- Passenger lists\n- Naturalization papers\n- Border crossings\n- Passport applications\n\n**Military Records**\n- Service records\n- Draft registrations\n- Pension files\n- Veterans' records\n\n**Land and Property**\n- Deeds\n- Tax records\n- Wills, probate\n- Land grants\n\n### Source Citation\n\n**Essential Elements**\n- Who created the record\n- What is it\n- When created\n- Where found\n- Any identifying numbers\n\n**Example Format**\n```\n[Creator], [Title], [Publication info], [Location/repository], [Item identifier]; accessed [date].\n```\n\n### Research Standards\n\n**GPS (Genealogical Proof Standard)**\n1. Reasonably exhaustive search\n2. Complete citation of sources\n3. Analysis and correlation\n4. Resolution of conflicts\n5. Written conclusion\n\n**Best Practices**\n- Source everything\n- Note negative searches\n- Date your research\n- Review periodically\n- Collaborate carefully\n\n### Common Research Challenges\n\n**Name Variations**\n- Spelling changes\n- Anglicization\n- Nicknames\n- Name changes\n\n**Date Discrepancies**\n- Calendar changes\n- Age rounding\n- Memory errors\n- Misrecording\n\n**Location Changes**\n- Boundary shifts\n- Name changes\n- Immigration\n\n**Record Loss**\n- Wars, fires, disasters\n- Deliberate destruction\n- Poor preservation\n\n### Documentation Standards\n\n**For Each Person**\n- Full name (all known variations)\n- Birth date and place\n- Death date and place\n- Marriage(s) date and place\n- Parents (if known)\n- Children (if any)\n- Sources for each fact\n\n**Relationship Recording**\n- Use standard relationships\n- Note adoptions separately\n- Document step-relationships\n- Handle multiple marriages\n\n### Privacy Considerations\n\n**Living Persons**\n- Get consent before sharing\n- Don't publish full dates\n- Protect addresses\n- Respect wishes\n\n**Sensitive Information**\n- Handle adoptions carefully\n- Note illegitimacy privately\n- Respect cultural sensitivities\n\n### Research Tools\n\n**Online Databases**\n- Ancestry.com\n- FamilySearch.org\n- FindMyPast\n- MyHeritage\n\n**Local Resources**\n- County courthouses\n- Libraries and archives\n- Historical societies\n- Cemeteries\n\n**DNA Testing**\n- Ethnicity estimates\n- Cousin matching\n- Paper trail companion\n- Not definitive alone\n";
20
+
21
+ /** Raw SKILL.md content for the `analyze-relationship` skill. */
22
+ export const analyzeRelationship = "---\nname: Analyze Family Relationship\ndescription: Understand how two family members are related\ntype: invocable\nversion: \"1.0.0\"\nparameters: [person1, person2]\n---\n\n## Analyze Family Relationship\n\nUnderstand how two family members are related\n\n### Steps\n\n1. Identify the two people to analyze\n2. Trace each person's lineage to a common ancestor\n3. Count generations from common ancestor to each person\n4. Determine relationship type (cousin, removal, etc.)\n5. Document the path of relationship\n6. Note if there are multiple relationship paths\n\n### Inputs Required\n\n- **person1** (required): First person\n- **person2** (required): Second person\n\n### Expected Outputs\n\n- Relationship explanation\n- Lineage path\n\n### When to Use\n\nThis workflow is helpful when the user mentions:\n- \"how are they related\"\n- \"relationship between\"\n- \"what relation is\"\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";
23
+
24
+ /** Raw SKILL.md content for the `research-ancestor` skill. */
25
+ export const researchAncestor = "---\nname: Research Ancestor\ndescription: Investigate a specific ancestor's history\ntype: invocable\nversion: \"1.0.0\"\nparameters: [ancestor]\n---\n\n## Research Ancestor\n\nInvestigate a specific ancestor's history\n\n### Steps\n\n1. Gather what's already known about this person\n2. Identify gaps in knowledge: dates, places, parents\n3. Search vital records (birth, marriage, death)\n4. Check census records for household information\n5. Look for immigration/naturalization records if applicable\n6. Search newspaper archives for mentions\n7. Review military records if relevant\n8. Document each source and what it revealed\n9. Update the person profile with findings\n10. Note new questions and next research steps\n\n### Inputs Required\n\n- **ancestor** (required): Name of person to research\n- **knownFacts** (optional): What you already know\n\n### Expected Outputs\n\n- Research findings\n- Updated person profile\n- Source citations\n\n### When to Use\n\nThis workflow is helpful when the user mentions:\n- \"research\"\n- \"find out about\"\n- \"investigate\"\n- \"look up ancestor\"\n";
26
+
27
+ /** Raw SKILL.md content for the `kit-expertise` skill. */
28
+ export const kitExpertise = "---\nname: kit-expertise\ndescription: Domain expertise for Family Tree - applied automatically when working in this kit\ntype: background\nversion: \"1.0.0\"\n---\n\n## Your Role\n\nYou are a genealogist and family historian who helps people document and understand their family heritage. You know how to organize family information, record oral histories, and navigate the complexities of family relationships. You treat sensitive family matters with care and respect.\n\n## Your Expertise\n\n- Genealogical record keeping\n- Family relationship documentation\n- Oral history recording\n- Research methodology for family history\n- GEDCOM and family tree standards\n- Organizing family documents and photos\n- Cultural heritage preservation\n- DNA genealogy basics\n- Immigration and migration patterns\n- Family naming conventions across cultures\n\n## Your Approach\n\nWork alongside the user as a creative partner\n\n## Things to Avoid\n\n- Don't push for information people aren't comfortable sharing\n- Don't make assumptions about family structures - families are diverse\n- Don't judge family situations or relationships\n- Don't share or display sensitive family information inappropriately\n- Don't oversimplify complex family dynamics\n\n## Domain Knowledge\n\n### Key Terms\n\n**GEDCOM**\nStandard file format for genealogical data exchange\n\n**Lineage**\nDirect line of descent from an ancestor\n\n**Progenitor**\nThe earliest known ancestor of a family line\n\n**Generation**\nAll family members at the same level of descent\n\n**Collateral**\nRelatives descended from the same ancestor but not in direct line\n\n**Consanguinity**\nBlood relationship between people\n\n**Affinity**\nRelationship through marriage (in-laws)\n\n**Patronymic**\nName derived from father's name\n\n**Matrilineal**\nLineage traced through the mother\n\n**Primary Source**\nOriginal document from the time period (birth certificate, etc.)\n\n**Secondary Source**\nDocument created later from primary sources\n\n**Vital Records**\nBirth, marriage, death certificates\n\n### Best Practices\n\n- Record full legal names and any nicknames or maiden names\n- Use consistent date formats (prefer YYYY-MM-DD for sorting)\n- Include birth, death, marriage dates and locations when known\n- Note the source of information (who told you, what document)\n- Mark uncertain information as estimated or approximate\n- Include photos with descriptions and dates\n- Record oral histories verbatim when possible\n- Document relationships explicitly (biological, adopted, step)\n- Keep separate notes for sensitive information\n- Update profiles as new information is discovered\n\n### Common Mistakes to Avoid\n\n- Recording unverified information as fact\n- Losing track of sources for family stories\n- Only documenting \"direct line\" and ignoring branches\n- Skipping living family members\n- Using only dates without locations\n- Not indicating uncertainty in records\n- Ignoring the maternal side of the family\n- Forgetting to back up genealogy data\n- Not interviewing elderly relatives while possible\n\n### Recommended References\n\n- [FamilySearch](https://www.familysearch.org): Free genealogical research platform\n- [Ancestry](https://www.ancestry.com): Genealogical records database\n- [GEDCOM Standard](https://www.gedcom.org): Technical specification for genealogical data\n- [StoryCorps](https://storycorps.org): Resources for recording oral histories\n";
29
+
30
+ /** Raw SKILL.md content for the `add-family-member` skill. */
31
+ export const addFamilyMember = "---\nname: Add Family Member\ndescription: Add a new person to the family tree with proper relationships\ntype: invocable\nversion: \"1.0.0\"\nparameters: [name, relationship]\n---\n\n## Add Family Member\n\nAdd a new person to the family tree with proper relationships\n\n### Steps\n\n1. Gather basic information: full name, birth date, birth place\n2. Identify their relationships: parents, spouse(s), children\n3. Create a person profile file in members/\n4. Add biographical information and life events\n5. Include any photos with dates and descriptions\n6. Create the person concept in the knowledge graph\n7. Add relationship links (child-of, spouse-of, parent-of)\n8. Link to the family collection\n9. Note sources for the information\n\n### Inputs Required\n\n- **name** (required): Person's full name\n- **relationship** (required): How they relate to existing members\n\n### Expected Outputs\n\n- Person profile file\n- Knowledge graph entries\n- Relationships\n\n### When to Use\n\nThis workflow is helpful when the user mentions:\n- \"add person\"\n- \"add family member\"\n- \"new family member\"\n- \"add relative\"\n";
32
+
33
+ /** All skills for the family-tree kit, keyed by skill ID. */
34
+ export const allSkills: Record<string, string> = {
35
+ 'record-oral-history': recordOralHistory,
36
+ 'export-gedcom': exportGedcom,
37
+ 'relationship-mapping': relationshipMapping,
38
+ 'genealogy-research': genealogyResearch,
39
+ 'analyze-relationship': analyzeRelationship,
40
+ 'research-ancestor': researchAncestor,
41
+ 'kit-expertise': kitExpertise,
42
+ 'add-family-member': addFamilyMember
43
+ };
@@ -0,0 +1,15 @@
1
+ /**
2
+ * @module @soulcraft/kits/skills/farkle-dice-game
3
+ * @description Raw SKILL.md content for the farkle-dice-game kit's AI skills.
4
+ *
5
+ * Generated from: kits/farkle-dice-game/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 `kit-expertise` skill. */
10
+ export const kitExpertise = "# Farkle Dice Game Kit Expertise\n\nYou are an expert in this Farkle dice game implementation. This kit provides a complete turn-based dice game with AI opponent support.\n\n## Architecture Overview\n\n### Game State Management\n- **`src/lib/stores/game.svelte.ts`**: Central game state using Svelte 5 runes\n- **`src/lib/game/scoring.ts`**: Complete Farkle scoring rules\n- **`src/lib/game/ai.ts`**: AI opponent logic with difficulty levels\n\n### Components\n- **`Die.svelte`**: Single die with 3D CSS animation\n- **`DiceRoll.svelte`**: Container for all dice with selection logic\n- **`ScoreCard.svelte`**: Player score display with progress\n- **`GameControls.svelte`**: Roll/Bank action buttons\n\n### Routes\n- **`/`**: Main game page (start screen → gameplay → game over)\n- **`/rules`**: Scoring rules reference\n- **`/stats`**: High scores and game history\n\n## Farkle Scoring Rules\n\nThe game implements standard Farkle scoring:\n\n```typescript\n// Single dice\nSingle 1 = 100 points\nSingle 5 = 50 points\n\n// Three of a kind\nThree 1s = 1,000 points\nThree 2s = 200 points\nThree 3s = 300 points\nThree 4s = 400 points\nThree 5s = 500 points\nThree 6s = 600 points\n\n// Multipliers\nFour of a kind = 2× triple score\nFive of a kind = 4× triple score\nSix of a kind = 8× triple score\n\n// Special combinations\nStraight (1-2-3-4-5-6) = 1,500 points\nThree pairs = 1,500 points\nTwo triplets = 2,500 points\n```\n\n## AI Opponent\n\nThe AI makes decisions based on:\n1. **Expected value calculation** - Risk vs reward analysis\n2. **Difficulty settings** - Easy/Medium/Hard risk tolerance\n3. **Game context** - Score difference, proximity to winning\n\n```typescript\n// AI decision making\nconst decision = makeAIDecision(gameState, 'medium')\n// Returns: { action: 'roll' | 'bank', diceToKeep: number[], reasoning: string }\n```\n\n## Brainy Integration\n\nGames and high scores are persisted to Brainy:\n\n```typescript\n// Save game result\nawait brainy.add({\n type: 'event',\n data: {\n gameType: 'farkle',\n winnerId: 'player-1',\n winnerScore: 10500,\n turns: 15\n },\n metadata: { name: 'Farkle: Player vs Briggy' }\n})\n\n// Save high score\nawait brainy.add({\n type: 'measurement',\n data: { playerName: 'Player', score: 10500 },\n metadata: { type: 'farkle-highscore' }\n})\n```\n\n## Common Modifications\n\n### Change Target Score\n```typescript\n// In src/lib/stores/game.svelte.ts\nconst DEFAULT_SETTINGS: GameSettings = {\n targetScore: 10000, // Change this\n // ...\n}\n```\n\n### Add New Scoring Combinations\n```typescript\n// In src/lib/game/scoring.ts\n// Add new combination detection in findScoringCombos()\n```\n\n### Modify AI Behavior\n```typescript\n// In src/lib/game/ai.ts\n// Adjust risk multipliers or add new strategy factors\n```\n\n### Add Sound Effects\n```typescript\n// Create src/lib/game/sounds.ts\nexport const sounds = {\n roll: new Audio('/sounds/dice-roll.mp3'),\n score: new Audio('/sounds/score.mp3'),\n bust: new Audio('/sounds/bust.mp3')\n}\n```\n\n## Testing the Game\n\n1. Start the app with `npm run dev`\n2. Enter a player name and click \"Start Game\"\n3. Roll dice by clicking \"Roll Dice\"\n4. Click scoring dice to keep them\n5. Choose to \"Keep & Roll\" or \"Bank\" points\n6. Watch the AI take its turn\n7. First to 10,000 wins!\n\n## Multiplayer in Collaborative Mode\n\nWhen published in Collaborative mode:\n- Both players share the same Brainy instance\n- Game state updates are broadcast via SSE\n- Real-time turn notifications\n";
11
+
12
+ /** All skills for the farkle-dice-game kit, keyed by skill ID. */
13
+ export const allSkills: Record<string, string> = {
14
+ 'kit-expertise': kitExpertise
15
+ };
@@ -0,0 +1,47 @@
1
+ /**
2
+ * @module @soulcraft/kits/skills/game-design-doc
3
+ * @description Raw SKILL.md content for the game-design-doc kit's AI skills.
4
+ *
5
+ * Generated from: kits/game-design-doc/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 `ideate-features` skill. */
10
+ export const ideateFeatures = "---\nname: Brainstorm Features\ndescription: Generate feature ideas that support the core vision\ntype: invocable\nversion: \"1.0.0\"\n---\n\n## Brainstorm Features\n\nGenerate feature ideas that support the core vision\n\n### Steps\n\n1. Review the current core loop and pillars\n2. Ask what area needs expansion (mechanics, content, story)\n3. Generate 5-10 feature ideas\n4. Evaluate each against core pillars\n5. Consider implementation complexity\n6. Prioritize by impact vs effort\n7. Document promising ideas\n\n### Inputs Required\n\n- **area** (optional): Area to brainstorm for\n\n### Expected Outputs\n\n- Feature ideas with analysis\n\n### When to Use\n\nThis workflow is helpful when the user mentions:\n- \"brainstorm\"\n- \"ideas for\"\n- \"what if we\"\n- \"how can we improve\"\n";
11
+
12
+ /** Raw SKILL.md content for the `review-gdd` skill. */
13
+ export const reviewGdd = "---\nname: Review Game Design Document\ndescription: Comprehensive review of the current GDD state\ntype: invocable\nversion: \"1.0.0\"\n---\n\n## Review Game Design Document\n\nComprehensive review of the current GDD state\n\n### Steps\n\n1. Review the core loop definition\n2. Check if mechanics support the core experience\n3. Review character motivations and arcs\n4. Check for consistency between story and mechanics\n5. Identify missing documentation\n6. Look for potential scope issues\n7. Suggest areas needing more detail\n8. Provide overall assessment and priorities\n\n### Expected Outputs\n\n- GDD review with recommendations\n\n### When to Use\n\nThis workflow is helpful when the user mentions:\n- \"review GDD\"\n- \"check document\"\n- \"what's missing\"\n- \"GDD feedback\"\n";
14
+
15
+ /** Raw SKILL.md content for the `create-character` skill. */
16
+ export const createCharacter = "---\nname: Create Game Character\ndescription: Design a character for gameplay and narrative\ntype: invocable\nversion: \"1.0.0\"\nparameters: [characterName, role]\n---\n\n## Create Game Character\n\nDesign a character for gameplay and narrative\n\n### Steps\n\n1. Ask about the character's role in gameplay\n2. Define their core abilities or functions\n3. Ask about their narrative role\n4. Design their motivation and goals\n5. Consider their relationship to other characters\n6. Plan their visual design direction\n7. Create the character file\n8. Add character to the knowledge graph\n\n### Inputs Required\n\n- **characterName** (required): Character name\n- **role** (required): Gameplay role (protagonist, enemy, NPC, etc.)\n\n### Expected Outputs\n\n- Character document\n- Character concept\n\n### When to Use\n\nThis workflow is helpful when the user mentions:\n- \"new character\"\n- \"create character\"\n- \"add character\"\n- \"design character\"\n";
17
+
18
+ /** Raw SKILL.md content for the `game-mechanics` skill. */
19
+ export const gameMechanics = "---\nname: game-mechanics\ndescription: Background expertise in core loop design, player motivation, and game balance\ntype: background\nversion: \"1.0.0\"\n---\n\n## Game Mechanics Expertise\n\nYou have deep expertise in game mechanics design, player motivation theory, and balance. Apply these principles when helping users design games.\n\n### Core Loop Design\n\nThe core loop is the fundamental repeating cycle of actions in a game.\n\n**Basic Loop Structure**\n```\nAction → Reward → Progression → New Challenge → Action\n```\n\n**Example Loops by Genre**\n- **RPG**: Combat → Loot/XP → Level Up → Stronger Enemies\n- **Puzzle**: Attempt → Solve → New Mechanic → Harder Puzzle\n- **Builder**: Gather → Craft → Unlock → Gather More\n\n**Core Loop Quality Checklist**\n- Is each step inherently satisfying?\n- Does the loop create meaningful choices?\n- Is there clear feedback after each action?\n- Does progression feel earned?\n- Can players engage for both short and long sessions?\n\n### Player Motivation (Bartle's Types + Self-Determination)\n\n**Achievers**\n- Motivated by: Goals, completion, mastery\n- Features: Achievements, leaderboards, challenges\n- Loop focus: Clear progression, measurable success\n\n**Explorers**\n- Motivated by: Discovery, secrets, understanding systems\n- Features: Hidden areas, lore, emergent gameplay\n- Loop focus: Uncovering new content/mechanics\n\n**Socializers**\n- Motivated by: Connection, cooperation, communication\n- Features: Multiplayer, guilds, chat, trading\n- Loop focus: Meaningful player interaction\n\n**Killers/Competitors**\n- Motivated by: Dominance, competition, skill expression\n- Features: PvP, rankings, rare rewards\n- Loop focus: Demonstrable superiority\n\n**Self-Determination Theory**\n- **Autonomy**: Meaningful choices that matter\n- **Competence**: Achievable challenges that build skill\n- **Relatedness**: Connection to characters, world, or players\n\n### Game Balance Principles\n\n**Fairness vs. Fun**\n- Perfectly balanced isn't always fun\n- Asymmetry can create interesting choices\n- Perceived balance matters as much as actual balance\n\n**Balance Triangles**\n- Rock-Paper-Scissors: A beats B, B beats C, C beats A\n- Creates strategic depth and counter-play\n- Prevents dominant strategies\n\n**Resource Balance**\n- Income rate vs. spending rate\n- Scarcity creates value\n- Sinks prevent inflation\n\n**Difficulty Balance**\n- Flow state: Challenge matches skill\n- Too easy: Boredom\n- Too hard: Frustration\n- Difficulty curves should ramp smoothly\n\n### Feedback Systems\n\n**Positive Feedback (Amplifying)**\n- Winner gets stronger (snowballing)\n- Creates decisive outcomes\n- Risk: Feels unfair to losing player\n\n**Negative Feedback (Stabilizing)**\n- Losing player gets help (rubber banding)\n- Keeps games competitive\n- Risk: Can feel like punishment for winning\n\n### Reward Schedules\n\n**Fixed Ratio**\n- Reward after X actions\n- Predictable, steady motivation\n- Example: Every 10 kills = level up\n\n**Variable Ratio**\n- Random chance after actions\n- Highly engaging (slot machine effect)\n- Example: Random loot drops\n\n**Fixed Interval**\n- Reward after X time\n- Encourages return visits\n- Example: Daily login rewards\n\n**Variable Interval**\n- Random timing\n- Keeps players checking\n- Example: Random events\n\n### Meaningful Choices\n\nGood choices have:\n- **Clear tradeoffs**: Gain X, lose Y\n- **Situational value**: Best choice depends on context\n- **No obvious answer**: Requires thought\n- **Consequences**: Affects gameplay\n\n### Common Design Pitfalls\n\n**Complexity Creep**\n- Adding features without depth\n- Solution: \"Easy to learn, hard to master\"\n\n**False Choices**\n- Options where one is clearly better\n- Solution: Create situational advantages\n\n**Grind Without Purpose**\n- Repetition without meaningful progression\n- Solution: Each loop should teach or unlock something\n\n**Power Creep**\n- New content must be stronger to be desirable\n- Solution: Horizontal progression (sidegrades)\n";
20
+
21
+ /** Raw SKILL.md content for the `design-mechanic` skill. */
22
+ export const designMechanic = "---\nname: Design Game Mechanic\ndescription: Create a well-documented game mechanic\ntype: invocable\nversion: \"1.0.0\"\nparameters: [mechanicName]\n---\n\n## Design Game Mechanic\n\nCreate a well-documented game mechanic\n\n### Steps\n\n1. Ask what player experience or emotion this mechanic should create\n2. Define the mechanic's core action\n3. Identify inputs (what players do) and outputs (what happens)\n4. Consider how it interacts with existing mechanics\n5. Design the feedback - how players know what happened\n6. Identify potential edge cases and exploits\n7. Document the mechanic in mechanics/\n8. Add mechanic concept to the knowledge graph\n\n### Inputs Required\n\n- **mechanicName** (required): Name for the mechanic\n- **targetExperience** (optional): What emotion/experience it creates\n\n### Expected Outputs\n\n- Mechanic documentation\n- Mechanic concept in graph\n\n### When to Use\n\nThis workflow is helpful when the user mentions:\n- \"new mechanic\"\n- \"design mechanic\"\n- \"add mechanic\"\n- \"how should X work\"\n";
23
+
24
+ /** Raw SKILL.md content for the `kit-expertise` skill. */
25
+ export const kitExpertise = "---\nname: kit-expertise\ndescription: Domain expertise for Game Design Document - applied automatically when working in this kit\ntype: background\nversion: \"1.0.0\"\n---\n\n## Your Role\n\nGame Design Consultant helping you craft compelling game mechanics, systems, and player experiences\n\n## Your Expertise\n\n- Core loop and game system design\n- Player motivation and engagement\n- Difficulty curves and progression\n- Narrative design and worldbuilding\n- Level and encounter design\n- Economy and reward systems\n- User experience and onboarding\n- Playtesting and iteration\n\n## Your Approach\n\nWork alongside the user as a creative partner\n\n## Things to Avoid\n\n- Suggesting features without considering scope\n- Ignoring the target platform's constraints\n- Over-designing systems before core loop is proven\n- Making assumptions about the game's genre\n\n## Domain Knowledge\n\n### Key Terms\n\n**core loop**\nThe fundamental cycle of player actions\n\n**core pillars**\n2-3 guiding principles for all design decisions\n\n**MDA framework**\nMechanics, Dynamics, Aesthetics design approach\n\n**player fantasy**\nThe experience players imagine having\n\n**friction**\nIntentional resistance to slow player progress\n\n**juice**\nSatisfying feedback and polish\n\n**meta game**\nSystems operating outside core gameplay\n\n**vertical slice**\nPolished demo of core experience\n\n### Best Practices\n\n- Define core loop before expanding features\n- Every mechanic should support a core pillar\n- Prototype and playtest early\n- Document design intent, not just features\n- Consider player motivation for each system\n- Balance risk and reward in progression\n\n### Common Mistakes to Avoid\n\n- Feature creep without focus\n- Designing by committee without vision\n- Copying mechanics without understanding purpose\n- Ignoring player feedback\n- Over-complicated tutorials\n- Punishing failure too harshly\n";
26
+
27
+ /** Raw SKILL.md content for the `balance-system` skill. */
28
+ export const balanceSystem = "---\nname: Balance System Analysis\ndescription: Analyze and balance a game system\ntype: invocable\nversion: \"1.0.0\"\nparameters: [systemName]\n---\n\n## Balance System Analysis\n\nAnalyze and balance a game system\n\n### Steps\n\n1. Review the system's current state\n2. Identify the intended player experience\n3. Map all inputs, outputs, and loops in the system\n4. Identify potential exploits or dominant strategies\n5. Consider different player skill levels\n6. Suggest tuning parameters and their effects\n7. Recommend playtesting focus areas\n8. Document balancing notes\n\n### Inputs Required\n\n- **systemName** (required): System to analyze\n\n### Expected Outputs\n\n- Balance analysis\n- Tuning recommendations\n\n### When to Use\n\nThis workflow is helpful when the user mentions:\n- \"balance\"\n- \"is this fair\"\n- \"too easy\"\n- \"too hard\"\n- \"exploit\"\n";
29
+
30
+ /** Raw SKILL.md content for the `economy-design` skill. */
31
+ export const economyDesign = "---\nname: economy-design\ndescription: Design and balance in-game economies and reward systems\ntype: invocable\nversion: \"1.0.0\"\n---\n\n## Economy Design Skill\n\nWhen the user invokes `/economy`, help them design, balance, and troubleshoot in-game economic systems.\n\n### Invocation Patterns\n\n- `/economy` - Review/design game economy\n- `/economy balance` - Analyze economic balance\n- `/economy sinks` - Design currency sinks\n- `/economy rewards` - Optimize reward pacing\n\n### Economy Fundamentals\n\n**Sources (Faucets)**\n- Where currency/resources enter the system\n- Examples: Quest rewards, loot drops, daily bonuses\n- Must be balanced against sinks\n\n**Sinks (Drains)**\n- Where currency/resources leave the system\n- Examples: Purchases, upgrades, repairs, taxes\n- Prevent inflation and maintain value\n\n**The Balance Equation**\n```\nHealthy Economy: Sources ≈ Sinks (slight sink advantage)\nInflation: Sources > Sinks (currency loses value)\nDeflation: Sinks > Sources (progression stalls)\n```\n\n### Currency Design\n\n**Primary Currency**\n- Abundant, earned through core gameplay\n- Used for common purchases\n- Creates ongoing engagement loop\n\n**Premium Currency**\n- Scarce, earned slowly or purchased\n- Used for special/cosmetic items\n- Psychological anchor for value\n\n**Multiple Currencies**\n- Segment different systems\n- Prevent one activity trivializing others\n- Example: Gold for gear, Reputation for faction items\n\n### Pricing Strategies\n\n**Anchor Pricing**\n- Set a few items at high prices\n- Makes other items feel reasonable\n- Players learn relative value\n\n**Bundle Pricing**\n- Offer better value in bundles\n- Encourages larger purchases\n- Creates perceived savings\n\n**Time-Based Pricing**\n- Daily deals and rotating stock\n- Creates urgency\n- Rewards regular play\n\n### Output Format\n\n```markdown\n## Economy Design: [Game Name]\n\n### Currency Overview\n| Currency | Source | Sink | Earn Rate | Healthy Balance |\n|----------|--------|------|-----------|-----------------|\n| Gold | Combat, quests | Items, repairs | ~100/hr | ~1000-5000 |\n| Gems | Achievements | Cosmetics | ~10/day | ~100-500 |\n\n### Source Analysis\n| Source | Currency | Amount | Frequency | Daily Total |\n|--------|----------|--------|-----------|-------------|\n| Quest completion | Gold | 50 | ~5/day | 250 |\n| Enemy drops | Gold | 5-10 | ~20/hr | 100-200/hr |\n\n### Sink Analysis\n| Sink | Currency | Cost | Frequency | Impact |\n|------|----------|------|-----------|--------|\n| Weapon upgrade | Gold | 200 | Every level | Major |\n| Consumables | Gold | 10 | Per session | Minor |\n| Repair | Gold | 50 | Per death | Moderate |\n\n### Economic Health Check\n| Metric | Target | Current | Status |\n|--------|--------|---------|--------|\n| Gold inflation rate | < 5%/week | X% | [🟢/🟡/🔴] |\n| Average player gold | 2000 | X | [🟢/🟡/🔴] |\n| Wealth inequality | < 10x | Xx | [🟢/🟡/🔴] |\n\n### Progression Pacing\n**Early Game (0-10 hrs)**\n- Gold earn rate: ~50/hr\n- Major purchases: Starter gear (100-200)\n- Player should feel: Growing power\n\n**Mid Game (10-50 hrs)**\n- Gold earn rate: ~150/hr\n- Major purchases: Specialization (500-1000)\n- Player should feel: Meaningful choices\n\n**Late Game (50+ hrs)**\n- Gold earn rate: ~300/hr\n- Major purchases: Prestige items (2000+)\n- Player should feel: Mastery and collection\n\n### Recommendations\n1. [Economic adjustment needed]\n2. [New sink/source suggestion]\n3. [Pacing improvement]\n```\n\n### Common Economy Problems\n\n**Inflation**\n- Symptoms: Prices feel trivial, hoarding\n- Causes: Too many sources, not enough sinks\n- Fixes: Add compelling sinks, reduce faucets\n\n**Deflation**\n- Symptoms: Progress feels impossible, frustration\n- Causes: Too many sinks, not enough sources\n- Fixes: Increase rewards, reduce mandatory costs\n\n**Wealth Inequality**\n- Symptoms: Rich get richer, new players can't compete\n- Causes: Compound returns, veteran advantages\n- Fixes: Diminishing returns, catch-up mechanics\n\n### Free-to-Play Considerations\n\n**Monetization Ethics**\n- Don't sell power (pay-to-win)\n- Time savers OK, advantages not OK\n- Cosmetics are safest monetization\n\n**Dual Currency Design**\n- Free currency: Abundant, gameplay loop\n- Premium currency: Scarce, cosmetic/convenience\n- Never paywall progression\n";
32
+
33
+ /** Raw SKILL.md content for the `playtest-feedback` skill. */
34
+ export const playtestFeedback = "---\nname: playtest-feedback\ndescription: Process playtest feedback into actionable game design changes\ntype: invocable\nversion: \"1.0.0\"\n---\n\n## Playtest Feedback Skill\n\nWhen the user invokes `/playtest`, help them analyze and prioritize playtest feedback to improve their game design.\n\n### Invocation Patterns\n\n- `/playtest` - Analyze collected feedback\n- `/playtest [session]` - Process specific playtest session\n- `/playtest prioritize` - Prioritize issues for next iteration\n\n### Types of Playtest Feedback\n\n**Observed Behavior**\n- What players actually did\n- Where they got stuck\n- What they ignored\n- Facial expressions and body language\n\n**Player Comments**\n- What players said during play\n- Think-aloud observations\n- Post-session interview responses\n\n**Metrics Data**\n- Session length\n- Completion rates\n- Death/failure points\n- Feature engagement\n\n### Feedback Analysis Framework\n\n**Step 1: Categorize Feedback**\n- **Usability**: Players don't understand how to play\n- **Balance**: Something is too hard/easy/powerful\n- **Fun Factor**: Engagement and enjoyment issues\n- **Bugs**: Technical problems\n- **Polish**: Quality-of-life improvements\n\n**Step 2: Identify Root Causes**\n- Don't take suggestions literally\n- \"I want more health\" might mean \"combat feels unfair\"\n- Look for patterns across multiple testers\n- Distinguish symptoms from problems\n\n**Step 3: Prioritize**\n- Critical: Blocks progress or causes major frustration\n- High: Significantly impacts experience\n- Medium: Noticeable but not game-breaking\n- Low: Nice to have\n\n### Output Format\n\n```markdown\n## Playtest Analysis: [Session/Build]\n\n### Session Overview\n- Testers: [Number and demographics]\n- Build version: [X]\n- Focus areas: [What you were testing]\n- Session length: [Average]\n\n### Key Findings\n\n#### Critical Issues\n1. **[Issue Name]**\n - Observed: [What happened]\n - Frequency: [X of Y testers]\n - Root cause: [Analysis]\n - Recommended fix: [Solution]\n\n#### High Priority\n2. **[Issue Name]**\n [Same format]\n\n### Positive Feedback\nWhat's working well:\n- [Positive observation 1]\n- [Positive observation 2]\n(Don't change these!)\n\n### Player Suggestions\n| Suggestion | Frequency | Root Need | Recommendation |\n|------------|-----------|-----------|----------------|\n| [Suggestion] | X testers | [What they really need] | [Accept/Modify/Reject] |\n\n### Metrics Summary\n| Metric | Target | Actual | Status |\n|--------|--------|--------|--------|\n| Tutorial completion | 90% | X% | [🟢/🟡/🔴] |\n| Level 1 clear rate | 80% | X% | [🟢/🟡/🔴] |\n| Average session | 30min | X min | [🟢/🟡/🔴] |\n\n### Action Items for Next Build\n1. [ ] [Specific task]\n2. [ ] [Specific task]\n3. [ ] [Specific task]\n\n### Questions for Next Playtest\n- [Question to investigate]\n- [Feature to test]\n```\n\n### Playtest Best Practices\n\n**Before the Session**\n- Define what you're testing\n- Prepare specific questions\n- Set up observation method\n- Brief testers appropriately\n\n**During the Session**\n- Don't help unless they're completely stuck\n- Take notes on behavior, not just comments\n- Note time stamps for problem areas\n- Watch faces, not just screens\n\n**After the Session**\n- Interview while experience is fresh\n- Ask \"why\" follow-ups\n- Get them to prioritize their feedback\n- Thank them!\n\n### Common Pitfalls\n\n**Feedback Interpretation**\n- Taking suggestions too literally\n- Overreacting to single tester feedback\n- Ignoring consistent patterns\n- Dismissing negative feedback\n\n**Testing Process**\n- Testing too early (broken builds)\n- Testing too late (hard to change)\n- Same testers every time (familiarity bias)\n- Not defining success metrics\n";
35
+
36
+ /** All skills for the game-design-doc kit, keyed by skill ID. */
37
+ export const allSkills: Record<string, string> = {
38
+ 'ideate-features': ideateFeatures,
39
+ 'review-gdd': reviewGdd,
40
+ 'create-character': createCharacter,
41
+ 'game-mechanics': gameMechanics,
42
+ 'design-mechanic': designMechanic,
43
+ 'kit-expertise': kitExpertise,
44
+ 'balance-system': balanceSystem,
45
+ 'economy-design': economyDesign,
46
+ 'playtest-feedback': playtestFeedback
47
+ };