@bitcobblers/wod-wiki-tools 0.45.2166 → 0.46.2168

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 (626) hide show
  1. package/dist/bin/wod.cjs +145 -117
  2. package/dist/bin/wod.cjs.map +1 -1
  3. package/dist/bin/wod.mjs +5 -5
  4. package/dist/{chunk-PF5BTGWZ.mjs → chunk-76AHBG3R.mjs} +14 -14
  5. package/dist/chunk-76AHBG3R.mjs.map +1 -0
  6. package/dist/{chunk-O5ZCOUQE.mjs → chunk-IIUCTIX5.mjs} +3 -3
  7. package/dist/chunk-IIUCTIX5.mjs.map +1 -0
  8. package/dist/{chunk-EAFF2GVB.mjs → chunk-MKGVKC2X.mjs} +77 -79
  9. package/dist/chunk-MKGVKC2X.mjs.map +1 -0
  10. package/dist/chunk-QUUX6NX2.mjs +28 -0
  11. package/dist/{chunk-6L5ZDZJ7.mjs.map → chunk-QUUX6NX2.mjs.map} +1 -1
  12. package/dist/{chunk-FSOBPDUC.mjs → chunk-Z2IQPTDI.mjs} +3 -3
  13. package/dist/{chunk-FSOBPDUC.mjs.map → chunk-Z2IQPTDI.mjs.map} +1 -1
  14. package/dist/{chunk-F7IXIJ4I.mjs → chunk-ZUZMRH3G.mjs} +3 -3
  15. package/dist/{chunk-F7IXIJ4I.mjs.map → chunk-ZUZMRH3G.mjs.map} +1 -1
  16. package/dist/compiler-Z6VNF53G.mjs +9 -0
  17. package/dist/{compiler-ZMG22VH4.mjs.map → compiler-Z6VNF53G.mjs.map} +1 -1
  18. package/dist/index.cjs +145 -117
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.mjs +6 -6
  21. package/dist/{scaffoldFeed-UXH3L5HM.mjs → scaffoldFeed-ALXZOKRV.mjs} +4 -4
  22. package/dist/{scaffoldFeed-UXH3L5HM.mjs.map → scaffoldFeed-ALXZOKRV.mjs.map} +1 -1
  23. package/dist/server/app.mjs +1 -1
  24. package/dist/server-QK2CXCDJ.mjs +11 -0
  25. package/dist/{server-5XDT7ITA.mjs.map → server-QK2CXCDJ.mjs.map} +1 -1
  26. package/dist/{skills-CZDOAQUB.mjs → skills-5F737S2K.mjs} +3 -3
  27. package/dist/{skills-CZDOAQUB.mjs.map → skills-5F737S2K.mjs.map} +1 -1
  28. package/dist/web/playground/assets/{feedSync.worker-CEbxagtY.js → feedSync.worker-BKsDG4P0.js} +4 -4
  29. package/dist/web/playground/assets/main-Cb5hwnvu.js +494 -0
  30. package/dist/web/playground/assets/main-Cye5g1Tm.css +2 -0
  31. package/dist/web/playground/assets/{statementBuilderFlow-DHSfYrHi.js → statementBuilderFlow-y8YIyGuW.js} +2 -2
  32. package/dist/web/playground/assets/{vendor-DKhA8bPd.js → vendor-D0x8W9No.js} +19 -19
  33. package/dist/web/{server/assets/vendor-codemirror-CnY0iCTs.js → playground/assets/vendor-codemirror-Bw_t2lTd.js} +7 -7
  34. package/dist/web/playground/index.html +4 -4
  35. package/dist/web/{server/seed/core/chunks/canvas.9ad327d4.json → playground/seed/core/chunks/canvas.dc1d093c.json} +1 -1
  36. package/dist/web/playground/seed/core/chunks/{dashboards.f4196444.json → dashboards.e349f3be.json} +1 -1
  37. package/dist/web/playground/seed/core/chunks/efforts.84f30fa3.json +1 -0
  38. package/dist/web/{server/seed/core/chunks/equipment.e7531ab5.json → playground/seed/core/chunks/equipment.f07ad76e.json} +1 -1
  39. package/dist/web/playground/seed/core/indexes/notebooks/canvas.json +178 -173
  40. package/dist/web/playground/seed/core/indexes/notebooks/dashboards.json +18 -13
  41. package/dist/web/playground/seed/core/indexes/notebooks/efforts.json +328 -323
  42. package/dist/web/playground/seed/core/indexes/notebooks/equipment.json +52 -47
  43. package/dist/web/playground/seed/core/manifest.json +40 -2512
  44. package/dist/web/playground/seed/core/markdown/canvas/ai-first/README.json +1 -1
  45. package/dist/web/playground/seed/core/markdown/canvas/guide/README.json +4 -4
  46. package/dist/web/playground/seed/core/markdown/canvas/guide/clock.json +1 -1
  47. package/dist/web/playground/seed/core/markdown/canvas/guide/dashboards.json +2 -2
  48. package/dist/web/playground/seed/core/markdown/canvas/guide/metrics.json +12 -12
  49. package/dist/web/playground/seed/core/markdown/canvas/guide/protocols.json +20 -20
  50. package/dist/web/playground/seed/core/markdown/canvas/guide/sessions.json +30 -30
  51. package/dist/web/playground/seed/core/markdown/canvas/guide/start.json +10 -10
  52. package/dist/web/playground/seed/core/markdown/canvas/guide/structure.json +24 -24
  53. package/dist/web/playground/seed/core/markdown/canvas/guide/wql.json +5 -5
  54. package/dist/web/playground/seed/core/markdown/canvas/home/sample-script.json +4 -4
  55. package/dist/web/playground/seed/core/markdown/canvas/home/welcome-1.json +2 -2
  56. package/dist/web/playground/seed/core/markdown/canvas/syntax/actions-comments.json +4 -4
  57. package/dist/web/playground/seed/core/markdown/canvas/syntax/alternating-emom.json +5 -5
  58. package/dist/web/playground/seed/core/markdown/canvas/syntax/basic-emom.json +4 -4
  59. package/dist/web/playground/seed/core/markdown/canvas/syntax/calculated-metrics.json +4 -4
  60. package/dist/web/playground/seed/core/markdown/canvas/syntax/classic-amrap.json +6 -6
  61. package/dist/web/playground/seed/core/markdown/canvas/syntax/complex-barbell-cycling.json +4 -4
  62. package/dist/web/playground/seed/core/markdown/canvas/syntax/complex-full-session.json +9 -9
  63. package/dist/web/playground/seed/core/markdown/canvas/syntax/complex-nested-protocols.json +7 -7
  64. package/dist/web/playground/seed/core/markdown/canvas/syntax/complex-partner-workout.json +7 -7
  65. package/dist/web/playground/seed/core/markdown/canvas/syntax/complex-swimming.json +3 -3
  66. package/dist/web/playground/seed/core/markdown/canvas/syntax/core-rules.json +4 -4
  67. package/dist/web/playground/seed/core/markdown/canvas/syntax/custom-and-calculated-metrics.json +7 -7
  68. package/dist/web/playground/seed/core/markdown/canvas/syntax/custom-intervals.json +4 -4
  69. package/dist/web/playground/seed/core/markdown/canvas/syntax/custom-metrics-1.json +4 -4
  70. package/dist/web/playground/seed/core/markdown/canvas/syntax/custom-metrics-2.json +5 -5
  71. package/dist/web/playground/seed/core/markdown/canvas/syntax/custom-metrics-3.json +2 -2
  72. package/dist/web/playground/seed/core/markdown/canvas/syntax/custom-metrics-4.json +4 -4
  73. package/dist/web/playground/seed/core/markdown/canvas/syntax/custom-metrics-5.json +4 -4
  74. package/dist/web/playground/seed/core/markdown/canvas/syntax/dialect-climb-bouldering.json +2 -2
  75. package/dist/web/playground/seed/core/markdown/canvas/syntax/dialect-climb-hangboard.json +2 -2
  76. package/dist/web/playground/seed/core/markdown/canvas/syntax/dialect-climb-sport.json +2 -2
  77. package/dist/web/playground/seed/core/markdown/canvas/syntax/dialect-log.json +4 -4
  78. package/dist/web/playground/seed/core/markdown/canvas/syntax/dialect-plan.json +8 -8
  79. package/dist/web/playground/seed/core/markdown/canvas/syntax/dialect-wod.json +5 -5
  80. package/dist/web/playground/seed/core/markdown/canvas/syntax/distance-intervals.json +3 -3
  81. package/dist/web/playground/seed/core/markdown/canvas/syntax/document-1.json +4 -4
  82. package/dist/web/playground/seed/core/markdown/canvas/syntax/document-2.json +5 -5
  83. package/dist/web/playground/seed/core/markdown/canvas/syntax/document-3.json +10 -10
  84. package/dist/web/playground/seed/core/markdown/canvas/syntax/document-4.json +4 -4
  85. package/dist/web/playground/seed/core/markdown/canvas/syntax/effort-notes.json +4 -4
  86. package/dist/web/playground/seed/core/markdown/canvas/syntax/groups-1.json +5 -5
  87. package/dist/web/playground/seed/core/markdown/canvas/syntax/groups-2.json +6 -6
  88. package/dist/web/playground/seed/core/markdown/canvas/syntax/groups-3.json +3 -3
  89. package/dist/web/playground/seed/core/markdown/canvas/syntax/groups-4.json +3 -3
  90. package/dist/web/playground/seed/core/markdown/canvas/syntax/longer-duration.json +4 -4
  91. package/dist/web/playground/seed/core/markdown/canvas/syntax/longer-intervals.json +4 -4
  92. package/dist/web/playground/seed/core/markdown/canvas/syntax/measurements.json +4 -4
  93. package/dist/web/playground/seed/core/markdown/canvas/syntax/metrics-1.json +5 -5
  94. package/dist/web/playground/seed/core/markdown/canvas/syntax/metrics-2.json +7 -7
  95. package/dist/web/playground/seed/core/markdown/canvas/syntax/metrics-3.json +8 -8
  96. package/dist/web/playground/seed/core/markdown/canvas/syntax/metrics-4.json +5 -5
  97. package/dist/web/playground/seed/core/markdown/canvas/syntax/metrics-5.json +5 -5
  98. package/dist/web/playground/seed/core/markdown/canvas/syntax/mixed-sections.json +8 -8
  99. package/dist/web/playground/seed/core/markdown/canvas/syntax/mixed-timers.json +5 -5
  100. package/dist/web/playground/seed/core/markdown/canvas/syntax/multiple-amrap-windows.json +7 -7
  101. package/dist/web/playground/seed/core/markdown/canvas/syntax/multiple-sets.json +4 -4
  102. package/dist/web/playground/seed/core/markdown/canvas/syntax/named-groups.json +5 -5
  103. package/dist/web/playground/seed/core/markdown/canvas/syntax/protocols-1.json +6 -6
  104. package/dist/web/playground/seed/core/markdown/canvas/syntax/protocols-2.json +4 -4
  105. package/dist/web/playground/seed/core/markdown/canvas/syntax/protocols-3.json +6 -6
  106. package/dist/web/playground/seed/core/markdown/canvas/syntax/protocols-4.json +3 -3
  107. package/dist/web/playground/seed/core/markdown/canvas/syntax/protocols-5.json +4 -4
  108. package/dist/web/playground/seed/core/markdown/canvas/syntax/single-movement.json +3 -3
  109. package/dist/web/playground/seed/core/markdown/canvas/syntax/supplemental-1.json +4 -4
  110. package/dist/web/playground/seed/core/markdown/canvas/syntax/supplemental-2.json +5 -5
  111. package/dist/web/playground/seed/core/markdown/canvas/syntax/supplemental-3.json +4 -4
  112. package/dist/web/playground/seed/core/markdown/canvas/syntax/supplemental-4.json +4 -4
  113. package/dist/web/playground/seed/core/markdown/canvas/syntax/time-cap.json +6 -6
  114. package/dist/web/playground/seed/core/markdown/canvas/syntax/timer-modifiers.json +6 -6
  115. package/dist/web/playground/seed/core/markdown/canvas/syntax/timers-1.json +6 -6
  116. package/dist/web/playground/seed/core/markdown/canvas/syntax/timers-2.json +4 -4
  117. package/dist/web/playground/seed/core/markdown/canvas/syntax/timers-3.json +3 -3
  118. package/dist/web/playground/seed/core/markdown/canvas/syntax/timers-4.json +4 -4
  119. package/dist/web/playground/seed/core/markdown/canvas/syntax/timers-5.json +5 -5
  120. package/dist/web/playground/seed/core/markdown/canvas/syntax/timers-rest.json +4 -4
  121. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/aggregate-by-effort.json +2 -2
  122. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/aggregate-by-week.json +2 -2
  123. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/content-fran.json +2 -2
  124. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/filter-combos.json +2 -2
  125. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/pipes-limit.json +2 -2
  126. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/session-rpe.json +2 -2
  127. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/source-journal.json +2 -2
  128. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/tis-trend.json +2 -2
  129. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/where-join.json +2 -2
  130. package/dist/web/playground/seed/core/markdown/dashboards/benchmark-pr-board.json +6 -6
  131. package/dist/web/playground/seed/core/markdown/dashboards/finger-strength-v8.json +5 -5
  132. package/dist/web/playground/seed/core/markdown/dashboards/polarized-base-marathon.json +9 -9
  133. package/dist/web/playground/seed/core/markdown/dashboards/recovery-readiness.json +7 -7
  134. package/dist/web/playground/seed/core/markdown/dashboards/road-to-560-total.json +9 -9
  135. package/dist/web/playground/seed/core/markdown/dashboards/training-block-review.json +11 -11
  136. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/air-squat.json +2 -2
  137. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/box-jump.json +2 -2
  138. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/broad-jump.json +2 -2
  139. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/burpee-box-jump-over.json +2 -2
  140. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/burpee-over-dumbbell.json +2 -2
  141. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/burpee.json +2 -2
  142. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/dumbbell-squat-clean.json +2 -2
  143. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/ghd-sit-up.json +2 -2
  144. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/ground-kong.json +2 -2
  145. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/jumping-jack.json +2 -2
  146. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/kong-walk.json +2 -2
  147. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/lunge.json +2 -2
  148. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/overhead-squat.json +2 -2
  149. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/parkour-roll.json +2 -2
  150. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/parkour-squat.json +2 -2
  151. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/pistol-squat.json +2 -2
  152. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/plank.json +2 -2
  153. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/precision-burpee.json +2 -2
  154. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/precision-jump.json +2 -2
  155. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/quadrupedal-movement.json +2 -2
  156. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/russian-twist.json +2 -2
  157. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/sit-up.json +2 -2
  158. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/squat-clean.json +2 -2
  159. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/squat-hold.json +2 -2
  160. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/squat-snatch.json +2 -2
  161. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/tuck-jump.json +2 -2
  162. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/wall-ball.json +2 -2
  163. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/wall-burpee.json +2 -2
  164. package/dist/web/playground/seed/core/markdown/efforts/cycling/assault-bike.json +2 -2
  165. package/dist/web/playground/seed/core/markdown/efforts/cycling/cycling-moderate.json +2 -2
  166. package/dist/web/playground/seed/core/markdown/efforts/cycling/cycling-vigorous.json +2 -2
  167. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/assisted-pull-up.json +2 -2
  168. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/burpee-pull-up.json +2 -2
  169. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/chest-to-bar-pull-up.json +2 -2
  170. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/dip.json +2 -2
  171. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/double-under.json +2 -2
  172. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/handstand-hold.json +2 -2
  173. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/handstand-push-up.json +2 -2
  174. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/handstand-walk.json +2 -2
  175. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/jump-rope.json +2 -2
  176. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/jumping-pull-up.json +2 -2
  177. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/jumping-push-up.json +2 -2
  178. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/l-sit-pull-up.json +2 -2
  179. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/muscle-up.json +2 -2
  180. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/pull-up.json +2 -2
  181. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/push-up.json +2 -2
  182. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/reverse-wall-dip.json +2 -2
  183. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/rope-climb.json +2 -2
  184. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/toes-to-bar.json +2 -2
  185. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-arm-bar.json +2 -2
  186. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-around-the-world.json +2 -2
  187. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-bent-over-row.json +2 -2
  188. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-clean-and-jerk.json +2 -2
  189. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-clean-and-press.json +2 -2
  190. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-clean.json +2 -2
  191. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-deadlift.json +2 -2
  192. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-floor-press.json +2 -2
  193. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-front-squat.json +2 -2
  194. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-goblet-squat.json +2 -2
  195. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-gorilla-row.json +2 -2
  196. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-halo.json +2 -2
  197. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-jerk.json +2 -2
  198. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-overhead-squat.json +2 -2
  199. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-press.json +2 -2
  200. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-snatch.json +2 -2
  201. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-swing.json +2 -2
  202. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-windmill.json +2 -2
  203. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/turkish-get-up.json +2 -2
  204. package/dist/web/playground/seed/core/markdown/efforts/recovery/rest.json +2 -2
  205. package/dist/web/playground/seed/core/markdown/efforts/recovery/stretching.json +2 -2
  206. package/dist/web/playground/seed/core/markdown/efforts/rowing/rowing-sprint.json +2 -2
  207. package/dist/web/playground/seed/core/markdown/efforts/rowing/rowing.json +2 -2
  208. package/dist/web/playground/seed/core/markdown/efforts/rowing/ski-erg.json +2 -2
  209. package/dist/web/playground/seed/core/markdown/efforts/running/backward-running.json +2 -2
  210. package/dist/web/playground/seed/core/markdown/efforts/running/running-6-mph.json +2 -2
  211. package/dist/web/playground/seed/core/markdown/efforts/running/running-8-mph.json +2 -2
  212. package/dist/web/playground/seed/core/markdown/efforts/running/running-sprint.json +2 -2
  213. package/dist/web/playground/seed/core/markdown/efforts/snatch.json +7 -7
  214. package/dist/web/playground/seed/core/markdown/efforts/strength/back-squat.json +2 -2
  215. package/dist/web/playground/seed/core/markdown/efforts/strength/bench-press.json +2 -2
  216. package/dist/web/playground/seed/core/markdown/efforts/strength/box-step-up.json +2 -2
  217. package/dist/web/playground/seed/core/markdown/efforts/strength/carioca.json +2 -2
  218. package/dist/web/playground/seed/core/markdown/efforts/strength/clean-and-jerk.json +2 -2
  219. package/dist/web/playground/seed/core/markdown/efforts/strength/cluster.json +2 -2
  220. package/dist/web/playground/seed/core/markdown/efforts/strength/dead-hang.json +2 -2
  221. package/dist/web/playground/seed/core/markdown/efforts/strength/deadlift.json +2 -2
  222. package/dist/web/playground/seed/core/markdown/efforts/strength/devils-press.json +2 -2
  223. package/dist/web/playground/seed/core/markdown/efforts/strength/dumbbell-box-step-up.json +2 -2
  224. package/dist/web/playground/seed/core/markdown/efforts/strength/dumbbell-clean.json +2 -2
  225. package/dist/web/playground/seed/core/markdown/efforts/strength/dumbbell-fly.json +2 -2
  226. package/dist/web/playground/seed/core/markdown/efforts/strength/dumbbell-row.json +2 -2
  227. package/dist/web/playground/seed/core/markdown/efforts/strength/dumbbell-snatch.json +2 -2
  228. package/dist/web/playground/seed/core/markdown/efforts/strength/dumbbell-thruster.json +2 -2
  229. package/dist/web/playground/seed/core/markdown/efforts/strength/elbows-to-knees.json +2 -2
  230. package/dist/web/playground/seed/core/markdown/efforts/strength/farmer-carry.json +2 -2
  231. package/dist/web/playground/seed/core/markdown/efforts/strength/frog-stand.json +2 -2
  232. package/dist/web/playground/seed/core/markdown/efforts/strength/front-squat.json +2 -2
  233. package/dist/web/playground/seed/core/markdown/efforts/strength/good-morning.json +2 -2
  234. package/dist/web/playground/seed/core/markdown/efforts/strength/hanging-leg-raise.json +2 -2
  235. package/dist/web/playground/seed/core/markdown/efforts/strength/hollow-rock.json +2 -2
  236. package/dist/web/playground/seed/core/markdown/efforts/strength/knees-to-elbows.json +2 -2
  237. package/dist/web/playground/seed/core/markdown/efforts/strength/l-sit.json +2 -2
  238. package/dist/web/playground/seed/core/markdown/efforts/strength/man-maker.json +2 -2
  239. package/dist/web/playground/seed/core/markdown/efforts/strength/medicine-ball-clean.json +2 -2
  240. package/dist/web/playground/seed/core/markdown/efforts/strength/overhead-press.json +2 -2
  241. package/dist/web/playground/seed/core/markdown/efforts/strength/parkour-vault.json +2 -2
  242. package/dist/web/playground/seed/core/markdown/efforts/strength/pig-flip.json +2 -2
  243. package/dist/web/playground/seed/core/markdown/efforts/strength/power-clean.json +2 -2
  244. package/dist/web/playground/seed/core/markdown/efforts/strength/power-snatch.json +2 -2
  245. package/dist/web/playground/seed/core/markdown/efforts/strength/push-jerk.json +2 -2
  246. package/dist/web/playground/seed/core/markdown/efforts/strength/push-press.json +2 -2
  247. package/dist/web/playground/seed/core/markdown/efforts/strength/romanian-deadlift.json +2 -2
  248. package/dist/web/playground/seed/core/markdown/efforts/strength/single-leg-deadlift.json +2 -2
  249. package/dist/web/playground/seed/core/markdown/efforts/strength/skull-crusher.json +2 -2
  250. package/dist/web/playground/seed/core/markdown/efforts/strength/slam-ball.json +2 -2
  251. package/dist/web/playground/seed/core/markdown/efforts/strength/sled-pull.json +2 -2
  252. package/dist/web/playground/seed/core/markdown/efforts/strength/sled-push.json +2 -2
  253. package/dist/web/playground/seed/core/markdown/efforts/strength/sumo-deadlift.json +2 -2
  254. package/dist/web/playground/seed/core/markdown/efforts/strength/thruster.json +2 -2
  255. package/dist/web/playground/seed/core/markdown/efforts/strength/triceps-extension.json +2 -2
  256. package/dist/web/playground/seed/core/markdown/efforts/strength/v-sit-hold.json +2 -2
  257. package/dist/web/playground/seed/core/markdown/efforts/strength/wall-walk.json +2 -2
  258. package/dist/web/playground/seed/core/markdown/efforts/strength/yoga-sun-salutation.json +2 -2
  259. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-assisted-sprint.json +2 -2
  260. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-backstroke.json +2 -2
  261. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-breaststroke-kick.json +2 -2
  262. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-breaststroke.json +2 -2
  263. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-butterfly.json +2 -2
  264. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-catch-up-drill.json +2 -2
  265. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-choice-stroke.json +2 -2
  266. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-dive-start.json +2 -2
  267. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-dolphin-kick.json +2 -2
  268. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-drafting.json +2 -2
  269. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-fingertip-drag.json +2 -2
  270. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-freestyle.json +2 -2
  271. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-individual-medley.json +2 -2
  272. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-kick.json +2 -2
  273. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-pull.json +2 -2
  274. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-resisted-sprint.json +2 -2
  275. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-rotation-drill.json +2 -2
  276. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-sighting.json +2 -2
  277. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-single-arm-drill.json +2 -2
  278. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-stroke-transition.json +2 -2
  279. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-two-kick-one-pull.json +2 -2
  280. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-vigorous.json +2 -2
  281. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming.json +2 -2
  282. package/dist/web/playground/seed/core/markdown/efforts/unconventional/clubbell-arm-cast.json +2 -2
  283. package/dist/web/playground/seed/core/markdown/efforts/unconventional/clubbell-circles.json +2 -2
  284. package/dist/web/playground/seed/core/markdown/efforts/unconventional/clubbell-mill.json +2 -2
  285. package/dist/web/playground/seed/core/markdown/efforts/unconventional/clubbell-reverse-mill.json +2 -2
  286. package/dist/web/playground/seed/core/markdown/efforts/unconventional/clubbell-shield-cast.json +2 -2
  287. package/dist/web/playground/seed/core/markdown/efforts/unconventional/macebell-10-to-2-swing.json +2 -2
  288. package/dist/web/playground/seed/core/markdown/efforts/unconventional/macebell-360-swing.json +2 -2
  289. package/dist/web/playground/seed/core/markdown/efforts/unconventional/macebell-barbarian-squat.json +2 -2
  290. package/dist/web/playground/seed/core/markdown/efforts/unconventional/macebell-flow.json +2 -2
  291. package/dist/web/playground/seed/core/markdown/efforts/unconventional/macebell-gravedigger.json +2 -2
  292. package/dist/web/playground/seed/core/markdown/efforts/unconventional/macebell-touchdown.json +2 -2
  293. package/dist/web/playground/seed/core/markdown/efforts/unconventional/sandbag-bear-hug-carry.json +2 -2
  294. package/dist/web/playground/seed/core/markdown/efforts/unconventional/sandbag-bear-hug-extension.json +2 -2
  295. package/dist/web/playground/seed/core/markdown/efforts/unconventional/sandbag-over-shoulder.json +2 -2
  296. package/dist/web/playground/seed/core/markdown/efforts/walking/walking-3-mph.json +2 -2
  297. package/dist/web/playground/seed/core/markdown/equipment/air-bike.json +1 -1
  298. package/dist/web/playground/seed/core/markdown/equipment/barbell.json +1 -1
  299. package/dist/web/playground/seed/core/markdown/equipment/bench.json +1 -1
  300. package/dist/web/playground/seed/core/markdown/equipment/bike-erg.json +1 -1
  301. package/dist/web/playground/seed/core/markdown/equipment/climbing-rope.json +1 -1
  302. package/dist/web/playground/seed/core/markdown/equipment/clubs.json +1 -1
  303. package/dist/web/playground/seed/core/markdown/equipment/dumbbell.json +1 -1
  304. package/dist/web/playground/seed/core/markdown/equipment/ghd.json +1 -1
  305. package/dist/web/playground/seed/core/markdown/equipment/gymnastic-rings.json +1 -1
  306. package/dist/web/playground/seed/core/markdown/equipment/jump-rope.json +1 -1
  307. package/dist/web/playground/seed/core/markdown/equipment/kettlebell.json +1 -1
  308. package/dist/web/playground/seed/core/markdown/equipment/macebell.json +1 -1
  309. package/dist/web/playground/seed/core/markdown/equipment/medicine-ball.json +1 -1
  310. package/dist/web/playground/seed/core/markdown/equipment/parallettes.json +1 -1
  311. package/dist/web/playground/seed/core/markdown/equipment/plyo-box.json +1 -1
  312. package/dist/web/playground/seed/core/markdown/equipment/pull-up-bar.json +1 -1
  313. package/dist/web/playground/seed/core/markdown/equipment/rower.json +1 -1
  314. package/dist/web/playground/seed/core/markdown/equipment/sandbag.json +1 -1
  315. package/dist/web/playground/seed/core/markdown/equipment/ski-erg.json +1 -1
  316. package/dist/web/playground/seed/core/markdown/equipment/slam-ball.json +1 -1
  317. package/dist/web/playground/seed/core/markdown/equipment/sled.json +1 -1
  318. package/dist/web/playground/seed/core/markdown/equipment/sledgehammer.json +1 -1
  319. package/dist/web/playground/seed/core/markdown/equipment/weight-vest.json +1 -1
  320. package/dist/web/playground/seed/core/report.html +13 -13
  321. package/dist/web/server/assets/{feedSync.worker-CEbxagtY.js → feedSync.worker-BKsDG4P0.js} +4 -4
  322. package/dist/web/server/assets/main-CRlqN3LF.js +494 -0
  323. package/dist/web/server/assets/main-Cye5g1Tm.css +2 -0
  324. package/dist/web/server/assets/{statementBuilderFlow-BPmNsGND.js → statementBuilderFlow-C7gh8ABR.js} +2 -2
  325. package/dist/web/server/assets/{vendor-DKhA8bPd.js → vendor-D0x8W9No.js} +19 -19
  326. package/dist/web/{playground/assets/vendor-codemirror-CnY0iCTs.js → server/assets/vendor-codemirror-Bw_t2lTd.js} +7 -7
  327. package/dist/web/server/index.html +4 -4
  328. package/dist/web/{playground/seed/core/chunks/canvas.9ad327d4.json → server/seed/core/chunks/canvas.dc1d093c.json} +1 -1
  329. package/dist/web/server/seed/core/chunks/{dashboards.f4196444.json → dashboards.e349f3be.json} +1 -1
  330. package/dist/web/server/seed/core/chunks/efforts.84f30fa3.json +1 -0
  331. package/dist/web/{playground/seed/core/chunks/equipment.e7531ab5.json → server/seed/core/chunks/equipment.f07ad76e.json} +1 -1
  332. package/dist/web/server/seed/core/indexes/notebooks/canvas.json +178 -173
  333. package/dist/web/server/seed/core/indexes/notebooks/dashboards.json +18 -13
  334. package/dist/web/server/seed/core/indexes/notebooks/efforts.json +328 -323
  335. package/dist/web/server/seed/core/indexes/notebooks/equipment.json +52 -47
  336. package/dist/web/server/seed/core/manifest.json +40 -2512
  337. package/dist/web/server/seed/core/markdown/canvas/ai-first/README.json +1 -1
  338. package/dist/web/server/seed/core/markdown/canvas/guide/README.json +4 -4
  339. package/dist/web/server/seed/core/markdown/canvas/guide/clock.json +1 -1
  340. package/dist/web/server/seed/core/markdown/canvas/guide/dashboards.json +2 -2
  341. package/dist/web/server/seed/core/markdown/canvas/guide/metrics.json +12 -12
  342. package/dist/web/server/seed/core/markdown/canvas/guide/protocols.json +20 -20
  343. package/dist/web/server/seed/core/markdown/canvas/guide/sessions.json +30 -30
  344. package/dist/web/server/seed/core/markdown/canvas/guide/start.json +10 -10
  345. package/dist/web/server/seed/core/markdown/canvas/guide/structure.json +24 -24
  346. package/dist/web/server/seed/core/markdown/canvas/guide/wql.json +5 -5
  347. package/dist/web/server/seed/core/markdown/canvas/home/sample-script.json +4 -4
  348. package/dist/web/server/seed/core/markdown/canvas/home/welcome-1.json +2 -2
  349. package/dist/web/server/seed/core/markdown/canvas/syntax/actions-comments.json +4 -4
  350. package/dist/web/server/seed/core/markdown/canvas/syntax/alternating-emom.json +5 -5
  351. package/dist/web/server/seed/core/markdown/canvas/syntax/basic-emom.json +4 -4
  352. package/dist/web/server/seed/core/markdown/canvas/syntax/calculated-metrics.json +4 -4
  353. package/dist/web/server/seed/core/markdown/canvas/syntax/classic-amrap.json +6 -6
  354. package/dist/web/server/seed/core/markdown/canvas/syntax/complex-barbell-cycling.json +4 -4
  355. package/dist/web/server/seed/core/markdown/canvas/syntax/complex-full-session.json +9 -9
  356. package/dist/web/server/seed/core/markdown/canvas/syntax/complex-nested-protocols.json +7 -7
  357. package/dist/web/server/seed/core/markdown/canvas/syntax/complex-partner-workout.json +7 -7
  358. package/dist/web/server/seed/core/markdown/canvas/syntax/complex-swimming.json +3 -3
  359. package/dist/web/server/seed/core/markdown/canvas/syntax/core-rules.json +4 -4
  360. package/dist/web/server/seed/core/markdown/canvas/syntax/custom-and-calculated-metrics.json +7 -7
  361. package/dist/web/server/seed/core/markdown/canvas/syntax/custom-intervals.json +4 -4
  362. package/dist/web/server/seed/core/markdown/canvas/syntax/custom-metrics-1.json +4 -4
  363. package/dist/web/server/seed/core/markdown/canvas/syntax/custom-metrics-2.json +5 -5
  364. package/dist/web/server/seed/core/markdown/canvas/syntax/custom-metrics-3.json +2 -2
  365. package/dist/web/server/seed/core/markdown/canvas/syntax/custom-metrics-4.json +4 -4
  366. package/dist/web/server/seed/core/markdown/canvas/syntax/custom-metrics-5.json +4 -4
  367. package/dist/web/server/seed/core/markdown/canvas/syntax/dialect-climb-bouldering.json +2 -2
  368. package/dist/web/server/seed/core/markdown/canvas/syntax/dialect-climb-hangboard.json +2 -2
  369. package/dist/web/server/seed/core/markdown/canvas/syntax/dialect-climb-sport.json +2 -2
  370. package/dist/web/server/seed/core/markdown/canvas/syntax/dialect-log.json +4 -4
  371. package/dist/web/server/seed/core/markdown/canvas/syntax/dialect-plan.json +8 -8
  372. package/dist/web/server/seed/core/markdown/canvas/syntax/dialect-wod.json +5 -5
  373. package/dist/web/server/seed/core/markdown/canvas/syntax/distance-intervals.json +3 -3
  374. package/dist/web/server/seed/core/markdown/canvas/syntax/document-1.json +4 -4
  375. package/dist/web/server/seed/core/markdown/canvas/syntax/document-2.json +5 -5
  376. package/dist/web/server/seed/core/markdown/canvas/syntax/document-3.json +10 -10
  377. package/dist/web/server/seed/core/markdown/canvas/syntax/document-4.json +4 -4
  378. package/dist/web/server/seed/core/markdown/canvas/syntax/effort-notes.json +4 -4
  379. package/dist/web/server/seed/core/markdown/canvas/syntax/groups-1.json +5 -5
  380. package/dist/web/server/seed/core/markdown/canvas/syntax/groups-2.json +6 -6
  381. package/dist/web/server/seed/core/markdown/canvas/syntax/groups-3.json +3 -3
  382. package/dist/web/server/seed/core/markdown/canvas/syntax/groups-4.json +3 -3
  383. package/dist/web/server/seed/core/markdown/canvas/syntax/longer-duration.json +4 -4
  384. package/dist/web/server/seed/core/markdown/canvas/syntax/longer-intervals.json +4 -4
  385. package/dist/web/server/seed/core/markdown/canvas/syntax/measurements.json +4 -4
  386. package/dist/web/server/seed/core/markdown/canvas/syntax/metrics-1.json +5 -5
  387. package/dist/web/server/seed/core/markdown/canvas/syntax/metrics-2.json +7 -7
  388. package/dist/web/server/seed/core/markdown/canvas/syntax/metrics-3.json +8 -8
  389. package/dist/web/server/seed/core/markdown/canvas/syntax/metrics-4.json +5 -5
  390. package/dist/web/server/seed/core/markdown/canvas/syntax/metrics-5.json +5 -5
  391. package/dist/web/server/seed/core/markdown/canvas/syntax/mixed-sections.json +8 -8
  392. package/dist/web/server/seed/core/markdown/canvas/syntax/mixed-timers.json +5 -5
  393. package/dist/web/server/seed/core/markdown/canvas/syntax/multiple-amrap-windows.json +7 -7
  394. package/dist/web/server/seed/core/markdown/canvas/syntax/multiple-sets.json +4 -4
  395. package/dist/web/server/seed/core/markdown/canvas/syntax/named-groups.json +5 -5
  396. package/dist/web/server/seed/core/markdown/canvas/syntax/protocols-1.json +6 -6
  397. package/dist/web/server/seed/core/markdown/canvas/syntax/protocols-2.json +4 -4
  398. package/dist/web/server/seed/core/markdown/canvas/syntax/protocols-3.json +6 -6
  399. package/dist/web/server/seed/core/markdown/canvas/syntax/protocols-4.json +3 -3
  400. package/dist/web/server/seed/core/markdown/canvas/syntax/protocols-5.json +4 -4
  401. package/dist/web/server/seed/core/markdown/canvas/syntax/single-movement.json +3 -3
  402. package/dist/web/server/seed/core/markdown/canvas/syntax/supplemental-1.json +4 -4
  403. package/dist/web/server/seed/core/markdown/canvas/syntax/supplemental-2.json +5 -5
  404. package/dist/web/server/seed/core/markdown/canvas/syntax/supplemental-3.json +4 -4
  405. package/dist/web/server/seed/core/markdown/canvas/syntax/supplemental-4.json +4 -4
  406. package/dist/web/server/seed/core/markdown/canvas/syntax/time-cap.json +6 -6
  407. package/dist/web/server/seed/core/markdown/canvas/syntax/timer-modifiers.json +6 -6
  408. package/dist/web/server/seed/core/markdown/canvas/syntax/timers-1.json +6 -6
  409. package/dist/web/server/seed/core/markdown/canvas/syntax/timers-2.json +4 -4
  410. package/dist/web/server/seed/core/markdown/canvas/syntax/timers-3.json +3 -3
  411. package/dist/web/server/seed/core/markdown/canvas/syntax/timers-4.json +4 -4
  412. package/dist/web/server/seed/core/markdown/canvas/syntax/timers-5.json +5 -5
  413. package/dist/web/server/seed/core/markdown/canvas/syntax/timers-rest.json +4 -4
  414. package/dist/web/server/seed/core/markdown/canvas/wql-presets/aggregate-by-effort.json +2 -2
  415. package/dist/web/server/seed/core/markdown/canvas/wql-presets/aggregate-by-week.json +2 -2
  416. package/dist/web/server/seed/core/markdown/canvas/wql-presets/content-fran.json +2 -2
  417. package/dist/web/server/seed/core/markdown/canvas/wql-presets/filter-combos.json +2 -2
  418. package/dist/web/server/seed/core/markdown/canvas/wql-presets/pipes-limit.json +2 -2
  419. package/dist/web/server/seed/core/markdown/canvas/wql-presets/session-rpe.json +2 -2
  420. package/dist/web/server/seed/core/markdown/canvas/wql-presets/source-journal.json +2 -2
  421. package/dist/web/server/seed/core/markdown/canvas/wql-presets/tis-trend.json +2 -2
  422. package/dist/web/server/seed/core/markdown/canvas/wql-presets/where-join.json +2 -2
  423. package/dist/web/server/seed/core/markdown/dashboards/benchmark-pr-board.json +6 -6
  424. package/dist/web/server/seed/core/markdown/dashboards/finger-strength-v8.json +5 -5
  425. package/dist/web/server/seed/core/markdown/dashboards/polarized-base-marathon.json +9 -9
  426. package/dist/web/server/seed/core/markdown/dashboards/recovery-readiness.json +7 -7
  427. package/dist/web/server/seed/core/markdown/dashboards/road-to-560-total.json +9 -9
  428. package/dist/web/server/seed/core/markdown/dashboards/training-block-review.json +11 -11
  429. package/dist/web/server/seed/core/markdown/efforts/bodyweight/air-squat.json +2 -2
  430. package/dist/web/server/seed/core/markdown/efforts/bodyweight/box-jump.json +2 -2
  431. package/dist/web/server/seed/core/markdown/efforts/bodyweight/broad-jump.json +2 -2
  432. package/dist/web/server/seed/core/markdown/efforts/bodyweight/burpee-box-jump-over.json +2 -2
  433. package/dist/web/server/seed/core/markdown/efforts/bodyweight/burpee-over-dumbbell.json +2 -2
  434. package/dist/web/server/seed/core/markdown/efforts/bodyweight/burpee.json +2 -2
  435. package/dist/web/server/seed/core/markdown/efforts/bodyweight/dumbbell-squat-clean.json +2 -2
  436. package/dist/web/server/seed/core/markdown/efforts/bodyweight/ghd-sit-up.json +2 -2
  437. package/dist/web/server/seed/core/markdown/efforts/bodyweight/ground-kong.json +2 -2
  438. package/dist/web/server/seed/core/markdown/efforts/bodyweight/jumping-jack.json +2 -2
  439. package/dist/web/server/seed/core/markdown/efforts/bodyweight/kong-walk.json +2 -2
  440. package/dist/web/server/seed/core/markdown/efforts/bodyweight/lunge.json +2 -2
  441. package/dist/web/server/seed/core/markdown/efforts/bodyweight/overhead-squat.json +2 -2
  442. package/dist/web/server/seed/core/markdown/efforts/bodyweight/parkour-roll.json +2 -2
  443. package/dist/web/server/seed/core/markdown/efforts/bodyweight/parkour-squat.json +2 -2
  444. package/dist/web/server/seed/core/markdown/efforts/bodyweight/pistol-squat.json +2 -2
  445. package/dist/web/server/seed/core/markdown/efforts/bodyweight/plank.json +2 -2
  446. package/dist/web/server/seed/core/markdown/efforts/bodyweight/precision-burpee.json +2 -2
  447. package/dist/web/server/seed/core/markdown/efforts/bodyweight/precision-jump.json +2 -2
  448. package/dist/web/server/seed/core/markdown/efforts/bodyweight/quadrupedal-movement.json +2 -2
  449. package/dist/web/server/seed/core/markdown/efforts/bodyweight/russian-twist.json +2 -2
  450. package/dist/web/server/seed/core/markdown/efforts/bodyweight/sit-up.json +2 -2
  451. package/dist/web/server/seed/core/markdown/efforts/bodyweight/squat-clean.json +2 -2
  452. package/dist/web/server/seed/core/markdown/efforts/bodyweight/squat-hold.json +2 -2
  453. package/dist/web/server/seed/core/markdown/efforts/bodyweight/squat-snatch.json +2 -2
  454. package/dist/web/server/seed/core/markdown/efforts/bodyweight/tuck-jump.json +2 -2
  455. package/dist/web/server/seed/core/markdown/efforts/bodyweight/wall-ball.json +2 -2
  456. package/dist/web/server/seed/core/markdown/efforts/bodyweight/wall-burpee.json +2 -2
  457. package/dist/web/server/seed/core/markdown/efforts/cycling/assault-bike.json +2 -2
  458. package/dist/web/server/seed/core/markdown/efforts/cycling/cycling-moderate.json +2 -2
  459. package/dist/web/server/seed/core/markdown/efforts/cycling/cycling-vigorous.json +2 -2
  460. package/dist/web/server/seed/core/markdown/efforts/gymnastics/assisted-pull-up.json +2 -2
  461. package/dist/web/server/seed/core/markdown/efforts/gymnastics/burpee-pull-up.json +2 -2
  462. package/dist/web/server/seed/core/markdown/efforts/gymnastics/chest-to-bar-pull-up.json +2 -2
  463. package/dist/web/server/seed/core/markdown/efforts/gymnastics/dip.json +2 -2
  464. package/dist/web/server/seed/core/markdown/efforts/gymnastics/double-under.json +2 -2
  465. package/dist/web/server/seed/core/markdown/efforts/gymnastics/handstand-hold.json +2 -2
  466. package/dist/web/server/seed/core/markdown/efforts/gymnastics/handstand-push-up.json +2 -2
  467. package/dist/web/server/seed/core/markdown/efforts/gymnastics/handstand-walk.json +2 -2
  468. package/dist/web/server/seed/core/markdown/efforts/gymnastics/jump-rope.json +2 -2
  469. package/dist/web/server/seed/core/markdown/efforts/gymnastics/jumping-pull-up.json +2 -2
  470. package/dist/web/server/seed/core/markdown/efforts/gymnastics/jumping-push-up.json +2 -2
  471. package/dist/web/server/seed/core/markdown/efforts/gymnastics/l-sit-pull-up.json +2 -2
  472. package/dist/web/server/seed/core/markdown/efforts/gymnastics/muscle-up.json +2 -2
  473. package/dist/web/server/seed/core/markdown/efforts/gymnastics/pull-up.json +2 -2
  474. package/dist/web/server/seed/core/markdown/efforts/gymnastics/push-up.json +2 -2
  475. package/dist/web/server/seed/core/markdown/efforts/gymnastics/reverse-wall-dip.json +2 -2
  476. package/dist/web/server/seed/core/markdown/efforts/gymnastics/rope-climb.json +2 -2
  477. package/dist/web/server/seed/core/markdown/efforts/gymnastics/toes-to-bar.json +2 -2
  478. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-arm-bar.json +2 -2
  479. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-around-the-world.json +2 -2
  480. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-bent-over-row.json +2 -2
  481. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-clean-and-jerk.json +2 -2
  482. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-clean-and-press.json +2 -2
  483. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-clean.json +2 -2
  484. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-deadlift.json +2 -2
  485. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-floor-press.json +2 -2
  486. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-front-squat.json +2 -2
  487. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-goblet-squat.json +2 -2
  488. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-gorilla-row.json +2 -2
  489. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-halo.json +2 -2
  490. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-jerk.json +2 -2
  491. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-overhead-squat.json +2 -2
  492. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-press.json +2 -2
  493. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-snatch.json +2 -2
  494. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-swing.json +2 -2
  495. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-windmill.json +2 -2
  496. package/dist/web/server/seed/core/markdown/efforts/kettlebell/turkish-get-up.json +2 -2
  497. package/dist/web/server/seed/core/markdown/efforts/recovery/rest.json +2 -2
  498. package/dist/web/server/seed/core/markdown/efforts/recovery/stretching.json +2 -2
  499. package/dist/web/server/seed/core/markdown/efforts/rowing/rowing-sprint.json +2 -2
  500. package/dist/web/server/seed/core/markdown/efforts/rowing/rowing.json +2 -2
  501. package/dist/web/server/seed/core/markdown/efforts/rowing/ski-erg.json +2 -2
  502. package/dist/web/server/seed/core/markdown/efforts/running/backward-running.json +2 -2
  503. package/dist/web/server/seed/core/markdown/efforts/running/running-6-mph.json +2 -2
  504. package/dist/web/server/seed/core/markdown/efforts/running/running-8-mph.json +2 -2
  505. package/dist/web/server/seed/core/markdown/efforts/running/running-sprint.json +2 -2
  506. package/dist/web/server/seed/core/markdown/efforts/snatch.json +7 -7
  507. package/dist/web/server/seed/core/markdown/efforts/strength/back-squat.json +2 -2
  508. package/dist/web/server/seed/core/markdown/efforts/strength/bench-press.json +2 -2
  509. package/dist/web/server/seed/core/markdown/efforts/strength/box-step-up.json +2 -2
  510. package/dist/web/server/seed/core/markdown/efforts/strength/carioca.json +2 -2
  511. package/dist/web/server/seed/core/markdown/efforts/strength/clean-and-jerk.json +2 -2
  512. package/dist/web/server/seed/core/markdown/efforts/strength/cluster.json +2 -2
  513. package/dist/web/server/seed/core/markdown/efforts/strength/dead-hang.json +2 -2
  514. package/dist/web/server/seed/core/markdown/efforts/strength/deadlift.json +2 -2
  515. package/dist/web/server/seed/core/markdown/efforts/strength/devils-press.json +2 -2
  516. package/dist/web/server/seed/core/markdown/efforts/strength/dumbbell-box-step-up.json +2 -2
  517. package/dist/web/server/seed/core/markdown/efforts/strength/dumbbell-clean.json +2 -2
  518. package/dist/web/server/seed/core/markdown/efforts/strength/dumbbell-fly.json +2 -2
  519. package/dist/web/server/seed/core/markdown/efforts/strength/dumbbell-row.json +2 -2
  520. package/dist/web/server/seed/core/markdown/efforts/strength/dumbbell-snatch.json +2 -2
  521. package/dist/web/server/seed/core/markdown/efforts/strength/dumbbell-thruster.json +2 -2
  522. package/dist/web/server/seed/core/markdown/efforts/strength/elbows-to-knees.json +2 -2
  523. package/dist/web/server/seed/core/markdown/efforts/strength/farmer-carry.json +2 -2
  524. package/dist/web/server/seed/core/markdown/efforts/strength/frog-stand.json +2 -2
  525. package/dist/web/server/seed/core/markdown/efforts/strength/front-squat.json +2 -2
  526. package/dist/web/server/seed/core/markdown/efforts/strength/good-morning.json +2 -2
  527. package/dist/web/server/seed/core/markdown/efforts/strength/hanging-leg-raise.json +2 -2
  528. package/dist/web/server/seed/core/markdown/efforts/strength/hollow-rock.json +2 -2
  529. package/dist/web/server/seed/core/markdown/efforts/strength/knees-to-elbows.json +2 -2
  530. package/dist/web/server/seed/core/markdown/efforts/strength/l-sit.json +2 -2
  531. package/dist/web/server/seed/core/markdown/efforts/strength/man-maker.json +2 -2
  532. package/dist/web/server/seed/core/markdown/efforts/strength/medicine-ball-clean.json +2 -2
  533. package/dist/web/server/seed/core/markdown/efforts/strength/overhead-press.json +2 -2
  534. package/dist/web/server/seed/core/markdown/efforts/strength/parkour-vault.json +2 -2
  535. package/dist/web/server/seed/core/markdown/efforts/strength/pig-flip.json +2 -2
  536. package/dist/web/server/seed/core/markdown/efforts/strength/power-clean.json +2 -2
  537. package/dist/web/server/seed/core/markdown/efforts/strength/power-snatch.json +2 -2
  538. package/dist/web/server/seed/core/markdown/efforts/strength/push-jerk.json +2 -2
  539. package/dist/web/server/seed/core/markdown/efforts/strength/push-press.json +2 -2
  540. package/dist/web/server/seed/core/markdown/efforts/strength/romanian-deadlift.json +2 -2
  541. package/dist/web/server/seed/core/markdown/efforts/strength/single-leg-deadlift.json +2 -2
  542. package/dist/web/server/seed/core/markdown/efforts/strength/skull-crusher.json +2 -2
  543. package/dist/web/server/seed/core/markdown/efforts/strength/slam-ball.json +2 -2
  544. package/dist/web/server/seed/core/markdown/efforts/strength/sled-pull.json +2 -2
  545. package/dist/web/server/seed/core/markdown/efforts/strength/sled-push.json +2 -2
  546. package/dist/web/server/seed/core/markdown/efforts/strength/sumo-deadlift.json +2 -2
  547. package/dist/web/server/seed/core/markdown/efforts/strength/thruster.json +2 -2
  548. package/dist/web/server/seed/core/markdown/efforts/strength/triceps-extension.json +2 -2
  549. package/dist/web/server/seed/core/markdown/efforts/strength/v-sit-hold.json +2 -2
  550. package/dist/web/server/seed/core/markdown/efforts/strength/wall-walk.json +2 -2
  551. package/dist/web/server/seed/core/markdown/efforts/strength/yoga-sun-salutation.json +2 -2
  552. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-assisted-sprint.json +2 -2
  553. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-backstroke.json +2 -2
  554. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-breaststroke-kick.json +2 -2
  555. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-breaststroke.json +2 -2
  556. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-butterfly.json +2 -2
  557. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-catch-up-drill.json +2 -2
  558. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-choice-stroke.json +2 -2
  559. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-dive-start.json +2 -2
  560. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-dolphin-kick.json +2 -2
  561. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-drafting.json +2 -2
  562. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-fingertip-drag.json +2 -2
  563. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-freestyle.json +2 -2
  564. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-individual-medley.json +2 -2
  565. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-kick.json +2 -2
  566. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-pull.json +2 -2
  567. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-resisted-sprint.json +2 -2
  568. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-rotation-drill.json +2 -2
  569. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-sighting.json +2 -2
  570. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-single-arm-drill.json +2 -2
  571. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-stroke-transition.json +2 -2
  572. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-two-kick-one-pull.json +2 -2
  573. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-vigorous.json +2 -2
  574. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming.json +2 -2
  575. package/dist/web/server/seed/core/markdown/efforts/unconventional/clubbell-arm-cast.json +2 -2
  576. package/dist/web/server/seed/core/markdown/efforts/unconventional/clubbell-circles.json +2 -2
  577. package/dist/web/server/seed/core/markdown/efforts/unconventional/clubbell-mill.json +2 -2
  578. package/dist/web/server/seed/core/markdown/efforts/unconventional/clubbell-reverse-mill.json +2 -2
  579. package/dist/web/server/seed/core/markdown/efforts/unconventional/clubbell-shield-cast.json +2 -2
  580. package/dist/web/server/seed/core/markdown/efforts/unconventional/macebell-10-to-2-swing.json +2 -2
  581. package/dist/web/server/seed/core/markdown/efforts/unconventional/macebell-360-swing.json +2 -2
  582. package/dist/web/server/seed/core/markdown/efforts/unconventional/macebell-barbarian-squat.json +2 -2
  583. package/dist/web/server/seed/core/markdown/efforts/unconventional/macebell-flow.json +2 -2
  584. package/dist/web/server/seed/core/markdown/efforts/unconventional/macebell-gravedigger.json +2 -2
  585. package/dist/web/server/seed/core/markdown/efforts/unconventional/macebell-touchdown.json +2 -2
  586. package/dist/web/server/seed/core/markdown/efforts/unconventional/sandbag-bear-hug-carry.json +2 -2
  587. package/dist/web/server/seed/core/markdown/efforts/unconventional/sandbag-bear-hug-extension.json +2 -2
  588. package/dist/web/server/seed/core/markdown/efforts/unconventional/sandbag-over-shoulder.json +2 -2
  589. package/dist/web/server/seed/core/markdown/efforts/walking/walking-3-mph.json +2 -2
  590. package/dist/web/server/seed/core/markdown/equipment/air-bike.json +1 -1
  591. package/dist/web/server/seed/core/markdown/equipment/barbell.json +1 -1
  592. package/dist/web/server/seed/core/markdown/equipment/bench.json +1 -1
  593. package/dist/web/server/seed/core/markdown/equipment/bike-erg.json +1 -1
  594. package/dist/web/server/seed/core/markdown/equipment/climbing-rope.json +1 -1
  595. package/dist/web/server/seed/core/markdown/equipment/clubs.json +1 -1
  596. package/dist/web/server/seed/core/markdown/equipment/dumbbell.json +1 -1
  597. package/dist/web/server/seed/core/markdown/equipment/ghd.json +1 -1
  598. package/dist/web/server/seed/core/markdown/equipment/gymnastic-rings.json +1 -1
  599. package/dist/web/server/seed/core/markdown/equipment/jump-rope.json +1 -1
  600. package/dist/web/server/seed/core/markdown/equipment/kettlebell.json +1 -1
  601. package/dist/web/server/seed/core/markdown/equipment/macebell.json +1 -1
  602. package/dist/web/server/seed/core/markdown/equipment/medicine-ball.json +1 -1
  603. package/dist/web/server/seed/core/markdown/equipment/parallettes.json +1 -1
  604. package/dist/web/server/seed/core/markdown/equipment/plyo-box.json +1 -1
  605. package/dist/web/server/seed/core/markdown/equipment/pull-up-bar.json +1 -1
  606. package/dist/web/server/seed/core/markdown/equipment/rower.json +1 -1
  607. package/dist/web/server/seed/core/markdown/equipment/sandbag.json +1 -1
  608. package/dist/web/server/seed/core/markdown/equipment/ski-erg.json +1 -1
  609. package/dist/web/server/seed/core/markdown/equipment/slam-ball.json +1 -1
  610. package/dist/web/server/seed/core/markdown/equipment/sled.json +1 -1
  611. package/dist/web/server/seed/core/markdown/equipment/sledgehammer.json +1 -1
  612. package/dist/web/server/seed/core/markdown/equipment/weight-vest.json +1 -1
  613. package/dist/web/server/seed/core/report.html +12 -12
  614. package/package.json +6 -6
  615. package/dist/chunk-6L5ZDZJ7.mjs +0 -15
  616. package/dist/chunk-EAFF2GVB.mjs.map +0 -1
  617. package/dist/chunk-O5ZCOUQE.mjs.map +0 -1
  618. package/dist/chunk-PF5BTGWZ.mjs.map +0 -1
  619. package/dist/compiler-ZMG22VH4.mjs +0 -9
  620. package/dist/server-5XDT7ITA.mjs +0 -11
  621. package/dist/web/playground/assets/main-BKDG9P36.css +0 -2
  622. package/dist/web/playground/assets/main-DAHoAykp.js +0 -491
  623. package/dist/web/playground/seed/core/chunks/efforts.7f0d2160.json +0 -1
  624. package/dist/web/server/assets/main-BKDG9P36.css +0 -2
  625. package/dist/web/server/assets/main-C_b1CczJ.js +0 -491
  626. package/dist/web/server/seed/core/chunks/efforts.7f0d2160.json +0 -1
