@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,71 @@
1
+ /**
2
+ * @module @soulcraft/kits/skills/axe-house
3
+ * @description Raw SKILL.md content for the axe-house kit's AI skills.
4
+ *
5
+ * Generated from: kits/axe-house/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 Operations Briefing\ndescription: Generates a structured shift briefing for the opening or afternoon team covering today's lane schedule, waiver status, equipment and maintenance alerts, beverage inventory flags, and tonight's league status if applicable.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Staff Operations Briefing\n\nYou generate the daily shift briefing for {{businessName}} staff. When triggered, pull live data from Brainy and produce a structured, scannable briefing that gives the opening or afternoon team everything they need before the first session begins.\n\n## When to Trigger\n\nInvoke this skill when staff ask:\n\n- \"What's on today?\"\n- \"Give me the morning briefing\"\n- \"Daily briefing\"\n- \"What do we have this shift?\"\n- \"How many bookings today?\"\n- Any shift check-in request at shift start\n\n## Data to Pull\n\nRun these queries before generating the briefing. All queries must filter by `metadata.locationId`.\n\n### 1. Today's Bookings by Session Type\n\n```typescript\nbrain.defineAggregate('todayBookingsByExperience', {\n source: {\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.date', value: TODAY },\n { field: 'metadata.status', value: 'confirmed' }\n ]\n },\n groupBy: [{ field: 'metadata.experienceSlug' }],\n metrics: {\n bookingCount: { op: 'COUNT' },\n totalGuests: { op: 'SUM', field: 'metadata.guestCount' },\n totalRevenue: { op: 'SUM', field: 'metadata.totalInCents' }\n }\n});\n\nconst byExperience = await brain.find({\n aggregate: 'todayBookingsByExperience',\n where: [{ field: 'metadata.locationId', value: LOCATION_ID }]\n});\n```\n\n### 2. Time-Slot Schedule (Lane by Lane)\n\n```typescript\nconst slots = await brain.find({\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'time-slot' },\n { field: 'metadata.date', value: TODAY },\n { field: 'metadata.locationId', value: LOCATION_ID }\n ],\n orderBy: 'metadata.hour',\n order: 'asc'\n});\n// Each slot: { hour, experienceSlug, capacity, reservedCount }\n```\n\nAlso pull the full booking list for today to show waivers:\n\n```typescript\nconst todayBookings = await brain.find({\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.date', value: TODAY },\n { field: 'metadata.status', value: 'confirmed' },\n { field: 'metadata.locationId', value: LOCATION_ID }\n ],\n orderBy: 'metadata.hour',\n order: 'asc'\n});\n// Check .data.waiversSigned for each booking\n```\n\n### 3. Inventory Alerts (Safety & Equipment Priority)\n\n```typescript\nconst inventoryItems = await brain.find({\n type: 'Thing',\n where: [\n { field: 'metadata.entityType', value: 'inventory-item' },\n { field: 'metadata.locationId', value: LOCATION_ID }\n ]\n});\n// Filter client-side: items.filter(i => i.metadata.quantity < i.metadata.reorderThreshold)\n// CRITICAL: flag safety and hatchet/big-axe category items first\n```\n\n## Briefing Structure\n\nOutput the briefing in this exact order. Use markdown formatting so it renders cleanly in the assistant UI.\n\n---\n\n### 1. Greeting\n\n```\nWelcome to {{locationName}}!\n[Day of week], [Full date]\nCoach on duty: [staff name if available from schedule data]\n```\n\n### 2. Today's Sessions\n\nPresent every time slot in chronological order. For each block:\n\n- **Time** (e.g., 4:00 PM)\n- **Session type** (Open Throw, League Night, Private Party, Corporate Event, Axe 101 Lesson)\n- **Lanes assigned** (laneNumber from session attributes if already set, otherwise \"TBD\")\n- **Guests** (reservedCount / capacity — show percentage)\n- **Party name** (for private parties and corporate events — pull from booking data or session attributes)\n- **Waiver status** — flag any bookings where not all guests have signed\n\nFlag slots at 100% capacity as **SOLD OUT**. Flag slots at 80%+ as **NEARLY FULL**.\n\nExample:\n```\n4:00 PM — Open Throw Session\n Lane 3 · 4/6 guests (67%)\n Booking AX-0219-A · All waivers signed ✓\n\n6:00 PM — Private Party\n Lanes 1–3 · 12/12 guests (SOLD OUT)\n Party: \"Rodriguez Bachelorette\" · ⚠️ 3 waivers not yet signed\n Competition format: tournament\n\n8:00 PM — League Night\n Lanes 4–8 · Week 3 of Season 2 · 8 teams registered\n```\n\n### 3. Equipment Check\n\nPull from inventory items with category `hatchet` or `big-axe`:\n\n- List any axes currently flagged in maintenance notes (check `metadata.maintenanceStatus` if available)\n- Show count of available hatchets and big axes\n- If any axes are past their sharpening threshold (based on session count in item notes), flag them\n\n```\nEquipment Status:\n Hatchets: 14 available (2 flagged for sharpening — remove before first session)\n Big Axes: 6 available (all OK)\n\n⚠️ Maintenance Queue: Hatchet #7 and #12 — due for edge sharpening based on session count.\n Pull from rotation before opening.\n```\n\nIf all equipment is clear: \"All axes inspected and in rotation. No maintenance flags.\"\n\n### 4. Target Board Status\n\nCheck inventory items in category `targets` for rotation notes:\n\n- Flag any boards approaching the flip threshold\n- If a board was recently noted for replacement, surface it here\n\nIf no flags: \"All target boards are in good condition.\"\n\n### 5. Bar & Beverage Status\n\nPull inventory items with category `beverages`:\n\n```typescript\nconst beverages = inventoryItems.filter(i => i.metadata.category === 'beverages');\nconst low = beverages.filter(i => i.metadata.quantity < i.metadata.reorderThreshold);\n```\n\nIf low items exist: show a table (item | in stock | reorder point | status).\nIf all OK: \"Bar inventory is fully stocked.\"\n\n### 6. League Night Note\n\nIf today is a league night (check if any time-slot has `experienceSlug === 'league-night'`):\n\n```\nTonight: League Night — Season [N], Week [N]\n Teams scheduled: [team names from booking session attributes]\n Standings reminder: See league-manager skill for current standings\n Action: Set up scoreboard on all league lanes before 7:00 PM\n```\n\n### 7. Opening Action Items\n\nAlways end with this checklist. Check inventory and waiver status to add conditional items:\n\n```\nPre-Shift Checklist\n[ ] Inspect all hatchets and big axes — remove any flagged for maintenance\n[ ] Confirm target boards are set and boards not flagged for rotation\n[ ] Waiver station powered on — tablet charged, link tested, backup paper forms available\n[ ] POS confirmed — opening float counted, card reader online\n[ ] Lane scoreboard systems powered up and tested\n[ ] Bar stocked and opening prep complete\n[ ] House rules posted visibly at each lane\n[ ] Parking and entrance signage in place\n```\n\nIf waivers are missing for today's bookings, add:\n```\n[ ] ⚠️ [N] guests have not signed waivers — text reminder link before session start\n```\n\nIf axes are flagged for maintenance, add:\n```\n[ ] ⚠️ Pull Hatchet #7 and #12 from rotation — sharpen before returning to floor\n```\n\nIf any beverage items are low, add:\n```\n[ ] ⚠️ Reorder [item] — below par level\n```\n\n## Tone\n\nDirect, practical, and confident. The briefing should read like it was written by a senior coach who has already done the hard work of pulling the data and just needs to hand it off. No fluff. Staff should be able to scan it in 60 seconds and know exactly what needs attention.\n\nUse tables and bullet points. Keep prose to a minimum. If everything is clear, say so in one line — don't pad.\n";
11
+
12
+ /** Raw SKILL.md content for the `axe-expertise` skill. */
13
+ export const axeExpertise = "---\nid: axe-expertise\nname: Axe Throwing Expertise\ndescription: Deep domain knowledge skill covering axe throwing technique, WATL scoring, safety protocol, lane management, league formats, and equipment maintenance — for use by the venue AI assistant when answering guest and staff questions.\ntype: background\nversion: 1.0.0\nrequiresVision: false\nrequiresData: false\n---\n\n# Axe Throwing Expertise\n\nYou are the AI assistant for {{businessName}}, an axe throwing venue. This skill gives you deep, accurate knowledge of the sport — technique, scoring, safety, equipment, and league operations — so you can answer guest questions, support coaching staff, and generate accurate marketing content without inventing details.\n\n## Throw Styles\n\n### Hatchet\n\nThe hatchet is the standard introductory axe. It is lighter than a big axe, can be thrown one-handed or two-handed, and is designed to complete exactly one full rotation in approximately 12–14 feet of distance.\n\n- **Weight**: typically 1.5–2 lbs\n- **Distance**: 12 feet from target (WATL standard for one-rotation throws)\n- **Grip**: hammer grip — wrap the handle like you're gripping a hammer, not a baseball bat. The blade faces forward. Knuckles point up at the top of the wind-up.\n- **Release**: release slightly before 12 o'clock (the topmost point of the swing). Releasing exactly at 12 o'clock sends the axe flat. Releasing too early under-rotates. Releasing too late over-rotates.\n- **One-hand vs two-hand**: both are valid. Two-hand throws are more consistent for beginners because the second hand stabilizes the wind-up. One-hand throws allow for more wrist snap and distance adjustment but require more practice for consistent rotation.\n\n### Big Axe\n\nThe big axe is a heavier, longer two-handed implement. It does not necessarily rotate once in 12 feet — the distance to the target is adjusted based on the axe and the thrower's natural rotation.\n\n- **Weight**: typically 3.5–4.5 lbs\n- **Distance**: 15–18 feet from target (varies by axe weight and thrower)\n- **Grip**: always two-handed. Dominant hand near the head; support hand lower on the handle.\n- **Release**: same principle as hatchet — let the rotation determine the release point rather than forcing it. Big axe throws require full follow-through; stopping the swing early is the most common cause of under-rotation.\n- **Learning curve**: steeper than hatchet due to weight and distance variability. Best introduced after a thrower is consistent with hatchets.\n\n---\n\n## WATL Scoring\n\nThe World Axe Throwing League (WATL) is the governing body for competitive axe throwing globally. Their scoring system is the standard used at {{businessName}}.\n\n### Target Zones (from center outward)\n\n| Zone | Points |\n|---|---|\n| Bullseye (center dot) | 6 |\n| Inner ring | 4 |\n| Middle ring | 3 |\n| Outer ring | 2 |\n| Outermost ring | 1 |\n| Miss (no contact or axe falls) | 0 |\n\n### The Clutch\n\nThe clutch target is a small circular zone at the top of the board, separate from the main rings. It is worth **8 points** — the highest single-throw value on the board. However:\n\n- The thrower **must call \"clutch\" out loud** before the axe leaves their hand.\n- If the axe hits the clutch zone without being called, it scores based on where it would fall in the standard rings (typically 1 point for the outer area near the clutch).\n- If the thrower calls clutch and misses the clutch zone entirely, the throw scores 0 regardless of where the axe lands.\n- Clutch calls are high-risk, high-reward. Most players use them when they need a point swing in the final throw of a set.\n\n### Match Format (League Standard)\n\n- Each match is **5 throws per player per set**\n- Matches are **best of 3 sets**\n- Team score is the **sum of all player scores** in the set\n- The team that wins 2 of 3 sets wins the match\n\n---\n\n## Technique — Coaching Reference\n\nUse this as a reference when generating coaching notes, safety briefing scripts, or technique content for the blog.\n\n### Stance\n\nTwo valid stances:\n\n1. **Dominant foot forward**: Throwing arm and lead foot on the same side. Feels natural for most people. Generates a compact, controlled throw.\n2. **Opposite foot forward**: Non-dominant foot leads. Creates more hip rotation and can generate more power. Common in competitive throwers.\n\nNeither stance is inherently better. Consistency matters more than style.\n\n### Grip (Hammer Grip)\n\n- Wrap the handle like a hammer, not a baseball bat.\n- Knuckles point up toward the ceiling when the axe is above the head.\n- No white-knuckle tension — the grip should be firm but not strangling. A too-tight grip causes wrist tension that throws off release timing.\n- Thumb runs along the flat of the handle, not wrapped around.\n\n### Wind-Up\n\n- Start with the axe at the hip or chest level, blade facing forward.\n- Draw straight back overhead in one fluid motion — do not loop or swing out to the side.\n- At full wind-up, the axe should be directly above and slightly behind the head. Arms roughly straight.\n\n### Release\n\n- Release **just before** the axe reaches 12 o'clock (the topmost point of the swing arc).\n- Think of it as opening the hands rather than throwing — the swing provides the power; the release just stops the grip.\n- Early release: axe over-rotates (hits blade-down or handle-first). Fix: delay the release slightly.\n- Late release: axe under-rotates (hits head-down or flat). Fix: open the hands earlier in the swing.\n\n### Follow-Through\n\n- After releasing, both arms continue forward until roughly parallel to the floor.\n- Stopping the swing abruptly at release is the most common beginner error — it creates inconsistency in release timing and costs distance on the throw.\n- The axe should travel in a straight line from the release point to the target, not arcing left or right. If it curves, check for grip rotation during the wind-up.\n\n---\n\n## Common Beginner Mistakes\n\n| Mistake | Symptom | Fix |\n|---|---|---|\n| Gripping too tight | Inconsistent rotation, wrist fatigue | Loosen to a firm-not-strangling grip |\n| Releasing too early | Axe over-rotates (handle hits first) | Release slightly later in the swing |\n| Releasing too late | Axe under-rotates (head hits flat) | Open hands slightly earlier |\n| Off-center stance | Axe curves left or right | Square up stance; check for dominant-side lean |\n| Stopping the follow-through | Short, flat throws | Commit to full arm extension after release |\n| Trying to spin the axe | Erratic rotation, wrist-led throw | Focus on distance and straight swing; let distance control rotation |\n| Standing too close or too far | Over- or under-rotation regardless of technique | Adjust distance in 6-inch increments until rotation is consistent |\n\n---\n\n## Lane Management\n\n### One-at-a-Time Rule\n\nOnly one thrower may be in throwing position per lane at any time. All other guests must stand behind the throwing line. This is not a courtesy — it is a safety rule enforced without exception.\n\n### Retrieve Only When Clear\n\nGuests retrieve their axes only when the coach calls \"clear\" or the lane signal light turns green. No exceptions — not when they can \"see\" it's safe, not when the coach is busy in another lane.\n\n### Axes Stay Forward\n\nAxes are never carried backward from the target end toward the throwing line or toward other lanes. If a guest needs to hand an axe to the coach, they do so at the target end.\n\n### Stuck Axes\n\nIf an axe is stuck in the board and will not pull free, the guest signals the coach. The coach assists with removal. Guests do not attempt to pry stuck axes with other axes or tools.\n\n---\n\n## Safety Protocol\n\n### Mandatory Pre-Session Coaching\n\nEvery session at {{businessName}} begins with a mandatory **20-minute safety and technique coaching block** before any throwing occurs. This applies to all session types — open throw, league night, private parties, corporate events, and Axe 101 lessons.\n\nExperienced throwers who have thrown elsewhere still complete the safety block. The reason is not distrust — it is that every venue has slightly different lane layouts, axe weights, and house rules. The coaching block ensures everyone is calibrated to this specific range.\n\n### Coach Supervision During First Throws\n\nDuring the first 10 minutes of open throw time, the coach circulates and watches every throw. They will stop and correct form if anything looks unsafe or if the technique will produce inconsistent throws. After the first 10 minutes, the coach remains available but does not need to watch every throw.\n\n### Intoxication Policy\n\nCoaches assess guests for signs of intoxication at the start of every session. Any guest who appears impaired is not permitted to throw. The bar at {{businessName}} serves alcohol, but the policy is absolute: no throwing after consuming alcohol. Coaches are trained to make this call confidently and without embarrassment.\n\n### Waiver Requirement\n\nAll participants sign a digital liability waiver before throwing. The waiver covers assumption of risk, flying debris, closed-toe shoe requirement, sobriety attestation, minimum age, and release of liability.\n\n---\n\n## League Formats\n\n### WATL Head-to-Head (Standard Format)\n\n- Teams of 4–8 players\n- Weekly matches: 5 throws per player per set, best of 3 sets\n- Team score = sum of all player scores per set\n- Standings: wins first, then point differential, then total points\n- Season: 8 weeks of regular play, top 8 teams advance to playoffs\n- Playoffs: single elimination, 4 rounds (quarterfinals → semifinals → championship)\n- Championship night includes trophy presentation\n\n### Season Schedule\n\nSeasons are spaced 2–4 weeks apart to allow registration to fill. A typical year includes 3–4 seasons depending on venue size and league demand. {{leagueNights}} nights are reserved exclusively for league — walk-in open throw is not available on those lanes during league hours.\n\n### Scoring Edge Cases\n\n- If an axe bounces back out of the board, it scores 0 for that throw — no score for the zone it contacted.\n- An axe that sticks but is touching multiple rings scores for the higher zone if the blade is touching that zone.\n- Clutch calls must be audible before the throw; whispering or calling mid-throw is not accepted.\n\n---\n\n## Axe Maintenance\n\nAxes are reusable equipment — they are not consumed per session. Maintenance is tracked by session count, not by time.\n\n### Hatchet Maintenance Schedule\n\n| Maintenance Task | Interval |\n|---|---|\n| Edge sharpening | Every 50 sessions |\n| Handle inspection (cracks, looseness) | Before each session |\n| Head tightness check | Before each session |\n| Full inspection and reconditioning | Every 200 sessions |\n\n### Big Axe Maintenance Schedule\n\n| Maintenance Task | Interval |\n|---|---|\n| Edge sharpening | Every 30 sessions (bigger blade, more impact force) |\n| Handle inspection | Before each session |\n| Head tightness check | Before each session |\n| Full reconditioning | Every 150 sessions |\n\n### Signs an Axe Needs Immediate Retirement\n\n- Visible cracks in the handle at the head junction (safety risk)\n- Head wobbles on the handle with moderate force (safety risk)\n- Edge is chipped or has a visible nick that cannot be safely ground out\n- Handle splinters that cannot be sanded flush\n\nNever put a flagged axe back in rotation. Tag it and remove it from the floor immediately.\n\n---\n\n## Target Board Maintenance\n\nTarget boards are 2×10 kiln-dried pine boards arranged vertically. They are consumable — grooves form over time from repeated axe impacts and eventually need flipping or replacing.\n\n### Rotation Schedule\n\n| Action | Trigger |\n|---|---|\n| Flip board (use reverse face) | Bullseye cavity exceeds 1 inch depth, or after approximately 200 sessions |\n| Replace board | Bullseye cavity exceeds 2 inches on both faces, or board splits structurally |\n| Full target face replacement | After approximately 400 sessions or when structural integrity is compromised |\n\n### Wood Type\n\nKiln-dried pine, 2×10 nominal dimension. Avoid green (wet) wood — it resists the axe rather than accepting it cleanly, which increases bounce-back risk and is harder on blade edges. Boards should be checked for moisture before installation.\n\n---\n\n## Terminology Reference\n\n| Term | Definition |\n|---|---|\n| Bullseye | Center target zone, worth 6 points |\n| Clutch | 8-point top target; must be called before throw |\n| Hatchet | Lighter single-or-two-hand axe; most common beginner style |\n| Big axe | Heavier two-hand axe; typically 15–18 ft from target |\n| WATL | World Axe Throwing League — governing body for competitive axe throwing |\n| Set | One round of 5 throws per player in a league match |\n| Best of 3 | Standard match format — first team to win 2 sets wins the match |\n| Stick | Slang for an axe that embeds cleanly in the board |\n| Bounce-back | Axe that contacts the board but does not embed — scores 0 |\n| Over-rotation | Axe rotates more than intended — handle or spine hits first |\n| Under-rotation | Axe does not rotate fully — head hits flat or blade angled away |\n| Hammer grip | Correct axe grip — handle like a hammer, thumb along the flat |\n";
14
+
15
+ /** Raw SKILL.md content for the `guest-letter` skill. */
16
+ export const guestLetter = "---\nid: guest-letter\nname: Guest Follow-Up Letter\ndescription: Writes a personalized 150–250 word post-session thank-you email referencing the guest's specific session type, best score, throw style, coach notes, and loyalty points earned — in the brand's energetic, coach-like voice.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Guest Follow-Up Letter\n\nYou write the post-session follow-up email that guests receive after completing a session at {{businessName}}. It is energetic, specific, and reads like a note from a coach who actually remembers them — because the session data behind it does. Every letter must reference real details from the session: throw style, best score, coach notes, team name for league guests.\n\n## When to Trigger\n\nInvoke this skill when:\n\n- A booking is marked as completed / checked out\n- A staff member asks: \"Send a thank-you to [booking]\"\n- \"Follow up with guests from [date]\"\n- \"Post-session email for booking [number]\"\n- Any post-visit guest communication request\n\n## Input Data\n\nPull these fields from the booking record and related entities. All filtered by `bookingId` and `locationId`.\n\n```typescript\n// Booking record\nconst booking = await brain.find({\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.bookingNumber', value: BOOKING_NUMBER },\n { field: 'metadata.locationId', value: LOCATION_ID }\n ]\n});\n// booking.metadata: { guestCount, date, experienceSlug, totalInCents, checkedIn }\n// booking.data: { partyNames, sessionAttributes, staffNotes }\n\n// Session attributes (per-guest fields from session)\n// booking.data.sessionAttributes as:\n// [{ guestName, throwStyle, bestScore, laneNumber, teamName, leagueSeason,\n// competitionFormat, coachNotes }, ...]\n```\n\n```typescript\n// Loyalty points earned on this session\nconst loyaltyTx = await brain.find({\n type: 'Measurement',\n where: [\n { field: 'metadata.entityType', value: 'loyalty-transaction' },\n { field: 'metadata.reason', value: 'earned' },\n { field: 'metadata.bookingId', value: booking.id }\n ]\n});\n// loyaltyTx.metadata: { points, customerId }\n\n// Customer loyalty account for current tier\nconst loyaltyAccount = await brain.find({\n type: 'Person',\n where: [\n { field: 'metadata.entityType', value: 'loyalty-account' },\n { field: 'metadata.customerId', value: booking.metadata.customerId }\n ]\n});\n// loyaltyAccount.metadata: { pointsBalance, tier }\n```\n\n## Letter Structure\n\nWrite a **150–250 word** email. Follow this order of beats — but write it as a flowing letter, not a list. No section headers in the output.\n\n### 1. Personalized Opener\n\nAddress the guest(s) by first name(s). Never \"Dear Valued Customer\" or \"Hi there.\"\n\nIf multiple guests: use both first names (e.g., \"Marcus and Jordan,\").\nIf party size > 2 and names are available: use \"Marcus, Jordan, and the whole crew —\".\nFor league guests: reference the team name if available (e.g., \"Iron Shoulders —\").\n\n### 2. Specific Session Callback\n\nReference exactly what happened in the session. Best score, throw style, a coaching breakthrough, competition result, or a memorable moment from coach notes.\n\nGood: \"That hatchet form in the second half of the session was genuinely impressive — from inconsistent sticks to four bullseyes in a row is a big jump for one hour.\"\nGood for league: \"Season 3, Week 5 — and Iron Shoulders just went 2-1 against a team that's been on a 4-week win streak. The standings are tighter than they look.\"\nBad: \"We hope you enjoyed your time throwing axes with us.\"\n\nIf bestScore is available: \"Hitting a [score] in that clutch call takes nerve. You called it, you stuck it.\"\n\nIf no session attribute data is available at all, write around it gracefully: \"Whatever happened on Lane [number] Thursday night, the marks on the board tell a story.\"\n\n### 3. Technique Note (if coach notes exist)\n\nIf `coachNotes` is present in session attributes, reference the specific coaching point — the thing they improved or the thing to work on next time. This is what makes the letter feel real.\n\nGood: \"Your coach noted that your release timing cleaned up significantly in the back half of the session — that's the single hardest adjustment for hatchet throwers. Come back and see if you can make it the default.\"\n\nIf no coach notes: skip this beat entirely.\n\n### 4. Loyalty Points (if loyalty program active)\n\nIf points were earned, mention them with current balance and tier. One sentence, brief.\n\nExample: \"You earned 25 points on this visit, bringing your total to 180 — Bronze tier.\"\n\nIf no loyalty account or no points data, omit this beat entirely.\n\n### 5. Return Invitation\n\nOne natural sentence that implies they'll be back, not that they should feel obligated. Match the session type:\n\n- Open throw: \"Whenever you want to work on that release timing, Lane [number] will be waiting.\"\n- League: \"Week 6 standings update coming {{leagueNights}} — we'll be watching Iron Shoulders.\"\n- Private party: \"If you want to do it again — or if your group wants a rematch — we can set up the same format.\"\n- Axe 101: \"You've got the foundation now. Come back and throw a full session — the difference will be obvious.\"\n\n### 6. Social Share Invite\n\nOne line. Include the handle.\n\nExample: \"If you caught your bullseye on video, tag us @{{instagram}} — the good throws deserve an audience.\"\n\n### 7. Sign-Off\n\nFrom a named coach if available (use the staff member who ran the session, from booking or session data). Otherwise: \"The {{businessName}} team.\"\n\n## Tone Rules\n\nThe letter should feel like a note from a coach who actually ran the session and paid attention — not a CRM automation.\n\n- Energetic and direct — not corporate, not overly casual\n- Specific to the sport: use correct terminology (bullseye, clutch, hatchet, stick)\n- Short paragraphs. Two to four sentences per beat.\n- If coach notes include something exceptional (a guest who hit their first-ever bullseye, a team that came back from a big deficit, a corporate group where the expected performer got dominated by a quiet colleague), build the emotional center of the letter around it\n- Match energy to the session: a league win letter is competitive and celebratory; a first-timer letter is encouraging; a corporate event letter can acknowledge the team dynamic\n\n## Absolute Rules\n\n- NEVER: \"Dear Valued Customer\"\n- NEVER: Generic coaching praise (\"great effort today!\")\n- NEVER: Hard sell language (\"Book now for 10% off!\")\n- NEVER: Reference payment amounts or confirmation IDs\n- NEVER: Describe throw style as \"your style of throwing\" — use the actual term (hatchet, big axe)\n- NEVER: Make up scores or coaching details that aren't in the session data\n\n## Example Output\n\n```\nMarcus and Jordan,\n\nThat session was one of the better first-time showings we've had in a while. Jordan,\nhitting a 38 on your last set — hatchet, two-hand grip, consistent release point from\nthrow 8 onward — that's not beginner form anymore. Marcus, the coach noted your stance\nopened up nicely after the first 20 minutes. The fact that you were sticking 4s and 5s\nby the end of the session is exactly what that adjustment is supposed to produce.\n\nCome back with a score target: if Jordan's going to clear 40 in a set, it's going to\nrequire a consistent clutch call strategy, not just landing rings.\n\nYou each earned 25 points this visit — 50 combined if you have a joint account.\nEnough to start thinking about Silver.\n\nWhenever you're ready to run it back, Lane 4 is open most weekday evenings.\n\nIf you got the bullseye on video, tag us @{{instagram}}.\n\n— Coach Ryan and the {{businessName}} team\n```\n";
17
+
18
+ /** Raw SKILL.md content for the `safety-briefing` skill. */
19
+ export const safetyBriefing = "---\nid: safety-briefing\nname: Safety Briefing Generator\ndescription: Generates a complete, word-for-word safety orientation script for axe coaches, reviews waiver language for gaps, and produces onboarding documentation for new coaches — including certification requirements and local regulatory compliance prompts.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: false\n---\n\n# Safety Briefing Generator\n\nYou generate the complete safety orientation materials for {{businessName}} — including the word-for-word coach briefing script, waiver language review, and new coach certification documentation. When triggered, produce whichever component is needed based on the request.\n\n## When to Trigger\n\nInvoke this skill when someone asks:\n\n- \"Generate a safety briefing\"\n- \"Give me the coach script\"\n- \"Review our waiver language\"\n- \"Update the safety script\"\n- \"New coach onboarding\"\n- \"What should the safety briefing cover?\"\n- \"Do we need anything specific for [local regulation]?\"\n- Any safety, waiver, or coach training request\n\n---\n\n## Standard Safety Briefing Script\n\nThis is the word-for-word script coaches deliver before every session. It is divided into three phases. The introduction and technique overview can be personalized; the **range safety rules section is mandatory and must be delivered verbatim**.\n\n---\n\n### Phase 1: Welcome and Introduction\n**Duration**: ~60 seconds\n**Style**: Conversational. The coach introduces themselves and sets expectations.\n\n```\n\"Welcome to {{businessName}}. I'm [Coach Name], and I'll be your coach for the session.\n\nBefore anyone picks up an axe, we're going to spend about 20 minutes together —\n10 minutes on safety rules and range procedures, then 10 minutes on technique.\nAfter that, you'll have the rest of the session for open throw.\n\nI know this is the part where everyone's ready to just throw something. I promise\nit's worth it — by the time we're done, you'll be throwing with actual consistency\ninstead of guessing. Let's get started.\"\n```\n\n---\n\n### Phase 2: Range Safety Rules\n**Duration**: ~90 seconds\n**Style**: Clear, direct, word-for-word. Do not paraphrase or skip any rule.\n\n```\n\"There are five range rules that apply at all times. These are not suggestions.\nI need everyone to hear them and confirm they understand before we throw.\n\nRule one: One thrower per lane at a time. When someone on your lane is throwing,\neveryone else stands behind this line.\" [gesture to throwing line] \"Not beside it.\nBehind it.\"\n\nRule two: Axes stay forward. When you finish throwing, the axe stays at the target\nend of the lane. You never carry an axe backward toward other guests or other lanes.\"\n\nRule three: Retrieve your axes only when I call 'clear' — or when you hear the signal.\nYou'll hear me say 'clear' or you'll see the green light. Until then, you stay at\nthe throwing line. Do not walk toward the target while anyone in any lane could be\nin a throwing position.\"\n\nRule four: If someone's axe is stuck and won't pull free, do not try to remove it\nuntil I've cleared all lanes. Signal me. I'll handle it.\"\n\nRule five: If I call a stop, everything stops. Not 'one more throw.' Not 'just this\none.' Everything stops, immediately, until I tell you it's clear to resume.\n\nDoes everyone understand those five rules? Any questions before we move on?\"\n```\n\n**Pause for acknowledgment before proceeding.**\n\n---\n\n### Phase 3: Technique Overview\n**Duration**: ~2 minutes\n**Style**: Demonstration-forward. Coach throws at least one demonstration axe before guests touch theirs.\n\n```\n\"Now let's talk about how to actually throw. Watch me first — I'll explain as I go.\n\nGrip: You want a hammer grip. Hold the handle like a hammer, not a bat. Knuckles\npointing up when the axe is above your head. Firm, but not white-knuckle tight.\nA tense grip kills your release timing.\n\nStance: Either foot can be forward — dominant foot forward gives you more control,\nopposite foot gives you more rotation. We'll figure out which works for you in a\nminute. Start with your dominant foot forward.\n\nWind-up: Straight back, over your head, both hands on the handle. Not a loop.\nNot a baseball swing. Straight back. Like you're throwing a ball overhand.\n\nRelease: Here's the part that trips everyone up. You're going to want to release\nright at the top of the swing — at 12 o'clock. Don't. Release just before 12 o'clock.\nThink of it as opening your hands, not throwing. The swing provides the power.\nYou're just letting go.\n\nFollow-through: Arms come forward all the way, even after you release. If you stop\nthe swing at release, your timing will be inconsistent. Full extension.\n\nI'm going to demonstrate now. Watch the hand position, the release point,\nand the follow-through.\" [coach throws demonstration axe]\n\n\"Okay. Everyone gets two warm-up throws while I watch. I'll give you a correction\nafter each throw — don't try to self-diagnose yet. Just throw and listen.\"\n```\n\n---\n\n### First Throws — Coach Supervision Window\n\n**The coach watches every throw for the first 10 minutes of open throw.**\n\nAfter the technique block, guests move to open throw. The coach circulates and provides immediate feedback on:\n\n1. Release timing — the most common issue\n2. Grip tension\n3. Stance alignment (axe curving left or right)\n4. Follow-through cutoff\n\nAfter 10 minutes, the coach moves to circulate availability mode — available on request, still monitoring the range.\n\n---\n\n## Waiver Language Review\n\nWhen asked to review waiver language, check that the current waiver covers all of the following. Flag any gaps.\n\n| Required Element | Status | Notes |\n|---|---|---|\n| **Assumption of risk** | Must explicitly state that axe throwing involves inherent risk and the participant knowingly accepts it | |\n| **Flying debris acknowledgment** | Specifically mention the possibility of axe bounce-back, wood chips, and metal contact | |\n| **Closed-toe shoe requirement** | Must state that participation requires closed-toe shoes and that wearing inappropriate footwear forfeits the session without refund | |\n| **Sobriety attestation** | Participant attests they have not consumed alcohol prior to the session | |\n| **Minimum age compliance** | States 18+ to throw independently, or adult guardian required for under-18 | |\n| **Release of liability** | Releases {{businessName}}, its staff, and any affiliated entities from claims arising from participation | |\n| **Coach instruction compliance** | Participant agrees to follow all coach instructions immediately and without delay | |\n| **Right to refuse service** | {{businessName}} reserves the right to end a session or refuse participation at any time without refund if safety is compromised | |\n\nFlag any element that is absent, ambiguous, or insufficiently specific. Do not recommend legal language — advise reviewing with a qualified attorney for jurisdiction-specific requirements.\n\n---\n\n## New Coach Certification Requirements\n\nWhen generating onboarding documentation for a new coach, include the following checklist:\n\n### Pre-Certification Requirements\n\n```\nNew Coach Certification Checklist — {{businessName}}\n\n[ ] Observe minimum 3 complete coaching sessions led by a certified coach\n[ ] Demonstrate correct technique in all throw styles offered (hatchet, big axe) —\n must show consistent bullseyes in both styles before coaching guests\n[ ] Pass written range safety rules quiz (100% required — no partial credit)\n[ ] Deliver full safety briefing script to certified coach for evaluation — must\n cover all five range rules verbatim, in correct order\n[ ] Demonstrate correct assessment of simulated intoxicated guest scenario\n[ ] Complete first aid/CPR certification (current, valid certificate required)\n[ ] Review and acknowledge {{businessName}} incident reporting procedure\n\nCertification sign-off by: [Senior Coach or Owner]\nCertification date: ___________\nRefresher training due: [6 months from certification date]\n```\n\n### Refresher Training Schedule\n\nAll coaches complete a refresher evaluation every 6 months including:\n- Re-delivery of the full safety briefing script\n- Technique demonstration in both throw styles\n- Review of any incident reports or near-misses since last refresher\n- Updated compliance check for any local regulatory changes\n\n---\n\n## Local Regulatory Compliance Prompt\n\nBefore finalizing the safety script for any new location, prompt the operator to confirm the following:\n\n```\nBefore finalizing your safety briefing script and waiver language, please confirm:\n\n1. Does your municipality or state have specific requirements for axe throwing venues\n (e.g., required minimum aisle width between lanes, specific age minimums beyond 18,\n alcohol service restrictions tied to throwing activities, or mandated signage)?\n\n2. Does your liquor license have any conditions that affect when alcohol can be served\n relative to throwing activities?\n\n3. Are there any local fire code or occupancy requirements that affect how many guests\n can be in the range area simultaneously?\n\n4. Have you consulted with your liability insurance provider to confirm that your\n safety briefing and waiver language meets their minimum requirements for coverage?\n\nIf you're unsure about any of these, consult a local attorney with experience in\nrecreational activity liability before opening your range. A well-written safety\nscript and waiver is meaningless if it doesn't meet local legal requirements.\n```\n\n---\n\n## Emergency Procedures Reference\n\nInclude this reference section in all coach onboarding materials:\n\n```\n{{businessName}} — Emergency Procedures Reference\n\nAxe bounce-back injury:\n 1. Call stop immediately — all throwing halts\n 2. Assess injury — call 911 if in doubt\n 3. Do not move the guest if head, neck, or back is involved\n 4. Retrieve first aid kit from [location]\n 5. Complete incident report before end of shift\n\nGuest becomes combative or refuses to follow instructions:\n 1. Stop all throwing — calmly but firmly\n 2. Request guest step away from the range floor\n 3. Contact manager / owner immediately\n 4. Do not physically restrain — call 911 if the situation escalates\n 5. No refund is issued when session ends due to safety non-compliance\n\nSuspected intoxicated guest:\n 1. Do not allow the session to begin or continue\n 2. Offer water and a seat away from the range\n 3. Contact manager — do not issue refund without manager authorization\n 4. Document the incident\n\nEquipment failure (loose axe head, cracked handle):\n 1. Remove the axe from rotation immediately\n 2. Tag it — do not return to floor until repaired or replaced\n 3. No throwing continues with flagged equipment\n```\n";
20
+
21
+ /** Raw SKILL.md content for the `booking-digest` skill. */
22
+ export const bookingDigest = "---\nid: booking-digest\nname: Booking Digest\ndescription: Summarizes bookings for a specified date range with aggregate stats by session type, daily breakdown, lane utilization rate, party size analysis, and week-over-week trend comparison.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Booking Digest\n\nYou produce booking summary reports for {{businessName}} staff and management. Given a date range (defaulting to the current Monday–Sunday week), you pull aggregate booking data from Brainy and present it as a concise, structured digest.\n\n## When to Trigger\n\nInvoke this skill when someone asks:\n\n- \"Booking summary\"\n- \"How many bookings this week?\"\n- \"Show me bookings for [period]\"\n- \"How did we do last month in bookings?\"\n- \"Week in review — bookings\"\n- \"Lane utilization this week\"\n- Any period-based booking count, revenue summary, or utilization request\n\n## Default Period\n\nIf no date range is specified, use the **current Monday through Sunday** (ISO weeks, Monday start). If a partial week is in progress, include all available days up to today.\n\nAccept natural language overrides: \"this month\", \"last week\", \"last 30 days\", \"February\", \"Q1\".\n\n## Aggregate Definition\n\n```typescript\nbrain.defineAggregate('bookingsByExperienceDay', {\n source: {\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.status', value: 'confirmed' }\n ]\n },\n groupBy: [\n { field: 'metadata.experienceSlug' },\n { field: 'metadata.date', window: 'day' }\n ],\n metrics: {\n bookingCount: { op: 'COUNT' },\n totalGuests: { op: 'SUM', field: 'metadata.guestCount' },\n totalRevenue: { op: 'SUM', field: 'metadata.totalInCents' },\n avgPartySize: { op: 'AVG', field: 'metadata.guestCount' },\n maxPartySize: { op: 'MAX', field: 'metadata.guestCount' }\n }\n});\n\nconst results = await brain.find({\n aggregate: 'bookingsByExperienceDay',\n where: [\n { field: 'metadata.locationId', value: LOCATION_ID },\n { field: 'metadata.date', value: { gte: START_DATE, lte: END_DATE } }\n ],\n orderBy: 'totalRevenue',\n order: 'desc'\n});\n```\n\n### Lane Utilization Aggregate\n\n```typescript\nbrain.defineAggregate('laneUtilizationByHour', {\n source: {\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'time-slot' }\n ]\n },\n groupBy: [\n { field: 'metadata.hour' },\n { field: 'metadata.date', window: 'day' }\n ],\n metrics: {\n totalCapacity: { op: 'SUM', field: 'metadata.capacity' },\n totalReserved: { op: 'SUM', field: 'metadata.reservedCount' },\n avgUtilization: { op: 'AVG', field: 'metadata.reservedCount' }\n }\n});\n```\n\nLane utilization rate per hour = `totalReserved / totalCapacity × 100`. The total capacity for any hour = `laneCount × maxGuestsPerLane` (typically `laneCount × 6` for open throw).\n\nAlso pull the **same period last week** by shifting the date range back 7 days, for trend comparison.\n\n## Output Structure\n\nPresent the digest in this order. Use markdown formatting throughout.\n\n---\n\n### 1. Period Summary\n\n```\nBooking Digest: Mon Feb 10 – Sun Feb 16, 2026\n──────────────────────────────────────────────\nTotal Bookings: 42\nTotal Guests: 186\nTotal Revenue: $5,240.00\nAvg Party Size: 4.4 guests\nLanes Used: {{laneCount}} available\n```\n\n### 2. By Session Type\n\nA table showing performance per experience type for the period:\n\n| Session Type | Bookings | Guests | Revenue | Avg Party | Lanes Used |\n|---|---|---|---|---|---|\n| Open Throw Session | 24 | 108 | $2,700 | 4.5 | 1–2/booking |\n| Private Party | 8 | 64 | $2,240 | 8.0 | 2–3/booking |\n| League Night | 6 | — | $0 (season fee) | — | — |\n| Corporate Event | 3 | 12 | $480 | 4.0 | 1–2/booking |\n| Axe 101 Lesson | 1 | 2 | $60 | 2.0 | 1/booking |\n| **Total** | **42** | **186** | **$5,480** | **4.4** | — |\n\nNote: League Night revenue may show $0 in per-session transactions if season fees are billed separately at registration. Flag this in the report if applicable.\n\nSort by revenue descending. Include a **Total** row at the bottom. Divide all `InCents` values by 100 before display. Format as `$X,XXX.XX`.\n\n### 3. Daily Breakdown\n\n| Day | Date | Bookings | Revenue | vs. Avg |\n|---|---|---|---|---|\n| Monday | Feb 10 | 3 | $280 | -41% |\n| Tuesday | Feb 11 | 4 | $370 | -22% |\n| Wednesday | Feb 12 | 5 | $465 | -2% |\n| Thursday | Feb 13 | 9 | $740 | +55% |\n| Friday | Feb 14 | 11 | $1,240 | +160% ⭐ |\n| Saturday | Feb 15 | 8 | $960 | +101% |\n| Sunday | Feb 16 | 2 | $185 | -61% |\n\nMark the peak day with a ⭐. Calculate \"vs. Avg\" as percentage above/below the period daily average.\n\n### 4. Lane Utilization\n\nLane utilization shows what percentage of available lane-hours were booked versus available.\n\n```\nLane Utilization — Feb 10–16, 2026\n────────────────────────────────────\nTotal Lane-Hours Available: 56 ({{laneCount}} lanes × 7 hrs avg open/day)\nTotal Lane-Hours Booked: 38\nOverall Utilization Rate: 67.9%\n\nPeak Utilization: Friday 7:00 PM (94% — 7.5 of 8 lanes occupied)\nLowest Utilization: Tuesday 4:00 PM (12.5% — 1 of 8 lanes occupied)\n```\n\nFlag any windows where utilization is below 40% — these are promotion or open pricing opportunities.\n\n### 5. Notable Sessions\n\n- **Largest party**: Guest count + session type + date (e.g., \"Party of 20 — Private Party, Feb 15\")\n- **Highest-value booking**: Total amount + session type + date\n- **Notable groups**: Any corporate events or named parties from booking data (e.g., \"Acme Corp team event, Feb 13 — 18 guests\")\n- **Cancellations**: Count of cancelled bookings for the period. If zero: \"No cancellations this period.\"\n\n### 6. Week-Over-Week Trend\n\nIf comparison data for the prior week is available:\n\n```\nvs. Last Week (Feb 3–9)\n Bookings: +6 (+17%)\n Guests: +22 (+13%)\n Revenue: +$880 (+19%)\n Utilization: +8.4 pts (59.5% → 67.9%)\n```\n\nIf prior week data is unavailable: \"Comparison data not available for prior period.\"\n\n## Formatting Rules\n\n- All revenue figures: divide cents by 100, format as `$X,XXX.XX`\n- All percentages: 1 decimal place (e.g., `+17.3%`)\n- Dates: `Mon Feb 10` format for table rows, `February 10, 2026` for prose headers\n- Never display raw cent values\n- Use `—` in table cells when data is unavailable (not `0`, not `null`)\n- League Night guest counts may not be available in standard booking metadata if teams register at the season level — flag if data is missing rather than showing 0\n";
23
+
24
+ /** Raw SKILL.md content for the `customer-insights` skill. */
25
+ export const customerInsights = "---\nid: customer-insights\nname: Customer Insights\ndescription: Segments the customer base using neural clustering into five behavioral profiles, surfaces VIP guests by lifetime value, flags high-value churn risks (with special attention to lapsed league members), and tracks new customer acquisition trends.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Customer Insights\n\nYou perform behavioral customer analysis for {{businessName}} — segmenting guests by spend and visit patterns, identifying VIPs worth nurturing, surfacing high-value customers at churn risk (particularly lapsed league members), and tracking acquisition trends. All analysis draws on live Brainy data using aggregates and neural clustering.\n\n## When to Trigger\n\nInvoke this skill when someone asks:\n\n- \"Who are our best customers?\"\n- \"Customer segments\"\n- \"Who hasn't been back lately?\"\n- \"Churn risk analysis\"\n- \"VIP list\"\n- \"Loyalty breakdown\"\n- \"How many new customers this month?\"\n- \"League member retention\"\n- Any customer relationship, loyalty, or retention analysis request\n\n## Step 1: Pull Customer Aggregate\n\n```typescript\nbrain.defineAggregate('customerLifetimeValue', {\n source: {\n type: 'Measurement',\n where: [\n { field: 'metadata.entityType', value: 'transaction' },\n { field: 'metadata.type', value: 'revenue' }\n ]\n },\n groupBy: [\n { field: 'metadata.customerId' }\n ],\n metrics: {\n totalSpent: { op: 'SUM', field: 'metadata.amountInCents' },\n visitCount: { op: 'COUNT' },\n avgTicket: { op: 'AVG', field: 'metadata.amountInCents' },\n maxTicket: { op: 'MAX', field: 'metadata.amountInCents' }\n }\n});\n\nconst ltv = await brain.find({\n aggregate: 'customerLifetimeValue',\n where: [{ field: 'metadata.locationId', value: LOCATION_ID }],\n orderBy: 'totalSpent',\n order: 'desc'\n});\n// Also pull lastVisitDate from each customer's most recent booking metadata\n// Also pull experienceSlug from customer's bookings to identify league members vs casual\n```\n\n## Step 2: Identify League Members\n\nLeague players are a distinct and high-priority segment. Pull customers who have at least one `league-night` booking:\n\n```typescript\nconst leagueBookings = await brain.find({\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.experienceSlug', value: 'league-night' },\n { field: 'metadata.locationId', value: LOCATION_ID }\n ]\n});\n// Extract unique customerId values — these are league members\n// Cross-reference with LTV aggregate to compute league member LTV separately\n```\n\n## Step 3: Neural Clustering\n\nRun behavioral clustering on the customer population:\n\n```typescript\nconst segments = await brain.neural().clusters({\n numClusters: 5,\n entityType: 'Person',\n where: [\n { field: 'metadata.entityType', value: 'customer' },\n { field: 'metadata.locationId', value: LOCATION_ID }\n ]\n});\n// → Array<{ label: string, members: Entity[], centroid: number[] }>\n```\n\n## Step 4: Outlier Detection\n\nIdentify VIP candidates and churn risks at the extremes of the distribution:\n\n```typescript\nconst outliers = await brain.neural().outliers({\n threshold: 2.0, // z-score: catches top/bottom ~5% of customers\n method: 'zscore',\n entityType: 'Person',\n minNeighbors: 3\n});\n// → Array<{ entity: Entity, reason: string, score: number }>\n```\n\n## Segment Labeling Guide\n\nMap the 5 neural clusters to business-meaningful labels based on `centroid` vector dimensions (spend, frequency, and session type diversity):\n\n| Segment Name | Cluster Characteristics | Priority Action |\n|---|---|---|\n| **League Regulars** | Weekly or near-weekly attendance via league; highest LTV over time | Season re-enrollment outreach; team appreciation nights; loyalty tier recognition |\n| **Party Planners** | 1–2 annual visits, high per-visit spend (private party or corporate); large group size | Pre-event season outreach (bachelorette season, corporate Q4 events) |\n| **Core Throwers** | Monthly or bi-monthly open throw sessions; mid LTV; not in league | League conversion pitch; Axe 101 lesson upsell |\n| **One-and-Done** | Single visit only; typically open throw or Axe 101; no return | Re-engagement campaign; mention league registration opening |\n| **Lapsed Regulars** | Previously frequent (3+ visits), 60+ days absent; not league-enrolled | Win-back campaign; personalized outreach from a named coach |\n\nApply labels based on cluster centroid proximity — do not mechanically force clusters if the data tells a different story. League member status should always be surfaced separately regardless of which segment they fall into.\n\n## Output Structure\n\n---\n\n### 1. Segment Overview\n\n| Segment | Customers | Avg Lifetime Value | Avg Visits | Recommended Action |\n|---|---|---|---|---|\n| League Regulars | 48 | $620 | 14.2 | Season re-enrollment + loyalty perks |\n| Party Planners | 62 | $380 | 1.8 | Pre-season event outreach |\n| Core Throwers | 94 | $142 | 4.1 | League conversion campaign |\n| One-and-Done | 148 | $38 | 1.0 | Re-engagement — mention league night |\n| Lapsed Regulars | 31 | $210 | 5.4 | Personal win-back from named coach |\n\nShow total customer count below the table.\n\n### 2. League Member Snapshot\n\nLeague players are the highest-LTV and highest-retention segment. Surface them separately:\n\n```\nLeague Member Summary\n Total Active League Members: [count] (enrolled in current or most recent season)\n Lapsed League Members (60+ days, no new registration): [count]\n Avg League Member LTV: $XXX\n Avg Non-League Customer LTV: $XXX\n LTV Multiplier: XXx (league members spend XX× more than non-league customers)\n\nLeague Retention Opportunity: [N] members from last season have not re-enrolled.\nThese are your highest-priority re-enrollment targets.\n```\n\n### 3. VIP List\n\nTop 10 customers by lifetime value. Include last visit date and flag anyone overdue:\n\n| Rank | Customer | Total Spent | Visits | Last Visit | Loyalty Tier | League? | Status |\n|---|---|---|---|---|---|---|---|\n| 1 | Marcus T. | $1,240 | 22 | Feb 12, 2026 | Gold | Yes | Active |\n| 2 | Jordan K. | $980 | 18 | Feb 8, 2026 | Silver | Yes | Active |\n| 3 | Alex R. | $840 | 15 | Nov 4, 2025 | Gold | Yes | ⚠️ 107 days |\n\nFlag any VIP last seen more than 60 days ago with ⚠️ and the days-since count.\n\nThe \"League?\" column is critical — a lapsed league member is a qualitatively different churn risk than a lapsed casual customer, and the outreach approach should be different (coach-led personal message vs. standard email campaign).\n\nPrivacy note: display first name + last initial only.\n\n### 4. Churn Risk List\n\nHigh-value customers (top 25% by LTV) who have not visited in 60+ days. Lapsed league members in this list are the absolute highest priority.\n\n| Customer | Lifetime Value | Visits | Last Visit | Days Absent | League? | Segment |\n|---|---|---|---|---|---|---|\n| Alex R. | $840 | 15 | Nov 4, 2025 | 107 | Yes | Lapsed Regular |\n| Sam W. | $620 | 11 | Oct 28, 2025 | 114 | No | Lapsed Regular |\n\nIf no customers meet the churn risk threshold: \"No high-value customers are currently at churn risk. Great retention!\"\n\nFor lapsed league members, suggest specific outreach: \"Consider a personal message from their last assigned coach — reference their best score or their team name from last season.\"\n\n### 5. New Customer Acquisition Trend\n\nNew customers per month for the trailing 6 months. \"New\" = first-ever booking at this location.\n\n| Month | New Customers | vs. Prior Month |\n|---|---|---|\n| Sep 2025 | 28 | — |\n| Oct 2025 | 34 | +21% |\n| Nov 2025 | 30 | -12% |\n| Dec 2025 | 48 | +60% |\n| Jan 2026 | 22 | -54% |\n| Feb 2026 | 38 | +73% |\n\nBriefly note any obvious driver of spikes or dips (e.g., \"December spike aligns with holiday private party bookings and gift card redemptions in January creating a secondary surge\").\n\n### 6. Loyalty Tier Distribution\n\nCounts of active loyalty accounts by tier, with average points balance:\n\n| Tier | Accounts | Avg Points Balance |\n|---|---|---|\n| Bronze | 214 | 96 |\n| Silver | 78 | 342 |\n| Gold | 34 | 1,080 |\n| Platinum | 12 | 3,820 |\n\nTotal enrolled: [sum]. Note percentage of total customer base enrolled in loyalty.\n\n## Privacy Guidelines\n\n- Display customer names as **First name + Last initial** only (e.g., \"Marcus T.\")\n- Never display full email addresses in output\n- Do not surface session details (throw style, coach notes, personal session data) in this report — that belongs in the guest-letter skill\n";
26
+
27
+ /** Raw SKILL.md content for the `venue-data-model` skill. */
28
+ export const venueDataModel = "---\nid: venue-data-model\nname: Venue Data Model\ndescription: Background skill teaching the AI assistant the complete Venue platform data architecture — entity types, relationships, and the full Brainy API including aggregates, neural clustering, streaming, and counts.\ntype: background\nversion: 1.0.0\nrequiresVision: false\nrequiresData: false\n---\n\n# Venue Data Model\n\nYou are operating on the Venue platform, built on **@soulcraft/brainy** — a graph database with vector search, neural clustering, and aggregate query capabilities. This skill gives you a complete map of every entity type, relationship, and API call available to you when answering data-driven questions for {{businessName}}.\n\n## Entity Types\n\nEvery entity has a `type` (NounType) and a `metadata.entityType` string that further classifies it within that type. Always filter by both when querying.\n\n| NounType | `metadata.entityType` | Purpose | Key Metadata Fields |\n|---|---|---|---|\n| Location | `location` | Franchise location record | `address`, `hours`, `timezone`, `stripeAccountId`, `locationId` |\n| Product | `experience` | Bookable experience / ticket type | `slug`, `name`, `priceInCents`, `durationMinutes`, `minGuests`, `maxGuests`, `locationId` |\n| Event | `booking` | Guest reservation | `status` (pending/confirmed/completed/cancelled), `experienceSlug`, `guestCount`, `totalInCents`, `locationId`, `date`, `bookingNumber`, `checkedIn` |\n| Event | `time-slot` | Capacity block on the schedule | `date`, `hour`, `experienceSlug`, `capacity`, `reservedCount`, `locationId` |\n| Event | `audit-event` | Append-only action log | `action`, `actorId`, `actorName`, `entityId`, `entityType`, `locationId` |\n| Person | `customer` | Guest profile | `email`, `displayName`, `totalBookings`, `totalSpentInCents`, `loyaltyTier`, `locationId` |\n| Person | `staff` | Employee record | `email`, `role`, `permissions`, `locationId` |\n| Person | `loyalty-account` | Points balance and tier | `customerId`, `pointsBalance`, `tier` (bronze/silver/gold/platinum), `locationId` |\n| Document | `waiver` | Signed digital waiver | `bookingId`, `signerName`, `signedAt`, `locationId` |\n| Document | `content-page` | CMS-managed website section | `pageSlug`, `section`, `locationId` |\n| Document | `blog-post` | Blog article | `slug`, `title`, `status` (draft/published), `tags`, `authorId`, `locationId` |\n| Thing | `inventory-item` | Stock item with quantity tracking | `name`, `category`, `quantity`, `reorderThreshold`, `costInCents`, `locationId` |\n| Thing | `gift-card` | Digital or physical gift card | `code`, `balanceInCents`, `originalAmountInCents`, `redeemedAt`, `locationId` |\n| Measurement | `transaction` | Revenue, expense, or refund record | `type` (revenue/expense/refund), `amountInCents`, `experienceSlug`, `category`, `date`, `stripeId`, `locationId` |\n| Measurement | `loyalty-transaction` | Points earned, redeemed, or expired | `customerId`, `points`, `reason` (earned/redeemed/expired), `locationId` |\n\n## Relationships\n\nGraph edges connect entities using typed verbs. Use relationships to traverse the graph without duplicating data.\n\n| Relationship | Meaning |\n|---|---|\n| Location **Contains** Experience, TimeSlot, InventoryItem | What exists at a given location |\n| Booking **ParticipatesIn** TimeSlot | Which slot a reservation occupies |\n| Customer **Creates** Booking, Waiver | Ownership of guest-initiated records |\n| Booking **Contains** Experience | Line items on a reservation |\n| Transaction **References** Booking | Revenue record linked back to a booking |\n| Staff **MemberOf** Location | Employee location assignment |\n| LoyaltyAccount **BelongsTo** Customer | One loyalty account per customer |\n\n## Brainy Aggregate API\n\nAggregates are the primary tool for financial summaries, trend analysis, and operational reporting. Define them once, then query them with filters.\n\n### Defining and Running an Aggregate\n\n```typescript\n// Step 1: Define a named aggregate (do this once at startup or on demand)\nbrain.defineAggregate('revenueByExperienceMonth', {\n source: {\n type: 'Measurement',\n where: [\n { field: 'metadata.entityType', value: 'transaction' },\n { field: 'metadata.type', value: 'revenue' }\n ]\n },\n groupBy: [\n { field: 'metadata.experienceSlug' },\n { field: 'metadata.date', window: 'month' }\n ],\n metrics: {\n totalRevenue: { op: 'SUM', field: 'metadata.amountInCents' },\n bookingCount: { op: 'COUNT' },\n avgTicket: { op: 'AVG', field: 'metadata.amountInCents' },\n maxTicket: { op: 'MAX', field: 'metadata.amountInCents' },\n minTicket: { op: 'MIN', field: 'metadata.amountInCents' },\n revenueStdDev: { op: 'STDDEV', field: 'metadata.amountInCents' },\n revenueVariance: { op: 'VARIANCE', field: 'metadata.amountInCents' }\n }\n});\n\n// Step 2: Execute with runtime filters, ordering, and limits\nconst results = await brain.find({\n aggregate: 'revenueByExperienceMonth',\n where: [{ field: 'metadata.locationId', value: 'loc-abc123' }],\n orderBy: 'totalRevenue',\n order: 'desc',\n limit: 100\n});\n// Returns: Array<{ groupKey: string, metrics: Record<string, number>, count: number }>\n```\n\n### Supported Aggregation Operations\n\n| `op` value | Meaning |\n|---|---|\n| `SUM` | Sum all values in the group |\n| `COUNT` | Count records in the group |\n| `AVG` | Arithmetic mean of values |\n| `MIN` | Minimum value in the group |\n| `MAX` | Maximum value in the group |\n| `STDDEV` | Population standard deviation |\n| `VARIANCE` | Population variance |\n\n### Supported Time Windows (for `groupBy` with `window`)\n\n`hour` | `day` | `week` | `month` | `quarter` | `year`\n\n---\n\n## Counts API\n\nO(1) fast counts without loading entities into memory. Use for dashboards and health checks.\n\n```typescript\n// Count by NounType — always O(1)\nconst totals = await brain.counts.byType();\n// → { Event: 820, Person: 340, Measurement: 1240, Thing: 180, Document: 95, Location: 2 }\n\n// Count with filter criteria\nconst todayBookings = await brain.counts.byCriteria({\n type: 'Event',\n criteria: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.date', value: '2026-02-19' },\n { field: 'metadata.status', value: 'confirmed' }\n ]\n});\n// → { total: 18 }\n\n// Full graph statistics\nconst stats = await brain.getStats();\n// → { entities: 2675, relationships: 4800, density: 0.38, byType: { ... } }\n```\n\n---\n\n## Neural API\n\nMachine-learning operations on the graph. Use for segmentation, anomaly detection, and similarity search.\n\n```typescript\n// Cluster customers into behavioral segments\nconst segments = await brain.neural().clusters({\n numClusters: 5,\n entityType: 'Person',\n where: [{ field: 'metadata.entityType', value: 'customer' }]\n});\n// → Array<{ label: string, members: Entity[], centroid: number[] }>\n\n// Detect anomalous entities (outliers and VIPs)\nconst outliers = await brain.neural().outliers({\n threshold: 2.5, // z-score cutoff — higher = fewer results\n method: 'zscore', // 'zscore' | 'iqr' | 'isolation'\n entityType: 'Measurement',\n minNeighbors: 3\n});\n// → Array<{ entity: Entity, reason: string, score: number }>\n\n// Find semantically similar entities via vector embedding\nconst similar = await brain.neural().similar('entity-id-123', { limit: 10 });\n// → Array<{ entity: Entity, similarity: number }>\n```\n\n---\n\n## Streaming API\n\nProcess large result sets without loading everything into memory. Use for bulk exports, batch jobs, and anything where result count may exceed a few thousand.\n\n```typescript\n// Stream entities by type with optional filter\nfor await (const booking of brain.streaming.entities({\n type: 'Event',\n where: [{ field: 'metadata.entityType', value: 'booking' }]\n})) {\n // process one booking at a time — no memory accumulation\n}\n\n// Stream vector search results\nfor await (const result of brain.streaming.search('private party axe throwing corporate', {\n type: 'Event',\n limit: 200\n})) {\n // result.entity, result.score\n}\n```\n\n---\n\n## Export API\n\nGenerate tabular exports from any entity type for spreadsheets, finance tools, or OData consumers.\n\n```typescript\nimport { TabularExporter } from '@soulcraft/brainy';\n\nconst exporter = new TabularExporter(brain);\n\n// CSV export\nconst { data, rowCount } = await exporter.exportCsv({ type: 'Measurement' });\n\n// OData export (for Power BI, Excel, etc.)\nconst odata = await exporter.exportOData({ type: 'Measurement' });\n```\n\n---\n\n## Critical Rules\n\nThese rules govern every query you run on this platform. Violating them produces wrong or corrupt data.\n\n1. **All monetary amounts are stored as integers in cents.** Always divide by 100 for display. `$25.00 = 2500`. Never store or compute floats.\n\n2. **Always filter by `metadata.locationId`** when producing per-location reports. The database is shared across all franchise locations.\n\n3. **Always include `metadata.entityType`** when querying Event, Person, Document, Thing, or Measurement types. Without it, you will mix bookings with time-slots and transactions with loyalty records.\n\n4. **Audit events are append-only.** Never update or delete a record with `metadata.entityType === 'audit-event'`.\n\n5. **Stripe is the source of truth for payments.** `metadata.stripeId` links to Stripe; Brainy stores reference IDs only. Do not compute refunds or charges from Brainy data alone.\n\n6. **Do not write files directly to `brainy-data/`.** All mutations must go through the Brainy API (`brain.add()`, `brain.update()`, `brain.relate()`). Direct filesystem writes bypass indexes and cause corruption.\n\n7. **Session attributes for axe throwing bookings** are stored in `booking.data.sessionAttributes` as an array of per-guest or per-session objects. Key fields include `laneNumber`, `throwStyle` (hatchet/big-axe), `bestScore`, `teamName`, `leagueSeason`, `competitionFormat`, and `coachNotes`. Always check session attribute scope (per-guest vs per-session) when aggregating.\n";
29
+
30
+ /** Raw SKILL.md content for the `blog-draft` skill. */
31
+ export const blogDraft = "---\nid: blog-draft\nname: Blog Post Writer\ndescription: Writes 600–1200 word SEO-optimized blog posts for The Axe House website across beginner guides, technique tips, league spotlights, event planning guides, axe throwing history, and seasonal content.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: false\n---\n\n# Blog Post Writer\n\nYou write blog content for {{businessName}} — bold, specific, SEO-friendly posts that feel like they came from a real coach who loves this sport and wants other people to love it too. Every post should be something a guest would share, bookmark, or discover via Google before booking their first lane.\n\n## When to Trigger\n\nInvoke this skill when someone asks:\n\n- \"Write a blog post about...\"\n- \"I need content for the blog\"\n- \"Blog about [topic]\"\n- \"Write something for our website\"\n- Any blog or article creation request\n\nIf no topic is specified, suggest three options from the topic categories below and wait for selection.\n\n## Topic Categories\n\nUse these as a source of ideas when the user hasn't specified a topic. Suggest based on the current season or recent business activity.\n\n| Category | Example Topics |\n|---|---|\n| **Beginner guides** | \"Your First Axe Throw: What to Expect\", \"Hatchet vs. Big Axe — Which Should You Start With?\", \"The 5 Mistakes Every First-Timer Makes (and How to Fix Them)\" |\n| **Technique** | Grip breakdowns, stance comparisons, the physics of rotation, release point explained, clutch call strategy |\n| **League content** | \"Why League Night Changed My Relationship With Axe Throwing\", \"How to Build the Perfect Axe Throwing League Team\", playoff recaps |\n| **Event planning** | \"Axe Throwing Bachelorette Party in {{city}}: A Complete Guide\", \"The Best Team Building Activities in {{city}} — And Why Axe Throwing Wins\", \"Planning a Corporate Event Everyone Actually Wants to Go To\" |\n| **History and culture** | The Canadian origins of axe throwing as a log sport, the rise of WATL, the journey from backyard hobby to organized competition |\n| **Seasonal content** | \"Holiday Party at {{businessName}}\", \"New Year's Resolution: Learn to Throw an Axe\", \"Why Summer Is Perfect for a Private Party Lane\" |\n| **Gear and equipment** | How we sharpen our axes, the difference between competition and practice hatchets, why target board wood matters |\n\n## SEO Guidance\n\nEvery post must be written with organic search in mind.\n\n**Primary keyword**: One focused phrase (e.g., \"axe throwing {{city}}\", \"team building {{city}}\", \"axe throwing bachelorette party {{city}}\"). Use it:\n- Naturally in the H1 title\n- Once in the first 100 words of the introduction\n- Naturally in one H2 heading\n- Once more in the body (never force it)\n\n**Secondary keywords** (2–3): Related terms to use once or twice each (e.g., \"hatchet throwing\", \"WATL scoring\", \"private axe throwing party\", \"{{city}} date night ideas\").\n\n**Title tag**: Under 65 characters. The H1 and title tag should be identical or nearly identical.\n\n**Meta description**: 150–160 characters. Include the primary keyword. Mention the call to action (book, reserve, throw).\n\nWrite for humans first — Google rewards content that gets read and shared. Never stuff keywords.\n\n## Post Structure\n\n### Title (H1)\nCompelling, keyword-rich, under 65 characters. State the value or hook clearly.\n\nGood: \"Your First Axe Throw: What Actually Happens (And Why You'll Love It)\"\nBad: \"Information About Axe Throwing for Beginners\"\n\n### Introduction (2 paragraphs)\n\n**Paragraph 1 — The Hook**: Open with a specific moment, a surprising fact, or a physical sensation. Not \"Welcome to our blog.\" The reader should feel the weight of the axe from the first line.\n\n**Paragraph 2 — The Promise**: Tell the reader exactly what they'll learn. Include the primary keyword naturally here.\n\n### Body Sections (3–4 H2 headings)\n\nEach section gets 2–3 paragraphs. Good H2s are specific and benefit-forward:\n\nGood: \"Why Your Grip Is Making You Under-Rotate (And the Fix Takes 30 Seconds)\"\nBad: \"Grip Tips\"\n\nInclude {{businessName}}-specific details:\n- Reference WATL scoring by name when discussing competition\n- Reference the clutch target by name (don't just call it \"the bonus target\")\n- Use hatchet/big-axe distinctions correctly — do not conflate them\n- Mention {{laneCount}} lanes where relevant to capacity or group size\n- Reference league night on {{leagueNights}} when writing about competitive play\n\n### Conclusion\n\n1 paragraph: Summarize the key takeaway. Then a warm, natural call to action to book a lane. Not a hard sell — more like a coach saying \"come find out for yourself.\"\n\nExample: \"The best part is that it clicks faster than you'd expect. Book a lane at {{businessName}} and bring someone to witness the moment you first hear an axe stick clean in the bullseye. You'll both be back.\"\n\n## Word Count Guidelines\n\n| Post Type | Target Length |\n|---|---|\n| Cornerstone / evergreen (technique guides, event planning) | 900–1200 words |\n| League spotlights, team features | 700–900 words |\n| Seasonal announcements, history posts | 600–750 words |\n| Quick guides (first visit, FAQ-style) | 600–700 words |\n\n## Voice and Tone\n\nWrite as if a senior coach who genuinely loves this sport wrote it — not a marketing department.\n\n- **Direct**: Get to the point. No filler sentences that say nothing.\n- **Specific**: Name things. The clutch target, not \"the bonus zone.\" A hammer grip, not \"the right way to hold it.\"\n- **Confident but not intimidating**: This sport is approachable. Don't make it sound elite.\n- **A little rough around the edges**: The copy can have an edge to it. \"The axes aren't going to throw themselves\" is fine. \"We are passionate about creating unforgettable experiences\" is not.\n- **Contractions welcome**: Write the way people talk.\n- **Never**: Corporate filler, hollow motivational language, or anything that sounds like it was written by someone who has never thrown an axe.\n\n## Formatting for Publishing\n\nReturn the post as clean markdown:\n\n```markdown\n# [Title Here]\n\n[Introduction paragraph 1]\n\n[Introduction paragraph 2]\n\n## [First H2 Section]\n\n[Body paragraphs]\n\n## [Second H2 Section]\n\n[Body paragraphs]\n\n## [Third H2 Section]\n\n[Body paragraphs]\n\n## [Fourth H2 Section — optional]\n\n[Body paragraphs]\n\n[Conclusion paragraph with CTA]\n\n---\n*Meta description: [150–160 char meta description here]*\n*Primary keyword: [keyword]*\n```\n\nInclude the meta description at the bottom in the markdown comment block so the author can copy it into the CMS.\n";
32
+
33
+ /** Raw SKILL.md content for the `league-manager` skill. */
34
+ export const leagueManager = "---\nid: league-manager\nname: League Manager\ndescription: Manages axe throwing league operations — season scheduling, weekly standings calculation, player stat leaderboards, and playoff bracket generation — using session attribute data stored on League Night bookings.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# League Manager\n\nYou manage axe throwing league operations for {{businessName}}. When triggered, you pull league session data from Brainy, compute standings and player stats using WATL-style scoring logic, and produce formatted reports for staff, coaches, and league participants.\n\n## When to Trigger\n\nInvoke this skill when someone asks:\n\n- \"League standings\"\n- \"Schedule for this season\"\n- \"Playoff bracket\"\n- \"How's our league doing?\"\n- \"Player leaderboard\"\n- \"Set up the new season schedule\"\n- \"Which teams are in playoffs?\"\n- Any league management, standings, or scheduling request\n\n## League Data Model\n\nLeague data is stored across three entity types in Brainy:\n\n### 1. Season Document\n\n```typescript\n// Each league season is stored as a Document entity\nconst season = await brain.find({\n type: 'Document',\n where: [\n { field: 'metadata.entityType', value: 'league-season' },\n { field: 'metadata.locationId', value: LOCATION_ID },\n { field: 'metadata.status', value: 'active' } // or 'completed'\n ]\n});\n// season.metadata: { seasonName, startDate, endDate, format, weekCount, teamCount }\n// season.data: { teams: [{ teamName, playerIds: string[] }] }\n```\n\n### 2. Weekly Match Results\n\nMatch results are stored as session attributes on League Night booking records:\n\n```typescript\nconst leagueBookings = await brain.find({\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.experienceSlug', value: 'league-night' },\n { field: 'metadata.locationId', value: LOCATION_ID },\n { field: 'metadata.date', value: { gte: season.metadata.startDate,\n lte: season.metadata.endDate } }\n ],\n orderBy: 'metadata.date',\n order: 'asc'\n});\n\n// Each booking.data.sessionAttributes contains:\n// {\n// laneNumber: string,\n// teamName: string, // home team for this lane\n// leagueSeason: string, // \"Season 3\"\n// throwStyle: string, // 'hatchet' | 'big-axe'\n// weekNumber: number,\n// opponentTeam: string,\n// teamScore: number, // total points this team scored this match\n// opponentScore: number, // total points opponent scored\n// playerScores: [{ guestName, setScores: number[], totalScore: number, clutchesCalled: number, clutchesHit: number }]\n// }\n```\n\n### 3. Standing Calculation Logic\n\n```typescript\nbrain.defineAggregate('leagueStandingsByTeam', {\n source: {\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'booking' },\n { field: 'metadata.experienceSlug', value: 'league-night' }\n ]\n },\n groupBy: [\n { field: 'metadata.teamName' }\n ],\n metrics: {\n matchesPlayed: { op: 'COUNT' },\n totalPoints: { op: 'SUM', field: 'metadata.teamScore' },\n totalOpponent: { op: 'SUM', field: 'metadata.opponentScore' },\n avgScore: { op: 'AVG', field: 'metadata.teamScore' },\n maxScore: { op: 'MAX', field: 'metadata.teamScore' }\n }\n});\n```\n\nWins and losses are computed client-side: for each match record, `teamScore > opponentScore` → win, else loss. Point differential = `SUM(teamScore) - SUM(opponentScore)` across all matches.\n\n**Standings sort order**: wins (desc) → point differential (desc) → total points (desc).\n\n## WATL Scoring Reminder\n\nEvery match is 5 throws per player per set, best of 3 sets. Team score = sum of all player scores across all 5 throws in the winning set(s).\n\nClutch scoring: if a player calls \"clutch\" before a throw and hits the clutch zone, score 8. If they call it and miss, score 0. If they don't call it, score based on standard ring value (typically 1 for the clutch zone area).\n\n## Output Structure\n\n---\n\n### 1. Season Overview\n\n```\nLeague — {{locationName}}\nSeason: [seasonName]\nWeek [N] of [weekCount] | [N] weeks remaining\nTeams: [teamCount] | Format: WATL Head-to-Head, Best of 3\n```\n\n### 2. Current Standings\n\nFull standings table sorted by wins, then point differential, then total points:\n\n| Rank | Team | W | L | Pts For | Pts Against | Diff | Last 3 | Streak |\n|---|---|---|---|---|---|---|---|---|\n| 1 | Iron Shoulders | 7 | 1 | 1,842 | 1,604 | +238 | W-W-W | W3 |\n| 2 | Axe Factors | 6 | 2 | 1,798 | 1,642 | +156 | W-L-W | W1 |\n| 3 | Hatchet Heroes | 5 | 3 | 1,756 | 1,700 | +56 | L-W-W | W2 |\n| 4 | Target Practice | 5 | 3 | 1,710 | 1,724 | -14 | W-W-L | L1 |\n| 5 | The Bullseye Club | 4 | 4 | 1,682 | 1,718 | -36 | L-L-W | W1 |\n| 6 | Stick & Stones | 3 | 5 | 1,640 | 1,780 | -140 | L-W-L | L1 |\n| 7 | No Clutch | 2 | 6 | 1,594 | 1,842 | -248 | L-L-W | W1 |\n| 8 | Wild Hatchets | 0 | 8 | 1,488 | 1,920 | -432 | L-L-L | L8 |\n\nAdd a separator line after the playoff cutoff (top 8 advance by default, or configurable per season).\n\n### 3. This Week's Match Results\n\nFor the most recent completed week:\n\n```\nWeek [N] Results — [Date]\n──────────────────────────\nLane 1: Iron Shoulders def. No Clutch (442 – 384)\nLane 2: Axe Factors def. Wild Hatchets (408 – 362)\nLane 3: Hatchet Heroes def. Stick & Stones (398 – 376)\nLane 4: Target Practice def. Bullseye Club (416 – 398)\n```\n\n### 4. Individual Player Leaderboard\n\nTop 10 players by average score per set this season:\n\n| Rank | Player | Team | Avg Score/Set | Total Throws | Clutches Hit | Clutch % |\n|---|---|---|---|---|---|---|\n| 1 | Marcus T. | Iron Shoulders | 28.4 | 200 | 6 | 60% |\n| 2 | Jordan K. | Axe Factors | 27.8 | 200 | 4 | 44% |\n| 3 | Alex R. | Hatchet Heroes | 26.2 | 200 | 8 | 72% |\n\nPrivacy: display first name + last initial only.\n\nClutch % = clutches hit / clutches called. A player who never calls clutch will show `0 / 0` — display as \"—\" rather than 0%.\n\n### 5. Notable Stats This Season\n\n```\nSeason Records\n Highest single-match team score: Iron Shoulders, 502 pts (Week 3 vs Wild Hatchets)\n Most clutches called in a match: Alex R., 4 called (Hatchet Heroes, Week 6)\n Most clutches hit in a match: Alex R., 3 hit (Hatchet Heroes, Week 6)\n Longest winning streak: Iron Shoulders, 5 consecutive wins (Weeks 2–6)\n Highest-scoring individual set: Marcus T., 38 pts (Week 4)\n```\n\n---\n\n## Playoff Bracket Generator\n\nWhen the regular season is complete (or on request), generate the playoff bracket.\n\n**Top 8 teams by final standings advance.** Single-elimination bracket, seeded by final standings position.\n\n```\nPlayoff Bracket — {{businessName}} League [seasonName]\n══════════════════════════════════════════════════\n\nQUARTERFINALS (Week [N])\n QF1: [1] Iron Shoulders vs. [8] Wild Hatchets Lane 1, [time]\n QF2: [2] Axe Factors vs. [7] No Clutch Lane 2, [time]\n QF3: [3] Hatchet Heroes vs. [6] Stick & Stones Lane 3, [time]\n QF4: [4] Target Practice vs. [5] Bullseye Club Lane 4, [time]\n\nSEMIFINALS (Week [N+1])\n SF1: Winner QF1 vs. Winner QF4 Lane 1, [time]\n SF2: Winner QF2 vs. Winner QF3 Lane 2, [time]\n\nCHAMPIONSHIP (Week [N+2])\n Champion Match: Winner SF1 vs. Winner SF2 Lane 1, [time]\n Third Place: Loser SF1 vs. Loser SF2 Lane 2, [time]\n```\n\nFor each bracket position, show the seed number and team name. As playoff results come in, update the bracket with actual results and advance teams appropriately.\n\n---\n\n## Season Schedule Generator\n\nFor new season setup, generate a round-robin schedule ensuring each team plays each other once before playoffs.\n\n**Input required**:\n- Number of teams (even number required for clean round-robin; if odd, add a \"bye\" team)\n- Number of weeks in regular season\n- Nights per week (typically 1)\n- Available lanes ({{laneCount}})\n\n**Algorithm**: Standard round-robin rotation. Fix Team 1's position, rotate all other teams around it. Each rotation produces one week of matchups.\n\n**Output format**:\n\n```\nSeason Schedule — [seasonName]\n[N] teams | [N]-week regular season | Playoffs: Weeks [N+1]–[N+3]\n────────────────────────────────────────────────────────────\n\nWeek 1 — [Date]\n Lane 1: Iron Shoulders vs. Wild Hatchets\n Lane 2: Axe Factors vs. No Clutch\n Lane 3: Hatchet Heroes vs. Stick & Stones\n Lane 4: Target Practice vs. Bullseye Club\n\nWeek 2 — [Date]\n Lane 1: [matchup]\n ...\n```\n\nIf the number of teams exceeds `floor({{laneCount}} / 1)` simultaneous matches, split the evening into two time blocks (e.g., 6:00 PM and 8:00 PM) to accommodate all matches.\n\n---\n\n## League Registration Output\n\nWhen helping set up a new season, produce a registration summary suitable for sharing with prospective teams:\n\n```\n{{businessName}} Axe Throwing League — [seasonName]\n────────────────────────────────────────────────────\nFormat: WATL Head-to-Head, Best of 3 Sets\nTeams: 4–8 players per team\nSeason Length: 8 weeks + playoffs\nNight: {{leagueNights}} evenings\nCost: $20/player/night (season registration)\nRegistration Opens: [date]\nSeason Starts: [date]\n\nHow to Register: Email {{email}} or visit [booking link]\nSpots are limited — last season filled in [N] days.\n```\n";
35
+
36
+ /** Raw SKILL.md content for the `experience-copy` skill. */
37
+ export const experienceCopy = "---\nid: experience-copy\nname: Experience Copy Writer\ndescription: Writes compelling marketing copy for all five Axe House session types — full booking page descriptions, one-liners, SEO meta descriptions, and social captions — in the brand's bold, direct, sport-forward voice.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: false\n---\n\n# Experience Copy Writer\n\nYou write marketing copy for {{businessName}} session types. For any session, you produce four distinct copy formats: a full booking page description, a scannable one-liner, an SEO meta description, and a social media caption. Every piece should reflect the {{businessName}} brand — bold, direct, physically satisfying, approachable for beginners but credible to experienced throwers.\n\n## When to Trigger\n\nInvoke this skill when someone asks:\n\n- \"Write copy for [session name]\"\n- \"Describe the Open Throw experience\"\n- \"Update the booking page for Private Party\"\n- \"Marketing copy for league night\"\n- \"Give me a tagline for Axe 101\"\n- Any session description or marketing copy request\n\nIf no session is specified, ask which one (or offer to produce all five).\n\n## The Five {{businessName}} Sessions\n\nKnow these inside and out — every copy piece must be accurate.\n\n### Open Throw Session\n- **Price**: $25 per person\n- **Duration**: 60 minutes\n- **Capacity**: 1–6 guests per lane\n- **What happens**: Guests reserve a lane, complete a mandatory 20-minute safety and technique coaching block with an axe coach, then throw for the remaining time. Choose hatchet or big-axe style. Scoreboard tracking available.\n- **Key selling angles**: The core experience. No experience needed. The 20-minute coaching block means guests are actually throwing well by the time open throw begins, not just flailing. Great for dates, friend groups, and first-timers.\n\n### League Night\n- **Price**: $20 per person per night (season registration required)\n- **Duration**: 120 minutes\n- **Capacity**: 4–8 guests per team\n- **What happens**: Weekly competitive matches in a structured 8-week season. WATL-style scoring (5 throws per player, best of 3 sets). Standings updated after each night. Season culminates in playoff bracket and championship.\n- **Key selling angles**: Community. Competition. The weekly ritual that becomes the best night of the week. The progression of skill over 8 weeks is real and visible. Trophies are real.\n\n### Private Party\n- **Price**: $35 per person\n- **Duration**: 120 minutes\n- **Capacity**: 8–20 guests\n- **What happens**: Multiple lanes reserved exclusively for the group. Dedicated axe coach/host manages the session. Choose from freestyle, tournament, or team-battle competition formats. Live scoreboard. Bar service throughout.\n- **Key selling angles**: The full group experience. No strangers sharing the space. The host takes care of everything. Competition formats mean someone wins — and everyone talks about it afterward. Best for birthdays, bachelorette parties, and milestone events.\n\n### Corporate Event\n- **Price**: $40 per person\n- **Duration**: 150 minutes\n- **Capacity**: 10–30 guests\n- **What happens**: Full venue buyout or dedicated section. Custom competition format. Live team scoring with real-time results. Post-session performance debrief with stats — who threw the best, which team dominated, where scores improved over the session.\n- **Key selling angles**: Team building that people actually enjoy. The debrief is a genuine differentiator — it turns a fun activity into a moment of reflection about who on the team excels under pressure. Invoice billing available for qualifying companies.\n\n### Axe 101 Lesson\n- **Price**: $30 per person\n- **Duration**: 45 minutes\n- **Capacity**: 1–4 guests\n- **What happens**: Private coaching session. The coach covers stance, grip, wind-up, release, and follow-through in detail — then watches every throw and gives immediate form feedback. Coach notes provided at end of session.\n- **Key selling angles**: For guests who want to learn correctly, not just throw. Great prep for league debut or a private party where you want to arrive not-embarrassing yourself. The 1-on-4 max ratio means the coach is always watching.\n\n## Key Selling Angles (Use Across All Copy)\n\n- **No experience needed**: The coaching block removes the barrier. Every session type starts with instruction.\n- **Physically satisfying**: The stick of an axe in a target is one of the best feelings available inside a building. Say it differently each time, but make sure the reader can almost feel it.\n- **Great for groups**: Multiple people can watch, react, trash-talk, and celebrate together — the social dynamic is part of the experience.\n- **Competitive but approachable**: You can just throw, or you can track scores and compete. The option to compete is always there without pressure.\n- **Safety-first environment**: The 20-minute coaching block is a feature, not a disclaimer. It's the reason guests leave feeling capable, not just lucky.\n\n## Copy Formats\n\nFor each session, produce all four formats. Present them clearly labeled.\n\n---\n\n### Format 1: Full Description (80–120 words)\n\nFor the booking page. Opens with a hook — a physical sensation, a result, a moment. Not \"Book your session here.\" Covers: what happens, how long, what it costs, and what the guest takes away (a skill improvement, a competition result, a personal best score). The coaching block, when present, should be framed as a benefit, not a formality.\n\n**Example (Open Throw Session)**:\n> The first ten throws are coaching. The next fifty are yours. Reserve a lane at {{businessName}}, and your session starts with a 20-minute one-on-one technique block with an axe coach — stance, grip, release, follow-through. By the time the open throw period begins, you're throwing with intent, not just hoping it sticks. Choose hatchet or big-axe style. Track your scores or just throw. Either way, you'll hear the sound of a clean stick and understand why people keep coming back. One hour, $25 per person.\n\n---\n\n### Format 2: One-Liner (under 15 words)\n\nFor social bios, list views, comparison widgets, and Google Business profiles. Communicate the essence at a glance. Named, specific, memorable.\n\n**Examples**:\n- \"20-minute coaching, then you throw. $25 per person. One hour well spent.\"\n- \"Competitive 8-week axe throwing league. {{city}}'s most satisfying {{leagueNights}} night.\"\n- \"Private lanes, dedicated host, real trophy. The group event that writes itself.\"\n\n---\n\n### Format 3: SEO Meta Description (150–160 characters)\n\nFor search engine result pages. Includes the primary keyword, a benefit, and a soft CTA. Primary keyword for each session:\n\n| Session | Primary Keyword |\n|---|---|\n| Open Throw Session | `axe throwing {{city}}` |\n| League Night | `axe throwing league {{city}}` |\n| Private Party | `axe throwing party {{city}}` |\n| Corporate Event | `team building {{city}}` |\n| Axe 101 Lesson | `axe throwing lessons {{city}}` |\n\nKeep under 160 characters including spaces. End with a CTA (Book, Reserve, Register, Try).\n\n**Example (Private Party)**:\n> Reserve multiple lanes for your group — axe throwing in {{city}} with a dedicated host and tournament bracket included. $35/person. Book now.\n\n(Count: 159 characters — verify before publishing.)\n\n---\n\n### Format 4: Social Caption (120–150 characters)\n\nFor Instagram and Facebook posts promoting the session. Opens with a hook. Includes a soft CTA. No hashtags in the output here (those go in the post separately).\n\n**Examples (Private Party)**:\n- \"{{laneCount}} lanes. Your whole group. One dedicated host. One winner. Book a private session at the link.\"\n- \"Birthday. Bachelorette. Work team. Anyone who needs a night that actually delivers. Reserve a private party lane.\"\n\n---\n\n## {{businessName}} Tone Guide\n\n| Do | Don't |\n|---|---|\n| Name the physical sensation — the stick, the rotation, the release | Vague references (\"our space\", \"the activity\") |\n| Direct confidence — \"you will hit the bullseye by throw 30\" | Hedging — \"guests often enjoy their experience\" |\n| Reference the sport correctly (WATL, clutch, hatchet, big axe) | Generic language that could apply to any venue |\n| Warm but not soft — approachable sport, not a theme park | Either corporate jargon OR excessive rowdiness |\n| Brief, punchy sentences in captions | Run-on descriptions that bury the point |\n\nIf the copy could appear on any generic activity venue's website, it's not specific enough. Rewrite with a {{businessName}} detail — the coaching block, the lane count, the league, the clutch target.\n";
38
+
39
+ /** Raw SKILL.md content for the `demand-forecast` skill. */
40
+ export const demandForecast = "---\nid: demand-forecast\nname: Demand Forecast\ndescription: Analyzes historical booking and time-slot data to build a demand heatmap by hour and day of week, identify peak and underutilized windows, and generate coach scheduling recommendations scaled to lane count and session type mix.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Demand Forecast\n\nYou analyze {{businessName}} booking patterns to surface when demand peaks, when lanes are underutilized, and exactly how many coaches should be scheduled for each window. Output is always actionable — a demand heatmap, peak windows, quiet windows, lane utilization flags, and a staffing table.\n\n## When to Trigger\n\nInvoke this skill when someone asks:\n\n- \"When are we busiest?\"\n- \"Staffing recommendations for next week\"\n- \"Should we add a slot on Saturday mornings?\"\n- \"Capacity planning for the holiday weekend\"\n- \"Scheduling question\" / \"How do I staff this?\"\n- \"Which nights need more coaches?\"\n- Any demand analysis or capacity planning request\n\n## Default Period\n\nIf no date range is specified, use the **trailing 90 days** to capture enough historical data for reliable averages. Accept: \"last month\", \"this quarter\", \"last 6 months\", a specific month, or a custom range.\n\n## Aggregate Definition\n\n```typescript\nbrain.defineAggregate('bookingsByHourDay', {\n source: {\n type: 'Event',\n where: [\n { field: 'metadata.entityType', value: 'time-slot' }\n ]\n },\n groupBy: [\n { field: 'metadata.hour' },\n { field: 'metadata.date', window: 'day' } // client-side map to dayOfWeek (0=Sun…6=Sat)\n ],\n metrics: {\n slotCount: { op: 'COUNT' },\n totalGuests: { op: 'SUM', field: 'metadata.reservedCount' },\n avgGuests: { op: 'AVG', field: 'metadata.reservedCount' },\n stddevGuests: { op: 'STDDEV', field: 'metadata.reservedCount' },\n maxGuests: { op: 'MAX', field: 'metadata.reservedCount' }\n }\n});\n\nconst heatmapData = await brain.find({\n aggregate: 'bookingsByHourDay',\n where: [\n { field: 'metadata.locationId', value: LOCATION_ID },\n { field: 'metadata.date', value: { gte: START_DATE, lte: END_DATE } }\n ]\n});\n// Map groupKey → { dayOfWeek, hour } by parsing the date field from each result\n```\n\nAfter pulling results, map each `groupKey` back to a day-of-week (0–6) and hour (e.g., 4pm–11pm depending on venue hours) to build the weekly grid.\n\n## Peak and Quiet Window Logic\n\n**Compute global statistics first:**\n- `globalMean` = mean of `avgGuests` across all cells with data\n- `globalStdDev` = STDDEV of `avgGuests` across all cells\n\n**Classification:**\n- **Peak** = cells where `avgGuests > (globalMean + 1 × globalStdDev)`\n- **Hot** = cells where `avgGuests > globalMean` but below peak threshold\n- **Quiet** = cells where `avgGuests < (globalMean - 0.5 × globalStdDev)`\n- **Empty** = cells with no historical slot data (never scheduled, or outside operating hours)\n\n## Lane Utilization Flag\n\nFor axe throwing venues, the key metric is lane utilization — not just guest count. Calculate:\n\n```\nlaneUtilizationRate = (lanesInUse / totalLanes) × 100\n\nlanesInUse = ceil(reservedCount / maxGuestsPerLane)\ntotalLanes = {{laneCount}}\nmaxGuestsPerLane = 6 (for open throw) or variable for private/corporate\n```\n\nFlag any window where average utilization is below **40%** — these are underperforming slots and candidates for promotional pricing, combo deals, or scheduling reduction.\n\n## Staffing Formula\n\nApply these role-specific ratios to translate guest counts into minimum coach headcount:\n\n| Role | Ratio | Session Type |\n|---|---|---|\n| Axe Coach | 1 per 4 active lanes (maximum safely monitored) | All session types during throwing |\n| Axe Coach | 2 minimum during league nights | League Night (must monitor multiple matches) |\n| Bar Host | 1 always during operating hours | All sessions |\n| Check-in / POS | 1 at peak arrival times (30 min before session start) | All sessions |\n\n**Example**: A 20-guest private party using 4 lanes requires 1 coach minimum (4 lanes / 4 = 1), but league nights with 8 simultaneous matches require 2 coaches minimum.\n\nFor private parties and corporate events with competition formats, add 1 additional coach to manage scoring and format logistics.\n\nRound up fractional coach counts. Never round down — understaffing a range is a safety risk, not a budget win.\n\n## Output Structure\n\n---\n\n### 1. Demand Heatmap\n\nA weekly grid (hours as rows, Mon–Sun as columns). Each cell shows average guest count rounded to 1 decimal. Use visual intensity markers:\n\n- 🔴 Peak (> mean + 1σ)\n- 🟡 Hot (> mean)\n- ⚫ (no marker) Normal\n- — Empty/no data\n\n```\n Mon Tue Wed Thu Fri Sat Sun\n4:00 PM — 2.1 1.8 4.8 3.2 6.4 4.1\n5:00 PM — 3.4 2.9 6.2 5.8 🟡8.1 🟡7.2\n6:00 PM — 4.2 3.8 🟡7.4 🟡8.4 🔴11.8 🟡9.4\n7:00 PM — 3.8 4.1 🔴10.2 🔴12.6 🔴14.0 🟡8.8\n8:00 PM — 2.4 3.2 8.8 🟡9.8 🔴13.2 5.4\n9:00 PM — — — 8.4 🟡7.2 🟡8.6 —\n10:00 PM — — — 6.8 4.4 5.2 —\n```\n\nCells on league nights ({{leagueNights}}) should be marked with an (L) indicator — e.g., `🔴10.2 (L)` — since those lanes are not available for open throw.\n\n### 2. Top 5 Peak Windows\n\nRanked by average guest count:\n\n| Rank | Day | Time | Avg Guests | Max Recorded | Notes |\n|---|---|---|---|---|---|\n| 1 | Saturday | 7:00 PM | 14.0 | 20 | Private party peak |\n| 2 | Friday | 7:00 PM | 12.6 | 18 | Date night + group surge |\n| 3 | Saturday | 8:00 PM | 13.2 | 20 | Consecutive with 7 PM peak |\n| 4 | Thursday | 7:00 PM | 10.2 | 16 | League night — dedicated lanes |\n| 5 | Friday | 8:00 PM | 9.8 | 14 | Post-dinner arrivals |\n\n### 3. Underutilized Windows\n\nWindows averaging below 40% lane utilization — opportunities for promotional pricing, early-bird discounts, or corporate outreach:\n\n| Day | Time | Avg Guests | Utilization | Recommended Action |\n|---|---|---|---|---|\n| Tuesday | 4:00 PM | 2.1 | 4.4% | Promote weekday happy hour session discount |\n| Wednesday | 4:00 PM | 1.8 | 3.8% | Target corporate lunch/afternoon bookings |\n| Tuesday | 5:00 PM | 3.4 | 7.1% | Add to promotional calendar as off-peak slot |\n\nFor quiet windows that are purely operational dead zones (e.g., after 9 PM on weekdays): recommend reducing scheduled hours rather than discounting.\n\n### 4. Coach Scheduling Recommendation Table\n\nOne row per peak or hot window:\n\n| Window | Avg Guests | Active Lanes | Min Coaches | Bar Host | Total Staff |\n|---|---|---|---|---|---|\n| Sat 6–8 PM | 12.5 | 3–4 | 2 | 1 | 3–4 |\n| Fri 6–8 PM | 10.5 | 3 | 2 | 1 | 3 |\n| Thu 7–9 PM | 9.5 (L) | 4 (league) | 2 | 1 | 3 |\n| Fri 5 PM | 5.8 | 1–2 | 1 | 1 | 2 |\n| Sun 6–7 PM | 9.4 | 2–3 | 1–2 | 1 | 2–3 |\n\nLeague night (Thu) is flagged with (L). The coaching requirement for league is always 2 minimum regardless of lane count — match supervision requires a second set of eyes.\n\n### 5. Seasonal Notes\n\nFlag upcoming high-demand periods in the next 30–60 days that may require additional coach scheduling or early lane reservations:\n\n- **Valentine's Day (Feb 14)**: Expect 2–3× normal demand for couples and private party bookings. Add a dedicated private party block and ensure at least 3 coaches are scheduled.\n- **Spring corporate season (Mar–May)**: Company team-building bookings spike. Ensure corporate inquiry response time is fast — these groups need 4+ weeks lead time to confirm.\n- **Summer (Jun–Aug)**: Bachelor/bachelorette party season. Private party bookings increase significantly. Add Saturday afternoon open throw slots to capture earlier arrivals.\n- **Holiday season (Nov–Dec)**: Gift card sales surge and \"holiday party\" private bookings fill up quickly. Add a corporate event promotion in October before calendars fill.\n- **New league season start**: League registration opens demand for the first 2–3 weeks of sign-ups. Ensure website booking flow highlights league registration prominently.\n\nIf no seasonal note applies to the current period, omit this section entirely.\n";
41
+
42
+ /** Raw SKILL.md content for the `revenue-report` skill. */
43
+ export const revenueReport = "---\nid: revenue-report\nname: Revenue Report\ndescription: Generates comprehensive financial performance reports using aggregate queries — revenue by session type, month-over-month trends, expense breakdown, beverage margin, lane ROI, and statistical anomaly flags.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Revenue Report\n\nYou generate financial performance reports for {{businessName}} management. When triggered, you query Brainy transaction data using named aggregates, then produce a structured report with revenue analysis, cost breakdown, margin calculations, and one clear recommendation.\n\n## When to Trigger\n\nInvoke this skill when someone asks:\n\n- \"How's revenue this month?\"\n- \"Give me a financial report\"\n- \"Show me the P&L\"\n- \"Which session type makes the most money?\"\n- \"What's our margin on private parties?\"\n- \"Revenue for Q1\" / \"How did we do last quarter?\"\n- \"Lane ROI\" or \"how much does each lane earn?\"\n- Any financial analysis or period-end review request\n\n## Default Period\n\nIf no period is specified, use the **current calendar month**. Accept: \"last month\", \"this quarter\", \"last 6 months\", \"year to date\", specific month/year, or a custom date range.\n\n## Aggregate Definitions\n\n### Revenue by Session Type and Month\n\n```typescript\nbrain.defineAggregate('revenueByExperienceMonth', {\n source: {\n type: 'Measurement',\n where: [\n { field: 'metadata.entityType', value: 'transaction' },\n { field: 'metadata.type', value: 'revenue' }\n ]\n },\n groupBy: [\n { field: 'metadata.experienceSlug' },\n { field: 'metadata.date', window: 'month' }\n ],\n metrics: {\n totalRevenue: { op: 'SUM', field: 'metadata.amountInCents' },\n bookingCount: { op: 'COUNT' },\n avgTicket: { op: 'AVG', field: 'metadata.amountInCents' },\n maxTicket: { op: 'MAX', field: 'metadata.amountInCents' },\n minTicket: { op: 'MIN', field: 'metadata.amountInCents' },\n revenueStdDev: { op: 'STDDEV', field: 'metadata.amountInCents' },\n revenueVariance: { op: 'VARIANCE', field: 'metadata.amountInCents' }\n }\n});\n\nconst revenueResults = await brain.find({\n aggregate: 'revenueByExperienceMonth',\n where: [\n { field: 'metadata.locationId', value: LOCATION_ID },\n { field: 'metadata.date', value: { gte: START_DATE, lte: END_DATE } }\n ],\n orderBy: 'totalRevenue',\n order: 'desc'\n});\n```\n\n### Expenses by Category and Month\n\n```typescript\nbrain.defineAggregate('expensesByCategory', {\n source: {\n type: 'Measurement',\n where: [\n { field: 'metadata.entityType', value: 'transaction' },\n { field: 'metadata.type', value: 'expense' }\n ]\n },\n groupBy: [\n { field: 'metadata.category' },\n { field: 'metadata.date', window: 'month' }\n ],\n metrics: {\n totalExpense: { op: 'SUM', field: 'metadata.amountInCents' },\n txCount: { op: 'COUNT' },\n avgExpense: { op: 'AVG', field: 'metadata.amountInCents' }\n }\n});\n\nconst expenseResults = await brain.find({\n aggregate: 'expensesByCategory',\n where: [\n { field: 'metadata.locationId', value: LOCATION_ID },\n { field: 'metadata.date', value: { gte: START_DATE, lte: END_DATE } }\n ]\n});\n```\n\n**Major expense categories for an axe throwing venue**: `hatchet` (sharpening, replacement), `big-axe` (maintenance, replacement), `targets` (board replacement), `beverages` (bar COGS), `maintenance` (general supplies, lane hardware), `retail` (merchandise COGS), `safety` (safety equipment replacement).\n\n## Report Structure\n\nPresent the report in this exact order. All amounts in dollars (divide cents by 100). Percentages to 1 decimal place.\n\n---\n\n### 1. Summary Bar\n\n```\nFinancial Report: February 2026 — {{locationName}}\n────────────────────────────────────────────────────\nGross Revenue: $14,820.00\nTotal Bookings: 248\nAvg Ticket: $59.76\nTotal Expenses: $3,140.00\nGross Margin: 78.8%\n```\n\n### 2. Revenue by Session Type\n\n| Session Type | Bookings | Revenue | Avg Ticket | % of Total | STDDEV |\n|---|---|---|---|---|---|\n| Private Party | 48 | $6,720 | $140.00 | 45.3% | $18.40 |\n| Open Throw Session | 142 | $3,550 | $25.00 | 24.0% | $0.00 |\n| Corporate Event | 22 | $3,080 | $140.00 | 20.8% | $24.20 |\n| League Night | 28 | $560 | $20.00 | 3.8% | $0.00 |\n| Axe 101 Lesson | 8 | $240 | $30.00 | 1.6% | $0.00 |\n| Bar / Retail | — | $670 | — | 4.5% | — |\n| **Total** | **248** | **$14,820** | **$59.76** | **100%** | — |\n\nSTDDEV column shows per-booking pricing consistency. Fixed per-person pricing will show $0.00. Private parties and corporate events will show variance based on group size differences — this is expected and not a flag. Flag only if STDDEV exceeds 40% of the avg ticket for a session type.\n\nNote: League revenue may reflect per-season registration fees billed separately. If so, this table will undercount league revenue — flag the discrepancy and advise pulling season registration totals separately.\n\n### 3. Revenue Mix: League vs Walk-In\n\nAxe throwing venues should track the ratio of recurring (league) revenue to walk-in and event revenue. A healthy mix varies by venue, but league revenue is typically more predictable and requires less marketing.\n\n```\nRevenue Mix Analysis\n League (season fees + league night sessions): $X,XXX (XX% of total)\n Walk-In + Events (open throw, private, corporate, lessons): $X,XXX (XX% of total)\n\nLeague revenue insight: [One sentence on whether league share is growing, stable, or declining vs prior period]\n```\n\n### 4. Month-Over-Month Trend\n\nShow one row per month for the trailing period (up to 12 months if available):\n\n| Month | Revenue | Bookings | Avg Ticket | Growth |\n|---|---|---|---|---|\n| Sep 2025 | $9,100 | 152 | $59.87 | — |\n| Oct 2025 | $10,640 | 178 | $59.78 | +16.9% |\n| Nov 2025 | $11,200 | 187 | $59.89 | +5.3% |\n| Dec 2025 | $13,480 | 225 | $59.91 | +20.4% |\n| Jan 2026 | $12,360 | 207 | $59.71 | -8.3% |\n| Feb 2026 | $14,820 | 248 | $59.76 | +19.9% |\n\nHighlight the highest-revenue month in the trailing period.\n\n### 5. Cost Breakdown\n\n| Category | Total Expenses | % of Revenue |\n|---|---|---|\n| beverages | $1,240 | 8.4% |\n| targets | $580 | 3.9% |\n| hatchet | $480 | 3.2% |\n| maintenance | $340 | 2.3% |\n| big-axe | $280 | 1.9% |\n| retail | $140 | 0.9% |\n| safety | $80 | 0.5% |\n| **Total** | **$3,140** | **21.2%** |\n\n### 6. Beverage Margin\n\nBar revenue is a meaningful secondary revenue stream at axe throwing venues. Calculate separately if bar transaction data is available as its own category:\n\n```\nBeverage Performance\n Bar Revenue: $X,XXX\n Bar COGS (expense): $X,XXX\n Bar Gross Margin: XX.X%\n\n[Flag if bar margin falls below 60% — typical pour-cost targets for a bar in this model are 30–35% COGS, implying 65–70% gross margin]\n```\n\n### 7. Lane ROI\n\nLane ROI measures how much revenue each lane generates per hour of operation. Useful for pricing adjustments, deciding whether to add lanes, and comparing session type efficiency.\n\n```\nLane ROI — February 2026\n Total Operating Hours (lane-hours available): [laneCount × hours open × days]\n Total Revenue: $14,820\n Revenue per Lane-Hour: $XX.XX\n\nBy Session Type (revenue per lane-hour used):\n Corporate Event: $XX.XX/lane-hour (highest — full buyout premium)\n Private Party: $XX.XX/lane-hour\n Open Throw: $XX.XX/lane-hour\n Axe 101 Lesson: $XX.XX/lane-hour\n League Night: $XX.XX/lane-hour (lowest per-hour — compensated by volume and retention)\n```\n\n### 8. Statistical Flags\n\nCheck each session type where `revenueStdDev > (avgTicket × 0.40)`. This signals pricing inconsistency, irregular group-size discounts, or ad-hoc pricing changes.\n\nIf flagged:\n\n```\n⚠️ Pricing Variance Detected\n Corporate Event: avg ticket $140.00, STDDEV $56.00 (40% of mean)\n → Investigate: group-size discounts, buyout pricing irregularities, or comped sessions\n```\n\nIf no flags: \"Pricing is consistent across all session types. No variance anomalies detected.\"\n\n### 9. Recommendation\n\nOne clear, data-backed recommendation. Choose the most actionable insight from the report. Examples:\n\n- \"Corporate events are your highest avg ticket ($140) and represent 20% of revenue — consider a dedicated corporate outreach campaign targeting HR departments and office managers.\"\n- \"League revenue is 4% of total — below the 15–20% target for venues this size. Promoting the upcoming season start could shift the mix and improve monthly predictability.\"\n- \"Bar margin fell to 54% this month — 11 points below target. Review pour costs and check for over-serving or untracked comp tabs.\"\n- \"Lane utilization is averaging 67% — a dynamic pricing window on Tuesday–Wednesday evenings could lift utilization to 80%+ with a modest rate reduction.\"\n\nOnly one recommendation. Make it specific and tied to a number from the report.\n\n## Formatting Rules\n\n- All revenue/expense amounts: divide cents by 100, format `$X,XXX.XX`\n- Percentages: one decimal (e.g., `62.7%`)\n- Growth rates: include sign (`+14.5%`, `-7.5%`)\n- Unavailable months: show `—` not `$0`\n- Never display raw cent integer values in the output\n";
44
+
45
+ /** Raw SKILL.md content for the `inventory-health` skill. */
46
+ export const inventoryHealth = "---\nid: inventory-health\nname: Inventory Health Check\ndescription: Analyzes axe throwing venue stock levels with special logic for axe maintenance cycles, target board rotation schedules, and beverage par levels — producing tiered alerts and a prioritized action list.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: true\n---\n\n# Inventory Health Check\n\nYou analyze {{businessName}} inventory with context-specific logic for an axe throwing venue. Axes are not consumed — they are maintained. Targets are consumed over time. Beverages run on standard par logic. Safety equipment requires its own threshold. This skill handles all three models and produces a clear, tiered alert report.\n\n## When to Trigger\n\nInvoke this skill when someone asks:\n\n- \"Check inventory\"\n- \"What needs restocking?\"\n- \"Which axes are due for sharpening?\"\n- \"Target board status\"\n- \"What are we running low on?\"\n- \"Inventory alert\"\n- Also runs automatically as section 4 of the Staff Briefing skill\n\n## Inventory Categories at {{businessName}}\n\n| Category ID | What It Covers | Tracking Model |\n|---|---|---|\n| `hatchet` | Throwing hatchets — numbered by ID | Maintenance cycle (sharpen every 50 sessions) |\n| `big-axe` | Big axes — numbered by ID | Maintenance cycle (sharpen every 30 sessions) |\n| `targets` | Target boards (2×10 pine) and mounting hardware | Consumption cycle (flip at ~200 sessions, replace at ~400) |\n| `lane-supplies` | Chalk, markers, scorecards, tape, lane barriers | Standard consumption |\n| `safety` | Safety barriers, floor mats, warning signs, first aid | Count + condition check |\n| `beverages` | Draft beer kegs, canned beverages, wine, non-alcoholic | Standard par level |\n| `retail` | Branded merchandise, gift items | Standard par level |\n| `maintenance` | Sharpening stones, axe oil, handle wrap, wood filler | Standard consumption |\n\n## Step 1: Pull Current Stock\n\n```typescript\nconst inventoryItems = await brain.find({\n type: 'Thing',\n where: [\n { field: 'metadata.entityType', value: 'inventory-item' },\n { field: 'metadata.locationId', value: LOCATION_ID }\n ]\n});\n// Each item: { metadata: { name, category, quantity, reorderThreshold, costInCents,\n// lastMaintenanceDate, sessionsSinceMaintenance, locationId } }\n```\n\n## Step 2: Axe Maintenance Logic\n\nAxes are tracked individually by ID. They are not \"consumed\" — they rotate through a maintenance cycle.\n\n```typescript\nconst hatchets = inventoryItems.filter(i => i.metadata.category === 'hatchet');\nconst bigAxes = inventoryItems.filter(i => i.metadata.category === 'big-axe');\n\n// Maintenance thresholds (from axe-expertise skill)\nconst HATCHET_SHARPEN_INTERVAL = 50; // sessions\nconst BIG_AXE_SHARPEN_INTERVAL = 30; // sessions\nconst HATCHET_FULL_SERVICE = 200; // sessions\nconst BIG_AXE_FULL_SERVICE = 150; // sessions\n\n// Flag axes where sessionsSinceMaintenance >= threshold\nconst hatchetsDue = hatchets.filter(\n i => (i.metadata.sessionsSinceMaintenance ?? 0) >= HATCHET_SHARPEN_INTERVAL\n);\nconst bigAxesDue = bigAxes.filter(\n i => (i.metadata.sessionsSinceMaintenance ?? 0) >= BIG_AXE_SHARPEN_INTERVAL\n);\nconst hatchetsFullService = hatchets.filter(\n i => (i.metadata.sessionsSinceMaintenance ?? 0) >= HATCHET_FULL_SERVICE\n);\n```\n\nAxes flagged for maintenance should be pulled from rotation before the first session of the day, not after. Safety equipment past its maintenance threshold is a 🔴 CRITICAL alert.\n\n## Step 3: Target Board Logic\n\nTarget boards are consumed over time through repeated axe impacts.\n\n```typescript\nconst targetBoards = inventoryItems.filter(i => i.metadata.category === 'targets');\n\n// Estimate based on session count metadata on each board item\nconst BOARD_FLIP_THRESHOLD = 200; // sessions — flip to reverse face\nconst BOARD_REPLACE_THRESHOLD = 400; // sessions — replace entirely\n\nconst boardsToFlip = targetBoards.filter(b => b.metadata.sessionCount >= BOARD_FLIP_THRESHOLD\n && b.metadata.sessionCount < BOARD_REPLACE_THRESHOLD);\nconst boardsToReplace = targetBoards.filter(b => b.metadata.sessionCount >= BOARD_REPLACE_THRESHOLD);\n```\n\nIf session count is not tracked per board, check `metadata.lastRotationDate` and estimate based on average sessions per week. Alert if any board has not been rotated in more than 4 weeks (assuming any operational venue runs 50+ sessions per week).\n\n## Step 4: Standard Consumption Rate (Beverages, Lane Supplies, Retail)\n\n```typescript\nbrain.defineAggregate('weeklyConsumptionByCategory', {\n source: {\n type: 'Measurement',\n where: [\n { field: 'metadata.entityType', value: 'transaction' },\n { field: 'metadata.type', value: 'expense' }\n ]\n },\n groupBy: [\n { field: 'metadata.category' },\n { field: 'metadata.date', window: 'week' }\n ],\n metrics: {\n weeklyCount: { op: 'COUNT' },\n weeklySpend: { op: 'SUM', field: 'metadata.amountInCents' },\n avgPerWeek: { op: 'AVG', field: 'metadata.amountInCents' }\n }\n});\n\nconst consumption = await brain.find({\n aggregate: 'weeklyConsumptionByCategory',\n where: [\n { field: 'metadata.locationId', value: LOCATION_ID },\n { field: 'metadata.date', value: { gte: FOUR_WEEKS_AGO, lte: TODAY } }\n ]\n});\n```\n\n## Alert Tiers\n\n| Tier | Condition | Action Required |\n|---|---|---|\n| 🔴 CRITICAL | Safety equipment below minimum count; axes past full service interval; boards past replace threshold; beverages at zero | Immediate action before opening |\n| 🟡 LOW | Axes due for sharpening (not full service); boards approaching flip threshold; beverages below par; lane supplies running low | Action this week |\n| 🟢 OK | All within safe thresholds | No action needed |\n\n## Output Structure\n\n---\n\n### 1. Status Summary\n\n```\nInventory Health — {{locationName}}\nAs of: [today's date]\n─────────────────────────────────────────\n🔴 CRITICAL: 1 item (action before opening)\n🟡 LOW: 6 items (order or service this week)\n🟢 OK: 28 items\n```\n\n### 2. Critical Items\n\nItems requiring immediate action before any session begins:\n\n| Item | Category | Issue | Action Required |\n|---|---|---|---|\n| Safety Mat — Lane 3 | safety | Torn edge — trip hazard | Replace before opening |\n| Big Axe #4 | big-axe | 148 sessions — past full service interval | Pull from rotation immediately |\n\nSafety category items are always CRITICAL regardless of days-until-empty logic.\n\n### 3. Axe Maintenance Queue\n\nList all axes due for sharpening (not yet critical) in order of urgency:\n\n| Axe ID | Type | Sessions Since Last Maintenance | Threshold | Status |\n|---|---|---|---|---|\n| Hatchet #7 | Hatchet | 52 | 50 | 🟡 Due for sharpening |\n| Hatchet #12 | Hatchet | 56 | 50 | 🟡 Due for sharpening |\n| Big Axe #2 | Big Axe | 28 | 30 | 🟡 Due next week |\n\n**Sharpening action**: Pull from rotation before the day's sessions begin. Return after sharpening is complete. Do not sharpen in-session — remove and replace with a spare.\n\nIf no axes are due: \"All axes within maintenance thresholds.\"\n\n### 4. Target Board Rotation Schedule\n\n| Board / Lane | Sessions Used | Flip At | Replace At | Status | Action |\n|---|---|---|---|---|---|\n| Board — Lane 2 | 198 | 200 | 400 | 🟡 Flip this week | Schedule flip before next private party |\n| Board — Lane 6 | 412 | 200 | 400 | 🔴 Replace immediately | Order replacement board |\n| Board — Lane 1 | 87 | 200 | 400 | 🟢 OK | None |\n\nIf no boards need attention: \"All target boards are within rotation thresholds.\"\n\n### 5. Beverage Par Status\n\n| Item | Category | In Stock | Par Level | Status |\n|---|---|---|---|---|\n| Pale Ale (1/6 bbl) | beverages | 1 keg | 3 kegs | 🟡 LOW — order this week |\n| IPA (1/2 bbl) | beverages | 2 kegs | 2 kegs | 🟢 OK |\n| Non-Alcoholic Cider | beverages | 4 cans | 24 cans | 🔴 CRITICAL |\n\n### 6. Weekly Consumption Rates (Last 4 Weeks)\n\n| Category | Avg Weekly Spend | Trend |\n|---|---|---|\n| beverages | $680 / week | +12% vs prior 4 wks |\n| targets | $140 / week | stable |\n| lane-supplies | $48 / week | stable |\n| maintenance | $62 / week | +5% vs prior 4 wks |\n| retail | $110 / week | -8% vs prior 4 wks |\n\nA rising beverage trend with low stock is a compounding risk — flag it.\n\n### 7. Recommended Action List\n\nA consolidated prioritized list of all required actions:\n\n| Priority | Item | Action | Urgency |\n|---|---|---|---|\n| 1 | Safety Mat — Lane 3 | Replace torn mat before opening | 🔴 NOW |\n| 2 | Non-Alcoholic Cider | Reorder — stock at critical level | 🔴 TODAY |\n| 3 | Hatchet #7, #12 | Pull from rotation; sharpen and return | 🟡 THIS SESSION |\n| 4 | Board — Lane 6 | Order replacement 2×10 pine board | 🟡 THIS WEEK |\n| 5 | Board — Lane 2 | Schedule flip — before next private party | 🟡 THIS WEEK |\n| 6 | Pale Ale keg | Order 2 additional 1/6 bbl kegs | 🟡 THIS WEEK |\n\nSuggested reorder quantities for consumable items: `(reorderThreshold × 2) − currentQuantity`, rounded up to nearest supplier unit.\n\n### 8. Axe Count Check\n\nConfirm operational readiness:\n\n```\nAxe Availability Summary\n Total Hatchets: [N] Available: [N-flagged] In Maintenance Queue: [N]\n Total Big Axes: [N] Available: [N-flagged] In Maintenance Queue: [N]\n\nSession Readiness: [status — e.g., \"Sufficient for all scheduled sessions today\" or \"Warning: if both flagged hatchets are pulled, open throw capacity is reduced by 2 lanes\"]\n```\n";
47
+
48
+ /** Raw SKILL.md content for the `email-campaign` skill. */
49
+ export const emailCampaign = "---\nid: email-campaign\nname: Email Campaign Writer\ndescription: Writes complete marketing email campaigns for The Axe House — two A/B subject lines, a preheader, 150–200 word body copy, a CTA button, and an unsubscribe line — across league season announcements, re-engagement, party pitches, corporate outreach, standings updates, and seasonal promotions.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: false\n---\n\n# Email Campaign Writer\n\nYou write marketing emails for {{businessName}} — concise, direct, and specific enough that recipients feel like the email was written for them, not blasted to a list. Every campaign includes two A/B subject line variants, a preheader, body copy, a CTA button label, and a compliant unsubscribe line.\n\n## When to Trigger\n\nInvoke this skill when someone asks:\n\n- \"Write a marketing email\"\n- \"Email campaign for [event/offer]\"\n- \"Re-engagement email for people who haven't been back\"\n- \"League season announcement\"\n- \"Corporate event outreach\"\n- \"Standings email for league members\"\n- Any email marketing or newsletter writing request\n\nIf no campaign type is specified, ask: \"What type of campaign is this — new league season, re-engagement, party pitch, corporate outreach, standings update, or seasonal promo?\"\n\n## Campaign Types\n\n| Type | Use Case | Key Angle |\n|---|---|---|\n| **New league season** | Announce registration for an upcoming league season | Urgency (lanes fill fast), community, competition |\n| **Re-engagement** | Win back guests absent 60+ days | \"The axes are still here\" energy + a reason to come back |\n| **Party pitch** | Promote private party and corporate event bookings | Group energy, social proof, specificity about what we provide |\n| **Corporate outreach** | Target teams and companies directly | ROI framing — team building that's actually fun, performance debrief, no one falls asleep |\n| **Standings update** | Send to league members: weekly standings, notable results | Inside-voice, competitive, personal to the league community |\n| **Seasonal promo** | Holiday, Valentine's Day, summer party season, New Year's | Tie to moment in time; urgency comes from the season, not manufactured scarcity |\n\n## Output Format\n\nAlways produce all six components in this order:\n\n---\n\n### Subject A\n35–50 characters. Use a **curiosity or question angle** — make them want to know what's inside.\n\nExamples:\n- \"Can you hit the bullseye, {{firstName}}?\"\n- \"The league standings are out. It's close.\"\n- \"We counted — it's been 84 days.\"\n\n### Subject B\n35–50 characters. Use a **direct value or offer angle** — lead with what they get.\n\nExamples:\n- \"New league season — registration opens Monday\"\n- \"Private party lanes available this weekend 🎯\"\n- \"Book your corporate event for Q4 — lanes are filling\"\n\n### Preheader\n85–100 characters. Appears in the inbox preview after the subject. Extends or complements the subject — never repeats it verbatim.\n\nExamples:\n- \"Eight weeks of competition, a standings board, playoffs, and trophies. Your team in?\"\n- \"Reserve multiple lanes for your group — a dedicated host runs the whole event.\"\n- \"We haven't seen you since October. Your aim has probably gotten worse. Let's fix that.\"\n\n### Email Body\n150–200 words. 3–4 short paragraphs. Apply these rules:\n\n**Opening rule**: Never \"Dear Customer\" or \"Hi there.\" Open with the hook addressed to `{{firstName}}` or just dive into the value.\n\nGood: \"{{firstName}}, league registration opens Monday and the spots go fast.\"\nBad: \"Dear Valued Customer, we are excited to announce...\"\n\n**Paragraph 2**: The specifics — what, when, how much, what they get. Be concrete. One {{businessName}} detail to make it feel personal (e.g., \"{{laneCount}} lanes are already assigned for the season\", \"your throw from last session is still in our system\", \"the team that beat you last season signed up yesterday\").\n\n**Paragraph 3**: The social proof or competitive hook. \"Last season filled in 6 days.\" \"The debrief at the end of a corporate event is half the fun — watching the data come in on who actually threw the best.\"\n\n**Paragraph 4 (optional)**: Soft objection handling or a P.S.-style closer.\n\nUse contractions. Punchy sentences. Aim for a 7th-grade reading level — this email should scan in 20 seconds.\n\n### CTA Button Text\n3–5 words. Action-oriented.\n\nGood: \"Reserve My Lane\", \"Register My Team\", \"Book the Party\", \"Join This Season\"\nBad: \"Submit\", \"Click Here\", \"Learn More\"\n\n### Unsubscribe Line\n```\nYou're receiving this because you visited {{businessName}}. Unsubscribe\n```\n\n---\n\n## {{businessName}}-Specific Angles\n\nUse these details to make emails feel like they came from a real venue, not a template:\n\n- **The lanes are real and limited**: \"{{laneCount}} lanes. Once they're booked, they're booked.\" Works for league, private party, and weekend promo campaigns.\n- **The coaching is real**: \"Every session starts with a 20-minute coaching block — your form actually improves.\" Great for re-engagement and first-timer pitches.\n- **League is a community**: Reference the standings, teams, rivalries, and the trophy. League emails should feel like they're written by someone in the league, not marketing it.\n- **Corporate angle**: \"Axe throwing tells you things about your team that a ropes course never will.\" The performance debrief is a genuine differentiator — mention it.\n- **The bar**: Cold drinks, post-session or between-session. Works in party pitches and weekend promo emails.\n- **Seasonal hooks**: Valentine's Day (couples throwing together), summer (outdoor energy inside), holiday season (office party alternative), New Year's (resolution to learn a physical skill).\n\n## Tone Rules\n\n- Direct and energetic — not corporate, not overly exclamatory\n- Contractions are expected (`you've`, `we're`, `it's`)\n- ONE specific {{businessName}} detail per email to avoid generic feel\n- Emojis: maximum two per email, only where natural — never in Subject A (curiosity variant)\n- Never: \"Don't miss out!!!\", manufactured scarcity, panic-selling\n- Competitive edge is fine — lean into the sport's competitive nature without being aggressive\n\n## Example Output (Re-engagement Campaign)\n\n**Subject A**: \"It's been a while, {{firstName}}\"\n**Subject B**: \"Your lane misses you — and your aim\"\n**Preheader**: \"We've had three new league seasons and a completely sold-out Valentine's weekend since your last session.\"\n\n**Body**:\n{{firstName}}, it's been a while, and we noticed.\n\nThe range has {{laneCount}} lanes now fully dialed in, and our league just kicked off Season 4. We've had teams form, rivalries develop, and one very memorable championship night that we're still talking about.\n\nIf you've been meaning to come back, this is a good week. Open Throw sessions are available Tuesday through Sunday, and if you want to throw with people instead of against the clock, league registration opens again in two weeks — teams of 4 to 8.\n\nYour first throw back will be rough. By the third one, you'll remember why you liked it.\n\n**CTA**: Book My Return Lane\n**Unsubscribe**: You're receiving this because you visited {{businessName}}. Unsubscribe\n";
50
+
51
+ /** Raw SKILL.md content for the `social-calendar` skill. */
52
+ export const socialCalendar = "---\nid: social-calendar\nname: Social Media Calendar\ndescription: Creates a full month of social media content for Instagram, TikTok, and Facebook — 20–30 posts with captions, hashtags, content descriptions, and a posting schedule following The Axe House's five content pillars.\ntype: invocable\nversion: 1.0.0\nrequiresVision: false\nrequiresData: false\n---\n\n# Social Media Calendar\n\nYou produce a complete month of social content for {{businessName}} — structured, ready-to-execute, and consistent with the brand's content pillars. Output includes post-by-post guidance with content descriptions, platform assignments, captions, hashtags, and optional reel or story concepts.\n\n## When to Trigger\n\nInvoke this skill when someone asks:\n\n- \"Social calendar for [month]\"\n- \"Content plan for this month\"\n- \"Instagram content ideas\"\n- \"Give me 30 social posts\"\n- \"Social media plan\"\n- Any social media content calendar request\n\nIf no month is specified, use the current calendar month.\n\n## Content Pillars and Proportions\n\nEvery calendar must follow this mix. In a 20-post month: 7 throw moments, 5 competition/league, 4 instruction, 2 atmosphere, 2 promotional. In a 30-post month: 10 throw moments, 8 competition/league, 6 instruction, 3 atmosphere, 3 promotional.\n\n| Pillar | Target % | What It Covers |\n|---|---|---|\n| **Throw Moments** | 35% | Bullseye celebrations, satisfying sticks, near-misses, guest reaction moments, slow-motion throws, highlight clips |\n| **Competition & League** | 25% | Standings posts, team celebrations, playoff bracket reveals, championship night recaps, weekly match results |\n| **Instruction & Tips** | 20% | Technique breakdowns, grip tutorials, stance explainers, \"rate my form\" engagement formats, WATL scoring guides |\n| **Atmosphere** | 10% | Venue vibes, bar shots, group energy, behind-the-scenes, coach spotlights, late-night range footage |\n| **Promotional** | 10% | Booking CTAs, gift cards, league registration, private party availability — NEVER more than 1 promotional post per 5 posts in the feed |\n\nNever front-load promotional posts. Distribute them evenly through the month.\n\n## Platform Strategy\n\n| Platform | Best Content | Caption Length | Frequency |\n|---|---|---|---|\n| **Instagram** | Reels (slow-motion bullseyes, league drama, coaching breakdowns), carousel (technique guides, scoring explained), single photo (axe portraits, venue atmosphere) | 150–220 chars + hashtags | 5–7×/week |\n| **TikTok** | Short-form video: slow-motion throw, bullseye highlight, \"rate my form\" reply format, behind-the-scenes, \"what your throw says about you\" | 100–150 chars + 3–5 tags | 3–5×/week |\n| **Facebook** | League announcements, event shares, private party promotions, longer community posts (season recap, team spotlight) | 200–350 chars | 3–4×/week |\n\nFor a full calendar, assign each post a primary platform. High-performing content should be noted as cross-postable.\n\n## {{businessName}} Hashtag Bank\n\nUse 5–7 per Instagram post, 3–5 per TikTok:\n\n```\n#axehouse #axethrowing #hatchet #bullseye #axelife\n#watl #leaguenight #teambuilding #throwingaxes\n#{{city}}fun #{{city}}axethrowing #axethrowingparty\n#hatchetthrowing #axethrowingleague #bigaxe #bullseyechallenge\n#axecoach #rangelife #axethrowingvenue #clutch\n```\n\nAlways include `#axehouse` and at least one city-specific tag. Never use more than 7 hashtags on Instagram — the algorithm penalizes over-tagging.\n\n## Post Format\n\nFor every post, output exactly these fields:\n\n```\nPost [N] — [Day, Date]\nPlatform: Instagram / TikTok / Facebook\nPillar: Throw Moments | Competition/League | Instruction | Atmosphere | Promotional\nContent: [What to film or photograph — 1–2 sentences of direction]\nCaption: [Full caption text — within platform character limit]\nHashtags: [5–7 tags for IG; 3–5 for TikTok; none needed for FB]\nReel/Story idea: [Optional — 1 sentence if a reel or story version is a natural extension]\n```\n\n## Monthly Rhythm\n\nStructure the month in three acts:\n\n**Opening week**: Lead with a high-impact throw moment — a clean bullseye, a slow-motion stick, or a first-timer's reaction. Hook the algorithm and set the tone. If a new league season just started, lead with that energy.\n\n**Mid-month**: Maintain the pillar mix. Place the month's promotional content here, sandwiched between instruction and competition content. If the month includes a seasonal moment (Valentine's Day, end of quarter, holiday party season), build toward it in the two weeks prior with atmosphere and instruction content.\n\n**Closing week**: End on competition energy or a coaching moment. A league playoff bracket reveal, a team that hit a milestone, or a technique tip that gets engagement. Close the month in a way that makes people want to see next month's standings.\n\n## Seasonal Awareness\n\nAdjust the calendar's tone and topics based on the month:\n\n| Month | Key Dates and Themes |\n|---|---|\n| January | New Year's resolution angle (\"learn a skill\"), fresh season start, quieter weekdays = technique content |\n| February | Valentine's Day (couples throwing together, date night framing), league winter season |\n| March | Spring corporate event season starts, private party bookings begin to pick up |\n| April | Spring league playoff potential, outdoor energy channeled indoors |\n| May | Bachelorette/bachelor party season peak, Mother's Day angle (gift card for the mom who wants something different) |\n| June | Summer bachelor/bachelorette surge, longer daylight = evening sessions popular |\n| July | Summer party season, cold-drink-meets-cold-axe atmosphere content |\n| August | Back-to-school wind-down, corporate Q3 planning season — target team events |\n| September | Fall league season launch, new season registration push |\n| October | Halloween-adjacent content (axes and autumn), cozy lodge atmosphere, peak corporate Q4 planning |\n| November | Holiday party alternative pitch, gift card season begins |\n| December | Gift card surge, corporate holiday party bookings, year-in-review league champion spotlight |\n\n## Content Ideas — Pillar by Pillar\n\n### Throw Moments\n- Slow-motion bullseye — shoot at 240fps if possible, cut at the moment of impact\n- Guest first bullseye reaction — capture the face, not just the throw\n- Satisfying axe stick from multiple angles\n- Near-miss clutch call — the drama of \"called it, missed it\"\n- Coach demonstrating a clean throw vs a student copying the form — side by side\n- \"Last throw of the night\" dramatic single throw\n\n### Competition & League\n- League standings graphic — formatted cleanly with team names and win-loss records\n- Playoff bracket reveal — build up with a teaser post the day before\n- Championship night recap — the moment the trophy is handed over\n- \"Week [N] results\" summary — quick and clean, works as IG story or static post\n- Team spotlight — ask a league team for a 3-second reaction clip to their weekly result\n- Individual player leaderboard — top 5 by average score this season\n\n### Instruction & Tips\n- Grip tutorial — overhead view showing correct hammer grip vs common mistake\n- \"Rate my form\" — repost a guest throwing with coach annotations in the caption\n- The clutch explained — what it is, when to call it, why it's worth 8 points\n- Hatchet vs big axe — quick comparison reel: same thrower, two axe styles, same distance\n- The follow-through — show what stopping early looks like vs full extension\n- Release timing — \"a tenth of a second too early vs a tenth too late\" as a split-screen\n\n### Atmosphere\n- Wide lane shot at peak Friday night — full house, energy visible\n- Bar area with axes visible in the background — the vibe of the venue\n- Coach walk-through before a private party — the calm before the group arrives\n- Time-lapse of a session from first throw to last\n- Behind the scenes: sharpening an axe, setting up a target board, cleaning chalk lanes\n\n### Promotional\n- Lane booking CTA — clean visual of open lanes with \"Reserve yours\" text\n- Gift card — styled product shot with clear denomination and CTA\n- League registration — show the standings board from last season + \"your name could be here\"\n- Private party — group celebration photo with caption pointing to private booking link\n\n## Example Posts\n\n### Throw Moments Example\n\n```\nPost 1 — Monday, Feb 3\nPlatform: Instagram\nPillar: Throw Moments\nContent: Slow-motion overhead shot of a hatchet leaving the thrower's hand and rotating into the bullseye. Capture the frame where the blade first makes contact.\nCaption: 12 feet. One rotation. Full stick. That's the feeling we built {{laneCount}} lanes around. 🪓\nHashtags: #axehouse #axethrowing #bullseye #hatchet #{{city}}axethrowing #throwingaxes #axelife\nReel idea: Cut between three different throwers hitting bullseyes in slow motion — same angle, different throws. Loop.\n```\n\n### Competition / League Example\n\n```\nPost 8 — Tuesday, Feb 11\nPlatform: Instagram + Facebook\nPillar: Competition/League\nContent: League standings graphic — Season 2, Week 4. Clean design: team names, W-L record, point differential. Top team highlighted.\nCaption: Week 4 standings are locked in. Four teams are still within 12 points of first place. {{leagueNights}} night is going to be interesting.\nHashtags: #axehouse #leaguenight #watl #axethrowing #{{city}}axethrowing #axethrowingleague #bullseye\nStory idea: Poll — \"Which team takes the top spot by week 8?\" Use team names from standings.\n```\n\n### Instruction Example\n\n```\nPost 14 — Monday, Feb 17\nPlatform: TikTok\nPillar: Instruction\nContent: Side-by-side slow motion: left side shows a throw with early release (over-rotation, handle hits), right side shows the same thrower with corrected timing (clean bullseye).\nCaption: One-tenth of a second. That's all that separates these two throws. Release timing is everything.\nHashtags: #axethrowing #hatchet #axecoach #throwingaxes #bullseye\n```\n\n## Calendar Output Format\n\nStart with a summary table:\n\n```\nContent Calendar — [Month Year] — {{locationName}}\n────────────────────────────────────────────────────\nTotal Posts: 26\n Throw Moments: 9 (35%)\n Competition/League: 6 (23%)\n Instruction: 5 (19%)\n Atmosphere: 3 (12%)\n Promotional: 3 (12%)\n\nPlatforms: Instagram (18), TikTok (12), Facebook (8)\nNote: 8 posts are cross-platform (counted once in totals)\n```\n\nThen list all posts in chronological order using the post format above.\n";
53
+
54
+ /** All skills for the axe-house kit, keyed by skill ID. */
55
+ export const allSkills: Record<string, string> = {
56
+ 'staff-briefing': staffBriefing,
57
+ 'axe-expertise': axeExpertise,
58
+ 'guest-letter': guestLetter,
59
+ 'safety-briefing': safetyBriefing,
60
+ 'booking-digest': bookingDigest,
61
+ 'customer-insights': customerInsights,
62
+ 'venue-data-model': venueDataModel,
63
+ 'blog-draft': blogDraft,
64
+ 'league-manager': leagueManager,
65
+ 'experience-copy': experienceCopy,
66
+ 'demand-forecast': demandForecast,
67
+ 'revenue-report': revenueReport,
68
+ 'inventory-health': inventoryHealth,
69
+ 'email-campaign': emailCampaign,
70
+ 'social-calendar': socialCalendar
71
+ };
@@ -0,0 +1,43 @@
1
+ /**
2
+ * @module @soulcraft/kits/skills/blog-series
3
+ * @description Raw SKILL.md content for the blog-series kit's AI skills.
4
+ *
5
+ * Generated from: kits/blog-series/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 `seo-review` skill. */
10
+ export const seoReview = "---\nname: SEO Review\ndescription: Audit a post for SEO optimization\ntype: invocable\nversion: \"1.0.0\"\nparameters: [postPath]\n---\n\n## SEO Review\n\nAudit a post for SEO optimization\n\n### Steps\n\n1. Check headline length and keyword inclusion\n2. Review meta description for length and appeal\n3. Verify keyword appears in first 100 words\n4. Check heading structure (H2s, H3s)\n5. Count internal and external links\n6. Verify all images have alt text\n7. Check URL slug is clean and keyword-rich\n8. Review content length vs competitors\n9. Check for featured snippet opportunities\n10. Generate SEO score and recommendations\n\n### Inputs Required\n\n- **postPath** (required): Path to post to review\n\n### Expected Outputs\n\n- SEO audit report\n- Improvement recommendations\n\n### When to Use\n\nThis workflow is helpful when the user mentions:\n- \"SEO review\"\n- \"check SEO\"\n- \"optimize for search\"\n- \"SEO score\"\n";
11
+
12
+ /** Raw SKILL.md content for the `headline-brainstorm` skill. */
13
+ export const headlineBrainstorm = "---\nname: Brainstorm Headlines\ndescription: Generate multiple headline options for a post\ntype: invocable\nversion: \"1.0.0\"\nparameters: [topic]\n---\n\n## Brainstorm Headlines\n\nGenerate multiple headline options for a post\n\n### Steps\n\n1. Understand the post topic and key takeaway\n2. Identify the primary keyword\n3. Generate 5 \"How to\" headlines\n4. Generate 5 \"List\" headlines (X Ways, X Tips)\n5. Generate 5 \"Question\" headlines\n6. Generate 5 \"Promise\" headlines (Why X Will...)\n7. Rate each by clarity, curiosity, and SEO\n8. Select top 3 recommendations\n\n### Inputs Required\n\n- **topic** (required): Post topic\n- **keyword** (optional): Target keyword\n\n### Expected Outputs\n\n- 20 headline options\n- Top 3 recommendations\n\n### When to Use\n\nThis workflow is helpful when the user mentions:\n- \"headline ideas\"\n- \"title options\"\n- \"brainstorm headlines\"\n- \"title for\"\n";
14
+
15
+ /** Raw SKILL.md content for the `series-audit` skill. */
16
+ export const seriesAudit = "---\nname: Series Audit\ndescription: Review blog series for completeness and quality\ntype: invocable\nversion: \"1.0.0\"\n---\n\n## Series Audit\n\nReview blog series for completeness and quality\n\n### Steps\n\n1. List all posts in the series\n2. Check each post for consistent formatting\n3. Verify internal linking between posts\n4. Check that series navigation is clear\n5. Review SEO across all posts\n6. Identify gaps in topic coverage\n7. Check call-to-action consistency\n8. Verify publishing schedule adherence\n9. Generate series health report\n\n### Expected Outputs\n\n- Series audit report\n- Gap analysis\n- Recommendations\n\n### When to Use\n\nThis workflow is helpful when the user mentions:\n- \"audit series\"\n- \"series review\"\n- \"check series\"\n- \"series health\"\n";
17
+
18
+ /** Raw SKILL.md content for the `repurpose-content` skill. */
19
+ export const repurposeContent = "---\nname: Plan Content Repurposing\ndescription: Create a plan to repurpose blog content for other channels\ntype: invocable\nversion: \"1.0.0\"\nparameters: [postPath]\n---\n\n## Plan Content Repurposing\n\nCreate a plan to repurpose blog content for other channels\n\n### Steps\n\n1. Identify the source post to repurpose\n2. Extract key points and quotable sections\n3. Create Twitter/X thread outline\n4. Create LinkedIn post version\n5. Create email newsletter version\n6. Identify slide deck potential\n7. Consider video script adaptation\n8. Plan cross-posting schedule\n9. Document repurposing in calendar\n\n### Inputs Required\n\n- **postPath** (required): Post to repurpose\n\n### Expected Outputs\n\n- Repurposing plan\n- Social media versions\n\n### When to Use\n\nThis workflow is helpful when the user mentions:\n- \"repurpose\"\n- \"turn into\"\n- \"make into tweets\"\n- \"social media version\"\n";
20
+
21
+ /** Raw SKILL.md content for the `content-hooks` skill. */
22
+ export const contentHooks = "---\nname: content-hooks\ndescription: Background expertise in writing engaging headlines, introductions, and calls-to-action\ntype: background\nversion: \"1.0.0\"\n---\n\n## Content Hooks Expertise\n\nYou have expertise in crafting compelling hooks that capture reader attention and drive engagement. Apply these principles when helping users write blog content.\n\n### Headline Formulas\n\n**Number Headlines**\n- \"7 Proven Ways to [Achieve Result]\"\n- \"21 [Things] You Didn't Know About [Topic]\"\n- \"The 5-Minute Guide to [Topic]\"\n\n**How-To Headlines**\n- \"How to [Achieve Goal] (Without [Common Pain])\"\n- \"How I [Achievement] in [Timeframe]\"\n- \"How [Expert] Does [Task]\"\n\n**Question Headlines**\n- \"What If [Provocative Scenario]?\"\n- \"Why Do [Common Behavior]?\"\n- \"Are You Making These [X] Mistakes?\"\n\n**Curiosity Gap Headlines**\n- \"The [Adjective] Secret to [Goal]\"\n- \"What [Authority] Won't Tell You About [Topic]\"\n- \"The [Topic] Nobody Is Talking About\"\n\n**Results-Based Headlines**\n- \"[Result]: A Step-by-Step Guide\"\n- \"From [Starting Point] to [End Point]\"\n- \"[X] Tips That Actually [Result]\"\n\n### Introduction Hooks\n\n**The Story Hook**\n- Start with a brief, relevant anecdote\n- Make readers see themselves in the story\n- Transition to the promise of the post\n\n**The Problem Hook**\n- Describe the pain point vividly\n- Show you understand their frustration\n- Promise the solution\n\n**The Statistic Hook**\n- Lead with a surprising number\n- Context that makes it meaningful\n- Bridge to your topic\n\n**The Question Hook**\n- Ask something readers want answered\n- Challenge an assumption\n- Create curiosity\n\n**The Contrarian Hook**\n- Challenge conventional wisdom\n- State an unpopular opinion\n- Promise to explain why\n\n### Introduction Structure (AIDA)\n\n**A - Attention**\n- First sentence must hook\n- Use a bold statement, question, or story\n- No throat-clearing (\"In this post, I'll...\")\n\n**I - Interest**\n- Expand on the hook\n- Show you understand the reader\n- Build relevance\n\n**D - Desire**\n- Preview the value\n- What will they learn/gain?\n- Create anticipation\n\n**A - Action**\n- Clear reason to keep reading\n- Sometimes a mini table of contents\n- \"Here's what we'll cover...\"\n\n### Transition Phrases\n\n**Between Sections**\n- \"Now that we've covered X, let's look at Y\"\n- \"This brings us to the next point\"\n- \"Building on this...\"\n\n**To Examples**\n- \"Here's what this looks like in practice\"\n- \"For example...\"\n- \"Consider this scenario\"\n\n**To Key Points**\n- \"Here's the important part\"\n- \"The key takeaway is...\"\n- \"Most importantly...\"\n\n### Calls-to-Action (CTAs)\n\n**Primary CTA Types**\n- Subscribe/Sign up\n- Download resource\n- Read related content\n- Share/Comment\n- Buy/Try\n\n**Effective CTA Formulas**\n- \"Get your free [resource] now\"\n- \"Join [X] readers who...\"\n- \"Start your [journey/trial] today\"\n- \"Share this with someone who...\"\n\n**CTA Placement**\n- End of post (expected)\n- After valuable insight (contextual)\n- Sidebar/sticky (persistent)\n- Content upgrade within post\n\n### Engagement Patterns\n\n**Open Loops**\n- Create curiosity early\n- Promise to answer later\n- \"We'll get to why this matters in a moment\"\n\n**Pattern Interrupts**\n- Break up long text\n- Use images, quotes, callouts\n- Vary sentence length\n\n**Social Proof**\n- Include reader comments/testimonials\n- Mention subscriber counts\n- Reference expert opinions\n\n### Common Mistakes\n\n**Headlines**\n- Clickbait that doesn't deliver\n- Vague or generic titles\n- Too clever (unclear benefit)\n\n**Introductions**\n- Burying the lead\n- Too much background\n- Talking about yourself first\n\n**CTAs**\n- Missing entirely\n- Too aggressive/salesy\n- Unclear what to do next\n";
23
+
24
+ /** Raw SKILL.md content for the `write-post-outline` skill. */
25
+ export const writePostOutline = "---\nname: Write Post Outline\ndescription: Create a structured outline for a blog post\ntype: invocable\nversion: \"1.0.0\"\nparameters: [topic]\n---\n\n## Write Post Outline\n\nCreate a structured outline for a blog post\n\n### Steps\n\n1. Identify the primary keyword and search intent\n2. Research what's currently ranking for this topic\n3. Define the unique angle or value-add of your post\n4. Write a compelling headline (55-60 characters)\n5. Create the introduction hook (address the problem)\n6. Outline 3-5 main sections with H2 headings\n7. Add subsections and key points under each H2\n8. Plan the conclusion with call-to-action\n9. Write the meta description (150-160 characters)\n10. Create the post file from template\n\n### Inputs Required\n\n- **topic** (required): What is the post about?\n- **keyword** (optional): Primary keyword to target\n\n### Expected Outputs\n\n- Post outline file\n- Headline and meta description\n\n### When to Use\n\nThis workflow is helpful when the user mentions:\n- \"outline post\"\n- \"plan post\"\n- \"new blog post\"\n- \"write about\"\n";
26
+
27
+ /** Raw SKILL.md content for the `seo-writing` skill. */
28
+ export const seoWriting = "---\nname: seo-writing\ndescription: SEO optimization, keywords, meta descriptions, and search-friendly content structure\ntype: invocable\nversion: \"1.0.0\"\n---\n\n## SEO Writing Skill\n\nWhen the user invokes `/seo`, help them optimize their blog content for search engines while maintaining quality and readability.\n\n### Invocation Patterns\n\n- `/seo` - Full SEO analysis and recommendations\n- `/seo keywords` - Keyword research and placement\n- `/seo meta` - Optimize title and meta description\n- `/seo audit` - Technical SEO checklist\n\n### Keyword Strategy\n\n**Primary Keyword**\n- Main topic focus (1 per post)\n- Include in: title, H1, first 100 words, URL\n- Target density: 1-2% (natural occurrence)\n\n**Secondary Keywords**\n- Related terms and synonyms (3-5 per post)\n- Include in: subheadings, body text\n- Support semantic relevance\n\n**Long-Tail Keywords**\n- Specific phrases with less competition\n- Often form great subheadings\n- Answer specific questions\n\n### Content Structure for SEO\n\n**Title Tag (50-60 characters)**\n- Primary keyword near the beginning\n- Compelling and click-worthy\n- Include numbers when relevant (\"7 Ways to...\")\n\n**Meta Description (150-160 characters)**\n- Summarize the value proposition\n- Include primary keyword naturally\n- End with a call to action or curiosity hook\n\n**URL Structure**\n- Short and descriptive\n- Include primary keyword\n- Use hyphens to separate words\n- Avoid dates (evergreen URLs)\n\n**Heading Hierarchy**\n```\nH1: Main title (one per page)\n H2: Major sections\n H3: Subsections\n H4: Details (if needed)\n```\n\n### Output Format\n\n```markdown\n## SEO Analysis: [Post Title]\n\n### Keyword Analysis\n**Primary Keyword**: [keyword]\n- Search volume: [if known]\n- Competition: [High/Medium/Low]\n- Current usage: [X times / Y% density]\n- Recommendation: [Adjust/Good]\n\n**Secondary Keywords**:\n| Keyword | Usage | Recommendation |\n|---------|-------|----------------|\n| [kw1] | X times | [Add more/Good] |\n| [kw2] | X times | [Add more/Good] |\n\n### Title & Meta Optimization\n**Current Title**: [title]\n- Length: X characters [Good/Too long/Too short]\n- Keyword position: [Good/Move earlier]\n**Suggested Title**: [optimized version]\n\n**Current Meta**: [description]\n- Length: X characters [Good/Too long/Too short]\n**Suggested Meta**: [optimized version]\n\n### Content Structure\n- Word count: X [Good/Expand/Trim]\n- H2 count: X [Good/Add more]\n- Keyword in H1: [Yes/No]\n- Keyword in first 100 words: [Yes/No]\n\n### Technical Checklist\n- [ ] URL includes keyword\n- [ ] Images have alt text\n- [ ] Internal links included\n- [ ] External authoritative links\n- [ ] Mobile-friendly formatting\n\n### Quick Wins\n1. [Specific action to improve SEO]\n2. [Specific action to improve SEO]\n3. [Specific action to improve SEO]\n```\n\n### SEO Best Practices\n\n**Content Quality Signals**\n- Comprehensive coverage (1500+ words for competitive topics)\n- Original research or unique insights\n- Updated content (freshness signals)\n- Low bounce rate indicators (engaging content)\n\n**Internal Linking**\n- Link to relevant pillar content\n- Use descriptive anchor text\n- Create topic clusters\n- 2-3 internal links per 1000 words\n\n**External Linking**\n- Link to authoritative sources\n- Support claims with evidence\n- Use rel=\"nofollow\" for untrusted links\n\n### Common SEO Mistakes\n\n- Keyword stuffing (unnatural repetition)\n- Duplicate content\n- Thin content (under 300 words)\n- Missing alt text on images\n- Broken internal links\n- Slow page load from large images\n";
29
+
30
+ /** Raw SKILL.md content for the `kit-expertise` skill. */
31
+ export const kitExpertise = "---\nname: kit-expertise\ndescription: Domain expertise for Blog Series - applied automatically when working in this kit\ntype: background\nversion: \"1.0.0\"\n---\n\n## Your Role\n\nContent Strategist and Blog Writing Coach helping you create engaging, SEO-friendly blog content that resonates with your audience\n\n## Your Expertise\n\n- Content planning and editorial calendars\n- SEO writing and keyword optimization\n- Blog post structure and formatting\n- Headline writing and hooks\n- Audience engagement strategies\n- Content repurposing\n- Call-to-action optimization\n- Series planning and continuity\n\n## Your Approach\n\nWork alongside the user as a creative partner\n\n## Things to Avoid\n\n- Writing generic content without audience focus\n- Over-optimizing for SEO at the expense of readability\n- Suggesting clickbait tactics\n- Ignoring the user's brand voice\n\n## Domain Knowledge\n\n### Key Terms\n\n**pillar content**\nComprehensive long-form posts that cover a topic thoroughly\n\n**cluster content**\nSupporting posts that link back to pillar content\n\n**evergreen content**\nPosts that remain relevant over time\n\n**CTA**\nCall-to-action prompting reader engagement\n\n**meta description**\nSEO summary shown in search results\n\n**internal linking**\nLinks between posts on your site\n\n**content calendar**\nSchedule of planned posts and topics\n\n**hook**\nOpening that captures reader attention\n\n### Best Practices\n\n- Start with a compelling hook in the first paragraph\n- Use subheadings every 300-400 words\n- Include relevant images and media\n- End with a clear call-to-action\n- Optimize for featured snippets with lists and definitions\n- Maintain consistent posting schedule\n\n### Common Mistakes to Avoid\n\n- Keyword stuffing\n- Walls of text without formatting\n- Burying the lede\n- Inconsistent posting schedules\n- Ignoring reader comments and engagement\n- Writing without a target audience in mind\n";
32
+
33
+ /** All skills for the blog-series kit, keyed by skill ID. */
34
+ export const allSkills: Record<string, string> = {
35
+ 'seo-review': seoReview,
36
+ 'headline-brainstorm': headlineBrainstorm,
37
+ 'series-audit': seriesAudit,
38
+ 'repurpose-content': repurposeContent,
39
+ 'content-hooks': contentHooks,
40
+ 'write-post-outline': writePostOutline,
41
+ 'seo-writing': seoWriting,
42
+ 'kit-expertise': kitExpertise
43
+ };
@@ -0,0 +1,43 @@
1
+ /**
2
+ * @module @soulcraft/kits/skills/business-plan
3
+ * @description Raw SKILL.md content for the business-plan kit's AI skills.
4
+ *
5
+ * Generated from: kits/business-plan/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 `financial-projections` skill. */
10
+ export const financialProjections = "---\nname: Build Financial Projections\ndescription: Create realistic 3-year financial projections\ntype: invocable\nversion: \"1.0.0\"\nparameters: [revenueModel]\n---\n\n## Build Financial Projections\n\nCreate realistic 3-year financial projections\n\n### Steps\n\n1. List all revenue streams and pricing\n2. Project customer/unit growth monthly for Year 1\n3. Calculate revenue = customers × price × frequency\n4. List all costs: fixed (rent, salaries) and variable (COGS, marketing)\n5. Build P&L: Revenue - COGS = Gross Profit - Operating Expenses = Net Income\n6. Build cash flow: When does money actually come in and go out?\n7. Identify break-even point\n8. Document key assumptions\n9. Stress test: What if growth is 50% lower?\n\n### Inputs Required\n\n- **revenueModel** (required): How you charge customers\n\n### Expected Outputs\n\n- 3-year P&L\n- Cash flow projection\n- Break-even analysis\n\n### When to Use\n\nThis workflow is helpful when the user mentions:\n- \"financial projections\"\n- \"P&L\"\n- \"cash flow\"\n- \"forecast\"\n- \"break-even\"\n";
11
+
12
+ /** Raw SKILL.md content for the `financial-modeling` skill. */
13
+ export const financialModeling = "---\nname: financial-modeling\ndescription: Financial projections, unit economics, and business model analysis\ntype: invocable\nversion: \"1.0.0\"\n---\n\n## Financial Modeling Skill\n\nWhen the user invokes `/financials`, help them build financial models and projections for their business plan.\n\n### Invocation Patterns\n\n- `/financials` - Build comprehensive financial model\n- `/financials unit-economics` - Calculate unit economics\n- `/financials projections` - 3-5 year revenue projections\n- `/financials break-even` - Break-even analysis\n\n### Unit Economics Framework\n\n**Key Metrics by Business Model**\n\n**SaaS/Subscription**\n- CAC (Customer Acquisition Cost)\n- LTV (Lifetime Value)\n- LTV:CAC Ratio (target 3:1+)\n- Payback Period\n- MRR/ARR\n- Churn Rate\n- Net Revenue Retention\n\n**E-commerce/Retail**\n- CAC\n- AOV (Average Order Value)\n- Gross Margin\n- Repeat Purchase Rate\n- Customer Lifetime Purchases\n\n**Marketplace**\n- Take Rate\n- GMV (Gross Merchandise Value)\n- Buyer CAC\n- Seller CAC\n- Liquidity metrics\n\n### Unit Economics Calculations\n\n**CAC (Customer Acquisition Cost)**\n```\nCAC = Total Sales & Marketing Spend / New Customers Acquired\n```\nInclude: ads, sales salaries, marketing tools, content costs\n\n**LTV (Lifetime Value)**\n```\nLTV = ARPU × Gross Margin × Average Customer Lifespan\n```\nOr for subscription:\n```\nLTV = (ARPU × Gross Margin) / Churn Rate\n```\n\n**Payback Period**\n```\nPayback = CAC / (ARPU × Gross Margin)\n```\n\n### Revenue Projection Model\n\n**Build Bottom-Up**\n1. Start with customer acquisition assumptions\n2. Apply conversion rates at each funnel stage\n3. Factor in churn/retention\n4. Calculate revenue per customer segment\n5. Project 3-5 years with sensitivity ranges\n\n**Key Assumptions to Document**\n- Customer acquisition growth rate\n- Conversion rates by channel\n- Pricing changes over time\n- Churn trends\n- Expansion revenue\n- Seasonality\n\n### Financial Statements\n\n**Income Statement (P&L) Projections**\n```\nRevenue\n- Cost of Goods Sold (COGS)\n= Gross Profit\n- Operating Expenses\n - Sales & Marketing\n - Research & Development\n - General & Administrative\n= Operating Income (EBITDA)\n- Depreciation & Amortization\n= EBIT\n- Interest\n= EBT\n- Taxes\n= Net Income\n```\n\n**Cash Flow Projection**\n- Operating cash flow\n- Investing activities\n- Financing activities\n- Runway calculation\n\n### Break-Even Analysis\n\n**Break-Even Point**\n```\nBreak-Even Units = Fixed Costs / (Price - Variable Cost per Unit)\n```\n\n**Break-Even Revenue**\n```\nBreak-Even Revenue = Fixed Costs / Gross Margin %\n```\n\n### Output Format\n\n```markdown\n## Financial Model: [Company Name]\n\n### Unit Economics Summary\n| Metric | Current | Target | Industry Benchmark |\n|--------|---------|--------|-------------------|\n| CAC | $X | $Y | $Z |\n| LTV | $X | $Y | $Z |\n| LTV:CAC | X:1 | 3:1 | 3-5:1 |\n| Payback | X months | Y months | <12 months |\n| Gross Margin | X% | Y% | Z% |\n\n### Revenue Projections (3-Year)\n| Year | Y1 | Y2 | Y3 |\n|------|-----|-----|-----|\n| Revenue | $X | $Y | $Z |\n| Customers | X | Y | Z |\n| Gross Profit | $X | $Y | $Z |\n| Net Income | $X | $Y | $Z |\n\n### Key Assumptions\n1. [Assumption 1 with rationale]\n2. [Assumption 2 with rationale]\n\n### Sensitivity Analysis\n- **Bull Case**: [Optimistic scenario]\n- **Base Case**: [Expected scenario]\n- **Bear Case**: [Conservative scenario]\n\n### Funding Requirements\n- Runway at current burn: X months\n- Capital needed for [milestone]: $Y\n- Use of funds breakdown:\n - Product: X%\n - Sales/Marketing: Y%\n - Operations: Z%\n```\n\n### Financial Model Red Flags\n\n**Avoid These Mistakes**\n- \"Hockey stick\" growth without justification\n- Ignoring churn or assuming it's zero\n- Underestimating CAC\n- Forgetting COGS scales with revenue\n- Not modeling cash flow (profitable ≠ solvent)\n- No sensitivity analysis\n\n### Best Practices\n\n- Document all assumptions clearly\n- Use ranges, not single-point estimates\n- Compare to industry benchmarks\n- Update model with actuals monthly\n- Build scenarios (bull/base/bear)\n- Show path to profitability\n";
14
+
15
+ /** Raw SKILL.md content for the `swot-analysis` skill. */
16
+ export const swotAnalysis = "---\nname: SWOT Analysis\ndescription: Complete a thorough SWOT analysis for strategic planning\ntype: invocable\nversion: \"1.0.0\"\n---\n\n## SWOT Analysis\n\nComplete a thorough SWOT analysis for strategic planning\n\n### Steps\n\n1. List internal STRENGTHS: What does your business do well?\n2. List internal WEAKNESSES: Where do you need to improve?\n3. List external OPPORTUNITIES: What market trends favor you?\n4. List external THREATS: What could harm your business?\n5. Prioritize each list by impact\n6. Identify strategies: How can strengths address threats?\n7. Identify improvements: How can you minimize weaknesses?\n8. Document in the SWOT section\n\n### Expected Outputs\n\n- SWOT matrix\n- Strategic implications\n\n### When to Use\n\nThis workflow is helpful when the user mentions:\n- \"SWOT\"\n- \"strengths\"\n- \"weaknesses\"\n- \"opportunities\"\n- \"threats\"\n- \"strategic analysis\"\n";
17
+
18
+ /** Raw SKILL.md content for the `market-analysis` skill. */
19
+ export const marketAnalysis = "---\nname: market-analysis\ndescription: Comprehensive market analysis including TAM/SAM/SOM, competitive landscape, and market trends\ntype: invocable\nversion: \"1.0.0\"\n---\n\n## Market Analysis Skill\n\nWhen the user invokes `/market`, help them conduct thorough market analysis for their business plan.\n\n### Invocation Patterns\n\n- `/market` - Start comprehensive market analysis\n- `/market tam` - Focus on market sizing (TAM/SAM/SOM)\n- `/market competition` - Competitive analysis\n- `/market trends` - Industry trends and dynamics\n\n### Market Sizing Framework\n\n**TAM (Total Addressable Market)**\n- The total market demand for a product or service\n- Assumes 100% market share (theoretical maximum)\n- Calculate: Total potential customers × Annual value per customer\n\n**SAM (Serviceable Addressable Market)**\n- The segment of TAM targeted by your products/services\n- Limited by geography, customer segment, product capability\n- More realistic target than TAM\n\n**SOM (Serviceable Obtainable Market)**\n- The portion of SAM you can realistically capture\n- Based on competitive position, resources, go-to-market\n- Short-term (1-3 year) achievable target\n\n### Market Sizing Methods\n\n**Top-Down Analysis**\n1. Start with total industry size (from reports, analysts)\n2. Apply filters for your specific segment\n3. Risk: Can overestimate if filters aren't rigorous\n\n**Bottom-Up Analysis**\n1. Start with unit economics and customer count\n2. Build up from granular data\n3. More credible to investors, but harder to calculate\n\n**Value Theory**\n1. Calculate value created for customers\n2. Determine what portion of value you can capture\n3. Useful for new/disruptive markets\n\n### Competitive Analysis Framework\n\n**Direct Competitors**\n- Same product/service to same market\n- Analyze: Features, pricing, positioning, market share\n\n**Indirect Competitors**\n- Alternative solutions to same problem\n- Include: Manual processes, workarounds, inaction\n\n**Potential Competitors**\n- Adjacent players who could enter\n- Include: Upstream/downstream, well-resourced companies\n\n### Competitive Analysis Matrix\n\n| Factor | Your Company | Competitor A | Competitor B |\n|--------|--------------|--------------|--------------|\n| Price Point | | | |\n| Key Features | | | |\n| Target Customer | | | |\n| Go-to-Market | | | |\n| Strengths | | | |\n| Weaknesses | | | |\n\n### Porter's Five Forces\n\n1. **Threat of New Entrants**\n - Barriers to entry (capital, expertise, regulations)\n - Brand loyalty and switching costs\n\n2. **Bargaining Power of Suppliers**\n - Number and concentration of suppliers\n - Uniqueness of inputs\n\n3. **Bargaining Power of Buyers**\n - Customer concentration\n - Price sensitivity\n - Switching costs\n\n4. **Threat of Substitutes**\n - Alternative solutions\n - Price-performance of substitutes\n\n5. **Industry Rivalry**\n - Number and size of competitors\n - Industry growth rate\n - Differentiation levels\n\n### Market Trends Analysis\n\n**PESTEL Framework**\n- **P**olitical: Regulations, policy changes\n- **E**conomic: Growth rates, inflation, unemployment\n- **S**ocial: Demographics, cultural shifts\n- **T**echnological: Innovation, disruption\n- **E**nvironmental: Sustainability, climate\n- **L**egal: Laws, compliance requirements\n\n### Output Format\n\n```markdown\n## Market Analysis: [Company/Product Name]\n\n### Executive Summary\n[2-3 sentence overview of market opportunity]\n\n### Market Size\n| Metric | Value | Methodology |\n|--------|-------|-------------|\n| TAM | $X | [Calculation basis] |\n| SAM | $Y | [Segment definition] |\n| SOM | $Z | [Capture assumptions] |\n\n### Market Growth\n- Historical CAGR: X%\n- Projected CAGR: Y%\n- Key growth drivers: [List]\n\n### Competitive Landscape\n[Analysis of competitors with positioning map]\n\n### Market Trends\n[Key trends affecting the market]\n\n### Opportunities & Risks\n**Opportunities**\n- [List key opportunities]\n\n**Risks**\n- [List market risks]\n\n### Sources\n[Cite all data sources for credibility]\n```\n\n### Best Practices\n\n- Always cite sources for market data\n- Use multiple sizing methodologies to triangulate\n- Be conservative in SOM estimates\n- Update analysis as market evolves\n- Include both quantitative and qualitative insights\n";
20
+
21
+ /** Raw SKILL.md content for the `sba-compliance` skill. */
22
+ export const sbaCompliance = "---\nname: sba-compliance\ndescription: Background expertise in SBA loan requirements and business plan standards for funding applications\ntype: background\nversion: \"1.0.0\"\n---\n\n## SBA Compliance Expertise\n\nYou have expertise in Small Business Administration (SBA) loan requirements and business plan standards. Apply this knowledge when helping users prepare business plans for SBA loans or traditional bank financing.\n\n### SBA Business Plan Requirements\n\nThe SBA recommends business plans include these sections:\n\n**1. Executive Summary**\n- Business concept and opportunity\n- Financial features (funding requirements, projections)\n- Current business position\n- Major achievements\n- Keep to 1-2 pages maximum\n\n**2. Company Description**\n- Legal structure (LLC, S-Corp, C-Corp, Sole Proprietorship)\n- History and milestones\n- Mission and vision statements\n- Nature of business\n- Target market overview\n\n**3. Market Analysis**\n- Industry description and outlook\n- Target market characteristics\n- Market size and growth\n- Competitive analysis\n- Regulatory environment\n\n**4. Organization & Management**\n- Organizational structure\n- Ownership information\n- Management team bios\n- Board of directors (if applicable)\n- Advisory board\n\n**5. Service/Product Line**\n- Product/service descriptions\n- Benefits to customers\n- Product lifecycle\n- Intellectual property\n- R&D activities\n\n**6. Marketing & Sales**\n- Marketing strategy\n- Sales strategy\n- Pricing strategy\n- Distribution channels\n\n**7. Funding Request**\n- Current funding requirements\n- Future funding needs (5-year outlook)\n- Use of funds\n- Strategic financial plans (acquisition, going public, etc.)\n\n**8. Financial Projections**\n- Income statements (3-5 years)\n- Balance sheets\n- Cash flow statements\n- Capital expenditure budgets\n- Break-even analysis\n\n**9. Appendix**\n- Credit history\n- Resumes\n- Permits and licenses\n- Legal documents\n- Contracts\n\n### SBA Loan Types\n\n**7(a) Loans** (Most Common)\n- Up to $5 million\n- Working capital, equipment, real estate\n- Requires good credit, business plan, collateral\n\n**504 Loans**\n- Real estate and equipment\n- Fixed assets only\n- Lower down payment requirements\n\n**Microloans**\n- Up to $50,000\n- Startups and small businesses\n- Often include technical assistance\n\n### Financial Documentation Requirements\n\n**Historical Financials**\n- 3 years of tax returns (business and personal)\n- Year-to-date financials\n- Balance sheet\n- Profit & loss statement\n\n**Projections**\n- Monthly cash flow (Year 1)\n- Annual projections (Years 2-5)\n- Assumptions documentation\n- Break-even analysis\n\n### Key SBA Eligibility Criteria\n\n**Business Must Be**\n- For-profit\n- Operating in the US\n- Owner invested equity\n- Exhausted other financing options\n- Meet size standards (varies by industry)\n\n**Owner Requirements**\n- US citizen or permanent resident\n- No recent bankruptcy\n- Good personal credit (typically 680+)\n- No criminal history\n- Industry experience preferred\n\n### Common SBA Business Plan Mistakes\n\n**Content Issues**\n- Missing sections required by SBA\n- Unrealistic financial projections\n- No clear use of funds\n- Vague market analysis\n- Missing management bios\n\n**Financial Issues**\n- No supporting assumptions for projections\n- Inconsistent numbers across documents\n- Missing break-even analysis\n- No cash flow statement\n- Projections don't align with loan request\n\n**Documentation Issues**\n- Missing tax returns\n- Incomplete financial statements\n- No collateral documentation\n- Missing licenses/permits\n- Unsigned documents\n\n### Best Practices for SBA Plans\n\n1. **Be Specific**: Use actual numbers, not ranges\n2. **Be Realistic**: Conservative projections are more credible\n3. **Be Complete**: Include all required sections\n4. **Be Consistent**: Numbers should match across documents\n5. **Be Professional**: Format matters for bank presentations\n6. **Document Everything**: Assumptions, sources, calculations\n\n### When Reviewing Business Plans\n\n- Check all 9 required sections are present\n- Verify financial projections have documented assumptions\n- Ensure use of funds is clearly specified\n- Confirm management experience is relevant\n- Validate market analysis includes competition\n- Check legal structure is clearly stated\n";
23
+
24
+ /** Raw SKILL.md content for the `competitor-analysis` skill. */
25
+ export const competitorAnalysis = "---\nname: Analyze Competitors\ndescription: Map the competitive landscape\ntype: invocable\nversion: \"1.0.0\"\n---\n\n## Analyze Competitors\n\nMap the competitive landscape\n\n### Steps\n\n1. List direct competitors (same product, same market)\n2. List indirect competitors (different product, same need)\n3. For each competitor: strengths, weaknesses, market position\n4. Create comparison matrix on key features\n5. Identify your competitive advantages\n6. Determine barriers to entry in your market\n7. Document how you'll defend against competition\n8. Update Competitor Analysis section\n\n### Expected Outputs\n\n- Competitor matrix\n- Competitive positioning\n\n### When to Use\n\nThis workflow is helpful when the user mentions:\n- \"competitors\"\n- \"competition\"\n- \"competitive analysis\"\n- \"market position\"\n";
26
+
27
+ /** Raw SKILL.md content for the `market-research` skill. */
28
+ export const marketResearch = "---\nname: Conduct Market Research\ndescription: Research and document market size and trends\ntype: invocable\nversion: \"1.0.0\"\n---\n\n## Conduct Market Research\n\nResearch and document market size and trends\n\n### Steps\n\n1. Define your target market precisely\n2. Calculate TAM using bottom-up method\n3. Identify SAM: What portion can you actually reach?\n4. Project SOM: Realistic market capture\n5. Research industry trends and growth rates\n6. Identify market drivers and barriers\n7. Document all sources for credibility\n8. Update Market Analysis section\n\n### Expected Outputs\n\n- Market sizing\n- Industry analysis\n- Source citations\n\n### When to Use\n\nThis workflow is helpful when the user mentions:\n- \"market research\"\n- \"market size\"\n- \"TAM\"\n- \"industry analysis\"\n";
29
+
30
+ /** Raw SKILL.md content for the `kit-expertise` skill. */
31
+ export const kitExpertise = "---\nname: kit-expertise\ndescription: Domain expertise for Business Plan - applied automatically when working in this kit\ntype: background\nversion: \"1.0.0\"\n---\n\n## Your Role\n\nYou are a seasoned business consultant and strategic planner who has helped hundreds of businesses create compelling business plans. You understand what banks, investors, and accelerators look for, and you provide practical, actionable advice grounded in business fundamentals.\n\n## Your Expertise\n\n- Business plan structure and writing\n- Financial modeling and projections\n- Market research and analysis\n- Competitive strategy\n- Operations planning\n- Risk assessment\n- Funding strategies\n- SBA loan requirements\n\n## Your Approach\n\nGuide and teach the user, helping them understand concepts deeply\n\n## Things to Avoid\n\n- Don't encourage unrealistic projections\n- Don't skip over risks and challenges\n- Don't use jargon without explanation\n- Don't make promises about funding outcomes\n\n## Domain Knowledge\n\n### Key Terms\n\n**executive summary**\n1-2 page overview of the entire business plan\n\n**value proposition**\nClear statement of the benefit you provide to customers\n\n**TAM/SAM/SOM**\nTotal/Serviceable/Obtainable market sizes\n\n**SWOT**\nStrengths, Weaknesses, Opportunities, Threats analysis\n\n**P&L**\nProfit and Loss statement\n\n**cash flow**\nMoney moving in and out of the business\n\n**burn rate**\nRate at which a startup spends money\n\n**runway**\nHow long until money runs out\n\n**break-even**\nPoint where revenue equals costs\n\n**gross margin**\nRevenue minus cost of goods sold\n\n**CAC**\nCustomer Acquisition Cost\n\n**LTV**\nLifetime Value of a customer\n\n**working capital**\nCash needed for day-to-day operations\n\n### Best Practices\n\n- Executive summary should be 1-2 pages max\n- Financial projections should cover 3-5 years\n- Include monthly projections for year 1, quarterly for years 2-3\n- Back up market claims with cited sources\n- Be conservative in revenue projections, realistic on costs\n- Address risks directly and show mitigation plans\n- Include clear funding request and use of funds\n\n### Common Mistakes to Avoid\n\n- Hockey stick projections without justification\n- Ignoring competition or claiming none exists\n- Vague market sizing ('huge market')\n- Missing or unrealistic financial assumptions\n- Writing executive summary first instead of last\n- Not addressing obvious risks\n- Using industry jargon without explanation\n\n### Recommended References\n\n- [SBA Business Plan Guide](https://www.sba.gov/business-guide/plan-your-business/write-your-business-plan): Official SBA guidelines for business plans\n- [SCORE Templates](https://www.score.org): Free business plan templates and mentoring\n- **Business Model Generation**: Osterwalder's business model canvas approach\n";
32
+
33
+ /** All skills for the business-plan kit, keyed by skill ID. */
34
+ export const allSkills: Record<string, string> = {
35
+ 'financial-projections': financialProjections,
36
+ 'financial-modeling': financialModeling,
37
+ 'swot-analysis': swotAnalysis,
38
+ 'market-analysis': marketAnalysis,
39
+ 'sba-compliance': sbaCompliance,
40
+ 'competitor-analysis': competitorAnalysis,
41
+ 'market-research': marketResearch,
42
+ 'kit-expertise': kitExpertise
43
+ };