Skip to content
On this page

Exercise library

Resolve TrainHeroic exercise names, inspect candidates, and cache the library.

Workout writes need TrainHeroic exercise ids. ExerciseLibrary loads the library once, ranks fuzzy matches in memory, and can persist the result between processes.

import { ExerciseLibrary } from "@trainheroic-unofficial/js";
import { JsonFileLibraryCache } from "@trainheroic-unofficial/js/node";

const library = new ExerciseLibrary(client, new JsonFileLibraryCache());

const matches = await library.search("back squat", 5);
const { match, candidates } = await library.resolve("Barbell Back Squat");

if (!match) {
  console.log(candidates.map((candidate) => `${candidate.id}: ${candidate.title}`));
}

resolve() returns a confident match only when the name identifies one exercise. Ambiguous queries return candidates instead; let the user choose before writing a workout.

Storage

The default cache is in memory. JsonFileLibraryCache writes to ~/.trainheroic/library.json unless you provide another path. Hosted MCP uses a D1-backed implementation of the same ExerciseIndex interface.

Was this page helpful?