@@ -5,8 +5,8 @@ if (typeof globalThis.require === 'undefined') {
5
5
  }
6
6
 
7
7
  // src/version.ts
8
- var VERSION = "0.45.2166";
8
+ var VERSION = "0.46.2168";
9
9
 
10
10
  export { VERSION };
11
- //# sourceMappingURL=chunk-O5ZCOUQE.mjs.map
12
- //# sourceMappingURL=chunk-O5ZCOUQE.mjs.map
11
+ //# sourceMappingURL=chunk-IIUCTIX5.mjs.map
12
+ //# sourceMappingURL=chunk-IIUCTIX5.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/version.ts"],"names":[],"mappings":";;;;;;;AAIO,IAAM,OAAA,GAAU","file":"chunk-IIUCTIX5.mjs","sourcesContent":["/**\n * Auto-generated build version metadata.\n * Do not edit directly; updated by scripts/stamp-version.ts\n */\nexport const VERSION = '0.46.2168';\nexport const GIT_SHA = '109e0ec';\nexport const BUILD_TIME = '2026-10-26T22:17:26.224Z';\nexport const SEMVER = {\n version: '0.46.2168',\n gitSha: '109e0ec',\n buildTime: '2026-10-26T22:17:26.224Z',\n} as const;\n"]}
@@ -1,7 +1,9 @@
1
1
  import { createRequire } from 'module';
