@bitcobblers/wod-wiki-tools 0.53.2204 → 0.54.2205
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agentCommands-AMMASJPH.mjs +586 -0
- package/dist/agentCommands-AMMASJPH.mjs.map +1 -0
- package/dist/bin/wod.cjs +1071 -29
- package/dist/bin/wod.cjs.map +1 -1
- package/dist/bin/wod.mjs +2 -2
- package/dist/{chunk-LNBKPHEP.mjs → chunk-AS6OJRNH.mjs} +9 -4
- package/dist/chunk-AS6OJRNH.mjs.map +1 -0
- package/dist/{chunk-SLCRIGUR.mjs → chunk-KXNK4PIB.mjs} +168 -28
- package/dist/chunk-KXNK4PIB.mjs.map +1 -0
- package/dist/{chunk-5NNSHRMZ.mjs → chunk-T7VB7PPO.mjs} +3 -3
- package/dist/chunk-T7VB7PPO.mjs.map +1 -0
- package/dist/{chunk-2EWCEE6N.mjs → chunk-WLCUM7KO.mjs} +106 -6
- package/dist/chunk-WLCUM7KO.mjs.map +1 -0
- package/dist/chunk-ZZVL6UGV.mjs +144 -0
- package/dist/chunk-ZZVL6UGV.mjs.map +1 -0
- package/dist/index.cjs +1075 -29
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +68 -3
- package/dist/index.d.ts +68 -3
- package/dist/index.mjs +5 -4
- package/dist/mcp-D6QARYOG.mjs +73 -0
- package/dist/mcp-D6QARYOG.mjs.map +1 -0
- package/dist/{scaffoldFeed-TCRNXYQU.mjs → scaffoldFeed-D55NINVJ.mjs} +3 -3
- package/dist/{scaffoldFeed-TCRNXYQU.mjs.map → scaffoldFeed-D55NINVJ.mjs.map} +1 -1
- package/dist/server/app.cjs +239 -2
- package/dist/server/app.cjs.map +1 -1
- package/dist/server/app.d.cts +2 -0
- package/dist/server/app.d.ts +2 -0
- package/dist/server/app.mjs +3 -1
- package/dist/server-2GTVPJDA.mjs +13 -0
- package/dist/{server-SHNWCIIM.mjs.map → server-2GTVPJDA.mjs.map} +1 -1
- package/dist/skills/README.md +3 -0
- package/dist/skills/wod-agent-parity/SKILL.md +41 -0
- package/dist/skills/wod-cli/SKILL.md +127 -0
- package/dist/skills/wod-wql/SKILL.md +63 -0
- package/dist/web/playground/ai-skills/agent-parity.md +41 -0
- package/dist/web/playground/ai-skills/cli.md +127 -0
- package/dist/web/playground/ai-skills/wql.md +63 -0
- package/dist/web/playground/assets/main-BH_SMMzT.css +2 -0
- package/dist/web/playground/assets/main-vYMBKnsB.js +1152 -0
- package/dist/web/playground/assets/{statementBuilderFlow-CQWO7k9W.js → statementBuilderFlow-D8GG8Y7r.js} +2 -2
- package/dist/web/playground/assets/vendor-BUlwHBNF.js +255 -0
- package/dist/web/playground/assets/{vendor-codemirror-B4BeZarI.js → vendor-codemirror-Bh6hyz5v.js} +11 -11
- package/dist/web/playground/index.html +4 -4
- package/dist/web/playground/llms-full.txt +1444 -0
- package/dist/web/playground/llms.txt +67 -0
- package/dist/web/{server/seed/core/chunks/canvas.deac64e3.json → playground/seed/core/chunks/canvas.b0bc465b.json} +1 -1
- package/dist/web/playground/seed/core/chunks/{dashboards.08301ab4.json → dashboards.af9a29e4.json} +1 -1
- package/dist/web/playground/seed/core/chunks/{efforts.47f650fe.json → efforts.902271f9.json} +1 -1
- package/dist/web/playground/seed/core/chunks/{equipment.79146d31.json → equipment.dbdc1af3.json} +1 -1
- package/dist/web/playground/seed/core/indexes/notebooks/canvas.json +180 -180
- package/dist/web/playground/seed/core/indexes/notebooks/dashboards.json +16 -16
- package/dist/web/playground/seed/core/indexes/notebooks/efforts.json +326 -326
- package/dist/web/playground/seed/core/indexes/notebooks/equipment.json +50 -50
- package/dist/web/playground/seed/core/manifest.json +27 -27
- package/dist/web/playground/seed/core/markdown/canvas/ai-first/README.json +1 -1
- package/dist/web/playground/seed/core/markdown/canvas/guide/README.json +4 -4
- package/dist/web/playground/seed/core/markdown/canvas/guide/clock.json +1 -1
- package/dist/web/playground/seed/core/markdown/canvas/guide/dashboards.json +1 -1
- package/dist/web/playground/seed/core/markdown/canvas/guide/metrics-summaries.json +2 -2
- package/dist/web/playground/seed/core/markdown/canvas/guide/metrics.json +12 -12
- package/dist/web/playground/seed/core/markdown/canvas/guide/protocols.json +20 -20
- package/dist/web/playground/seed/core/markdown/canvas/guide/sessions.json +33 -33
- package/dist/web/playground/seed/core/markdown/canvas/guide/start.json +11 -11
- package/dist/web/playground/seed/core/markdown/canvas/guide/structure.json +25 -25
- package/dist/web/playground/seed/core/markdown/canvas/guide/wql.json +5 -5
- package/dist/web/playground/seed/core/markdown/canvas/home/sample-script.json +4 -4
- package/dist/web/playground/seed/core/markdown/canvas/home/welcome-1.json +2 -2
- package/dist/web/playground/seed/core/markdown/canvas/syntax/actions-comments.json +4 -4
- package/dist/web/playground/seed/core/markdown/canvas/syntax/alternating-emom.json +5 -5
- package/dist/web/playground/seed/core/markdown/canvas/syntax/basic-emom.json +4 -4
- package/dist/web/playground/seed/core/markdown/canvas/syntax/calculated-metrics.json +4 -4
- package/dist/web/playground/seed/core/markdown/canvas/syntax/classic-amrap.json +6 -6
- package/dist/web/playground/seed/core/markdown/canvas/syntax/complex-barbell-cycling.json +4 -4
- package/dist/web/playground/seed/core/markdown/canvas/syntax/complex-full-session.json +10 -10
- package/dist/web/playground/seed/core/markdown/canvas/syntax/complex-nested-protocols.json +7 -7
- package/dist/web/playground/seed/core/markdown/canvas/syntax/complex-partner-workout.json +7 -7
- package/dist/web/playground/seed/core/markdown/canvas/syntax/complex-swimming.json +5 -5
- package/dist/web/playground/seed/core/markdown/canvas/syntax/core-rules.json +4 -4
- package/dist/web/playground/seed/core/markdown/canvas/syntax/custom-and-calculated-metrics.json +4 -4
- package/dist/web/playground/seed/core/markdown/canvas/syntax/custom-intervals.json +4 -4
- package/dist/web/playground/seed/core/markdown/canvas/syntax/custom-metrics-1.json +4 -4
- package/dist/web/playground/seed/core/markdown/canvas/syntax/custom-metrics-2.json +5 -5
- package/dist/web/playground/seed/core/markdown/canvas/syntax/custom-metrics-3.json +3 -3
- package/dist/web/playground/seed/core/markdown/canvas/syntax/custom-metrics-4.json +4 -4
- package/dist/web/playground/seed/core/markdown/canvas/syntax/custom-metrics-5.json +4 -4
- package/dist/web/playground/seed/core/markdown/canvas/syntax/dialect-climb-bouldering.json +2 -2
- package/dist/web/playground/seed/core/markdown/canvas/syntax/dialect-climb-hangboard.json +2 -2
- package/dist/web/playground/seed/core/markdown/canvas/syntax/dialect-climb-sport.json +2 -2
- package/dist/web/playground/seed/core/markdown/canvas/syntax/dialect-log.json +4 -4
- package/dist/web/playground/seed/core/markdown/canvas/syntax/dialect-plan.json +8 -8
- package/dist/web/playground/seed/core/markdown/canvas/syntax/dialect-wod.json +5 -5
- package/dist/web/playground/seed/core/markdown/canvas/syntax/distance-intervals.json +3 -3
- package/dist/web/playground/seed/core/markdown/canvas/syntax/document-1.json +4 -4
- package/dist/web/playground/seed/core/markdown/canvas/syntax/document-2.json +5 -5
- package/dist/web/playground/seed/core/markdown/canvas/syntax/document-3.json +10 -10
- package/dist/web/playground/seed/core/markdown/canvas/syntax/document-4.json +5 -5
- package/dist/web/playground/seed/core/markdown/canvas/syntax/effort-notes.json +5 -5
- package/dist/web/playground/seed/core/markdown/canvas/syntax/frontmatter-summaries.json +4 -4
- package/dist/web/playground/seed/core/markdown/canvas/syntax/groups-1.json +5 -5
- package/dist/web/playground/seed/core/markdown/canvas/syntax/groups-2.json +6 -6
- package/dist/web/playground/seed/core/markdown/canvas/syntax/groups-3.json +3 -3
- package/dist/web/playground/seed/core/markdown/canvas/syntax/groups-4.json +3 -3
- package/dist/web/playground/seed/core/markdown/canvas/syntax/longer-duration.json +4 -4
- package/dist/web/playground/seed/core/markdown/canvas/syntax/longer-intervals.json +4 -4
- package/dist/web/playground/seed/core/markdown/canvas/syntax/measurements.json +7 -7
- package/dist/web/playground/seed/core/markdown/canvas/syntax/metrics-1.json +5 -5
- package/dist/web/playground/seed/core/markdown/canvas/syntax/metrics-2.json +7 -7
- package/dist/web/playground/seed/core/markdown/canvas/syntax/metrics-3.json +8 -8
- package/dist/web/playground/seed/core/markdown/canvas/syntax/metrics-4.json +6 -6
- package/dist/web/playground/seed/core/markdown/canvas/syntax/metrics-5.json +5 -5
- package/dist/web/playground/seed/core/markdown/canvas/syntax/mixed-sections.json +10 -10
- package/dist/web/playground/seed/core/markdown/canvas/syntax/mixed-timers.json +5 -5
- package/dist/web/playground/seed/core/markdown/canvas/syntax/multiple-amrap-windows.json +7 -7
- package/dist/web/playground/seed/core/markdown/canvas/syntax/multiple-sets.json +4 -4
- package/dist/web/playground/seed/core/markdown/canvas/syntax/named-groups.json +6 -6
- package/dist/web/playground/seed/core/markdown/canvas/syntax/protocols-1.json +6 -6
- package/dist/web/playground/seed/core/markdown/canvas/syntax/protocols-2.json +4 -4
- package/dist/web/playground/seed/core/markdown/canvas/syntax/protocols-3.json +6 -6
- package/dist/web/playground/seed/core/markdown/canvas/syntax/protocols-4.json +3 -3
- package/dist/web/playground/seed/core/markdown/canvas/syntax/protocols-5.json +4 -4
- package/dist/web/playground/seed/core/markdown/canvas/syntax/single-movement.json +3 -3
- package/dist/web/playground/seed/core/markdown/canvas/syntax/supplemental-1.json +4 -4
- package/dist/web/playground/seed/core/markdown/canvas/syntax/supplemental-2.json +5 -5
- package/dist/web/playground/seed/core/markdown/canvas/syntax/supplemental-3.json +4 -4
- package/dist/web/playground/seed/core/markdown/canvas/syntax/supplemental-4.json +4 -4
- package/dist/web/playground/seed/core/markdown/canvas/syntax/time-cap.json +6 -6
- package/dist/web/playground/seed/core/markdown/canvas/syntax/timer-modifiers.json +6 -6
- package/dist/web/playground/seed/core/markdown/canvas/syntax/timers-1.json +6 -6
- package/dist/web/playground/seed/core/markdown/canvas/syntax/timers-2.json +4 -4
- package/dist/web/playground/seed/core/markdown/canvas/syntax/timers-3.json +4 -4
- package/dist/web/playground/seed/core/markdown/canvas/syntax/timers-4.json +4 -4
- package/dist/web/playground/seed/core/markdown/canvas/syntax/timers-5.json +5 -5
- package/dist/web/playground/seed/core/markdown/canvas/syntax/timers-rest.json +4 -4
- package/dist/web/playground/seed/core/markdown/canvas/wql-presets/aggregate-by-effort.json +2 -2
- package/dist/web/playground/seed/core/markdown/canvas/wql-presets/aggregate-by-week.json +2 -2
- package/dist/web/playground/seed/core/markdown/canvas/wql-presets/content-fran.json +2 -2
- package/dist/web/playground/seed/core/markdown/canvas/wql-presets/filter-combos.json +2 -2
- package/dist/web/playground/seed/core/markdown/canvas/wql-presets/pipes-limit.json +2 -2
- package/dist/web/playground/seed/core/markdown/canvas/wql-presets/session-rpe.json +2 -2
- package/dist/web/playground/seed/core/markdown/canvas/wql-presets/source-journal.json +2 -2
- package/dist/web/playground/seed/core/markdown/canvas/wql-presets/tis-trend.json +2 -2
- package/dist/web/playground/seed/core/markdown/canvas/wql-presets/where-join.json +2 -2
- package/dist/web/playground/seed/core/markdown/dashboards/benchmark-pr-board.json +6 -6
- package/dist/web/playground/seed/core/markdown/dashboards/finger-strength-v8.json +5 -5
- package/dist/web/playground/seed/core/markdown/dashboards/polarized-base-marathon.json +9 -9
- package/dist/web/playground/seed/core/markdown/dashboards/recovery-readiness.json +7 -7
- package/dist/web/playground/seed/core/markdown/dashboards/road-to-560-total.json +9 -9
- package/dist/web/playground/seed/core/markdown/dashboards/training-block-review.json +11 -11
- package/dist/web/playground/seed/core/markdown/efforts/bodyweight/air-squat.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/bodyweight/box-jump.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/bodyweight/broad-jump.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/bodyweight/burpee-box-jump-over.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/bodyweight/burpee-over-dumbbell.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/bodyweight/burpee.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/bodyweight/dumbbell-squat-clean.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/bodyweight/ghd-sit-up.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/bodyweight/ground-kong.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/bodyweight/jumping-jack.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/bodyweight/kong-walk.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/bodyweight/lunge.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/bodyweight/overhead-squat.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/bodyweight/parkour-roll.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/bodyweight/parkour-squat.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/bodyweight/pistol-squat.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/bodyweight/plank.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/bodyweight/precision-burpee.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/bodyweight/precision-jump.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/bodyweight/quadrupedal-movement.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/bodyweight/russian-twist.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/bodyweight/sit-up.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/bodyweight/squat-clean.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/bodyweight/squat-hold.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/bodyweight/squat-snatch.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/bodyweight/tuck-jump.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/bodyweight/wall-ball.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/bodyweight/wall-burpee.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/cycling/assault-bike.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/cycling/cycling-moderate.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/cycling/cycling-vigorous.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/gymnastics/assisted-pull-up.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/gymnastics/burpee-pull-up.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/gymnastics/chest-to-bar-pull-up.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/gymnastics/dip.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/gymnastics/double-under.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/gymnastics/handstand-hold.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/gymnastics/handstand-push-up.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/gymnastics/handstand-walk.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/gymnastics/jump-rope.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/gymnastics/jumping-pull-up.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/gymnastics/jumping-push-up.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/gymnastics/l-sit-pull-up.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/gymnastics/muscle-up.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/gymnastics/pull-up.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/gymnastics/push-up.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/gymnastics/reverse-wall-dip.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/gymnastics/rope-climb.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/gymnastics/toes-to-bar.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-arm-bar.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-around-the-world.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-bent-over-row.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-clean-and-jerk.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-clean-and-press.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-clean.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-deadlift.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-floor-press.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-front-squat.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-goblet-squat.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-gorilla-row.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-halo.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-jerk.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-overhead-squat.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-press.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-snatch.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-swing.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-windmill.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/kettlebell/turkish-get-up.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/recovery/rest.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/recovery/stretching.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/rowing/rowing-sprint.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/rowing/rowing.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/rowing/ski-erg.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/running/backward-running.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/running/running-6-mph.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/running/running-8-mph.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/running/running-sprint.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/snatch.json +2 -2
- package/dist/web/playground/seed/core/markdown/efforts/strength/back-squat.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/bench-press.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/box-step-up.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/carioca.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/clean-and-jerk.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/cluster.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/dead-hang.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/deadlift.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/devils-press.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/dumbbell-box-step-up.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/dumbbell-clean.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/dumbbell-fly.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/dumbbell-row.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/dumbbell-snatch.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/dumbbell-thruster.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/elbows-to-knees.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/farmer-carry.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/frog-stand.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/front-squat.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/good-morning.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/hanging-leg-raise.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/hollow-rock.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/knees-to-elbows.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/l-sit.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/man-maker.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/medicine-ball-clean.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/overhead-press.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/parkour-vault.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/pig-flip.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/power-clean.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/power-snatch.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/push-jerk.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/push-press.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/romanian-deadlift.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/single-leg-deadlift.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/skull-crusher.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/slam-ball.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/sled-pull.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/sled-push.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/sumo-deadlift.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/thruster.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/triceps-extension.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/v-sit-hold.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/wall-walk.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/strength/yoga-sun-salutation.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-assisted-sprint.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-backstroke.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-breaststroke-kick.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-breaststroke.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-butterfly.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-catch-up-drill.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-choice-stroke.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-dive-start.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-dolphin-kick.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-drafting.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-fingertip-drag.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-freestyle.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-individual-medley.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-kick.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-pull.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-resisted-sprint.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-rotation-drill.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-sighting.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-single-arm-drill.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-stroke-transition.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-two-kick-one-pull.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-vigorous.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/unconventional/clubbell-arm-cast.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/unconventional/clubbell-circles.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/unconventional/clubbell-mill.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/unconventional/clubbell-reverse-mill.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/unconventional/clubbell-shield-cast.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/unconventional/macebell-10-to-2-swing.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/unconventional/macebell-360-swing.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/unconventional/macebell-barbarian-squat.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/unconventional/macebell-flow.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/unconventional/macebell-gravedigger.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/unconventional/macebell-touchdown.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/unconventional/sandbag-bear-hug-carry.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/unconventional/sandbag-bear-hug-extension.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/unconventional/sandbag-over-shoulder.json +1 -1
- package/dist/web/playground/seed/core/markdown/efforts/walking/walking-3-mph.json +1 -1
- package/dist/web/playground/seed/core/markdown/equipment/air-bike.json +1 -1
- package/dist/web/playground/seed/core/markdown/equipment/barbell.json +1 -1
- package/dist/web/playground/seed/core/markdown/equipment/bench.json +1 -1
- package/dist/web/playground/seed/core/markdown/equipment/bike-erg.json +1 -1
- package/dist/web/playground/seed/core/markdown/equipment/climbing-rope.json +1 -1
- package/dist/web/playground/seed/core/markdown/equipment/clubs.json +1 -1
- package/dist/web/playground/seed/core/markdown/equipment/dumbbell.json +1 -1
- package/dist/web/playground/seed/core/markdown/equipment/ghd.json +1 -1
- package/dist/web/playground/seed/core/markdown/equipment/gymnastic-rings.json +1 -1
- package/dist/web/playground/seed/core/markdown/equipment/jump-rope.json +1 -1
- package/dist/web/playground/seed/core/markdown/equipment/kettlebell.json +1 -1
- package/dist/web/playground/seed/core/markdown/equipment/macebell.json +1 -1
- package/dist/web/playground/seed/core/markdown/equipment/medicine-ball.json +1 -1
- package/dist/web/playground/seed/core/markdown/equipment/parallettes.json +1 -1
- package/dist/web/playground/seed/core/markdown/equipment/plyo-box.json +1 -1
- package/dist/web/playground/seed/core/markdown/equipment/pull-up-bar.json +1 -1
- package/dist/web/playground/seed/core/markdown/equipment/rower.json +1 -1
- package/dist/web/playground/seed/core/markdown/equipment/sandbag.json +1 -1
- package/dist/web/playground/seed/core/markdown/equipment/ski-erg.json +1 -1
- package/dist/web/playground/seed/core/markdown/equipment/slam-ball.json +1 -1
- package/dist/web/playground/seed/core/markdown/equipment/sled.json +1 -1
- package/dist/web/playground/seed/core/markdown/equipment/sledgehammer.json +1 -1
- package/dist/web/playground/seed/core/markdown/equipment/weight-vest.json +1 -1
- package/dist/web/playground/seed/core/report.html +13 -13
- package/dist/web/server/ai-skills/agent-parity.md +41 -0
- package/dist/web/server/ai-skills/cli.md +127 -0
- package/dist/web/server/ai-skills/wql.md +63 -0
- package/dist/web/server/assets/main-BH_SMMzT.css +2 -0
- package/dist/web/server/assets/main-D0W-D5YL.js +1152 -0
- package/dist/web/server/assets/{statementBuilderFlow-C7x-7JGx.js → statementBuilderFlow-CtmmV_Yv.js} +2 -2
- package/dist/web/server/assets/vendor-BUlwHBNF.js +255 -0
- package/dist/web/server/assets/{vendor-codemirror-B4BeZarI.js → vendor-codemirror-Bh6hyz5v.js} +11 -11
- package/dist/web/server/index.html +4 -4
- package/dist/web/server/llms-full.txt +1444 -0
- package/dist/web/server/llms.txt +67 -0
- package/dist/web/{playground/seed/core/chunks/canvas.deac64e3.json → server/seed/core/chunks/canvas.b0bc465b.json} +1 -1
- package/dist/web/server/seed/core/chunks/{dashboards.08301ab4.json → dashboards.af9a29e4.json} +1 -1
- package/dist/web/server/seed/core/chunks/{efforts.47f650fe.json → efforts.902271f9.json} +1 -1
- package/dist/web/server/seed/core/chunks/{equipment.79146d31.json → equipment.dbdc1af3.json} +1 -1
- package/dist/web/server/seed/core/indexes/notebooks/canvas.json +180 -180
- package/dist/web/server/seed/core/indexes/notebooks/dashboards.json +16 -16
- package/dist/web/server/seed/core/indexes/notebooks/efforts.json +326 -326
- package/dist/web/server/seed/core/indexes/notebooks/equipment.json +50 -50
- package/dist/web/server/seed/core/manifest.json +27 -27
- package/dist/web/server/seed/core/markdown/canvas/ai-first/README.json +1 -1
- package/dist/web/server/seed/core/markdown/canvas/guide/README.json +4 -4
- package/dist/web/server/seed/core/markdown/canvas/guide/clock.json +1 -1
- package/dist/web/server/seed/core/markdown/canvas/guide/dashboards.json +1 -1
- package/dist/web/server/seed/core/markdown/canvas/guide/metrics-summaries.json +2 -2
- package/dist/web/server/seed/core/markdown/canvas/guide/metrics.json +12 -12
- package/dist/web/server/seed/core/markdown/canvas/guide/protocols.json +20 -20
- package/dist/web/server/seed/core/markdown/canvas/guide/sessions.json +33 -33
- package/dist/web/server/seed/core/markdown/canvas/guide/start.json +11 -11
- package/dist/web/server/seed/core/markdown/canvas/guide/structure.json +25 -25
- package/dist/web/server/seed/core/markdown/canvas/guide/wql.json +5 -5
- package/dist/web/server/seed/core/markdown/canvas/home/sample-script.json +4 -4
- package/dist/web/server/seed/core/markdown/canvas/home/welcome-1.json +2 -2
- package/dist/web/server/seed/core/markdown/canvas/syntax/actions-comments.json +4 -4
- package/dist/web/server/seed/core/markdown/canvas/syntax/alternating-emom.json +5 -5
- package/dist/web/server/seed/core/markdown/canvas/syntax/basic-emom.json +4 -4
- package/dist/web/server/seed/core/markdown/canvas/syntax/calculated-metrics.json +4 -4
- package/dist/web/server/seed/core/markdown/canvas/syntax/classic-amrap.json +6 -6
- package/dist/web/server/seed/core/markdown/canvas/syntax/complex-barbell-cycling.json +4 -4
- package/dist/web/server/seed/core/markdown/canvas/syntax/complex-full-session.json +10 -10
- package/dist/web/server/seed/core/markdown/canvas/syntax/complex-nested-protocols.json +7 -7
- package/dist/web/server/seed/core/markdown/canvas/syntax/complex-partner-workout.json +7 -7
- package/dist/web/server/seed/core/markdown/canvas/syntax/complex-swimming.json +5 -5
- package/dist/web/server/seed/core/markdown/canvas/syntax/core-rules.json +4 -4
- package/dist/web/server/seed/core/markdown/canvas/syntax/custom-and-calculated-metrics.json +4 -4
- package/dist/web/server/seed/core/markdown/canvas/syntax/custom-intervals.json +4 -4
- package/dist/web/server/seed/core/markdown/canvas/syntax/custom-metrics-1.json +4 -4
- package/dist/web/server/seed/core/markdown/canvas/syntax/custom-metrics-2.json +5 -5
- package/dist/web/server/seed/core/markdown/canvas/syntax/custom-metrics-3.json +3 -3
- package/dist/web/server/seed/core/markdown/canvas/syntax/custom-metrics-4.json +4 -4
- package/dist/web/server/seed/core/markdown/canvas/syntax/custom-metrics-5.json +4 -4
- package/dist/web/server/seed/core/markdown/canvas/syntax/dialect-climb-bouldering.json +2 -2
- package/dist/web/server/seed/core/markdown/canvas/syntax/dialect-climb-hangboard.json +2 -2
- package/dist/web/server/seed/core/markdown/canvas/syntax/dialect-climb-sport.json +2 -2
- package/dist/web/server/seed/core/markdown/canvas/syntax/dialect-log.json +4 -4
- package/dist/web/server/seed/core/markdown/canvas/syntax/dialect-plan.json +8 -8
- package/dist/web/server/seed/core/markdown/canvas/syntax/dialect-wod.json +5 -5
- package/dist/web/server/seed/core/markdown/canvas/syntax/distance-intervals.json +3 -3
- package/dist/web/server/seed/core/markdown/canvas/syntax/document-1.json +4 -4
- package/dist/web/server/seed/core/markdown/canvas/syntax/document-2.json +5 -5
- package/dist/web/server/seed/core/markdown/canvas/syntax/document-3.json +10 -10
- package/dist/web/server/seed/core/markdown/canvas/syntax/document-4.json +5 -5
- package/dist/web/server/seed/core/markdown/canvas/syntax/effort-notes.json +5 -5
- package/dist/web/server/seed/core/markdown/canvas/syntax/frontmatter-summaries.json +4 -4
- package/dist/web/server/seed/core/markdown/canvas/syntax/groups-1.json +5 -5
- package/dist/web/server/seed/core/markdown/canvas/syntax/groups-2.json +6 -6
- package/dist/web/server/seed/core/markdown/canvas/syntax/groups-3.json +3 -3
- package/dist/web/server/seed/core/markdown/canvas/syntax/groups-4.json +3 -3
- package/dist/web/server/seed/core/markdown/canvas/syntax/longer-duration.json +4 -4
- package/dist/web/server/seed/core/markdown/canvas/syntax/longer-intervals.json +4 -4
- package/dist/web/server/seed/core/markdown/canvas/syntax/measurements.json +7 -7
- package/dist/web/server/seed/core/markdown/canvas/syntax/metrics-1.json +5 -5
- package/dist/web/server/seed/core/markdown/canvas/syntax/metrics-2.json +7 -7
- package/dist/web/server/seed/core/markdown/canvas/syntax/metrics-3.json +8 -8
- package/dist/web/server/seed/core/markdown/canvas/syntax/metrics-4.json +6 -6
- package/dist/web/server/seed/core/markdown/canvas/syntax/metrics-5.json +5 -5
- package/dist/web/server/seed/core/markdown/canvas/syntax/mixed-sections.json +10 -10
- package/dist/web/server/seed/core/markdown/canvas/syntax/mixed-timers.json +5 -5
- package/dist/web/server/seed/core/markdown/canvas/syntax/multiple-amrap-windows.json +7 -7
- package/dist/web/server/seed/core/markdown/canvas/syntax/multiple-sets.json +4 -4
- package/dist/web/server/seed/core/markdown/canvas/syntax/named-groups.json +6 -6
- package/dist/web/server/seed/core/markdown/canvas/syntax/protocols-1.json +6 -6
- package/dist/web/server/seed/core/markdown/canvas/syntax/protocols-2.json +4 -4
- package/dist/web/server/seed/core/markdown/canvas/syntax/protocols-3.json +6 -6
- package/dist/web/server/seed/core/markdown/canvas/syntax/protocols-4.json +3 -3
- package/dist/web/server/seed/core/markdown/canvas/syntax/protocols-5.json +4 -4
- package/dist/web/server/seed/core/markdown/canvas/syntax/single-movement.json +3 -3
- package/dist/web/server/seed/core/markdown/canvas/syntax/supplemental-1.json +4 -4
- package/dist/web/server/seed/core/markdown/canvas/syntax/supplemental-2.json +5 -5
- package/dist/web/server/seed/core/markdown/canvas/syntax/supplemental-3.json +4 -4
- package/dist/web/server/seed/core/markdown/canvas/syntax/supplemental-4.json +4 -4
- package/dist/web/server/seed/core/markdown/canvas/syntax/time-cap.json +6 -6
- package/dist/web/server/seed/core/markdown/canvas/syntax/timer-modifiers.json +6 -6
- package/dist/web/server/seed/core/markdown/canvas/syntax/timers-1.json +6 -6
- package/dist/web/server/seed/core/markdown/canvas/syntax/timers-2.json +4 -4
- package/dist/web/server/seed/core/markdown/canvas/syntax/timers-3.json +4 -4
- package/dist/web/server/seed/core/markdown/canvas/syntax/timers-4.json +4 -4
- package/dist/web/server/seed/core/markdown/canvas/syntax/timers-5.json +5 -5
- package/dist/web/server/seed/core/markdown/canvas/syntax/timers-rest.json +4 -4
- package/dist/web/server/seed/core/markdown/canvas/wql-presets/aggregate-by-effort.json +2 -2
- package/dist/web/server/seed/core/markdown/canvas/wql-presets/aggregate-by-week.json +2 -2
- package/dist/web/server/seed/core/markdown/canvas/wql-presets/content-fran.json +2 -2
- package/dist/web/server/seed/core/markdown/canvas/wql-presets/filter-combos.json +2 -2
- package/dist/web/server/seed/core/markdown/canvas/wql-presets/pipes-limit.json +2 -2
- package/dist/web/server/seed/core/markdown/canvas/wql-presets/session-rpe.json +2 -2
- package/dist/web/server/seed/core/markdown/canvas/wql-presets/source-journal.json +2 -2
- package/dist/web/server/seed/core/markdown/canvas/wql-presets/tis-trend.json +2 -2
- package/dist/web/server/seed/core/markdown/canvas/wql-presets/where-join.json +2 -2
- package/dist/web/server/seed/core/markdown/dashboards/benchmark-pr-board.json +6 -6
- package/dist/web/server/seed/core/markdown/dashboards/finger-strength-v8.json +5 -5
- package/dist/web/server/seed/core/markdown/dashboards/polarized-base-marathon.json +9 -9
- package/dist/web/server/seed/core/markdown/dashboards/recovery-readiness.json +7 -7
- package/dist/web/server/seed/core/markdown/dashboards/road-to-560-total.json +9 -9
- package/dist/web/server/seed/core/markdown/dashboards/training-block-review.json +11 -11
- package/dist/web/server/seed/core/markdown/efforts/bodyweight/air-squat.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/bodyweight/box-jump.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/bodyweight/broad-jump.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/bodyweight/burpee-box-jump-over.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/bodyweight/burpee-over-dumbbell.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/bodyweight/burpee.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/bodyweight/dumbbell-squat-clean.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/bodyweight/ghd-sit-up.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/bodyweight/ground-kong.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/bodyweight/jumping-jack.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/bodyweight/kong-walk.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/bodyweight/lunge.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/bodyweight/overhead-squat.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/bodyweight/parkour-roll.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/bodyweight/parkour-squat.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/bodyweight/pistol-squat.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/bodyweight/plank.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/bodyweight/precision-burpee.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/bodyweight/precision-jump.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/bodyweight/quadrupedal-movement.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/bodyweight/russian-twist.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/bodyweight/sit-up.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/bodyweight/squat-clean.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/bodyweight/squat-hold.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/bodyweight/squat-snatch.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/bodyweight/tuck-jump.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/bodyweight/wall-ball.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/bodyweight/wall-burpee.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/cycling/assault-bike.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/cycling/cycling-moderate.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/cycling/cycling-vigorous.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/gymnastics/assisted-pull-up.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/gymnastics/burpee-pull-up.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/gymnastics/chest-to-bar-pull-up.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/gymnastics/dip.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/gymnastics/double-under.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/gymnastics/handstand-hold.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/gymnastics/handstand-push-up.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/gymnastics/handstand-walk.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/gymnastics/jump-rope.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/gymnastics/jumping-pull-up.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/gymnastics/jumping-push-up.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/gymnastics/l-sit-pull-up.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/gymnastics/muscle-up.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/gymnastics/pull-up.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/gymnastics/push-up.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/gymnastics/reverse-wall-dip.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/gymnastics/rope-climb.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/gymnastics/toes-to-bar.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-arm-bar.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-around-the-world.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-bent-over-row.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-clean-and-jerk.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-clean-and-press.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-clean.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-deadlift.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-floor-press.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-front-squat.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-goblet-squat.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-gorilla-row.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-halo.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-jerk.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-overhead-squat.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-press.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-snatch.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-swing.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-windmill.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/kettlebell/turkish-get-up.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/recovery/rest.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/recovery/stretching.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/rowing/rowing-sprint.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/rowing/rowing.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/rowing/ski-erg.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/running/backward-running.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/running/running-6-mph.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/running/running-8-mph.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/running/running-sprint.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/snatch.json +2 -2
- package/dist/web/server/seed/core/markdown/efforts/strength/back-squat.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/bench-press.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/box-step-up.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/carioca.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/clean-and-jerk.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/cluster.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/dead-hang.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/deadlift.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/devils-press.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/dumbbell-box-step-up.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/dumbbell-clean.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/dumbbell-fly.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/dumbbell-row.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/dumbbell-snatch.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/dumbbell-thruster.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/elbows-to-knees.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/farmer-carry.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/frog-stand.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/front-squat.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/good-morning.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/hanging-leg-raise.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/hollow-rock.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/knees-to-elbows.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/l-sit.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/man-maker.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/medicine-ball-clean.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/overhead-press.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/parkour-vault.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/pig-flip.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/power-clean.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/power-snatch.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/push-jerk.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/push-press.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/romanian-deadlift.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/single-leg-deadlift.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/skull-crusher.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/slam-ball.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/sled-pull.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/sled-push.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/sumo-deadlift.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/thruster.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/triceps-extension.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/v-sit-hold.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/wall-walk.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/strength/yoga-sun-salutation.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-assisted-sprint.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-backstroke.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-breaststroke-kick.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-breaststroke.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-butterfly.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-catch-up-drill.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-choice-stroke.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-dive-start.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-dolphin-kick.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-drafting.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-fingertip-drag.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-freestyle.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-individual-medley.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-kick.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-pull.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-resisted-sprint.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-rotation-drill.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-sighting.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-single-arm-drill.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-stroke-transition.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-two-kick-one-pull.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-vigorous.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/swimming/swimming.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/unconventional/clubbell-arm-cast.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/unconventional/clubbell-circles.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/unconventional/clubbell-mill.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/unconventional/clubbell-reverse-mill.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/unconventional/clubbell-shield-cast.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/unconventional/macebell-10-to-2-swing.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/unconventional/macebell-360-swing.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/unconventional/macebell-barbarian-squat.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/unconventional/macebell-flow.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/unconventional/macebell-gravedigger.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/unconventional/macebell-touchdown.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/unconventional/sandbag-bear-hug-carry.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/unconventional/sandbag-bear-hug-extension.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/unconventional/sandbag-over-shoulder.json +1 -1
- package/dist/web/server/seed/core/markdown/efforts/walking/walking-3-mph.json +1 -1
- package/dist/web/server/seed/core/markdown/equipment/air-bike.json +1 -1
- package/dist/web/server/seed/core/markdown/equipment/barbell.json +1 -1
- package/dist/web/server/seed/core/markdown/equipment/bench.json +1 -1
- package/dist/web/server/seed/core/markdown/equipment/bike-erg.json +1 -1
- package/dist/web/server/seed/core/markdown/equipment/climbing-rope.json +1 -1
- package/dist/web/server/seed/core/markdown/equipment/clubs.json +1 -1
- package/dist/web/server/seed/core/markdown/equipment/dumbbell.json +1 -1
- package/dist/web/server/seed/core/markdown/equipment/ghd.json +1 -1
- package/dist/web/server/seed/core/markdown/equipment/gymnastic-rings.json +1 -1
- package/dist/web/server/seed/core/markdown/equipment/jump-rope.json +1 -1
- package/dist/web/server/seed/core/markdown/equipment/kettlebell.json +1 -1
- package/dist/web/server/seed/core/markdown/equipment/macebell.json +1 -1
- package/dist/web/server/seed/core/markdown/equipment/medicine-ball.json +1 -1
- package/dist/web/server/seed/core/markdown/equipment/parallettes.json +1 -1
- package/dist/web/server/seed/core/markdown/equipment/plyo-box.json +1 -1
- package/dist/web/server/seed/core/markdown/equipment/pull-up-bar.json +1 -1
- package/dist/web/server/seed/core/markdown/equipment/rower.json +1 -1
- package/dist/web/server/seed/core/markdown/equipment/sandbag.json +1 -1
- package/dist/web/server/seed/core/markdown/equipment/ski-erg.json +1 -1
- package/dist/web/server/seed/core/markdown/equipment/slam-ball.json +1 -1
- package/dist/web/server/seed/core/markdown/equipment/sled.json +1 -1
- package/dist/web/server/seed/core/markdown/equipment/sledgehammer.json +1 -1
- package/dist/web/server/seed/core/markdown/equipment/weight-vest.json +1 -1
- package/dist/web/server/seed/core/report.html +13 -13
- package/package.json +10 -8
- package/dist/chunk-2EWCEE6N.mjs.map +0 -1
- package/dist/chunk-5NNSHRMZ.mjs.map +0 -1
- package/dist/chunk-LNBKPHEP.mjs.map +0 -1
- package/dist/chunk-SLCRIGUR.mjs.map +0 -1
- package/dist/server-SHNWCIIM.mjs +0 -11
- package/dist/web/playground/assets/main-DGz9PHS_.css +0 -2
- package/dist/web/playground/assets/main-DfHqNhwO.js +0 -1149
- package/dist/web/playground/assets/vendor-Dz-Azkoq.js +0 -198
- package/dist/web/server/assets/main-DGz9PHS_.css +0 -2
- package/dist/web/server/assets/main-VXFEU44Q.js +0 -1149
- package/dist/web/server/assets/vendor-Dz-Azkoq.js +0 -198
package/dist/bin/wod.cjs
CHANGED
|
@@ -5,15 +5,20 @@ var wodWikiLang = require('@bitcobblers/wod-wiki-lang');
|
|
|
5
5
|
var wod_wiki_engine_star = require('@bitcobblers/wod-wiki-engine');
|
|
6
6
|
var fs = require('fs');
|
|
7
7
|
var path = require('path');
|
|
8
|
+
var wodWikiStorage = require('@bitcobblers/wod-wiki-storage');
|
|
9
|
+
var agent = require('@bitcobblers/wod-wiki-engine/agent');
|
|
8
10
|
var child_process = require('child_process');
|
|
9
11
|
var wodWikiCore = require('@bitcobblers/wod-wiki-core');
|
|
10
12
|
var wodWikiWql = require('@bitcobblers/wod-wiki-wql');
|
|
11
13
|
var crypto = require('crypto');
|
|
14
|
+
var zod = require('zod');
|
|
15
|
+
var mcp_js = require('@modelcontextprotocol/sdk/server/mcp.js');
|
|
16
|
+
var webStandardStreamableHttp_js = require('@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js');
|
|
17
|
+
var sql = require('@bitcobblers/wod-wiki-storage/sql');
|
|
12
18
|
var promises = require('fs/promises');
|
|
13
19
|
var stream = require('stream');
|
|
14
|
-
var sql = require('@bitcobblers/wod-wiki-storage/sql');
|
|
15
|
-
var wodWikiStorage = require('@bitcobblers/wod-wiki-storage');
|
|
16
20
|
var http = require('http');
|
|
21
|
+
var stdio_js = require('@modelcontextprotocol/sdk/server/stdio.js');
|
|
17
22
|
|
|
18
23
|
var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
|
|
19
24
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
@@ -440,7 +445,7 @@ var init_report = __esm({
|
|
|
440
445
|
var VERSION;
|
|
441
446
|
var init_version = __esm({
|
|
442
447
|
"src/version.ts"() {
|
|
443
|
-
VERSION = "0.
|
|
448
|
+
VERSION = "0.54.2205";
|
|
444
449
|
}
|
|
445
450
|
});
|
|
446
451
|
|
|
@@ -706,6 +711,590 @@ var init_skills = __esm({
|
|
|
706
711
|
}
|
|
707
712
|
});
|
|
708
713
|
|
|
714
|
+
// src/cli/agentCommands.ts
|
|
715
|
+
var agentCommands_exports = {};
|
|
716
|
+
__export(agentCommands_exports, {
|
|
717
|
+
runAgentNounVerbCommand: () => runAgentNounVerbCommand
|
|
718
|
+
});
|
|
719
|
+
async function openStorageSession(env) {
|
|
720
|
+
if (env.parsed.serverUrl) {
|
|
721
|
+
const trimmed = env.parsed.serverUrl.replace(/\/+$/, "");
|
|
722
|
+
const apiBase = trimmed.endsWith("/api") ? trimmed : `${trimmed}/api`;
|
|
723
|
+
const baseUrl = trimmed.endsWith("/api") ? trimmed.slice(0, -4) : trimmed;
|
|
724
|
+
const storage = new wodWikiStorage.ApiStorage(apiBase);
|
|
725
|
+
return {
|
|
726
|
+
storage,
|
|
727
|
+
feedTree: new wod_wiki_engine_star.MemoryFeedTree(),
|
|
728
|
+
baseUrl,
|
|
729
|
+
label: baseUrl,
|
|
730
|
+
close: () => storage.close()
|
|
731
|
+
};
|
|
732
|
+
}
|
|
733
|
+
const dbConfig = env.resolveDbConfig();
|
|
734
|
+
const dbHandle = await openCliDb(dbConfig);
|
|
735
|
+
const feedTree = dbConfig.kind === "sqlite" ? new NodeFsFeedTree(`${dbConfig.path}.feed`) : new wod_wiki_engine_star.MemoryFeedTree();
|
|
736
|
+
return {
|
|
737
|
+
storage: dbHandle.storage,
|
|
738
|
+
feedTree,
|
|
739
|
+
baseUrl: "",
|
|
740
|
+
label: dbHandle.path,
|
|
741
|
+
close: () => dbHandle.close()
|
|
742
|
+
};
|
|
743
|
+
}
|
|
744
|
+
function parseSetPairs(pairs) {
|
|
745
|
+
const out = {};
|
|
746
|
+
for (const pair of pairs) {
|
|
747
|
+
const idx = pair.indexOf("=");
|
|
748
|
+
if (idx <= 0) {
|
|
749
|
+
throw new Error(`Invalid --set "${pair}" (expected fieldId=value)`);
|
|
750
|
+
}
|
|
751
|
+
const key = pair.slice(0, idx).trim();
|
|
752
|
+
const rawVal = pair.slice(idx + 1).trim();
|
|
753
|
+
if (!key || !rawVal) {
|
|
754
|
+
throw new Error(`Invalid --set "${pair}" (expected fieldId=value)`);
|
|
755
|
+
}
|
|
756
|
+
const num = Number(rawVal);
|
|
757
|
+
out[key] = Number.isFinite(num) ? num : rawVal;
|
|
758
|
+
}
|
|
759
|
+
return out;
|
|
760
|
+
}
|
|
761
|
+
function toNotebookId(slugOrId) {
|
|
762
|
+
if (!slugOrId) return void 0;
|
|
763
|
+
return slugOrId.startsWith("notebook/") ? slugOrId : `notebook/${slugOrId}`;
|
|
764
|
+
}
|
|
765
|
+
function slugifyName(input) {
|
|
766
|
+
return input.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
|
|
767
|
+
}
|
|
768
|
+
async function readContentArg(fileOrDash, inlineMarkdown, readStdin2) {
|
|
769
|
+
if (inlineMarkdown !== void 0) return inlineMarkdown;
|
|
770
|
+
if (!fileOrDash || fileOrDash === "-") {
|
|
771
|
+
return readStdin2();
|
|
772
|
+
}
|
|
773
|
+
const fs = nodeFs();
|
|
774
|
+
if (!fs.existsSync(fileOrDash)) {
|
|
775
|
+
throw new Error(`File not found: ${fileOrDash}`);
|
|
776
|
+
}
|
|
777
|
+
return fs.readFileSync(fileOrDash, "utf-8");
|
|
778
|
+
}
|
|
779
|
+
function emitSuccess(env, toolName, data, humanSummary) {
|
|
780
|
+
if (env.parsed.json) {
|
|
781
|
+
env.writeOut(
|
|
782
|
+
JSON.stringify(
|
|
783
|
+
{
|
|
784
|
+
ok: true,
|
|
785
|
+
tool: toolName,
|
|
786
|
+
data
|
|
787
|
+
},
|
|
788
|
+
null,
|
|
789
|
+
2
|
|
790
|
+
)
|
|
791
|
+
);
|
|
792
|
+
} else {
|
|
793
|
+
env.writeOut(humanSummary);
|
|
794
|
+
}
|
|
795
|
+
return 0;
|
|
796
|
+
}
|
|
797
|
+
function emitError(env, error) {
|
|
798
|
+
if (error instanceof agent.AgentConfirmationRequiredError) {
|
|
799
|
+
const payload = {
|
|
800
|
+
ok: false,
|
|
801
|
+
code: error.code,
|
|
802
|
+
exitCode: 4,
|
|
803
|
+
action: error.action,
|
|
804
|
+
targetId: error.targetId,
|
|
805
|
+
error: error.message,
|
|
806
|
+
hint: `Re-run with --yes "${error.targetId}" to confirm.`
|
|
807
|
+
};
|
|
808
|
+
if (env.parsed.json) {
|
|
809
|
+
env.writeOut(JSON.stringify(payload, null, 2));
|
|
810
|
+
} else {
|
|
811
|
+
env.writeErr(
|
|
812
|
+
`[wod] Confirmation required (${error.action}): ${error.message} Pass --yes "${error.targetId}" to confirm.`
|
|
813
|
+
);
|
|
814
|
+
}
|
|
815
|
+
return 4;
|
|
816
|
+
}
|
|
817
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
818
|
+
if (env.parsed.json) {
|
|
819
|
+
env.writeOut(
|
|
820
|
+
JSON.stringify(
|
|
821
|
+
{
|
|
822
|
+
ok: false,
|
|
823
|
+
code: "RUNTIME_ERROR",
|
|
824
|
+
error: message
|
|
825
|
+
},
|
|
826
|
+
null,
|
|
827
|
+
2
|
|
828
|
+
)
|
|
829
|
+
);
|
|
830
|
+
} else {
|
|
831
|
+
env.writeErr(`[wod] Error: ${message}`);
|
|
832
|
+
}
|
|
833
|
+
return 1;
|
|
834
|
+
}
|
|
835
|
+
async function runAgentNounVerbCommand(env) {
|
|
836
|
+
const { parsed } = env;
|
|
837
|
+
const noun = parsed.subcommand;
|
|
838
|
+
const verb = parsed.target;
|
|
839
|
+
const arg1 = parsed.target2;
|
|
840
|
+
const arg2 = parsed.target3;
|
|
841
|
+
try {
|
|
842
|
+
if (noun === "tools") {
|
|
843
|
+
const action = verb ?? "list";
|
|
844
|
+
const manifest = agent.exportAgentCapabilitiesManifest();
|
|
845
|
+
if (action === "manifest") {
|
|
846
|
+
env.writeOut(JSON.stringify(manifest, null, 2));
|
|
847
|
+
return 0;
|
|
848
|
+
}
|
|
849
|
+
if (action === "list") {
|
|
850
|
+
if (parsed.json) {
|
|
851
|
+
return emitSuccess(env, "wod_tools_list", manifest.domainTools, "");
|
|
852
|
+
}
|
|
853
|
+
for (const t of manifest.domainTools) {
|
|
854
|
+
env.writeOut(`${t.name.padEnd(26)} [Tier ${t.tier}] ${t.cliEquivalent}`);
|
|
855
|
+
}
|
|
856
|
+
env.writeOut(`[wod tools] ${manifest.domainTools.length} portable domain tools`);
|
|
857
|
+
return 0;
|
|
858
|
+
}
|
|
859
|
+
throw new Error(`Unknown tools action "${action}" (expected: list | manifest)`);
|
|
860
|
+
}
|
|
861
|
+
if (noun === "doctor") {
|
|
862
|
+
let backendKind = "sqlite";
|
|
863
|
+
let backendTarget = "";
|
|
864
|
+
let dbReady = false;
|
|
865
|
+
let noteCount = 0;
|
|
866
|
+
let sessionCount = 0;
|
|
867
|
+
if (parsed.serverUrl) {
|
|
868
|
+
backendKind = "api";
|
|
869
|
+
backendTarget = parsed.serverUrl;
|
|
870
|
+
const session2 = await openStorageSession(env);
|
|
871
|
+
try {
|
|
872
|
+
noteCount = (await session2.storage.readonly("notes").getAll()).length;
|
|
873
|
+
sessionCount = (await session2.storage.readonly("sessions").getAll()).length;
|
|
874
|
+
dbReady = true;
|
|
875
|
+
} finally {
|
|
876
|
+
await session2.close();
|
|
877
|
+
}
|
|
878
|
+
} else {
|
|
879
|
+
const cfg = env.resolveDbConfig();
|
|
880
|
+
backendKind = cfg.kind;
|
|
881
|
+
backendTarget = cfg.kind === "sqlite" ? cfg.path : cfg.kind;
|
|
882
|
+
try {
|
|
883
|
+
const db = await openCliDb(cfg, { initialize: false });
|
|
884
|
+
try {
|
|
885
|
+
noteCount = (await db.storage.readonly("notes").getAll()).length;
|
|
886
|
+
sessionCount = (await db.storage.readonly("sessions").getAll()).length;
|
|
887
|
+
dbReady = true;
|
|
888
|
+
} finally {
|
|
889
|
+
await db.close();
|
|
890
|
+
}
|
|
891
|
+
} catch {
|
|
892
|
+
dbReady = false;
|
|
893
|
+
}
|
|
894
|
+
}
|
|
895
|
+
const { bundledSkillsRoot: bundledSkillsRoot2, listBundledSkills: listBundledSkills2 } = await Promise.resolve().then(() => (init_skills(), skills_exports));
|
|
896
|
+
const skillsRoot = bundledSkillsRoot2();
|
|
897
|
+
const skills = skillsRoot ? listBundledSkills2(skillsRoot).map((s) => s.name) : [];
|
|
898
|
+
const report = {
|
|
899
|
+
version: VERSION,
|
|
900
|
+
backendKind,
|
|
901
|
+
backendTarget,
|
|
902
|
+
databaseInitialized: dbReady,
|
|
903
|
+
noteCount,
|
|
904
|
+
sessionCount,
|
|
905
|
+
domainToolCount: agent.DOMAIN_AGENT_TOOLS.length,
|
|
906
|
+
bundledSkills: skills
|
|
907
|
+
};
|
|
908
|
+
return emitSuccess(
|
|
909
|
+
env,
|
|
910
|
+
"wod_doctor",
|
|
911
|
+
report,
|
|
912
|
+
`[wod doctor] v${VERSION} \xB7 backend=${backendKind} (${dbReady ? "ready" : "uninitialized"}) \xB7 ${noteCount} notes \xB7 ${sessionCount} sessions \xB7 ${agent.DOMAIN_AGENT_TOOLS.length} tools \xB7 ${skills.length} skills`
|
|
913
|
+
);
|
|
914
|
+
}
|
|
915
|
+
const session = await openStorageSession(env);
|
|
916
|
+
const ctx = {
|
|
917
|
+
storage: session.storage,
|
|
918
|
+
feedTree: session.feedTree,
|
|
919
|
+
baseUrl: session.baseUrl
|
|
920
|
+
};
|
|
921
|
+
try {
|
|
922
|
+
if (noun === "note") {
|
|
923
|
+
if (verb === "list" || !verb) {
|
|
924
|
+
const out = await agent.wodNoteListTool.execute(
|
|
925
|
+
{
|
|
926
|
+
notebookId: toNotebookId(parsed.notebook),
|
|
927
|
+
tag: parsed.tag,
|
|
928
|
+
search: parsed.search,
|
|
929
|
+
limit: parsed.limit
|
|
930
|
+
},
|
|
931
|
+
ctx
|
|
932
|
+
);
|
|
933
|
+
return emitSuccess(
|
|
934
|
+
env,
|
|
935
|
+
agent.wodNoteListTool.name,
|
|
936
|
+
out,
|
|
937
|
+
out.notes.map((n) => `${n.id} ${(n.date ? new Date(n.date).toISOString().slice(0, 10) : "").padEnd(10)} ${n.title}`).join("\n") || "[wod note list] 0 notes"
|
|
938
|
+
);
|
|
939
|
+
}
|
|
940
|
+
if (verb === "get") {
|
|
941
|
+
const noteId = arg1 ?? parsed.noteId;
|
|
942
|
+
if (!noteId) throw new Error("Usage: wod note get <noteId>");
|
|
943
|
+
const out = await agent.wodNoteGetTool.execute({ noteId }, ctx);
|
|
944
|
+
return emitSuccess(
|
|
945
|
+
env,
|
|
946
|
+
agent.wodNoteGetTool.name,
|
|
947
|
+
out,
|
|
948
|
+
parsed.format === "table" ? `${out.id} ${out.title}
|
|
949
|
+
|
|
950
|
+
${out.rawContent}` : out.rawContent
|
|
951
|
+
);
|
|
952
|
+
}
|
|
953
|
+
if (verb === "create" || verb === "update" || verb === "upsert") {
|
|
954
|
+
const noteId = verb === "update" ? arg1 ?? parsed.noteId : parsed.noteId;
|
|
955
|
+
const fileArg = verb === "update" ? arg2 : arg1;
|
|
956
|
+
let content = await readContentArg(fileArg, parsed.markdown, env.readStdin);
|
|
957
|
+
if (parsed.tags.length > 0 && !content.trimStart().startsWith("---")) {
|
|
958
|
+
content = `---
|
|
959
|
+
tags:
|
|
960
|
+
${parsed.tags.map((t) => ` - ${t}`).join("\n")}
|
|
961
|
+
---
|
|
962
|
+
|
|
963
|
+
${content}`;
|
|
964
|
+
}
|
|
965
|
+
const out = await agent.wodNoteUpsertTool.execute(
|
|
966
|
+
{
|
|
967
|
+
noteId,
|
|
968
|
+
title: parsed.title,
|
|
969
|
+
content,
|
|
970
|
+
notebookId: toNotebookId(parsed.notebook),
|
|
971
|
+
journalDate: parsed.date,
|
|
972
|
+
sport: parsed.sport
|
|
973
|
+
},
|
|
974
|
+
ctx
|
|
975
|
+
);
|
|
976
|
+
return emitSuccess(
|
|
977
|
+
env,
|
|
978
|
+
agent.wodNoteUpsertTool.name,
|
|
979
|
+
out,
|
|
980
|
+
`[wod note ${verb}] ${out.noteId}${out.created ? " (created)" : " (updated)"} \u2014 ${out.blockCount} block(s)`
|
|
981
|
+
);
|
|
982
|
+
}
|
|
983
|
+
if (verb === "clone") {
|
|
984
|
+
const sourceNoteId = arg1 ?? parsed.noteId;
|
|
985
|
+
if (!sourceNoteId) {
|
|
986
|
+
throw new Error("Usage: wod note clone <sourceNoteId> [--date YYYY-MM-DD] [--notebook <slug>]");
|
|
987
|
+
}
|
|
988
|
+
const out = await agent.wodNoteCloneTool.execute(
|
|
989
|
+
{
|
|
990
|
+
sourceNoteId,
|
|
991
|
+
title: parsed.title,
|
|
992
|
+
targetNotebookId: toNotebookId(parsed.notebook),
|
|
993
|
+
journalDate: parsed.date
|
|
994
|
+
},
|
|
995
|
+
ctx
|
|
996
|
+
);
|
|
997
|
+
return emitSuccess(
|
|
998
|
+
env,
|
|
999
|
+
agent.wodNoteCloneTool.name,
|
|
1000
|
+
out,
|
|
1001
|
+
`[wod note clone] ${sourceNoteId} \u2192 ${out.noteId}`
|
|
1002
|
+
);
|
|
1003
|
+
}
|
|
1004
|
+
if (verb === "delete") {
|
|
1005
|
+
const noteId = arg1 ?? parsed.noteId;
|
|
1006
|
+
if (!noteId) throw new Error("Usage: wod note delete <noteId> --yes <noteId>");
|
|
1007
|
+
const out = await agent.wodNoteDeleteTool.execute({ noteId, confirmId: parsed.yes }, ctx);
|
|
1008
|
+
return emitSuccess(
|
|
1009
|
+
env,
|
|
1010
|
+
agent.wodNoteDeleteTool.name,
|
|
1011
|
+
out,
|
|
1012
|
+
`[wod note delete] deleted=${out.deleted} note=${out.noteId}`
|
|
1013
|
+
);
|
|
1014
|
+
}
|
|
1015
|
+
throw new Error(`Unknown note verb "${verb}" (expected: list | get | create | update | clone | delete)`);
|
|
1016
|
+
}
|
|
1017
|
+
if (noun === "journal") {
|
|
1018
|
+
if (verb === "day" || !verb) {
|
|
1019
|
+
const date = arg1 ?? parsed.date ?? "today";
|
|
1020
|
+
const out = await agent.wodJournalDayTool.execute({ date }, ctx);
|
|
1021
|
+
return emitSuccess(
|
|
1022
|
+
env,
|
|
1023
|
+
agent.wodJournalDayTool.name,
|
|
1024
|
+
out,
|
|
1025
|
+
`[wod journal day ${out.date}] ${out.noteCount} scheduled note(s), ${out.sessionCount} session(s)`
|
|
1026
|
+
);
|
|
1027
|
+
}
|
|
1028
|
+
if (verb === "add") {
|
|
1029
|
+
const date = arg1 ?? parsed.date ?? "today";
|
|
1030
|
+
const sourceNoteId = parsed.sourceNoteId ?? parsed.noteId;
|
|
1031
|
+
if (sourceNoteId && !parsed.markdown && !arg2) {
|
|
1032
|
+
const cloned = await agent.wodNoteCloneTool.execute(
|
|
1033
|
+
{
|
|
1034
|
+
sourceNoteId,
|
|
1035
|
+
title: parsed.title,
|
|
1036
|
+
targetNotebookId: toNotebookId(parsed.notebook ?? "journal"),
|
|
1037
|
+
journalDate: date
|
|
1038
|
+
},
|
|
1039
|
+
ctx
|
|
1040
|
+
);
|
|
1041
|
+
return emitSuccess(
|
|
1042
|
+
env,
|
|
1043
|
+
agent.wodNoteCloneTool.name,
|
|
1044
|
+
cloned,
|
|
1045
|
+
`[wod journal add] cloned ${sourceNoteId} \u2192 ${cloned.noteId} on ${date}`
|
|
1046
|
+
);
|
|
1047
|
+
}
|
|
1048
|
+
const content = await readContentArg(arg2, parsed.markdown, env.readStdin);
|
|
1049
|
+
const out = await agent.wodJournalAddTool.execute(
|
|
1050
|
+
{
|
|
1051
|
+
date,
|
|
1052
|
+
title: parsed.title,
|
|
1053
|
+
content,
|
|
1054
|
+
sport: parsed.sport,
|
|
1055
|
+
notebookId: toNotebookId(parsed.notebook)
|
|
1056
|
+
},
|
|
1057
|
+
ctx
|
|
1058
|
+
);
|
|
1059
|
+
return emitSuccess(
|
|
1060
|
+
env,
|
|
1061
|
+
agent.wodJournalAddTool.name,
|
|
1062
|
+
out,
|
|
1063
|
+
`[wod journal add] scheduled note ${out.noteId} on ${out.date}`
|
|
1064
|
+
);
|
|
1065
|
+
}
|
|
1066
|
+
throw new Error(`Unknown journal verb "${verb}" (expected: day | add)`);
|
|
1067
|
+
}
|
|
1068
|
+
if (noun === "notebook") {
|
|
1069
|
+
if (verb === "list" || !verb) {
|
|
1070
|
+
const out = await agent.wodNotebookListTool.execute({ origin: "all" }, ctx);
|
|
1071
|
+
return emitSuccess(
|
|
1072
|
+
env,
|
|
1073
|
+
agent.wodNotebookListTool.name,
|
|
1074
|
+
out,
|
|
1075
|
+
out.notebooks.map((nb) => `${nb.slug.padEnd(20)} (${nb.noteCount} notes) \u2014 ${nb.name}`).join("\n") || "[wod notebook list] 0 notebooks"
|
|
1076
|
+
);
|
|
1077
|
+
}
|
|
1078
|
+
if (verb === "create" || verb === "save" || verb === "update") {
|
|
1079
|
+
const slugOrId = arg1 ?? parsed.notebook;
|
|
1080
|
+
const name = parsed.title ?? parsed.dbName ?? slugOrId;
|
|
1081
|
+
if (!name) throw new Error('Usage: wod notebook save <slug> --title "<Name>"');
|
|
1082
|
+
const notebookId = toNotebookId(slugOrId ?? slugifyName(name));
|
|
1083
|
+
const existing = notebookId ? await session.storage.readonly("notes").get(notebookId) : void 0;
|
|
1084
|
+
const action = verb === "create" || !existing ? "create" : "update";
|
|
1085
|
+
const out = await agent.wodNotebookSaveTool.execute(
|
|
1086
|
+
{
|
|
1087
|
+
action,
|
|
1088
|
+
notebookId,
|
|
1089
|
+
name,
|
|
1090
|
+
description: parsed.description,
|
|
1091
|
+
noteId: parsed.noteId
|
|
1092
|
+
},
|
|
1093
|
+
ctx
|
|
1094
|
+
);
|
|
1095
|
+
return emitSuccess(
|
|
1096
|
+
env,
|
|
1097
|
+
agent.wodNotebookSaveTool.name,
|
|
1098
|
+
out,
|
|
1099
|
+
`[wod notebook ${verb}] ${out.notebookId ?? slugOrId ?? name}`
|
|
1100
|
+
);
|
|
1101
|
+
}
|
|
1102
|
+
if (verb === "promote" || verb === "detach") {
|
|
1103
|
+
const slugOrId = arg1 ?? parsed.notebook;
|
|
1104
|
+
const noteId = arg2 ?? parsed.noteId;
|
|
1105
|
+
if (!slugOrId || !noteId) {
|
|
1106
|
+
throw new Error(`Usage: wod notebook ${verb} <slug> <noteId>`);
|
|
1107
|
+
}
|
|
1108
|
+
const out = await agent.wodNotebookSaveTool.execute(
|
|
1109
|
+
{
|
|
1110
|
+
action: verb,
|
|
1111
|
+
notebookId: toNotebookId(slugOrId),
|
|
1112
|
+
noteId
|
|
1113
|
+
},
|
|
1114
|
+
ctx
|
|
1115
|
+
);
|
|
1116
|
+
return emitSuccess(
|
|
1117
|
+
env,
|
|
1118
|
+
agent.wodNotebookSaveTool.name,
|
|
1119
|
+
out,
|
|
1120
|
+
`[wod notebook ${verb}] note ${out.noteId} \u2192 ${(out.notebookIds ?? []).join(", ")}`
|
|
1121
|
+
);
|
|
1122
|
+
}
|
|
1123
|
+
if (verb === "delete") {
|
|
1124
|
+
const slugOrId = arg1 ?? parsed.notebook;
|
|
1125
|
+
if (!slugOrId) throw new Error("Usage: wod notebook delete <slug> --yes <notebook/slug>");
|
|
1126
|
+
const notebookId = toNotebookId(slugOrId);
|
|
1127
|
+
const confirmId = parsed.yes === slugOrId ? notebookId : parsed.yes;
|
|
1128
|
+
const out = await agent.wodNotebookDeleteTool.execute({ notebookId, confirmId }, ctx);
|
|
1129
|
+
return emitSuccess(
|
|
1130
|
+
env,
|
|
1131
|
+
agent.wodNotebookDeleteTool.name,
|
|
1132
|
+
out,
|
|
1133
|
+
`[wod notebook delete] deleted ${out.notebookId}`
|
|
1134
|
+
);
|
|
1135
|
+
}
|
|
1136
|
+
throw new Error(`Unknown notebook verb "${verb}" (expected: list | create | save | update | promote | detach | delete)`);
|
|
1137
|
+
}
|
|
1138
|
+
if (noun === "session") {
|
|
1139
|
+
if (verb === "list" || !verb) {
|
|
1140
|
+
const out = await agent.wodSessionListTool.execute(
|
|
1141
|
+
{
|
|
1142
|
+
noteId: parsed.noteId,
|
|
1143
|
+
limit: parsed.limit
|
|
1144
|
+
},
|
|
1145
|
+
ctx
|
|
1146
|
+
);
|
|
1147
|
+
return emitSuccess(
|
|
1148
|
+
env,
|
|
1149
|
+
agent.wodSessionListTool.name,
|
|
1150
|
+
out,
|
|
1151
|
+
out.sessions.map(
|
|
1152
|
+
(s) => `${s.id} ${new Date(s.startTime).toISOString().slice(0, 10)} note=${s.noteId} completed=${s.completed}`
|
|
1153
|
+
).join("\n") || "[wod session list] 0 sessions"
|
|
1154
|
+
);
|
|
1155
|
+
}
|
|
1156
|
+
if (verb === "get") {
|
|
1157
|
+
const sessionId = arg1;
|
|
1158
|
+
if (!sessionId) throw new Error("Usage: wod session get <sessionId>");
|
|
1159
|
+
const out = await agent.wodSessionGetTool.execute({ sessionId }, ctx);
|
|
1160
|
+
return emitSuccess(
|
|
1161
|
+
env,
|
|
1162
|
+
agent.wodSessionGetTool.name,
|
|
1163
|
+
out,
|
|
1164
|
+
`[wod session get] ${out.session.id} \u2014 ${out.eventCount} event(s), duration=${out.session.duration}ms`
|
|
1165
|
+
);
|
|
1166
|
+
}
|
|
1167
|
+
if (verb === "run") {
|
|
1168
|
+
const noteId = parsed.noteId ?? arg1;
|
|
1169
|
+
const source = !noteId ? await readContentArg(arg1, parsed.markdown, env.readStdin) : void 0;
|
|
1170
|
+
const out = await agent.wodSessionRunHeadlessTool.execute(
|
|
1171
|
+
{
|
|
1172
|
+
noteId,
|
|
1173
|
+
blockId: parsed.blockId,
|
|
1174
|
+
source,
|
|
1175
|
+
title: parsed.title,
|
|
1176
|
+
sport: parsed.sport,
|
|
1177
|
+
journalDate: parsed.date,
|
|
1178
|
+
collectibles: parsed.setPairs.length > 0 ? parseSetPairs(parsed.setPairs) : void 0
|
|
1179
|
+
},
|
|
1180
|
+
ctx
|
|
1181
|
+
);
|
|
1182
|
+
return emitSuccess(
|
|
1183
|
+
env,
|
|
1184
|
+
agent.wodSessionRunHeadlessTool.name,
|
|
1185
|
+
out,
|
|
1186
|
+
`[wod session run] session ${out.sessionId} on note ${out.noteId} (${out.eventCount} events, ${out.summaryCount} summaries)`
|
|
1187
|
+
);
|
|
1188
|
+
}
|
|
1189
|
+
if (verb === "delete") {
|
|
1190
|
+
const sessionId = arg1;
|
|
1191
|
+
if (!sessionId) throw new Error("Usage: wod session delete <sessionId> --yes <sessionId>");
|
|
1192
|
+
const out = await agent.wodSessionDeleteTool.execute({ sessionId, confirmId: parsed.yes }, ctx);
|
|
1193
|
+
return emitSuccess(
|
|
1194
|
+
env,
|
|
1195
|
+
agent.wodSessionDeleteTool.name,
|
|
1196
|
+
out,
|
|
1197
|
+
`[wod session delete] deleted=${out.deleted} session=${out.sessionId}`
|
|
1198
|
+
);
|
|
1199
|
+
}
|
|
1200
|
+
throw new Error(`Unknown session verb "${verb}" (expected: list | get | run | delete)`);
|
|
1201
|
+
}
|
|
1202
|
+
if (noun === "catalog" || noun === "tag") {
|
|
1203
|
+
const defaultKind = noun === "tag" ? "tag" : "effort";
|
|
1204
|
+
if (verb === "list" || verb === "lookup" || !verb) {
|
|
1205
|
+
const kind = (noun === "tag" ? "tag" : arg1) ?? defaultKind;
|
|
1206
|
+
const out = await agent.wodCatalogLookupTool.execute(
|
|
1207
|
+
{
|
|
1208
|
+
kind,
|
|
1209
|
+
search: parsed.search ?? (noun === "tag" ? arg1 : arg2),
|
|
1210
|
+
slug: parsed.slug,
|
|
1211
|
+
notebookId: toNotebookId(parsed.notebook),
|
|
1212
|
+
limit: parsed.limit
|
|
1213
|
+
},
|
|
1214
|
+
ctx
|
|
1215
|
+
);
|
|
1216
|
+
return emitSuccess(
|
|
1217
|
+
env,
|
|
1218
|
+
agent.wodCatalogLookupTool.name,
|
|
1219
|
+
out,
|
|
1220
|
+
`[wod ${noun} ${verb ?? "list"}] ${out.items.length} ${out.kind} item(s)`
|
|
1221
|
+
);
|
|
1222
|
+
}
|
|
1223
|
+
if (verb === "get") {
|
|
1224
|
+
const kind = noun === "tag" ? "tag" : arg1 ?? "effort";
|
|
1225
|
+
const slug = noun === "tag" ? arg1 : arg2;
|
|
1226
|
+
const out = await agent.wodCatalogLookupTool.execute({ kind, slug }, ctx);
|
|
1227
|
+
return emitSuccess(
|
|
1228
|
+
env,
|
|
1229
|
+
agent.wodCatalogLookupTool.name,
|
|
1230
|
+
out,
|
|
1231
|
+
JSON.stringify(out.items[0] ?? null, null, 2)
|
|
1232
|
+
);
|
|
1233
|
+
}
|
|
1234
|
+
if (verb === "upsert" || verb === "create") {
|
|
1235
|
+
const kind = noun === "tag" ? "tag" : arg1 ?? "effort";
|
|
1236
|
+
const label = (noun === "tag" ? arg1 : arg2) ?? parsed.title ?? parsed.slug;
|
|
1237
|
+
if (!label) {
|
|
1238
|
+
throw new Error(
|
|
1239
|
+
`Usage: wod ${noun} upsert ${noun === "tag" ? "<label> [--category <tagType>]" : "<effort|equipment|tag> <name>"}`
|
|
1240
|
+
);
|
|
1241
|
+
}
|
|
1242
|
+
const slug = parsed.slug ?? slugifyName(label);
|
|
1243
|
+
const out = await agent.wodCatalogUpsertTool.execute(
|
|
1244
|
+
{
|
|
1245
|
+
kind,
|
|
1246
|
+
slug,
|
|
1247
|
+
label,
|
|
1248
|
+
targetNotebookId: toNotebookId(parsed.notebook),
|
|
1249
|
+
markdown: parsed.markdown,
|
|
1250
|
+
category: parsed.category ?? parsed.tagType,
|
|
1251
|
+
aliases: parsed.aliases.length > 0 ? parsed.aliases : void 0
|
|
1252
|
+
},
|
|
1253
|
+
ctx
|
|
1254
|
+
);
|
|
1255
|
+
return emitSuccess(
|
|
1256
|
+
env,
|
|
1257
|
+
agent.wodCatalogUpsertTool.name,
|
|
1258
|
+
out,
|
|
1259
|
+
`[wod ${noun} upsert] ${out.kind} ${out.slug} (${out.ownerNoteId})`
|
|
1260
|
+
);
|
|
1261
|
+
}
|
|
1262
|
+
throw new Error(`Unknown ${noun} verb "${verb}" (expected: list | lookup | get | upsert)`);
|
|
1263
|
+
}
|
|
1264
|
+
if (noun === "feed") {
|
|
1265
|
+
const action = verb ?? "list";
|
|
1266
|
+
const out = await agent.wodFeedManageTool.execute(
|
|
1267
|
+
{
|
|
1268
|
+
action,
|
|
1269
|
+
notebookSlug: parsed.notebook,
|
|
1270
|
+
name: parsed.title,
|
|
1271
|
+
description: parsed.description
|
|
1272
|
+
},
|
|
1273
|
+
ctx
|
|
1274
|
+
);
|
|
1275
|
+
return emitSuccess(
|
|
1276
|
+
env,
|
|
1277
|
+
agent.wodFeedManageTool.name,
|
|
1278
|
+
out,
|
|
1279
|
+
`[wod feed ${action}] ok`
|
|
1280
|
+
);
|
|
1281
|
+
}
|
|
1282
|
+
throw new Error(`Unhandled agent command group "${noun}"`);
|
|
1283
|
+
} finally {
|
|
1284
|
+
await session.close();
|
|
1285
|
+
}
|
|
1286
|
+
} catch (err) {
|
|
1287
|
+
return emitError(env, err);
|
|
1288
|
+
}
|
|
1289
|
+
}
|
|
1290
|
+
var init_agentCommands = __esm({
|
|
1291
|
+
"src/cli/agentCommands.ts"() {
|
|
1292
|
+
init_db();
|
|
1293
|
+
init_nodeFeedTree();
|
|
1294
|
+
init_version();
|
|
1295
|
+
}
|
|
1296
|
+
});
|
|
1297
|
+
|
|
709
1298
|
// src/seedbuild/contract.ts
|
|
710
1299
|
var contract_exports = {};
|
|
711
1300
|
var init_contract = __esm({
|
|
@@ -1519,6 +2108,221 @@ var init_errors = __esm({
|
|
|
1519
2108
|
};
|
|
1520
2109
|
}
|
|
1521
2110
|
});
|
|
2111
|
+
function createWodMcpServer(options) {
|
|
2112
|
+
const server = new mcp_js.McpServer(
|
|
2113
|
+
{
|
|
2114
|
+
name: "wod-wiki",
|
|
2115
|
+
version: VERSION
|
|
2116
|
+
},
|
|
2117
|
+
{
|
|
2118
|
+
capabilities: {
|
|
2119
|
+
tools: {},
|
|
2120
|
+
resources: {},
|
|
2121
|
+
prompts: {}
|
|
2122
|
+
}
|
|
2123
|
+
}
|
|
2124
|
+
);
|
|
2125
|
+
const ctx = {
|
|
2126
|
+
storage: options.storage,
|
|
2127
|
+
feedTree: options.feedTree,
|
|
2128
|
+
baseUrl: options.baseUrl,
|
|
2129
|
+
onMutated: options.onMutated
|
|
2130
|
+
// Over MCP HTTP/stdio, explicit confirm="<targetId>" inside tool arguments
|
|
2131
|
+
// satisfies Tier 2 confirmation; when omitted, requireAgentConfirmation throws
|
|
2132
|
+
// an actionable error instructing the caller to pass confirm="<targetId>".
|
|
2133
|
+
};
|
|
2134
|
+
for (const spec of agent.DOMAIN_AGENT_TOOLS) {
|
|
2135
|
+
if (options.readonly && spec.tier !== 0) {
|
|
2136
|
+
continue;
|
|
2137
|
+
}
|
|
2138
|
+
server.registerTool(
|
|
2139
|
+
spec.name,
|
|
2140
|
+
{
|
|
2141
|
+
title: spec.title,
|
|
2142
|
+
description: spec.description,
|
|
2143
|
+
inputSchema: spec.inputSchema,
|
|
2144
|
+
annotations: spec.annotations
|
|
2145
|
+
},
|
|
2146
|
+
async (args) => {
|
|
2147
|
+
try {
|
|
2148
|
+
const parsed = spec.inputSchema.parse(args ?? {});
|
|
2149
|
+
const result = await spec.execute(parsed, ctx);
|
|
2150
|
+
return {
|
|
2151
|
+
content: [
|
|
2152
|
+
{
|
|
2153
|
+
type: "text",
|
|
2154
|
+
text: JSON.stringify(result, null, 2)
|
|
2155
|
+
}
|
|
2156
|
+
],
|
|
2157
|
+
structuredContent: result
|
|
2158
|
+
};
|
|
2159
|
+
} catch (err) {
|
|
2160
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
2161
|
+
return {
|
|
2162
|
+
isError: true,
|
|
2163
|
+
content: [
|
|
2164
|
+
{
|
|
2165
|
+
type: "text",
|
|
2166
|
+
text: message
|
|
2167
|
+
}
|
|
2168
|
+
]
|
|
2169
|
+
};
|
|
2170
|
+
}
|
|
2171
|
+
}
|
|
2172
|
+
);
|
|
2173
|
+
}
|
|
2174
|
+
for (const resource of agent.AGENT_STATIC_RESOURCES) {
|
|
2175
|
+
server.registerResource(
|
|
2176
|
+
resource.name,
|
|
2177
|
+
resource.uri,
|
|
2178
|
+
{
|
|
2179
|
+
description: resource.description,
|
|
2180
|
+
mimeType: resource.mimeType
|
|
2181
|
+
},
|
|
2182
|
+
async (uri) => {
|
|
2183
|
+
const res = await agent.readAgentResource(uri.toString(), ctx);
|
|
2184
|
+
return {
|
|
2185
|
+
contents: [
|
|
2186
|
+
{
|
|
2187
|
+
uri: res.uri,
|
|
2188
|
+
mimeType: res.mimeType,
|
|
2189
|
+
text: res.text
|
|
2190
|
+
}
|
|
2191
|
+
]
|
|
2192
|
+
};
|
|
2193
|
+
}
|
|
2194
|
+
);
|
|
2195
|
+
}
|
|
2196
|
+
for (const tmpl of agent.AGENT_RESOURCE_TEMPLATES) {
|
|
2197
|
+
const template = new mcp_js.ResourceTemplate(tmpl.uriTemplate, { list: void 0 });
|
|
2198
|
+
server.registerResource(
|
|
2199
|
+
tmpl.name,
|
|
2200
|
+
template,
|
|
2201
|
+
{
|
|
2202
|
+
description: tmpl.description,
|
|
2203
|
+
mimeType: tmpl.mimeType
|
|
2204
|
+
},
|
|
2205
|
+
async (uri) => {
|
|
2206
|
+
const res = await agent.readAgentResource(uri.toString(), ctx);
|
|
2207
|
+
return {
|
|
2208
|
+
contents: [
|
|
2209
|
+
{
|
|
2210
|
+
uri: res.uri,
|
|
2211
|
+
mimeType: res.mimeType,
|
|
2212
|
+
text: res.text
|
|
2213
|
+
}
|
|
2214
|
+
]
|
|
2215
|
+
};
|
|
2216
|
+
}
|
|
2217
|
+
);
|
|
2218
|
+
}
|
|
2219
|
+
for (const prompt of agent.AGENT_PROMPTS) {
|
|
2220
|
+
const argsShape = {};
|
|
2221
|
+
for (const arg of prompt.arguments) {
|
|
2222
|
+
argsShape[arg.name] = arg.required ? zod.z.string().describe(arg.description) : zod.z.string().optional().describe(arg.description);
|
|
2223
|
+
}
|
|
2224
|
+
server.registerPrompt(
|
|
2225
|
+
prompt.name,
|
|
2226
|
+
{
|
|
2227
|
+
title: prompt.title,
|
|
2228
|
+
description: prompt.description,
|
|
2229
|
+
argsSchema: argsShape
|
|
2230
|
+
},
|
|
2231
|
+
async (args) => {
|
|
2232
|
+
const rendered = agent.renderAgentPrompt(prompt.name, args);
|
|
2233
|
+
return {
|
|
2234
|
+
description: rendered.description,
|
|
2235
|
+
messages: rendered.messages
|
|
2236
|
+
};
|
|
2237
|
+
}
|
|
2238
|
+
);
|
|
2239
|
+
}
|
|
2240
|
+
return server;
|
|
2241
|
+
}
|
|
2242
|
+
var init_createWodMcpServer = __esm({
|
|
2243
|
+
"src/mcp/createWodMcpServer.ts"() {
|
|
2244
|
+
init_version();
|
|
2245
|
+
}
|
|
2246
|
+
});
|
|
2247
|
+
function withMcpCors(response) {
|
|
2248
|
+
const headers = new Headers(response.headers);
|
|
2249
|
+
for (const [k, v] of Object.entries(MCP_CORS_HEADERS)) {
|
|
2250
|
+
if (!headers.has(k)) {
|
|
2251
|
+
headers.set(k, v);
|
|
2252
|
+
}
|
|
2253
|
+
}
|
|
2254
|
+
return new Response(response.body, {
|
|
2255
|
+
status: response.status,
|
|
2256
|
+
statusText: response.statusText,
|
|
2257
|
+
headers
|
|
2258
|
+
});
|
|
2259
|
+
}
|
|
2260
|
+
function normalizeAcceptForPost(request) {
|
|
2261
|
+
if (request.method !== "POST") return request;
|
|
2262
|
+
const accept = request.headers.get("accept") ?? "";
|
|
2263
|
+
if (accept.includes("application/json") && accept.includes("text/event-stream")) {
|
|
2264
|
+
return request;
|
|
2265
|
+
}
|
|
2266
|
+
const headers = new Headers(request.headers);
|
|
2267
|
+
headers.set("accept", "application/json, text/event-stream");
|
|
2268
|
+
return new Request(request, { headers });
|
|
2269
|
+
}
|
|
2270
|
+
async function handleMcpHttpRequest(request, options) {
|
|
2271
|
+
if (request.method === "OPTIONS") {
|
|
2272
|
+
return new Response(null, { status: 204, headers: MCP_CORS_HEADERS });
|
|
2273
|
+
}
|
|
2274
|
+
const expectedToken = options.authToken ?? process.env.WOD_MCP_TOKEN?.trim();
|
|
2275
|
+
if (expectedToken) {
|
|
2276
|
+
const authHeader = request.headers.get("authorization") ?? "";
|
|
2277
|
+
const bearer = authHeader.startsWith("Bearer ") ? authHeader.slice("Bearer ".length).trim() : "";
|
|
2278
|
+
if (bearer !== expectedToken) {
|
|
2279
|
+
return withMcpCors(
|
|
2280
|
+
new Response(
|
|
2281
|
+
JSON.stringify({
|
|
2282
|
+
jsonrpc: "2.0",
|
|
2283
|
+
error: { code: -32001, message: "Unauthorized: missing or invalid Bearer token" },
|
|
2284
|
+
id: null
|
|
2285
|
+
}),
|
|
2286
|
+
{ status: 401, headers: { "content-type": "application/json" } }
|
|
2287
|
+
)
|
|
2288
|
+
);
|
|
2289
|
+
}
|
|
2290
|
+
}
|
|
2291
|
+
const storage = new sql.SqlStorage(options.db);
|
|
2292
|
+
const server = createWodMcpServer({
|
|
2293
|
+
storage,
|
|
2294
|
+
feedTree: options.feedTree,
|
|
2295
|
+
baseUrl: options.baseUrl,
|
|
2296
|
+
readonly: options.readonly ?? process.env.WOD_MCP_READONLY === "1"
|
|
2297
|
+
});
|
|
2298
|
+
const transport = new webStandardStreamableHttp_js.WebStandardStreamableHTTPServerTransport({
|
|
2299
|
+
sessionIdGenerator: void 0,
|
|
2300
|
+
enableJsonResponse: true
|
|
2301
|
+
});
|
|
2302
|
+
await server.connect(transport);
|
|
2303
|
+
try {
|
|
2304
|
+
const normalizedReq = normalizeAcceptForPost(request);
|
|
2305
|
+
const response = await transport.handleRequest(normalizedReq);
|
|
2306
|
+
return withMcpCors(response);
|
|
2307
|
+
} finally {
|
|
2308
|
+
await transport.close().catch(() => {
|
|
2309
|
+
});
|
|
2310
|
+
await server.close().catch(() => {
|
|
2311
|
+
});
|
|
2312
|
+
}
|
|
2313
|
+
}
|
|
2314
|
+
var MCP_CORS_HEADERS;
|
|
2315
|
+
var init_httpHandler = __esm({
|
|
2316
|
+
"src/mcp/httpHandler.ts"() {
|
|
2317
|
+
init_createWodMcpServer();
|
|
2318
|
+
MCP_CORS_HEADERS = {
|
|
2319
|
+
"access-control-allow-origin": "*",
|
|
2320
|
+
"access-control-allow-methods": "GET, POST, DELETE, OPTIONS",
|
|
2321
|
+
"access-control-allow-headers": "Content-Type, Accept, Authorization, Mcp-Session-Id, MCP-Protocol-Version, Last-Event-ID",
|
|
2322
|
+
"access-control-expose-headers": "Mcp-Session-Id, MCP-Protocol-Version"
|
|
2323
|
+
};
|
|
2324
|
+
}
|
|
2325
|
+
});
|
|
1522
2326
|
function streamFile(path) {
|
|
1523
2327
|
const bun = globalThis.Bun;
|
|
1524
2328
|
if (bun?.file) return bun.file(path);
|
|
@@ -1750,10 +2554,19 @@ async function servePublishedFeed(feedTree, method, relPath) {
|
|
|
1750
2554
|
throw err;
|
|
1751
2555
|
}
|
|
1752
2556
|
}
|
|
1753
|
-
async function apiRoutes(db, feedTree, req, method, sub, url) {
|
|
2557
|
+
async function apiRoutes(db, feedTree, req, method, sub, url, mcpOptions) {
|
|
1754
2558
|
if (sub === "/health") {
|
|
1755
2559
|
return json({ ok: true, driver: db.dialect }, 200);
|
|
1756
2560
|
}
|
|
2561
|
+
if (sub === "/mcp") {
|
|
2562
|
+
return handleMcpHttpRequest(req, {
|
|
2563
|
+
db,
|
|
2564
|
+
feedTree,
|
|
2565
|
+
baseUrl: url.origin,
|
|
2566
|
+
readonly: mcpOptions?.readonly,
|
|
2567
|
+
authToken: mcpOptions?.authToken
|
|
2568
|
+
});
|
|
2569
|
+
}
|
|
1757
2570
|
if (sub === "/v1/feed/status" && method === "GET") {
|
|
1758
2571
|
const storage = new sql.SqlStorage(db);
|
|
1759
2572
|
const status = await wod_wiki_engine_star.checkUnpublishedFeedChanges(storage, feedTree);
|
|
@@ -1817,7 +2630,20 @@ function createHandler(db, options) {
|
|
|
1817
2630
|
const method = request.method === "HEAD" ? "GET" : request.method;
|
|
1818
2631
|
const path = url.pathname;
|
|
1819
2632
|
if (path === "/api" || path.startsWith("/api/")) {
|
|
1820
|
-
return db ? await apiRoutes(
|
|
2633
|
+
return db ? await apiRoutes(
|
|
2634
|
+
db,
|
|
2635
|
+
feedTree,
|
|
2636
|
+
request,
|
|
2637
|
+
request.method === "OPTIONS" ? "OPTIONS" : method,
|
|
2638
|
+
path.slice("/api".length) || "/",
|
|
2639
|
+
url,
|
|
2640
|
+
{ readonly: options.mcpReadonly, authToken: options.mcpToken }
|
|
2641
|
+
) : notFound();
|
|
2642
|
+
}
|
|
2643
|
+
if (db && path === "/.well-known/agent-capabilities.json" && method === "GET") {
|
|
2644
|
+
const res = await staticResponse(distRoot, method, path);
|
|
2645
|
+
if (res.status === 200) return res;
|
|
2646
|
+
return json(agent.exportAgentCapabilitiesManifest(), 200);
|
|
1821
2647
|
}
|
|
1822
2648
|
if (db) {
|
|
1823
2649
|
const feedAsset = isPublishedFeedAssetPath(path);
|
|
@@ -1844,6 +2670,7 @@ var init_app = __esm({
|
|
|
1844
2670
|
"src/server/app.ts"() {
|
|
1845
2671
|
init_errors();
|
|
1846
2672
|
init_nodeFeedTree();
|
|
2673
|
+
init_httpHandler();
|
|
1847
2674
|
json = (value, status) => new Response(JSON.stringify(value), { status, headers: { "content-type": "application/json" } });
|
|
1848
2675
|
plain = (body, status) => new Response(body, { status, headers: { "content-type": "text/plain; charset=utf-8" } });
|
|
1849
2676
|
notFound = () => json({ error: "not found" }, 404);
|
|
@@ -2005,7 +2832,12 @@ async function runCliServer(mode, options, writeOut) {
|
|
|
2005
2832
|
try {
|
|
2006
2833
|
const dist = resolveDist(mode, options);
|
|
2007
2834
|
const feedDir = mode === "server" && options.database?.kind === "sqlite" ? `${options.database.path}.feed` : void 0;
|
|
2008
|
-
const handler = createHandler(db?.db ?? null, {
|
|
2835
|
+
const handler = createHandler(db?.db ?? null, {
|
|
2836
|
+
playgroundDist: dist,
|
|
2837
|
+
feedDir,
|
|
2838
|
+
mcpReadonly: options.mcpReadonly === true || options.env.WOD_MCP_READONLY === "1",
|
|
2839
|
+
mcpToken: options.env.WOD_MCP_TOKEN?.trim()
|
|
2840
|
+
});
|
|
2009
2841
|
server = await startHttpServer(handler, host, port);
|
|
2010
2842
|
if (mode === "server") {
|
|
2011
2843
|
writeOut(`wod server: http://${host}:${port} \u2014 ${dbLabel} \xB7 dist ${dist}`);
|
|
@@ -2042,6 +2874,76 @@ var init_server = __esm({
|
|
|
2042
2874
|
init_app();
|
|
2043
2875
|
}
|
|
2044
2876
|
});
|
|
2877
|
+
|
|
2878
|
+
// src/cli/mcp.ts
|
|
2879
|
+
var mcp_exports = {};
|
|
2880
|
+
__export(mcp_exports, {
|
|
2881
|
+
runMcpStdio: () => runMcpStdio
|
|
2882
|
+
});
|
|
2883
|
+
async function runMcpStdio(options) {
|
|
2884
|
+
const logErr = options.writeErr ?? ((msg) => process.stderr.write(`${msg}
|
|
2885
|
+
`));
|
|
2886
|
+
let dbHandle;
|
|
2887
|
+
let storage;
|
|
2888
|
+
let feedTree;
|
|
2889
|
+
let baseUrl = "";
|
|
2890
|
+
if (options.serverUrl) {
|
|
2891
|
+
const trimmed = options.serverUrl.replace(/\/+$/, "");
|
|
2892
|
+
const apiBase = trimmed.endsWith("/api") ? trimmed : `${trimmed}/api`;
|
|
2893
|
+
storage = new wodWikiStorage.ApiStorage(apiBase);
|
|
2894
|
+
feedTree = new wod_wiki_engine_star.MemoryFeedTree();
|
|
2895
|
+
baseUrl = trimmed.endsWith("/api") ? trimmed.slice(0, -4) : trimmed;
|
|
2896
|
+
} else {
|
|
2897
|
+
if (!options.database) {
|
|
2898
|
+
logErr("[wod mcp] Error: Missing database configuration");
|
|
2899
|
+
return 1;
|
|
2900
|
+
}
|
|
2901
|
+
dbHandle = await openCliDb(options.database);
|
|
2902
|
+
storage = dbHandle.storage;
|
|
2903
|
+
feedTree = options.database.kind === "sqlite" ? new NodeFsFeedTree(`${options.database.path}.feed`) : new wod_wiki_engine_star.MemoryFeedTree();
|
|
2904
|
+
}
|
|
2905
|
+
const server = createWodMcpServer({
|
|
2906
|
+
storage,
|
|
2907
|
+
feedTree,
|
|
2908
|
+
baseUrl,
|
|
2909
|
+
readonly: options.readonly
|
|
2910
|
+
});
|
|
2911
|
+
const transport = new stdio_js.StdioServerTransport();
|
|
2912
|
+
await server.connect(transport);
|
|
2913
|
+
return new Promise((resolve4) => {
|
|
2914
|
+
let closed = false;
|
|
2915
|
+
const finish = async (code) => {
|
|
2916
|
+
if (closed) return;
|
|
2917
|
+
closed = true;
|
|
2918
|
+
await server.close().catch(() => {
|
|
2919
|
+
});
|
|
2920
|
+
if (dbHandle) {
|
|
2921
|
+
await dbHandle.close().catch(() => {
|
|
2922
|
+
});
|
|
2923
|
+
}
|
|
2924
|
+
resolve4(code);
|
|
2925
|
+
};
|
|
2926
|
+
transport.onclose = () => {
|
|
2927
|
+
void finish(0);
|
|
2928
|
+
};
|
|
2929
|
+
transport.onerror = (err) => {
|
|
2930
|
+
logErr(`[wod mcp] Transport error: ${err.message}`);
|
|
2931
|
+
};
|
|
2932
|
+
process.once("SIGINT", () => {
|
|
2933
|
+
void finish(0);
|
|
2934
|
+
});
|
|
2935
|
+
process.once("SIGTERM", () => {
|
|
2936
|
+
void finish(0);
|
|
2937
|
+
});
|
|
2938
|
+
});
|
|
2939
|
+
}
|
|
2940
|
+
var init_mcp = __esm({
|
|
2941
|
+
"src/cli/mcp.ts"() {
|
|
2942
|
+
init_db();
|
|
2943
|
+
init_nodeFeedTree();
|
|
2944
|
+
init_createWodMcpServer();
|
|
2945
|
+
}
|
|
2946
|
+
});
|
|
2045
2947
|
function getPathUtils() {
|
|
2046
2948
|
if (typeof globalThis.process?.versions?.node === "undefined" && !("Bun" in globalThis)) {
|
|
2047
2949
|
throw new Error("Path resolution is only supported in Node / Bun environments");
|
|
@@ -4072,7 +4974,23 @@ var VALUE_FLAGS = [
|
|
|
4072
4974
|
["--env-file", "envFile"],
|
|
4073
4975
|
["--host", "host"],
|
|
4074
4976
|
["--port", "port"],
|
|
4075
|
-
["--dist", "dist"]
|
|
4977
|
+
["--dist", "dist"],
|
|
4978
|
+
["--server", "serverUrl"],
|
|
4979
|
+
["--note", "noteId"],
|
|
4980
|
+
["--source-note", "sourceNoteId"],
|
|
4981
|
+
["--block", "blockId"],
|
|
4982
|
+
["--notebook", "notebook"],
|
|
4983
|
+
["--date", "date"],
|
|
4984
|
+
["--title", "title"],
|
|
4985
|
+
["--description", "description"],
|
|
4986
|
+
["--markdown", "markdown"],
|
|
4987
|
+
["--search", "search"],
|
|
4988
|
+
["--tag", "tag"],
|
|
4989
|
+
["--slug", "slug"],
|
|
4990
|
+
["--category", "category"],
|
|
4991
|
+
["--type", "tagType"],
|
|
4992
|
+
["--url", "url"],
|
|
4993
|
+
["--feed-id", "feedId"]
|
|
4076
4994
|
];
|
|
4077
4995
|
function readValueFlag(args, i, flag) {
|
|
4078
4996
|
const inline = args[i].startsWith(`${flag}=`);
|
|
@@ -4089,7 +5007,10 @@ function parseCliArgs(args) {
|
|
|
4089
5007
|
const result = {
|
|
4090
5008
|
format: "json",
|
|
4091
5009
|
packs: [],
|
|
4092
|
-
sources: []
|
|
5010
|
+
sources: [],
|
|
5011
|
+
tags: [],
|
|
5012
|
+
aliases: [],
|
|
5013
|
+
setPairs: []
|
|
4093
5014
|
};
|
|
4094
5015
|
const valueArgs = result;
|
|
4095
5016
|
let i = 0;
|
|
@@ -4197,8 +5118,50 @@ function parseCliArgs(args) {
|
|
|
4197
5118
|
const v = Number(arg.slice("--seed-version=".length));
|
|
4198
5119
|
if (Number.isSafeInteger(v) && v >= 0) result.seedVersion = v;
|
|
4199
5120
|
i++;
|
|
5121
|
+
} else if (arg === "--json") {
|
|
5122
|
+
result.json = true;
|
|
5123
|
+
result.format = "json";
|
|
5124
|
+
i++;
|
|
5125
|
+
} else if (arg === "--no-save") {
|
|
5126
|
+
result.noSave = true;
|
|
5127
|
+
i++;
|
|
5128
|
+
} else if (arg === "--mcp-readonly" || arg === "--readonly") {
|
|
5129
|
+
result.mcpReadonly = true;
|
|
5130
|
+
i++;
|
|
5131
|
+
} else if (arg === "--validate-only") {
|
|
5132
|
+
result.validateOnly = true;
|
|
5133
|
+
i++;
|
|
5134
|
+
} else if (arg === "--limit") {
|
|
5135
|
+
const v = Number(args[++i]);
|
|
5136
|
+
if (Number.isSafeInteger(v) && v > 0) result.limit = v;
|
|
5137
|
+
i++;
|
|
5138
|
+
} else if (arg.startsWith("--limit=")) {
|
|
5139
|
+
const v = Number(arg.slice("--limit=".length));
|
|
5140
|
+
if (Number.isSafeInteger(v) && v > 0) result.limit = v;
|
|
5141
|
+
i++;
|
|
5142
|
+
} else if (arg === "--tags") {
|
|
5143
|
+
const raw = args[++i] ?? "";
|
|
5144
|
+
result.tags.push(...raw.split(",").map((t) => t.trim()).filter(Boolean));
|
|
5145
|
+
i++;
|
|
5146
|
+
} else if (arg.startsWith("--tags=")) {
|
|
5147
|
+
result.tags.push(...arg.slice("--tags=".length).split(",").map((t) => t.trim()).filter(Boolean));
|
|
5148
|
+
i++;
|
|
5149
|
+
} else if (arg === "--alias") {
|
|
5150
|
+
const raw = args[++i];
|
|
5151
|
+
if (raw) result.aliases.push(raw);
|
|
5152
|
+
i++;
|
|
5153
|
+
} else if (arg.startsWith("--alias=")) {
|
|
5154
|
+
result.aliases.push(arg.slice("--alias=".length));
|
|
5155
|
+
i++;
|
|
5156
|
+
} else if (arg === "--set") {
|
|
5157
|
+
const raw = args[++i];
|
|
5158
|
+
if (raw) result.setPairs.push(raw);
|
|
5159
|
+
i++;
|
|
5160
|
+
} else if (arg.startsWith("--set=")) {
|
|
5161
|
+
result.setPairs.push(arg.slice("--set=".length));
|
|
5162
|
+
i++;
|
|
4200
5163
|
} else if (!result.subcommand) {
|
|
4201
|
-
if (arg === "parse" || arg === "run" || arg === "query" || arg === "download" || arg === "export" || arg === "import" || arg === "publish" || arg === "build" || arg === "seed" || arg === "reset" || arg === "init" || arg === "db" || arg === "server" || arg === "serve" || arg === "playground" || arg === "init-feed" || arg === "skills" || arg === "help" || arg === "version") {
|
|
5164
|
+
if (arg === "parse" || arg === "run" || arg === "query" || arg === "download" || arg === "export" || arg === "import" || arg === "publish" || arg === "build" || arg === "seed" || arg === "reset" || arg === "init" || arg === "db" || arg === "server" || arg === "serve" || arg === "playground" || arg === "init-feed" || arg === "skills" || arg === "note" || arg === "journal" || arg === "notebook" || arg === "session" || arg === "catalog" || arg === "tag" || arg === "feed" || arg === "mcp" || arg === "tools" || arg === "doctor" || arg === "help" || arg === "version") {
|
|
4202
5165
|
result.subcommand = arg;
|
|
4203
5166
|
} else {
|
|
4204
5167
|
result.target = arg;
|
|
@@ -4210,6 +5173,9 @@ function parseCliArgs(args) {
|
|
|
4210
5173
|
} else if (!result.target2) {
|
|
4211
5174
|
result.target2 = arg;
|
|
4212
5175
|
i++;
|
|
5176
|
+
} else if (!result.target3) {
|
|
5177
|
+
result.target3 = arg;
|
|
5178
|
+
i++;
|
|
4213
5179
|
} else {
|
|
4214
5180
|
i++;
|
|
4215
5181
|
}
|
|
@@ -4320,9 +5286,22 @@ DB OPTIONS (for 'wod db'):
|
|
|
4320
5286
|
actions; credentials are never printed to stdout
|
|
4321
5287
|
|
|
4322
5288
|
wod server [options]
|
|
4323
|
-
Serve the app (HTTP API + packaged frontend; alias: serve)
|
|
5289
|
+
Serve the app (HTTP API + /api/mcp + packaged frontend; alias: serve)
|
|
4324
5290
|
wod playground [options]
|
|
4325
|
-
Serve the local playground (browser IndexedDB build)
|
|
5291
|
+
Serve the local playground (browser IndexedDB build + WebMCP)
|
|
5292
|
+
wod mcp [--readonly] [--server <url>]
|
|
5293
|
+
Start the official MCP server over stdio for Claude/Cursor/Codex
|
|
5294
|
+
|
|
5295
|
+
AGENT NOUN-VERB COMMANDS (all support --json and --server <url>):
|
|
5296
|
+
wod note <list|get|create|update|clone|delete> [args]
|
|
5297
|
+
wod journal <day|add> [date] [options]
|
|
5298
|
+
wod notebook <list|save|delete> [slug] [options]
|
|
5299
|
+
wod session <list|get|run|delete> [id] [options]
|
|
5300
|
+
wod catalog <lookup|get|upsert> [effort|equipment|tag|tag-type] [name]
|
|
5301
|
+
wod tag <list|upsert> [label] [--type <tagType>]
|
|
5302
|
+
wod feed <list|status|subscribe|sync|unsubscribe|publish> [options]
|
|
5303
|
+
wod tools <list|manifest> [--json]
|
|
5304
|
+
wod doctor [--json]
|
|
4326
5305
|
|
|
4327
5306
|
SUBCOMMANDS:
|
|
4328
5307
|
parse <file | -> Parse Whiteboard Script, create a note in the database
|
|
@@ -4453,6 +5432,7 @@ EXIT CODES:
|
|
|
4453
5432
|
1 - General / Runtime error
|
|
4454
5433
|
2 - Parse / Syntax error
|
|
4455
5434
|
3 - Language Pack load error
|
|
5435
|
+
4 - Destructive confirmation required (pass --yes <targetId>)
|
|
4456
5436
|
`;
|
|
4457
5437
|
}
|
|
4458
5438
|
function printUsage(writer) {
|
|
@@ -4586,22 +5566,32 @@ async function cliMain(argv = process.argv.slice(2), io = {}) {
|
|
|
4586
5566
|
}
|
|
4587
5567
|
const noteSource = cliNoteSource(source, parsed.target, parsed.sport);
|
|
4588
5568
|
const ir = runParse(source, { sport: parsed.sport, sourceLabel: `cli:wod parse ${parsed.target}` });
|
|
4589
|
-
|
|
4590
|
-
|
|
4591
|
-
|
|
4592
|
-
|
|
4593
|
-
|
|
4594
|
-
|
|
4595
|
-
|
|
4596
|
-
|
|
4597
|
-
|
|
4598
|
-
|
|
4599
|
-
|
|
4600
|
-
|
|
4601
|
-
|
|
4602
|
-
|
|
4603
|
-
|
|
4604
|
-
|
|
5569
|
+
if (!parsed.noSave) {
|
|
5570
|
+
const identity = wod_wiki_engine_star.extractNoteIdentity(source);
|
|
5571
|
+
const tags = wod_wiki_engine_star.extractTypedTags(source);
|
|
5572
|
+
const db = await openCliDb(cliDb());
|
|
5573
|
+
try {
|
|
5574
|
+
const persisted = await persistNote(db, {
|
|
5575
|
+
source: noteSource,
|
|
5576
|
+
sourceLabel: parsed.target,
|
|
5577
|
+
noteId: identity?.noteId,
|
|
5578
|
+
title: identity?.title,
|
|
5579
|
+
tags
|
|
5580
|
+
});
|
|
5581
|
+
if (!parsed.json) {
|
|
5582
|
+
writeOut(
|
|
5583
|
+
`[wod parse] note ${persisted.noteId}${persisted.created ? "" : " (updated)"} \u2014 ${persisted.blocks} blocks, ${persisted.efforts} efforts${persisted.tags > 0 ? `, ${persisted.tags} tags` : ""} \u2192 ${db.path}`
|
|
5584
|
+
);
|
|
5585
|
+
} else if (!parsed.output) {
|
|
5586
|
+
deliverOutput(JSON.stringify({ ok: true, persisted, ir }, null, 2));
|
|
5587
|
+
}
|
|
5588
|
+
} finally {
|
|
5589
|
+
await db.close();
|
|
5590
|
+
}
|
|
5591
|
+
} else if (parsed.json && !parsed.output) {
|
|
5592
|
+
deliverOutput(formatParseOutput(ir, "json", true));
|
|
5593
|
+
} else if (!parsed.output) {
|
|
5594
|
+
writeOut(`[wod parse] valid Whiteboard Script (--no-save)`);
|
|
4605
5595
|
}
|
|
4606
5596
|
if (parsed.output) {
|
|
4607
5597
|
const pretty = Boolean(process.stdout.isTTY);
|
|
@@ -4611,8 +5601,18 @@ async function cliMain(argv = process.argv.slice(2), io = {}) {
|
|
|
4611
5601
|
return 0;
|
|
4612
5602
|
}
|
|
4613
5603
|
if (parsed.subcommand === "run") {
|
|
5604
|
+
if (parsed.noteId && !parsed.target) {
|
|
5605
|
+
const { runAgentNounVerbCommand: runAgentNounVerbCommand2 } = await Promise.resolve().then(() => (init_agentCommands(), agentCommands_exports));
|
|
5606
|
+
return runAgentNounVerbCommand2({
|
|
5607
|
+
parsed: { ...parsed, subcommand: "session", target: "run", target2: parsed.noteId },
|
|
5608
|
+
resolveDbConfig: cliDb,
|
|
5609
|
+
readStdin: getStdin,
|
|
5610
|
+
writeOut,
|
|
5611
|
+
writeErr
|
|
5612
|
+
});
|
|
5613
|
+
}
|
|
4614
5614
|
if (!parsed.target) {
|
|
4615
|
-
writeErr('[wod run] Error: Missing input file
|
|
5615
|
+
writeErr('[wod run] Error: Missing input file, "-" for stdin, or --note <noteId>');
|
|
4616
5616
|
return 1;
|
|
4617
5617
|
}
|
|
4618
5618
|
let source;
|
|
@@ -4668,6 +5668,18 @@ async function cliMain(argv = process.argv.slice(2), io = {}) {
|
|
|
4668
5668
|
writeErr("[wod query] Error: Missing WQL query argument");
|
|
4669
5669
|
return 1;
|
|
4670
5670
|
}
|
|
5671
|
+
if (parsed.validateOnly) {
|
|
5672
|
+
const { wodValidateWqlTool } = await import('@bitcobblers/wod-wiki-engine/agent');
|
|
5673
|
+
const validation = await wodValidateWqlTool.execute({ query: parsed.target }, {
|
|
5674
|
+
storage: void 0
|
|
5675
|
+
});
|
|
5676
|
+
if (parsed.json || parsed.format === "json") {
|
|
5677
|
+
deliverOutput(JSON.stringify(validation, null, 2));
|
|
5678
|
+
} else {
|
|
5679
|
+
writeOut(validation.valid ? `[wod query] valid (${validation.family ?? "wql"})` : `[wod query] invalid: ${validation.error}`);
|
|
5680
|
+
}
|
|
5681
|
+
return validation.valid ? 0 : 2;
|
|
5682
|
+
}
|
|
4671
5683
|
const useDb = !parsed.corpus && !parsed.stdinLog && !parsed.stdinFacts;
|
|
4672
5684
|
let stdinLogContent;
|
|
4673
5685
|
let stdinFactsContent;
|
|
@@ -4995,10 +6007,20 @@ async function cliMain(argv = process.argv.slice(2), io = {}) {
|
|
|
4995
6007
|
);
|
|
4996
6008
|
return 1;
|
|
4997
6009
|
}
|
|
6010
|
+
if (parsed.yes !== void 0 && parsed.yes !== "RESET") {
|
|
6011
|
+
writeErr("[wod reset] Invalid --yes value (expected: --yes RESET)");
|
|
6012
|
+
return 4;
|
|
6013
|
+
}
|
|
4998
6014
|
const target = config.path;
|
|
4999
6015
|
if (nodeFs().existsSync(target)) {
|
|
5000
6016
|
nodeFs().unlinkSync(target);
|
|
5001
|
-
|
|
6017
|
+
if (parsed.json) {
|
|
6018
|
+
writeOut(JSON.stringify({ ok: true, removed: true, path: target }, null, 2));
|
|
6019
|
+
} else {
|
|
6020
|
+
writeOut(`[wod reset] removed ${target}`);
|
|
6021
|
+
}
|
|
6022
|
+
} else if (parsed.json) {
|
|
6023
|
+
writeOut(JSON.stringify({ ok: true, removed: false, path: target }, null, 2));
|
|
5002
6024
|
} else {
|
|
5003
6025
|
writeOut(`[wod reset] nothing to reset \u2014 ${target} does not exist`);
|
|
5004
6026
|
}
|
|
@@ -5043,9 +6065,29 @@ async function cliMain(argv = process.argv.slice(2), io = {}) {
|
|
|
5043
6065
|
if (parsed.host !== void 0) options.host = parsed.host;
|
|
5044
6066
|
if (parsed.port !== void 0) options.port = parsed.port;
|
|
5045
6067
|
if (parsed.dist !== void 0) options.dist = parsed.dist;
|
|
6068
|
+
if (parsed.mcpReadonly === true) options.mcpReadonly = true;
|
|
5046
6069
|
await runCliServer2(mode, options, writeOut);
|
|
5047
6070
|
return 0;
|
|
5048
6071
|
}
|
|
6072
|
+
if (parsed.subcommand === "mcp") {
|
|
6073
|
+
const { runMcpStdio: runMcpStdio2 } = await Promise.resolve().then(() => (init_mcp(), mcp_exports));
|
|
6074
|
+
return runMcpStdio2({
|
|
6075
|
+
database: parsed.serverUrl ? void 0 : cliDb(),
|
|
6076
|
+
serverUrl: parsed.serverUrl,
|
|
6077
|
+
readonly: parsed.mcpReadonly === true || cliEnv().WOD_MCP_READONLY === "1",
|
|
6078
|
+
writeErr
|
|
6079
|
+
});
|
|
6080
|
+
}
|
|
6081
|
+
if (parsed.subcommand === "note" || parsed.subcommand === "journal" || parsed.subcommand === "notebook" || parsed.subcommand === "session" || parsed.subcommand === "catalog" || parsed.subcommand === "tag" || parsed.subcommand === "feed" || parsed.subcommand === "tools" || parsed.subcommand === "doctor") {
|
|
6082
|
+
const { runAgentNounVerbCommand: runAgentNounVerbCommand2 } = await Promise.resolve().then(() => (init_agentCommands(), agentCommands_exports));
|
|
6083
|
+
return runAgentNounVerbCommand2({
|
|
6084
|
+
parsed,
|
|
6085
|
+
resolveDbConfig: cliDb,
|
|
6086
|
+
readStdin: getStdin,
|
|
6087
|
+
writeOut,
|
|
6088
|
+
writeErr
|
|
6089
|
+
});
|
|
6090
|
+
}
|
|
5049
6091
|
writeErr(`[wod] Unknown subcommand "${parsed.subcommand}"`);
|
|
5050
6092
|
return 1;
|
|
5051
6093
|
} catch (error) {
|