2
+ import { __reExport } from './chunk-QUUX6NX2.mjs';
2
3
  import { parseScript, whiteboardParser, parseEffortFile, parseEquipmentFile, createReferenceIndex, slugifyRefLabel, extractStatementRefs } from '@bitcobblers/wod-wiki-lang';
3
- import { reconcileNoteBlocks, KNOWN_SECTION_WIDGETS, parseDocumentSections, blockContentId } from '@bitcobblers/wod-wiki-core';
4
+ import { reconcileNoteBlocks, parseDocumentSections, blockContentId } from '@bitcobblers/wod-wiki-core';
4
5
  import { parseDashboardNote, buildDashboardDocument, isDashboardWidgetType, resolveWidgetType, parseQuery } from '@bitcobblers/wod-wiki-wql';
6
+ import * as wod_wiki_engine_star from '@bitcobblers/wod-wiki-engine';
5
7
  import { execFileSync, execSync } from 'child_process';
6
8
  import { writeFileSync, readFileSync, existsSync, mkdirSync, rmSync, readdirSync } from 'fs';
7
9
  import { join, dirname } from 'path';
@@ -10,36 +12,10 @@ import { createHash } from 'crypto';
10
12
  if (typeof globalThis.require === 'undefined') {
11
13
  try { globalThis.require = createRequire(import.meta.url); } catch {}
12
14
  }
13
- var SEED_SCHEMA = 9;
14
- var SEED_REGISTERED_WIDGETS = KNOWN_SECTION_WIDGETS;
15
- var SEED_NAMESPACE = "1b671a64-40d5-491e-99b0-da01ff1f3341";
16
- var EFFORTS_CHUNK_ID = "efforts";
17
- var EQUIPMENT_CHUNK_ID = "equipment";
18
- var CANVAS_CHUNK_ID = "canvas";
19
- var DASHBOARDS_CHUNK_ID = "dashboards";
20
- function notebookSlugForChunkId(chunkId) {
21
- const value = /^notebook\.(.+)$/.exec(chunkId)?.[1];
22
- return value && value !== "_root" ? value : void 0;
23
- }
24
- function canvasRouteSlug(content) {
25
- const fm = /^---\r?\n([\s\S]*?)\r?\n---/.exec(content);
26
- if (fm?.[1] && !/^template:\s*canvas\s*$/m.test(fm[1])) return null;
27
- return fm?.[1]?.match(/^route:\s*(\S+)\s*$/m)?.[1]?.replace(/^\//, "") || null;
28
- }
29
- function seedNoteSourceId(path, content, chunkId) {
30
- const parts = path.split("/");
31
- const stem = (parts.at(-1) ?? "").replace(/\.md$/i, "");
32
- const under = parts.slice(2).map((p) => p.replace(/\.md$/i, "")).join("/");
33
- if (chunkId === CANVAS_CHUNK_ID) return `guides:${canvasRouteSlug(content) ?? under}`;
34
- if (chunkId === DASHBOARDS_CHUNK_ID) return "dashboards";
35
- if (chunkId === EFFORTS_CHUNK_ID) return "efforts";
36
- if (chunkId === EQUIPMENT_CHUNK_ID) return "equipment";
37
- if (chunkId.startsWith("notebook.")) {
38
- const slug = notebookSlugForChunkId(chunkId);
39
- return !slug ? "notebook:_root" : stem.toLowerCase() === "readme" ? `notebook:${slug}` : `notebook:${under}`;
40
- }
41
- return void 0;
42
- }
15
+
16
+ // src/seedbuild/contract.ts
17
+ var contract_exports = {};
18
+ __reExport(contract_exports, wod_wiki_engine_star);
43
19
 
44
20
  // src/seedbuild/filename.ts
45
21
  var FILE_TITLE_STOP_WORDS = {
@@ -202,34 +178,10 @@ function getScalar(meta, key) {
202
178
  const value = meta[key];
203
179
  return typeof value === "string" || typeof value === "number" ? value : void 0;
204
180
  }
205
- function object(value) {
206
- return typeof value === "object" && value !== null && !Array.isArray(value);
207
- }
208
- function nonnegative(value) {
209
- return typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
210
- }
211
- function assertSeedManifest(value) {
212
- if (!object(value) || value.schema !== SEED_SCHEMA) throw new Error("Incompatible seed schema; rebuild seed artifacts");
213
- if (!nonnegative(value.version) || typeof value.builtAt !== "string" || !Number.isFinite(Date.parse(value.builtAt)) || !Array.isArray(value.chunks)) throw new Error("seed manifest failed shape validation");
214
- for (const key of ["versionLabel", "commit", "name", "description"]) if (value[key] !== void 0 && typeof value[key] !== "string") throw new Error("invalid seed manifest metadata");
215
- if (value.repositoryUrl !== void 0 && (typeof value.repositoryUrl !== "string" || !/^https:\/\//.test(value.repositoryUrl) || new URL(value.repositoryUrl).username || new URL(value.repositoryUrl).password)) throw new Error("invalid seed repository URL");
216
- if (value.dirty !== void 0 && typeof value.dirty !== "boolean") throw new Error("invalid seed manifest metadata");
217
- const ids = /* @__PURE__ */ new Set(), paths = /* @__PURE__ */ new Set();
218
- for (const chunk of value.chunks) {
219
- if (!object(chunk) || typeof chunk.id !== "string" || !chunk.id || typeof chunk.path !== "string" || !/^chunks\/[a-zA-Z0-9._-]+\.json$/.test(chunk.path) || typeof chunk.sha256 !== "string" || !/^[0-9a-f]{64}$/.test(chunk.sha256) || !nonnegative(chunk.bytes) || !nonnegative(chunk.count) || chunk.kind !== void 0 && chunk.kind !== "notes" || ids.has(chunk.id) || paths.has(chunk.path)) throw new Error("seed manifest failed shape validation");
220
- ids.add(chunk.id);
221
- paths.add(chunk.path);
222
- }
223
- if (value.notebooks !== void 0) {
224
- if (!Array.isArray(value.notebooks)) throw new Error("seed manifest failed shape validation");
225
- for (const nb of value.notebooks) {
226
- if (!object(nb) || typeof nb.notebookId !== "string" || typeof nb.label !== "string" || !nonnegative(nb.count) || !Array.isArray(nb.records)) {
227
- throw new Error("seed manifest failed shape validation");
228
- }
229
- }
230
- }
231
- return value;
232
- }
181
+
182
+ // src/seedbuild/validation.ts
183
+ var validation_exports = {};
184
+ __reExport(validation_exports, wod_wiki_engine_star);
233
185
  function listMarkdownFiles(dir, prefix = "") {
234
186
  if (!existsSync(dir)) return [];
235
187
  const out = [];
@@ -305,7 +257,7 @@ function validateDashboardNote(raw) {
305
257
  }
306
258
  function gateDashboards(groups, corpusRoot) {
307
259
  for (const group of groups) {
308
- if (group.id !== DASHBOARDS_CHUNK_ID) continue;
260
+ if (group.id !== contract_exports.DASHBOARDS_CHUNK_ID) continue;
309
261
  for (const p of group.files) {
310
262
  const problems = validateDashboardNote(readFileSync(join(corpusRoot, p), "utf8"));
311
263
  if (problems.length > 0) {
@@ -325,7 +277,7 @@ function getFileCreatedAt(file, repoRoot) {
325
277
  }
326
278
  }
327
279
  function seedNoteIdSync(path) {
328
- const hash = createHash("sha1").update(`${SEED_NAMESPACE}:${path}`).digest();
280
+ const hash = createHash("sha1").update(`${contract_exports.SEED_NAMESPACE}:${path}`).digest();
329
281
  const bytes = new Uint8Array(hash.subarray(0, 16));
330
282
  bytes[6] = bytes[6] & 15 | 80;
331
283
  bytes[8] = bytes[8] & 63 | 128;
@@ -347,6 +299,37 @@ function getFileVersion(file, repoRoot) {
347
299
  return 1;
348
300
  }
349
301
  }
302
+ function getPathVersion(targetPath, repoRoot) {
303
+ try {
304
+ const out = execFileSync("git", ["rev-list", "--count", "HEAD", "--", targetPath], { cwd: repoRoot, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim();
305
+ const count = Number(out);
306
+ return Number.isFinite(count) && count > 0 ? count : 1;
307
+ } catch {
308
+ return 1;
309
+ }
310
+ }
311
+ function getPathCommit(targetPath, repoRoot) {
312
+ try {
313
+ return execFileSync("git", ["log", "-1", "--format=%H", "--", targetPath], { cwd: repoRoot, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim();
314
+ } catch {
315
+ return "";
316
+ }
317
+ }
318
+ function getPathUpdatedAt(targetPath, repoRoot) {
319
+ try {
320
+ const out = execFileSync("git", ["log", "-1", "--format=%cI", "--", targetPath], { cwd: repoRoot, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim();
321
+ return out || void 0;
322
+ } catch {
323
+ return void 0;
324
+ }
325
+ }
326
+ function groupCorpusPath(id) {
327
+ if (id.startsWith("notebook.")) {
328
+ const slug = id.slice("notebook.".length);
329
+ return slug === "_root" ? "markdown/notebooks" : `markdown/notebooks/${slug}`;
330
+ }
331
+ return `markdown/${id}`;
332
+ }
350
333
  function frontmatterDateToCreatedAt(raw, path) {
351
334
  const value = getScalar(parseFrontmatter(raw).meta, "date");
352
335
  if (value === void 0 || value === "") return void 0;
@@ -366,7 +349,7 @@ function dateKeyToCreatedAt(dateKey) {
366
349
  }
367
350
  function compileSeedRow(path, content, metadata = {}) {
368
351
  let ordinal = 0;
369
- const blocks = reconcileNoteBlocks(content, { sourceRevision: 1, registeredWidgets: SEED_REGISTERED_WIDGETS, createId: () => `seed:${path}:${ordinal++}` });
352
+ const blocks = reconcileNoteBlocks(content, { sourceRevision: 1, registeredWidgets: contract_exports.SEED_REGISTERED_WIDGETS, createId: () => `seed:${path}:${ordinal++}` });
370
353
  const noteId = metadata.routeId ?? path;
371
354
  const sections = parseDocumentSections(content);
372
355
  const blockIndex = Object.values(blocks).map((block, position) => {
@@ -384,8 +367,8 @@ function buildBlockIndexRows(markdownDir, corpusRoot, excludePaths = []) {
384
367
  const parts = path.split("/");
385
368
  const stem = (parts.at(-1) ?? "").replace(/\.md$/, "");
386
369
  const slug = parts[2];
387
- const routeId = chunkId === "canvas" ? canvasRouteSlug(content) ?? void 0 : chunkId.startsWith("notebook.") ? stem.toLowerCase() === "readme" ? slug : parts.slice(2).join("/").replace(/\.md$/, "") : void 0;
388
- const sourceId = seedNoteSourceId(path, content, chunkId);
370
+ const routeId = chunkId === "canvas" ? (0, contract_exports.canvasRouteSlug)(content) ?? void 0 : chunkId.startsWith("notebook.") ? stem.toLowerCase() === "readme" ? slug : parts.slice(2).join("/").replace(/\.md$/, "") : void 0;
371
+ const sourceId = (0, contract_exports.seedNoteSourceId)(path, content, chunkId);
389
372
  const createdAt = frontmatterDateToCreatedAt(content, path) ?? (chunkId.startsWith("notebook.") && /^\d{4}-\d{2}-\d{2}$/.test(parts.at(-2) ?? "") ? dateKeyToCreatedAt(parts.at(-2) ?? "") : getFileCreatedAt(path, corpusRoot));
390
373
  rows.push(...compileSeedRow(path, content, { routeId, sourceId, createdAt }).blockIndex);
391
374
  }
@@ -395,7 +378,7 @@ function validateWodBlockSyntax(blocks) {
395
378
  const problems = [];
396
379
  for (const block of blocks) {
397
380
  if (block.dataType !== "wod" || !block.rawContent?.trim()) continue;
398
- const section = parseDocumentSections(block.rawContent, { registeredWidgets: SEED_REGISTERED_WIDGETS }).find((s) => s.scriptBlock);
381
+ const section = parseDocumentSections(block.rawContent, { registeredWidgets: contract_exports.SEED_REGISTERED_WIDGETS }).find((s) => s.scriptBlock);
399
382
  const source = section?.scriptBlock?.content ?? block.rawContent;
400
383
  if (!source.trim()) continue;
401
384
  const where = block.sourcePath ?? block.noteId;
@@ -491,7 +474,7 @@ function discoverUncatalogedEfforts(markdownDir, corpusRoot, excludePaths = [])
491
474
  const discovered = /* @__PURE__ */ new Map();
492
475
  for (const block of blocks) {
493
476
  if (block.dataType !== "wod" || !block.rawContent) continue;
494
- const section = parseDocumentSections(block.rawContent, { registeredWidgets: SEED_REGISTERED_WIDGETS }).find((section2) => section2.scriptBlock);
477
+ const section = parseDocumentSections(block.rawContent, { registeredWidgets: contract_exports.SEED_REGISTERED_WIDGETS }).find((section2) => section2.scriptBlock);
495
478
  const script = parseScript(section?.scriptBlock?.content ?? block.rawContent, { references: index });
496
479
  for (const statement of script.statements) {
497
480
  const effortMetric = statement.metrics?.getMetric?.("effort");
@@ -552,7 +535,7 @@ function buildBlockEffortRows(markdownDir, corpusRoot, blocks = buildBlockIndexR
552
535
  const index = createReferenceIndex(loadCorpusReferenceCatalog(markdownDir));
553
536
  for (const block of blocks) {
554
537
  if (block.dataType !== "wod" || !block.rawContent) continue;
555
- const section = parseDocumentSections(block.rawContent, { registeredWidgets: SEED_REGISTERED_WIDGETS }).find((section2) => section2.scriptBlock);
538
+ const section = parseDocumentSections(block.rawContent, { registeredWidgets: contract_exports.SEED_REGISTERED_WIDGETS }).find((section2) => section2.scriptBlock);
556
539
  const script = parseScript(section?.scriptBlock?.content ?? block.rawContent, { references: index });
557
540
  const linked = /* @__PURE__ */ new Set();
558
541
  for (const rawSlug of extractStatementRefs(script.statements).efforts) {
@@ -582,7 +565,7 @@ function buildBlockEquipmentRows(markdownDir, corpusRoot, blocks = buildBlockInd
582
565
  const index = createReferenceIndex(loadCorpusReferenceCatalog(markdownDir));
583
566
  for (const block of blocks) {
584
567
  if (block.dataType !== "wod" || !block.rawContent) continue;
585
- const section = parseDocumentSections(block.rawContent, { registeredWidgets: SEED_REGISTERED_WIDGETS }).find((s) => s.scriptBlock);
568
+ const section = parseDocumentSections(block.rawContent, { registeredWidgets: contract_exports.SEED_REGISTERED_WIDGETS }).find((s) => s.scriptBlock);
586
569
  const script = parseScript(section?.scriptBlock?.content ?? block.rawContent, { references: index });
587
570
  const linked = /* @__PURE__ */ new Set();
588
571
  for (const rawSlug of extractStatementRefs(script.statements).equipment) {
@@ -672,6 +655,7 @@ ${shown}${more}`);
672
655
  }
673
656
  let totalFiles = 0;
674
657
  const manifestNotebooks = [];
658
+ const manifestBuiltAt = (/* @__PURE__ */ new Date()).toISOString();
675
659
  const tWrite = Date.now();
676
660
  for (const { id, files } of groups) {
677
661
  const records = [];
@@ -706,42 +690,56 @@ ${shown}${more}`);
706
690
  });
707
691
  return compiled;
708
692
  });
693
+ (0, validation_exports.assertSeedRows)(rows);
709
694
  const bytes = Buffer.from(JSON.stringify(rows), "utf8");
710
695
  const sha = sha256Hex(bytes);
711
696
  const file = `chunks/${id}.${sha.slice(0, 8)}.json`;
712
697
  writeFileSync(join(outDir, file), bytes);
713
698
  manifestChunks.push({ id, path: file, sha256: sha, bytes: bytes.length, count: rows.length });
714
699
  totalFiles += rows.length;
700
+ const groupPath = groupCorpusPath(id);
701
+ const groupVersion = getPathVersion(groupPath, corpusRoot);
702
+ const groupCommit = getPathCommit(groupPath, corpusRoot) || gitVersion.commit || "";
703
+ const groupUpdatedAt = getPathUpdatedAt(groupPath, corpusRoot);
715
704
  const notebookIndexPath = `indexes/notebooks/${id}.json`;
716
- const notebookIndex = {
705
+ const summary = {
717
706
  notebookId: id,
718
707
  label: fileToDisplayName(id.split(".").at(-1) ?? id),
719
- category: notebookSlugForChunkId(id),
708
+ category: (0, contract_exports.notebookSlugForChunkId)(id),
720
709
  indexPath: notebookIndexPath,
721
- commit: records.find((r) => r.commit)?.commit ?? gitVersion.commit,
722
- count: rows.length,
710
+ version: groupVersion,
711
+ commit: groupCommit,
712
+ updatedAt: groupUpdatedAt,
713
+ builtAt: manifestBuiltAt,
714
+ sha256: sha,
715
+ bytes: bytes.length,
716
+ count: rows.length
717
+ };
718
+ const notebookIndex = {
719
+ ...summary,
723
720
  records
724
721
  };
722
+ (0, validation_exports.assertNotebookIndex)(notebookIndex);
725
723
  const indexOutFile = join(outDir, notebookIndexPath);
726
724
  mkdirSync(dirname(indexOutFile), { recursive: true });
727
725
  writeFileSync(indexOutFile, JSON.stringify(notebookIndex, null, 2) + "\n");
728
- manifestNotebooks.push(notebookIndex);
726
+ manifestNotebooks.push(summary);
729
727
  }
730
728
  passMs.write = Date.now() - tWrite;
731
729
  const manifest = {
732
730
  name: "name" in metadata && typeof metadata.name === "string" ? metadata.name : void 0,
733
731
  description: "description" in metadata && typeof metadata.description === "string" ? metadata.description : void 0,
734
732
  repositoryUrl: repositoryLink?.protocol === "https:" && !repositoryLink.username && !repositoryLink.password ? repositoryLink.href : void 0,
735
- schema: SEED_SCHEMA,
733
+ schema: contract_exports.SEED_SCHEMA,
736
734
  version: gitVersion.version,
737
735
  versionLabel: gitVersion.versionLabel,
738
736
  commit: gitVersion.commit,
739
737
  dirty: gitVersion.dirty,
740
- builtAt: (/* @__PURE__ */ new Date()).toISOString(),
738
+ builtAt: manifestBuiltAt,
741
739
  chunks: manifestChunks,
742
740
  notebooks: manifestNotebooks
743
741
  };
744
- assertSeedManifest(manifest);
742
+ (0, validation_exports.assertSeedManifest)(manifest);
745
743
  writeFileSync(join(outDir, "manifest.json"), JSON.stringify(manifest, null, 2) + "\n");
746
744
  const reportPath = writeBuildReport(outDir, {
747
745
  manifest,
@@ -751,6 +749,6 @@ ${shown}${more}`);
751
749
  return { manifest, outDir, totalFiles, reportPath, passMs };
752
750
  }
753
751
 
754
- export { SEED_SCHEMA, buildBlockEffortRows, buildBlockEquipmentRows, buildBlockIndexRows, chunkIdFor, collectCorpusMarkdown, compileSeedRow, dateKeyToCreatedAt, discoverUncatalogedEfforts, frontmatterDateToCreatedAt, generateSeed, getFileCommit, getFileVersion, loadCorpusReferenceCatalog, partitionIntoChunks, scaffoldDiscoveredEfforts, seedNoteIdSync, validateDashboardNote, validateWodBlockSyntax, writeBuildReport };
755
- //# sourceMappingURL=chunk-EAFF2GVB.mjs.map
756
- //# sourceMappingURL=chunk-EAFF2GVB.mjs.map
752
+ export { buildBlockEffortRows, buildBlockEquipmentRows, buildBlockIndexRows, chunkIdFor, collectCorpusMarkdown, compileSeedRow, contract_exports, dateKeyToCreatedAt, discoverUncatalogedEfforts, frontmatterDateToCreatedAt, generateSeed, getFileCommit, getFileVersion, getPathCommit, getPathUpdatedAt, getPathVersion, groupCorpusPath, loadCorpusReferenceCatalog, partitionIntoChunks, scaffoldDiscoveredEfforts, seedNoteIdSync, validateDashboardNote, validateWodBlockSyntax, writeBuildReport };
753
+ //# sourceMappingURL=chunk-MKGVKC2X.mjs.map
754
+ //# sourceMappingURL=chunk-MKGVKC2X.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/seedbuild/contract.ts","../src/seedbuild/filename.ts","../src/seedbuild/git-version.ts","../src/seedbuild/report.ts","../src/seedbuild/frontmatter.ts","../src/seedbuild/validation.ts","../src/seedbuild/compiler.ts"],"names":["wod_wiki_engine_star","join","execSync","section","writeFileSync"],"mappings":"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","file":"chunk-MKGVKC2X.mjs","sourcesContent":["export * from '@bitcobblers/wod-wiki-engine';\n","/**\n * fileToDisplayName — port of wod-wiki's\n * apps/playground/src/repositories/groupings.ts (display-name derivation\n * only). Block-index rows carry the same note titles the app renders, so\n * titles must derive identically on both sides.\n */\n\n/** Lowercased mid-title words — \"and\", \"of\", \"70.3\"-style fragments read wrong capped. */\nconst FILE_TITLE_STOP_WORDS: Record<string, true> = {\n and: true, or: true, of: true, for: true, to: true, in: true, on: true,\n at: true, by: true, with: true, the: true, a: true, an: true,\n};\n\n/**\n * Parse a filename into a display name.\n * \"simple-and-sinister.md\" -> \"Simple and Sinister\"\n */\nexport function fileToDisplayName(filename: string): string {\n const base = filename.replace(/\\.md$/, '');\n if (base.toUpperCase() === 'README') return 'Overview';\n // Strip leading \"day-01-\" prefixes if present, then humanise\n const cleaned = base.replace(/^day-\\d+-/, '');\n const tokens = cleaned.split(/[-_]/);\n const titled: string[] = [];\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i]!;\n const next = tokens[i + 1];\n const after = tokens[i + 2];\n const prev = tokens[i - 1];\n // Race distances keep their dot: a lone 1-2-digit pair (\"70-3\" -> \"70.3\").\n // Longer numeric runs are dates (2009-12-01) or rep ladders (5-3-1) —\n // only an isolated pair between words is a distance.\n if (\n /^\\d{1,2}$/.test(token) && /^\\d{1,2}$/.test(next ?? '')\n && !/^\\d+$/.test(prev ?? '') && !/^\\d+$/.test(after ?? '')\n ) {\n titled.push(`${token}.${next}`);\n i++;\n continue;\n }\n if (titled.length > 0 && FILE_TITLE_STOP_WORDS[token.toLowerCase()]) {\n titled.push(token.toLowerCase());\n continue;\n }\n titled.push(token.charAt(0).toUpperCase() + token.slice(1));\n }\n return titled.join(' ');\n}\n","/**\n * Git-derived versioning — the seed artifact's version IS this repo's git\n * history. Every merged MR advances `version` (commit count), and\n * `versionLabel`/`commit` make an artifact traceable to its exact source\n * tree, so the app (and humans diffing manifests) can answer \"what changed\n * and what needs syncing\" from the manifest alone.\n */\nimport { execSync } from 'node:child_process';\n\nexport interface GitVersion {\n /** Monotonic commit count — the import-order version stamped on the manifest. */\n version: number;\n /** `git describe --tags --long --always --dirty`, e.g. `v1.2.0-4-gdeadbee`. */\n versionLabel: string;\n /** Full HEAD sha. */\n commit: string;\n /** True when built with uncommitted working-tree changes. */\n dirty: boolean;\n}\n\n/** Unversioned fallback for source trees without git history (e.g. exported tarballs). */\nexport const UNKNOWN_GIT_VERSION: GitVersion = {\n version: 0,\n versionLabel: 'unknown',\n commit: '',\n dirty: false,\n};\n\nexport function resolveGitVersion(repoRoot: string): GitVersion {\n try {\n const run = (args: string): string =>\n execSync(`git ${args}`, { cwd: repoRoot, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();\n const count = Number(run('rev-list --count HEAD'));\n return {\n version: Number.isFinite(count) && count > 0 ? count : 0,\n versionLabel: run('describe --tags --long --always --dirty'),\n commit: run('rev-parse HEAD'),\n dirty: run('status --porcelain') !== '',\n };\n } catch {\n return UNKNOWN_GIT_VERSION;\n }\n}\n","/**\n * Build report — a static HTML benchmark page for each seed build\n * (`dist/report.html`). Per-chunk sizes, row counts, pass timings, and the\n * git version stamp, so CI and contributors see build health at a glance.\n * Deliberately dependency-free (one string template + a file write).\n */\nimport { writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { SeedManifest } from './contract';\n\nexport interface BuildReportData {\n manifest: SeedManifest;\n /** Wall-clock ms for the full build. */\n totalMs: number;\n /** Per-pass timings (ms): corpus scan, block-index derivation, effort-row derivation, chunk writes. */\n passMs: { scan: number; blockIndex: number; parseGate: number; blockEfforts: number; write: number };\n /** Number of corpus markdown files. */\n fileCount: number;\n outDir: string;\n}\n\nfunction escapeHtml(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n}\n\nfunction rowHtml(c: SeedManifest['chunks'][number]): string {\n const kind = c.kind ?? 'notes';\n return `<tr><td>${escapeHtml(c.id)}</td><td>${kind}</td><td>${c.count}</td><td>${(c.bytes / 1024).toFixed(1)} KB</td><td><code>${c.sha256.slice(0, 8)}</code></td></tr>`;\n}\n\nexport function writeBuildReport(outDir: string, data: BuildReportData): string {\n const { manifest, totalMs, passMs, fileCount } = data;\n const totalBytes = manifest.chunks.reduce((s, c) => s + c.bytes, 0);\n const dirtyBadge = manifest.dirty\n ? ' <strong style=\"color:#b45309\">(dirty working tree — not reproducible from <code>' + escapeHtml(manifest.commit ?? '') + '</code>)</strong>'\n : '';\n const html = `<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\" />\n<title>Seed build report</title>\n<style>\n body { font-family: system-ui, sans-serif; max-width: 960px; margin: 2rem auto; padding: 0 1rem; color: #1f2937; }\n h1 { font-size: 1.4rem; } h2 { font-size: 1.1rem; margin-top: 2rem; }\n table { border-collapse: collapse; width: 100%; font-size: 0.9rem; }\n th, td { text-align: left; padding: 0.3rem 0.6rem; border-bottom: 1px solid #e5e7eb; }\n code { font-size: 0.85em; }\n dl { display: grid; grid-template-columns: max-content 1fr; gap: 0.2rem 1rem; font-size: 0.95rem; }\n dt { font-weight: 600; }\n</style>\n</head>\n<body>\n<h1>Seed build report</h1>\n<h2>Version</h2>\n<dl>\n <dt>version</dt><dd>${manifest.version} <code>${escapeHtml(manifest.versionLabel ?? '')}</code>${dirtyBadge}</dd>\n <dt>commit</dt><dd><code>${escapeHtml(manifest.commit ?? 'unknown')}</code></dd>\n <dt>built at</dt><dd>${escapeHtml(manifest.builtAt)}</dd>\n <dt>schema</dt><dd>v${manifest.schema}</dd>\n</dl>\n<h2>Benchmarks</h2>\n<dl>\n <dt>total</dt><dd>${totalMs} ms</dd>\n <dt>corpus scan + partition</dt><dd>${passMs.scan} ms (${fileCount} files)</dd>\n <dt>block-index derivation</dt><dd>${passMs.blockIndex} ms</dd>\n <dt>block syntax gate</dt><dd>${passMs.parseGate} ms</dd>\n <dt>block-efforts derivation</dt><dd>${passMs.blockEfforts} ms</dd>\n <dt>chunk writes</dt><dd>${passMs.write} ms</dd>\n</dl>\n<h2>Chunks (${manifest.chunks.length}, ${(totalBytes / 1024).toFixed(0)} KB total)</h2>\n<table>\n<thead><tr><th>id</th><th>kind</th><th>rows</th><th>size</th><th>sha256</th></tr></thead>\n<tbody>\n${manifest.chunks.map(rowHtml).join('\\n')}\n</tbody>\n</table>\n</body>\n</html>\n`;\n const file = join(outDir, 'report.html');\n writeFileSync(file, html, 'utf8');\n return file;\n}\n","/**\n * Frontmatter parser — port of wod-wiki's apps/playground/src/lib/frontmatter.ts\n * (parseFrontmatter/getScalar/getList only; the editor-only helpers\n * (LinkWidget, YouTube, serialize) stay in the app).\n *\n * ponytail: semantics must match the app's parser exactly — the seed\n * compiler and the app runtime derive frontmatter from the same corpus.\n * Upgrade path: publish the parser in @bitcobblers/wod-wiki-core and import\n * from both sides.\n */\n\nexport interface ParsedFrontmatter {\n meta: Record<string, string | number | string[]>\n body: string\n}\n\n/** Leading `---` … `---` block; body is everything after the closing delimiter. */\nconst FRONTMATTER_RE = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?/;\n\n/** Strip matched wrapping quotes: `\"x\"` / `'x'` → `x`; mismatched quotes are kept.\n * Double-quoted values also collapse the serializer's escapes (`\\\\\"`, `\\\\\\\\`). */\nfunction unquote(value: string): string {\n return value.replace(/^(['\"])(.*)\\1$/, (_match, quote: string, inner: string) =>\n quote === '\"' ? inner.replace(/\\\\([\"\\\\])/g, '$1') : inner,\n );\n}\n\n/**\n * Parse the leading YAML frontmatter block of a markdown string.\n *\n * Semantics (mirrors the app):\n * - Scalar `key: value` (key `/^[A-Za-z][\\w.-]*$/`, dots allow flat nested\n * keys like `book.title`): wrapping quotes stripped; bare numeric strings\n * become `number`, quoted scalars always stay strings.\n * - `key:` with empty value followed by indented `- item` lines → `string[]`.\n * - `key:` with empty value and no list items → `''`.\n * - Inline `key: [a, b]` stays a plain scalar string.\n */\nexport function parseFrontmatter(raw: string): ParsedFrontmatter {\n const match = raw.match(FRONTMATTER_RE);\n if (!match) return { meta: {}, body: raw };\n return { meta: parseMetaLines(match[1].split(/\\r?\\n/)), body: raw.slice(match[0].length) };\n}\n\nfunction parseMetaLines(lines: string[]): ParsedFrontmatter['meta'] {\n const meta: ParsedFrontmatter['meta'] = {};\n\n for (let i = 0; i < lines.length; i++) {\n const keyMatch = lines[i].match(/^([A-Za-z][\\w.-]*)\\s*:(.*)$/);\n if (!keyMatch) continue; // indented/nested/list lines are not top-level keys\n\n const key = keyMatch[1];\n const rawVal = keyMatch[2].trim();\n\n if (rawVal === '') {\n const items: string[] = [];\n while (i + 1 < lines.length) {\n const itemMatch = lines[i + 1].match(/^\\s+-\\s+(.+)$/);\n if (!itemMatch) break;\n items.push(itemMatch[1].trim());\n i++;\n }\n meta[key] = items.length > 0 ? items : '';\n } else {\n const wasQuoted = /^(['\"])(.*)\\1$/.test(rawVal);\n const value = unquote(rawVal);\n const num = Number(value);\n meta[key] = !wasQuoted && value !== '' && !isNaN(num) ? num : value;\n }\n }\n\n return meta;\n}\n\n/** Scalar value at `key`, or `undefined` when absent or a list. */\nexport function getScalar(\n meta: ParsedFrontmatter['meta'],\n key: string,\n): string | number | undefined {\n const value = meta[key];\n return typeof value === 'string' || typeof value === 'number' ? value : undefined;\n}\n\n/** List value at `key`, or `[]` when absent or a scalar. */\nexport function getList(meta: ParsedFrontmatter['meta'], key: string): string[] {\n const value = meta[key];\n return Array.isArray(value) ? value : [];\n}\n","export * from '@bitcobblers/wod-wiki-engine';\n","/** Compiles exact source, occurrence maps and sparse projections into atomic notes chunks. */\nimport { parseScript, whiteboardParser } from '@bitcobblers/wod-wiki-lang';\nimport { blockContentId, parseDocumentSections, reconcileNoteBlocks } from '@bitcobblers/wod-wiki-core';\nimport type { BlockEffort, BlockEquipment, BlockIndexRow } from '@bitcobblers/wod-wiki-storage';\nimport {\n buildDashboardDocument,\n isDashboardWidgetType,\n parseDashboardNote,\n parseQuery,\n resolveWidgetType,\n} from '@bitcobblers/wod-wiki-wql';\nimport {\n DASHBOARDS_CHUNK_ID,\n SEED_NAMESPACE,\n SEED_SCHEMA,\n SEED_REGISTERED_WIDGETS,\n canvasRouteSlug,\n seedNoteSourceId,\n notebookSlugForChunkId,\n type ManifestChunk,\n type NotebookIndex,\n type NotebookIndexSummary,\n type SeedManifest,\n type SeedRecordRef,\n type SeedRow,\n} from './contract';\nimport { fileToDisplayName } from './filename';\nimport { createReferenceIndex, extractStatementRefs, parseEffortFile, parseEquipmentFile, slugifyRefLabel, type IEffort, type IEquipment } from '@bitcobblers/wod-wiki-lang';\nimport { resolveGitVersion } from './git-version';\nimport { writeBuildReport } from './report';\nimport { getScalar, parseFrontmatter } from './frontmatter';\nimport { assertNotebookIndex, assertSeedManifest, assertSeedRows } from './validation';\nimport { createHash } from 'node:crypto';\nimport { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from 'node:fs';\nimport { execFileSync, execSync } from 'node:child_process';\nimport { dirname, join } from 'node:path';\n\n// BlockEffort/BlockIndexRow row types come from @bitcobblers/wod-wiki-storage\n// (type-only import — chunk rows are plain JSON applied structurally by the\n// app, mirroring cli/seed.ts).\n\n/** Scan `dir` recursively for `*.md` files; returns POSIX paths relative to `dir`, sorted. */\nfunction listMarkdownFiles(dir: string, prefix = ''): string[] {\n if (!existsSync(dir)) return [];\n const out: string[] = [];\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const rel = prefix ? `${prefix}/${entry.name}` : entry.name;\n if (entry.isDirectory()) out.push(...listMarkdownFiles(join(dir, entry.name), rel));\n else if (entry.isFile() && entry.name.endsWith('.md')) out.push(rel);\n }\n return out.sort();\n}\n\n// ── Types ─────────────────────────────────────────────────────────────────\n\nexport interface ChunkGroup {\n id: string;\n files: string[];\n}\n\nexport interface GenerateSeedOptions {\n /** The corpus directory (`markdown/`). Defaults to `<corpusRoot>/markdown`. */\n markdownDir?: string;\n /** Output directory. Defaults to `<corpusRoot>/dist`. */\n outDir?: string;\n /**\n * Explicit manifest version (tests). Defaults to the corpus repo's git\n * commit count — see git-version.ts.\n */\n version?: number;\n /** Repo root the corpus paths resolve against and versioning derives from. Defaults to cwd. */\n corpusRoot?: string;\n /** Automatically scaffold markdown files for newly discovered efforts. */\n scaffoldDiscoveredEfforts?: boolean;\n /** Repo-relative POSIX paths omitted from chunk rows and derived indexes. */\n excludePaths?: readonly string[];\n}\n\nexport interface GenerateSeedResult {\n manifest: SeedManifest;\n outDir: string;\n totalFiles: number;\n reportPath: string;\n /** ms timings per pass (mirrored into report.html). */\n passMs: { scan: number; blockIndex: number; parseGate: number; blockEfforts: number; write: number };\n}\n\n// ── Corpus partition ──────────────────────────────────────────────────────\n\n/**\n * Map one `markdown/…` path to its chunk id. Returns null for files outside\n * the known corpora — callers MUST treat that as a parity failure so new\n * content directories cannot bypass the seed.\n */\nexport function chunkIdFor(relPath: string): string | null {\n const parts = relPath.split('/');\n if (parts[0] !== 'markdown' || parts.length < 2) return null;\n const corpus = parts[1];\n // markdown/<corpus>/<rest…>; a file directly under markdown/ has no corpus.\n if (parts.length === 2) return null;\n const slug = parts[2]?.replace(/\\.md$/, '');\n switch (corpus) {\n case 'canvas':\n case 'dashboards':\n case 'efforts':\n case 'equipment':\n return corpus;\n case 'notebooks':\n return parts.length === 3 ? `notebook._root` : `notebook.${slug}`;\n default:\n return null;\n }\n}\n\n/** Scan the markdown corpus; returns repo-relative POSIX paths of all .md files. */\nexport function collectCorpusMarkdown(markdownDir: string, excludePaths: readonly string[] = []): string[] {\n const excluded = new Set(excludePaths);\n return listMarkdownFiles(markdownDir)\n .map((p) => `markdown/${p}`)\n .filter((path) => !excluded.has(path));\n}\n\n/** Group markdown corpus paths into chunk groups; throws on paths outside the known corpora. */\nexport function partitionIntoChunks(paths: string[]): ChunkGroup[] {\n const byId = new Map<string, string[]>();\n for (const p of paths) {\n const id = chunkIdFor(p);\n if (id === null) {\n throw new Error(\n `[generate-seed] Parity failure: '${p}' is not part of any known corpus ` +\n `(canvas | dashboards | efforts | equipment | notebooks). ` +\n `Extend chunkIdFor() if this is a new corpus.`,\n );\n }\n const list = byId.get(id);\n if (list) list.push(p);\n else byId.set(id, [p]);\n }\n return [...byId.entries()]\n .sort(([a], [b]) => (a < b ? -1 : 1))\n .map(([id, files]) => ({ id, files }));\n}\n\n// ── Dashboard gate (#906) ─────────────────────────────────────────────────\n\n/**\n * Validate one dashboard note in the locked #899 format: dashboard\n * frontmatter, a title, known widget types, WQL bodies that parse (and are\n * aggregate queries, not find queries), and every `$token` reference\n * declared. Returns the problems found (empty = valid).\n */\nexport function validateDashboardNote(raw: string): string[] {\n const problems: string[] = [];\n const { meta } = parseFrontmatter(raw);\n const { sections } = parseDashboardNote(raw);\n const doc = buildDashboardDocument(sections, meta);\n if (!doc.isDashboard) return ['file is not a dashboard note (missing dashboard frontmatter)'];\n if (doc.title === undefined) problems.push('dashboard has no title');\n if (doc.widgets.length < 3) problems.push(`dashboard has only ${doc.widgets.length} widgets (the locked format has ≥ 3)`);\n const declared = new Set(doc.tokens.map((t) => t.name));\n for (const widget of doc.widgets) {\n const where = `widget '${widget.title ?? widget.body.slice(0, 40)}'`;\n if (widget.title === undefined) problems.push(`${where}: missing title`);\n if (!isDashboardWidgetType(resolveWidgetType(widget.type))) {\n problems.push(`${where}: unknown widget type '${widget.type}'`);\n }\n const parsed = parseQuery(widget.body);\n if (parsed.error !== undefined) problems.push(`${where}: WQL parse error: ${parsed.error}`);\n for (const ref of [\n ...widget.body.matchAll(/\\$([A-Za-z][\\w-]*)/g),\n ...Object.values(widget.attributes).flatMap((v) => [...String(v).matchAll(/\\$([A-Za-z][\\w-]*)/g)]),\n ]) {\n if (!declared.has(ref[1])) problems.push(`${where}: undeclared token $${ref[1]}`);\n }\n }\n return problems;\n}\n\n/** Validate every dashboard file in a chunk group; throws on the first invalid file. */\nfunction gateDashboards(groups: ChunkGroup[], corpusRoot: string): void {\n for (const group of groups) {\n if (group.id !== DASHBOARDS_CHUNK_ID) continue;\n for (const p of group.files) {\n const problems = validateDashboardNote(readFileSync(join(corpusRoot, p), 'utf8'));\n if (problems.length > 0) {\n throw new Error(`[generate-seed] Dashboard validation failed for '${p}':\\n - ${problems.join('\\n - ')}`);\n }\n }\n }\n}\n\n// ── Block index derivation ────────────────────────────────────────────────\n\n\n/** Created-at from the corpus repo's git history (notebooks/guides), 0 fallback when unknown. */\nfunction getFileCreatedAt(file: string, repoRoot: string): number {\n try {\n const out = execSync(`git log -1 --format=%ct -- '${file}'`, { cwd: repoRoot, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();\n const ts = Number(out) * 1000;\n return Number.isFinite(ts) && ts > 0 ? ts : 0;\n } catch {\n return 0;\n }\n}\n\nexport function seedNoteIdSync(path: string): string {\n const hash = createHash('sha1').update(`${SEED_NAMESPACE}:${path}`).digest();\n const bytes = new Uint8Array(hash.subarray(0, 16));\n bytes[6] = (bytes[6] & 0x0f) | 0x50;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n return [...bytes].map((b, i) => ([4, 6, 8, 10].includes(i) ? `-${b.toString(16).padStart(2, '0')}` : b.toString(16).padStart(2, '0'))).join('');\n}\n\nexport function getFileCommit(file: string, repoRoot: string): string {\n try {\n return execFileSync('git', ['log', '-1', '--format=%H', '--', file], { cwd: repoRoot, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();\n } catch {\n return '';\n }\n}\n\nexport function getFileVersion(file: string, repoRoot: string): number {\n try {\n const out = execFileSync('git', ['rev-list', '--count', 'HEAD', '--', file], { cwd: repoRoot, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();\n const count = Number(out);\n return Number.isFinite(count) && count > 0 ? count : 1;\n } catch {\n return 1;\n }\n}\nexport function getPathVersion(targetPath: string, repoRoot: string): number {\n try {\n const out = execFileSync('git', ['rev-list', '--count', 'HEAD', '--', targetPath], { cwd: repoRoot, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();\n const count = Number(out);\n return Number.isFinite(count) && count > 0 ? count : 1;\n } catch {\n return 1;\n }\n}\n\nexport function getPathCommit(targetPath: string, repoRoot: string): string {\n try {\n return execFileSync('git', ['log', '-1', '--format=%H', '--', targetPath], { cwd: repoRoot, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();\n } catch {\n return '';\n }\n}\n\nexport function getPathUpdatedAt(targetPath: string, repoRoot: string): string | undefined {\n try {\n const out = execFileSync('git', ['log', '-1', '--format=%cI', '--', targetPath], { cwd: repoRoot, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();\n return out || undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function groupCorpusPath(id: string): string {\n if (id.startsWith('notebook.')) {\n const slug = id.slice('notebook.'.length);\n return slug === '_root' ? 'markdown/notebooks' : `markdown/notebooks/${slug}`;\n }\n return `markdown/${id}`;\n}\n\n/**\n * Frontmatter `date: YYYY-MM-DD` → epoch ms at noon UTC (mirrors the seed\n * importer's Note.date, so the block and note planes place a post on the\n * same civil day). Absent/empty → undefined; anything else that is not a\n * real calendar day throws — the build fails loudly instead of silently\n * misdating or rolling the post to another day.\n */\nexport function frontmatterDateToCreatedAt(raw: string, path: string): number | undefined {\n const value = getScalar(parseFrontmatter(raw).meta, 'date');\n if (value === undefined || value === '') return undefined;\n const text = String(value);\n const parts = text.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n const ts = parts ? Date.parse(`${text}T12:00:00Z`) : NaN;\n // Some engines roll impossible days (2026-02-30 → March 2) instead of\n // failing — round-trip the UTC components so the post can never silently\n // move to another day.\n const valid = !!parts && Number.isFinite(ts)\n && new Date(ts).getUTCMonth() === Number(parts[2]) - 1\n && new Date(ts).getUTCDate() === Number(parts[3]);\n if (!valid) {\n throw new Error(`[wod build] invalid frontmatter date '${text}' in '${path}' — expected a real calendar day (YYYY-MM-DD)`);\n }\n return ts;\n}\n\n/** Created-at timestamp for a dated notebook item's date key (`yyyy-mm-dd` from the path). */\nexport function dateKeyToCreatedAt(dateKey: string): number {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(dateKey)) return 0;\n const ts = Date.parse(`${dateKey}T00:00:00Z`);\n return Number.isNaN(ts) ? 0 : ts;\n}\n\n// canvasRouteSlug lives in contract.ts — one derivation shared by the\n// block plane (here) and the app's importer (note plane).\n\n\nexport function compileSeedRow(path: string, content: string, metadata: { routeId?: string; noteTitle?: string; sourceId?: string; createdAt?: number } = {}): SeedRow {\n let ordinal = 0;\n const blocks = reconcileNoteBlocks(content, { sourceRevision: 1, registeredWidgets: SEED_REGISTERED_WIDGETS, createId: () => `seed:${path}:${ordinal++}` });\n const noteId = metadata.routeId ?? path;\n const sections = parseDocumentSections(content);\n const blockIndex: BlockIndexRow[] = Object.values(blocks).map((block, position) => {\n const section = sections.find((section) => section.from === block.from && section.to === block.to);\n return { id: `${noteId}:${block.id}`, noteId, blockId: block.id, blockVersion: 1, sourceRevision: 1, from: block.from, to: block.to, position, dataType: block.kind, ...(block.kind === 'wod' ? { blockContentId: blockContentId(section?.scriptBlock?.content ?? content.slice(block.from, block.to)) } : {}), rawContent: content.slice(block.from, block.to), noteTitle: metadata.noteTitle ?? fileToDisplayName(path.split('/').at(-1) ?? path), createdAt: metadata.createdAt ?? 0, isStatic: true, sourceId: metadata.sourceId, sourcePath: path, routeId: metadata.routeId };\n });\n return { path, content, blocks, blockIndex, blockEfforts: [], blockEquipment: [] };\n}\n\nexport function buildBlockIndexRows(markdownDir: string, corpusRoot: string, excludePaths: readonly string[] = []): BlockIndexRow[] {\n const rows: BlockIndexRow[] = [];\n for (const path of collectCorpusMarkdown(markdownDir, excludePaths)) {\n const chunkId = chunkIdFor(path);\n if (!chunkId) continue;\n const content = readFileSync(join(corpusRoot, path), 'utf8');\n const parts = path.split('/');\n const stem = (parts.at(-1) ?? '').replace(/\\.md$/, '');\n const slug = parts[2];\n const routeId = chunkId === 'canvas' ? canvasRouteSlug(content) ?? undefined : chunkId.startsWith('notebook.') ? (stem.toLowerCase() === 'readme' ? slug : parts.slice(2).join('/').replace(/\\.md$/, '')) : undefined;\n const sourceId = seedNoteSourceId(path, content, chunkId);\n // Authored frontmatter date wins regardless of filename/directory; dated\n // notebooks keep their historical path-date placement, everything else\n // falls back to the corpus repo's git history.\n const createdAt = frontmatterDateToCreatedAt(content, path)\n ?? (chunkId.startsWith('notebook.') && /^\\d{4}-\\d{2}-\\d{2}$/.test(parts.at(-2) ?? '') ? dateKeyToCreatedAt(parts.at(-2) ?? '') : getFileCreatedAt(path, corpusRoot));\n rows.push(...compileSeedRow(path, content, { routeId, sourceId, createdAt }).blockIndex);\n }\n return rows;\n}\n\n/**\n * Syntax gate — every `wod` block's script must parse cleanly.\n *\n * Plain fences get a strict scan of the Lezer tree for error nodes\n * (`WhiteboardScript.errors` only carries mapper exceptions; the parser\n * recovers silently, so the tree is scanned directly) with `path:line`\n * diagnostics. Dialect-fenced blocks (`log:climbing`, …) are owned by the\n * dialect stack — their `key: value` lines are recovered by dialect\n * handlers, not the base grammar — so those gate on the exception channel\n * of a dialect-aware parse instead, matching how the app consumes them.\n */\nexport function validateWodBlockSyntax(blocks: BlockIndexRow[]): string[] {\n const problems: string[] = [];\n for (const block of blocks) {\n if (block.dataType !== 'wod' || !block.rawContent?.trim()) continue;\n const section = parseDocumentSections(block.rawContent, { registeredWidgets: SEED_REGISTERED_WIDGETS })\n .find((s) => s.scriptBlock);\n const source = section?.scriptBlock?.content ?? block.rawContent;\n if (!source.trim()) continue;\n\n const where = block.sourcePath ?? block.noteId;\n if (section?.sport) {\n const parsed = parseScript(source, { sport: section.sport });\n for (const error of parsed.errors ?? []) {\n problems.push(`${where}: ${error.message}`);\n }\n continue;\n }\n\n const doc = source.endsWith('\\n') ? source : source + '\\n';\n const tree = whiteboardParser.parse(doc);\n tree.iterate({\n enter: (node) => {\n if (!node.type.isError) return;\n const line = doc.slice(0, node.from).split('\\n').length;\n const snippet = source.slice(node.from, Math.min(node.to, node.from + 60)).split('\\n')[0];\n problems.push(`${where}:${line} \\`${snippet}\\``);\n },\n });\n }\n return problems;\n}\n\n/**\n * Uncataloged effort discovered during workout block analysis.\n */\nexport interface DiscoveredEffort {\n slug: string;\n label: string;\n rawLabels: string[];\n}\n\n/** Static lookup — syntax/structure keywords and known non-effort labels that must never scaffold. */\nconst NON_EFFORT_SLUGS: Record<string, true> = {\n 'amrap': true, 'emom': true, 'tabata': true, 'for-time': true, 'rounds': true, 'sets': true,\n 'repetitions': true, 'count-down': true, 'total-reps': true,\n 'warmup': true, 'cooldown': true, 'cool-down': true, 'transition': true, 'rest': true, 'break': true, 'work': true,\n 'i-suck-at-this': true, 'isuckatthis': true, 'movement': true, 'movement-you': true, 'selected-exercise': true,\n 'training-setup': true, 'grade-system': true, 'hangs': true, 'warm-light-wind': true, 'basin': true, 'rock-canyon': true,\n 'b-onsight': true, 'a-redpoint': true, 'd-redpoint': true, 'v0-flash': true, 'v2-flash': true, 'v7-redpoint': true,\n 'avgrpe-mean': true, 'calculate': true, 'totalload-sum': true, 'query': true, 'by': true,\n '': true, '-': true, '...': true, 'x': true, 's': true, 'bw': true,\n};\n\nfunction formatDiscoveredLabel(raw: string): string {\n const clean = raw.replace(/[-_]+/g, ' ').trim();\n return clean\n .split(/\\s+/)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())\n .join(' ');\n}\n\n/**\n * ONE corpus reference catalog — both definition families parsed once into\n * real arrays, the direct feed for lang's `createReferenceIndex`. Effort and\n * equipment containment rows, discovery and the runtime all resolve through\n * that single index, so the static plane and runtime agree on canonical\n * slugs with no per-family copies.\n */\nexport function loadCorpusReferenceCatalog(markdownDir: string): { efforts: IEffort[]; equipment: IEquipment[] } {\n const efforts: IEffort[] = [];\n const equipment: IEquipment[] = [];\n const effortsDir = join(markdownDir, 'efforts');\n for (const file of listMarkdownFiles(effortsDir)) {\n const parsed = parseEffortFile(readFileSync(join(effortsDir, file), 'utf8'));\n if (parsed) efforts.push(parsed);\n }\n const equipmentDir = join(markdownDir, 'equipment');\n for (const file of listMarkdownFiles(equipmentDir)) {\n const parsed = parseEquipmentFile(readFileSync(join(equipmentDir, file), 'utf8'));\n if (parsed) equipment.push(parsed);\n }\n return { efforts, equipment };\n}\n\nexport function discoverUncatalogedEfforts(markdownDir: string, corpusRoot: string, excludePaths: readonly string[] = []): DiscoveredEffort[] {\n const catalog = loadCorpusReferenceCatalog(markdownDir);\n const index = createReferenceIndex(catalog);\n const blocks = buildBlockIndexRows(markdownDir, corpusRoot, excludePaths);\n const discovered = new Map<string, { label: string; rawLabels: Set<string> }>();\n\n for (const block of blocks) {\n if (block.dataType !== 'wod' || !block.rawContent) continue;\n const section = parseDocumentSections(block.rawContent, { registeredWidgets: SEED_REGISTERED_WIDGETS }).find((section) => section.scriptBlock);\n const script = parseScript(section?.scriptBlock?.content ?? block.rawContent, { references: index });\n for (const statement of script.statements) {\n const effortMetric = statement.metrics?.getMetric?.('effort');\n const effortLabel = (effortMetric && typeof effortMetric.value === 'string' ? effortMetric.value : undefined) ?? statement.exerciseId;\n if (!effortLabel) continue;\n\n const slugified = slugifyRefLabel(effortLabel);\n if (!slugified || NON_EFFORT_SLUGS[slugified]) continue;\n\n // Known efforts are exactly the catalog's canonical slugs — discovery\n // only reports labels the shared index cannot resolve.\n if (index.resolveEffort(slugified) || index.resolveEffort(effortLabel)) continue;\n\n const existing = discovered.get(slugified);\n if (existing) {\n existing.rawLabels.add(effortLabel);\n } else {\n discovered.set(slugified, {\n label: formatDiscoveredLabel(effortLabel),\n rawLabels: new Set([effortLabel]),\n });\n }\n }\n }\n\n return Array.from(discovered.entries()).map(([slug, data]) => ({\n slug,\n label: data.label,\n rawLabels: Array.from(data.rawLabels),\n }));\n}\n\nexport function scaffoldDiscoveredEfforts(\n discovered: DiscoveredEffort[],\n markdownDir: string,\n): string[] {\n const targetDir = join(markdownDir, 'efforts', 'discovered');\n if (!existsSync(targetDir)) {\n mkdirSync(targetDir, { recursive: true });\n }\n\n const createdPaths: string[] = [];\n for (const effort of discovered) {\n const filePath = join(targetDir, `${effort.slug}.md`);\n if (existsSync(filePath)) continue;\n\n const aliases = effort.rawLabels\n .filter((l) => l.toLowerCase() !== effort.label.toLowerCase())\n .map((l) => ` - \"${l.replace(/\"/g, '\\\\\"')}\"`);\n\n const content = [\n '---',\n `id: effort-bundled-${effort.slug}`,\n `slug: ${effort.slug}`,\n `label: \"${effort.label.replace(/\"/g, '\\\\\"')}\"`,\n aliases.length > 0 ? `aliases:\\n${aliases.join('\\n')}` : 'aliases: []',\n 'baseAttributes:',\n ' met: 5.0',\n ' discipline: general',\n ' intensityTier: moderate',\n 'registrySource: bundled',\n '---',\n '',\n ].join('\\n');\n\n writeFileSync(filePath, content, 'utf8');\n createdPaths.push(filePath);\n }\n\n return createdPaths;\n}\n\n/**\n * Derive BlockEffort[] containment rows from the block-index row set.\n * Requires a second pass over the source markdown to parse the script AST\n * (with the corpus reference index configured, so statements carry canonical\n * refs), which is safe because the corpus is static and compile-time.\n *\n * Only VALIDATED refs enter the durable index: a slug that survives is\n * confirmed by the shared index (`resolveEffort`); uncataloged movements\n * produce no durable link — that is discovery's reporting job.\n */\nexport function buildBlockEffortRows(markdownDir: string, corpusRoot: string, blocks: BlockIndexRow[] = buildBlockIndexRows(markdownDir, corpusRoot)): BlockEffort[] {\n const efforts: BlockEffort[] = [];\n const index = createReferenceIndex(loadCorpusReferenceCatalog(markdownDir));\n for (const block of blocks) {\n if (block.dataType !== 'wod' || !block.rawContent) continue;\n const section = parseDocumentSections(block.rawContent, { registeredWidgets: SEED_REGISTERED_WIDGETS }).find((section) => section.scriptBlock);\n const script = parseScript(section?.scriptBlock?.content ?? block.rawContent, { references: index });\n const linked = new Set<string>();\n for (const rawSlug of extractStatementRefs(script.statements).efforts) {\n const canonical = index.resolveEffort(rawSlug);\n const canonicalSlug = canonical?.slug;\n if (!canonicalSlug || NON_EFFORT_SLUGS[canonicalSlug] || NON_EFFORT_SLUGS[rawSlug]) {\n continue;\n }\n if (linked.has(canonicalSlug)) continue;\n linked.add(canonicalSlug);\n efforts.push({\n id: `${block.id}:${canonicalSlug}`,\n noteId: block.noteId,\n blockId: block.blockId,\n blockContentId: block.blockContentId,\n effortSlug: canonicalSlug,\n isStatic: block.isStatic,\n sourcePath: block.sourcePath,\n createdAt: block.createdAt,\n });\n }\n }\n return efforts;\n}\n\n/**\n * Derive BlockEquipment[] containment rows — the equipment twin of\n * {@link buildBlockEffortRows}. Parsed with the corpus reference index so\n * statements carry canonical equipment refs; only slugs the shared index\n * confirms (`resolveEquipment`) produce a durable link. Unknown equipment\n * stays visible as authored source + parser diagnostics.\n */\nexport function buildBlockEquipmentRows(markdownDir: string, corpusRoot: string, blocks: BlockIndexRow[] = buildBlockIndexRows(markdownDir, corpusRoot)): BlockEquipment[] {\n const links: BlockEquipment[] = [];\n const index = createReferenceIndex(loadCorpusReferenceCatalog(markdownDir));\n for (const block of blocks) {\n if (block.dataType !== 'wod' || !block.rawContent) continue;\n const section = parseDocumentSections(block.rawContent, { registeredWidgets: SEED_REGISTERED_WIDGETS }).find((s) => s.scriptBlock);\n const script = parseScript(section?.scriptBlock?.content ?? block.rawContent, { references: index });\n const linked = new Set<string>();\n for (const rawSlug of extractStatementRefs(script.statements).equipment) {\n const canonicalSlug = index.resolveEquipment(rawSlug)?.slug;\n if (!canonicalSlug || linked.has(canonicalSlug)) continue;\n linked.add(canonicalSlug);\n links.push({\n id: `${block.id}:${canonicalSlug}`,\n noteId: block.noteId,\n blockId: block.blockId,\n blockContentId: block.blockContentId,\n equipmentSlug: canonicalSlug,\n isStatic: block.isStatic,\n sourcePath: block.sourcePath,\n createdAt: block.createdAt,\n });\n }\n }\n return links;\n}\n\n\n// ── Generation ────────────────────────────────────────────────────────────\n\nfunction sha256Hex(data: string | Buffer): string {\n return createHash('sha256').update(data).digest('hex');\n}\n\nexport function generateSeed(options: GenerateSeedOptions = {}): GenerateSeedResult {\n const t0 = Date.now();\n const passMs = { scan: 0, blockIndex: 0, parseGate: 0, blockEfforts: 0, write: 0 };\n const corpusRoot = options.corpusRoot ?? process.cwd();\n const markdownDir = options.markdownDir ?? join(corpusRoot, 'markdown');\n const outDir = options.outDir ?? join(corpusRoot, 'dist');\n const gitVersion = options.version !== undefined\n ? { ...resolveGitVersion(corpusRoot), version: options.version }\n : resolveGitVersion(corpusRoot);\n const packageFile = join(corpusRoot, 'package.json');\n const packageMetadata: unknown = existsSync(packageFile) ? JSON.parse(readFileSync(packageFile, 'utf8')) : {};\n const metadata = packageMetadata && typeof packageMetadata === 'object' ? packageMetadata : {};\n const repository = 'repository' in metadata ? metadata.repository : undefined;\n const repositoryUrl = typeof repository === 'string' ? repository : repository && typeof repository === 'object' && 'url' in repository && typeof repository.url === 'string' ? repository.url : undefined;\n const webRepositoryUrl = repositoryUrl?.replace(/^git\\+/, '').replace(/\\.git$/, '');\n const repositoryLink = webRepositoryUrl && URL.canParse(webRepositoryUrl) ? new URL(webRepositoryUrl) : undefined;\n if (options.scaffoldDiscoveredEfforts) {\n const discovered = discoverUncatalogedEfforts(markdownDir, corpusRoot, options.excludePaths);\n if (discovered.length > 0) {\n scaffoldDiscoveredEfforts(discovered, markdownDir);\n }\n }\n\n const tScan = Date.now();\n const paths = collectCorpusMarkdown(markdownDir, options.excludePaths);\n const groups = partitionIntoChunks(paths);\n gateDashboards(groups, corpusRoot);\n passMs.scan = Date.now() - tScan;\n\n const tBlockIndex = Date.now();\n const blockRows = buildBlockIndexRows(markdownDir, corpusRoot, options.excludePaths);\n passMs.blockIndex = Date.now() - tBlockIndex;\n const tParseGate = Date.now();\n const syntaxProblems = validateWodBlockSyntax(blockRows);\n passMs.parseGate = Date.now() - tParseGate;\n if (syntaxProblems.length > 0) {\n const shown = syntaxProblems.slice(0, 20).map((p) => ` ${p}`).join('\\n');\n const more = syntaxProblems.length > 20 ? `\\n … and ${syntaxProblems.length - 20} more` : '';\n throw new Error(`[wod build] block syntax gate failed — ${syntaxProblems.length} block(s) do not parse:\\n${shown}${more}`);\n }\n\n const chunksDir = join(outDir, 'chunks');\n rmSync(outDir, { recursive: true, force: true });\n mkdirSync(chunksDir, { recursive: true });\n\n const manifestChunks: ManifestChunk[] = [];\n const tBlockEfforts = Date.now();\n const effortRows = buildBlockEffortRows(markdownDir, corpusRoot, blockRows);\n const equipmentRows = buildBlockEquipmentRows(markdownDir, corpusRoot, blockRows);\n passMs.blockEfforts = Date.now() - tBlockEfforts;\n const blocksByPath = new Map<string, BlockIndexRow[]>();\n const effortsByPath = new Map<string, BlockEffort[]>();\n const equipmentByPath = new Map<string, BlockEquipment[]>();\n for (const row of blockRows) {\n const rows = blocksByPath.get(row.sourcePath!) ?? [];\n rows.push(row); blocksByPath.set(row.sourcePath!, rows);\n }\n for (const row of effortRows) {\n const rows = effortsByPath.get(row.sourcePath!) ?? [];\n rows.push(row); effortsByPath.set(row.sourcePath!, rows);\n }\n for (const row of equipmentRows) {\n const rows = equipmentByPath.get(row.sourcePath!) ?? [];\n rows.push(row); equipmentByPath.set(row.sourcePath!, rows);\n }\n let totalFiles = 0;\n const manifestNotebooks: NotebookIndexSummary[] = [];\n const manifestBuiltAt = new Date().toISOString();\n\n const tWrite = Date.now();\n for (const { id, files } of groups) {\n const records: SeedRecordRef[] = [];\n const rows: SeedRow[] = files.map((p) => {\n const raw = readFileSync(join(corpusRoot, p), 'utf8');\n const content = raw;\n const compiled = compileSeedRow(p, content);\n compiled.blockIndex = blocksByPath.get(p) ?? compiled.blockIndex;\n compiled.blockEfforts = effortsByPath.get(p) ?? [];\n compiled.blockEquipment = equipmentByPath.get(p) ?? [];\n const fileCommit = getFileCommit(p, corpusRoot) || gitVersion.commit || '';\n const fileVer = getFileVersion(p, corpusRoot);\n const uuid = seedNoteIdSync(p);\n compiled.commit = fileCommit;\n compiled.uuid = uuid;\n compiled.version = fileVer;\n\n // Write compiled record JSON alongside markdown\n const recordRelPath = p.replace(/\\.md$/, '.json');\n const recordOutFile = join(outDir, recordRelPath);\n mkdirSync(dirname(recordOutFile), { recursive: true });\n const recordBytes = Buffer.from(JSON.stringify(compiled, null, 2), 'utf8');\n writeFileSync(recordOutFile, recordBytes);\n\n const title = compiled.blockIndex[0]?.noteTitle ?? fileToDisplayName(p.split('/').at(-1) ?? p);\n records.push({\n uuid,\n path: p,\n recordPath: recordRelPath,\n commit: fileCommit,\n version: fileVer,\n sha256: sha256Hex(recordBytes),\n title,\n date: frontmatterDateToCreatedAt(content, p),\n });\n\n return compiled;\n });\n assertSeedRows(rows);\n const bytes = Buffer.from(JSON.stringify(rows), 'utf8');\n const sha = sha256Hex(bytes);\n const file = `chunks/${id}.${sha.slice(0, 8)}.json`;\n writeFileSync(join(outDir, file), bytes);\n manifestChunks.push({ id, path: file, sha256: sha, bytes: bytes.length, count: rows.length });\n totalFiles += rows.length;\n\n // Emit notebook index\n const groupPath = groupCorpusPath(id);\n const groupVersion = getPathVersion(groupPath, corpusRoot);\n const groupCommit = getPathCommit(groupPath, corpusRoot) || gitVersion.commit || '';\n const groupUpdatedAt = getPathUpdatedAt(groupPath, corpusRoot);\n\n const notebookIndexPath = `indexes/notebooks/${id}.json`;\n const summary: NotebookIndexSummary = {\n notebookId: id,\n label: fileToDisplayName(id.split('.').at(-1) ?? id),\n category: notebookSlugForChunkId(id),\n indexPath: notebookIndexPath,\n version: groupVersion,\n commit: groupCommit,\n updatedAt: groupUpdatedAt,\n builtAt: manifestBuiltAt,\n sha256: sha,\n bytes: bytes.length,\n count: rows.length,\n };\n const notebookIndex: NotebookIndex = {\n ...summary,\n records,\n };\n assertNotebookIndex(notebookIndex);\n const indexOutFile = join(outDir, notebookIndexPath);\n mkdirSync(dirname(indexOutFile), { recursive: true });\n writeFileSync(indexOutFile, JSON.stringify(notebookIndex, null, 2) + '\\n');\n manifestNotebooks.push(summary);\n }\n\n passMs.write = Date.now() - tWrite;\n\n const manifest: SeedManifest = {\n name: 'name' in metadata && typeof metadata.name === 'string' ? metadata.name : undefined,\n description: 'description' in metadata && typeof metadata.description === 'string' ? metadata.description : undefined,\n repositoryUrl: repositoryLink?.protocol === 'https:' && !repositoryLink.username && !repositoryLink.password ? repositoryLink.href : undefined,\n schema: SEED_SCHEMA,\n version: gitVersion.version,\n versionLabel: gitVersion.versionLabel,\n commit: gitVersion.commit,\n dirty: gitVersion.dirty,\n builtAt: manifestBuiltAt,\n chunks: manifestChunks,\n notebooks: manifestNotebooks,\n };\n assertSeedManifest(manifest);\n writeFileSync(join(outDir, 'manifest.json'), JSON.stringify(manifest, null, 2) + '\\n');\n\n const reportPath = writeBuildReport(outDir, {\n manifest,\n totalMs: Date.now() - t0,\n passMs,\n fileCount: paths.length,\n outDir,\n });\n\n return { manifest, outDir, totalFiles, reportPath, passMs };\n}\n"]}
@@ -0,0 +1,28 @@
1
+ import { createRequire } from 'module';
2
+
3
+ if (typeof globalThis.require === 'undefined') {
4
+ try { globalThis.require = createRequire(import.meta.url); } catch {}
5
+ }
6
+ var __defProp = Object.defineProperty;
7
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
8
+ var __getOwnPropNames = Object.getOwnPropertyNames;
9
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
10
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
11
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
12
+ }) : x)(function(x) {
13
+ if (typeof require !== "undefined") return require.apply(this, arguments);
14
+ throw Error('Dynamic require of "' + x + '" is not supported');
15
+ });
16
+ var __copyProps = (to, from, except, desc) => {
17
+ if (from && typeof from === "object" || typeof from === "function") {
18
+ for (let key of __getOwnPropNames(from))
19
+ if (!__hasOwnProp.call(to, key) && key !== except)
20
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
21
+ }
22
+ return to;
23
+ };
24
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
25
+
26
+ export { __reExport, __require };
27
+ //# sourceMappingURL=chunk-QUUX6NX2.mjs.map
28
+ //# sourceMappingURL=chunk-QUUX6NX2.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-6L5ZDZJ7.mjs"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-QUUX6NX2.mjs"}
@@ -1,5 +1,5 @@
1
1
  import { createRequire } from 'module';
2
- import { openCliDb, nodePath, nodeFs } from './chunk-F7IXIJ4I.mjs';
2
+ import { openCliDb, nodePath, nodeFs } from './chunk-ZUZMRH3G.mjs';
3
3
  import { createHandler } from './chunk-V23POHG2.mjs';
4
4
  import http from 'http';
5
5
  import { Readable } from 'stream';
@@ -161,5 +161,5 @@ async function runCliServer(mode, options, writeOut) {
161
161
  }
162
162
 
163
163
  export { runCliServer };
164
- //# sourceMappingURL=chunk-FSOBPDUC.mjs.map
165
- //# sourceMappingURL=chunk-FSOBPDUC.mjs.map
164
+ //# sourceMappingURL=chunk-Z2IQPTDI.mjs.map
165
+ //# sourceMappingURL=chunk-Z2IQPTDI.mjs.map