Add 17 warm-up, stretch, and mobility exercises with new starter splits

The library grows to 64 exercises: arm circles, torso twist, leg
swings, hip and neck mobility, marching, calf raises, and a full
stretching set (forward fold, quad, calf, chest, triceps, hip flexor,
butterfly, cobra, child's pose), each with an authored motion rig and
reference page. Eight new starter splits join the catalog — Upper and
Lower Body Warm-Up, Morning Wake-Up, Morning Mobility, Full Body
Stretch, Evening Stretch, Free Weight Basics, and Full Body Machines —
regenerated deterministically at split schema v3 with fixed ULIDs.

Claude-Session: https://claude.ai/code/session_01HJDQQDA9QdP8zByg43H5v3
This commit is contained in:
2026-07-08 12:49:18 -04:00
parent 394ec0989e
commit 60927b5d1f
170 changed files with 4502 additions and 15 deletions
+70 -3
View File
@@ -49,7 +49,7 @@ struct ExerciseDocument: Codable {
var order: Int
var sets: Int
var reps: Int
var weight: Int
var weight: Double
var loadType: Int
var durationSeconds: Int
var machineSettings: [MachineSetting]? = nil
@@ -73,7 +73,7 @@ struct SplitDocument: Codable {
// `machine: true` emits `machineSettings: []` marks the exercise machine-based
// (empty = nothing recorded yet), which lights up the machine-settings UI without
// the user having to flip the editor toggle first.
struct Ex { let name: String; var weight = 0; var sets = 4; var reps = 10; var load = 1; var dur = 0; var machine = false }
struct Ex { let name: String; var weight: Double = 0; var sets = 4; var reps = 10; var load = 1; var dur = 0; var machine = false }
struct Sp { let name: String; let color: String; let icon: String; let activity: Int; let ex: [Ex] }
let seeds: [Sp] = [
@@ -108,6 +108,73 @@ let seeds: [Sp] = [
Ex(name: "Crunch", sets: 3, reps: 12, load: 0),
Ex(name: "Reverse Crunch", sets: 3, reps: 12, load: 0),
]),
Sp(name: "Full Body Machines", color: "purple", icon: "figure.strengthtraining.traditional", activity: 0, ex: [
Ex(name: "Leg Press", weight: 100, machine: true),
Ex(name: "Chest Press", weight: 40, machine: true),
Ex(name: "Seated Row", weight: 70, machine: true),
Ex(name: "Shoulder Press", weight: 30, machine: true),
Ex(name: "Lat Pull Down", weight: 80, machine: true),
Ex(name: "Abdominal", weight: 40, machine: true),
]),
Sp(name: "Free Weight Basics", color: "red", icon: "dumbbell.fill", activity: 0, ex: [
Ex(name: "Goblet Squat", weight: 25, sets: 3, reps: 10),
Ex(name: "Dumbbell Bench Press", weight: 25, sets: 3, reps: 8),
Ex(name: "Dumbbell Row", weight: 30, sets: 3, reps: 8),
Ex(name: "Dumbbell Shoulder Press", weight: 20, sets: 3, reps: 8),
Ex(name: "Romanian Deadlift", weight: 65, sets: 3, reps: 8),
Ex(name: "Dumbbell Curl", weight: 20, sets: 3, reps: 10),
]),
Sp(name: "Upper Body Warm-Up", color: "cyan", icon: "figure.arms.open", activity: 1, ex: [
Ex(name: "Arm Circles", sets: 2, reps: 10, load: 0),
Ex(name: "Torso Twist", sets: 2, reps: 10, load: 0),
Ex(name: "Standing Side Bend", sets: 2, reps: 8, load: 0),
Ex(name: "Cat-Cow", sets: 1, reps: 8, load: 0),
Ex(name: "Push-Up", sets: 2, reps: 8, load: 0),
]),
Sp(name: "Lower Body Warm-Up", color: "mint", icon: "figure.walk", activity: 1, ex: [
Ex(name: "March in Place", sets: 1, reps: 0, load: 2, dur: 60),
Ex(name: "Leg Swings", sets: 2, reps: 10, load: 0),
Ex(name: "Hip Circles", sets: 2, reps: 8, load: 0),
Ex(name: "Bodyweight Squat", sets: 2, reps: 12, load: 0),
Ex(name: "Glute Bridge", sets: 2, reps: 10, load: 0),
Ex(name: "Standing Calf Raise", sets: 2, reps: 12, load: 0),
]),
Sp(name: "Morning Wake-Up", color: "yellow", icon: "sun.max.fill", activity: 1, ex: [
Ex(name: "March in Place", sets: 1, reps: 0, load: 2, dur: 45),
Ex(name: "Neck Rolls", sets: 1, reps: 5, load: 0),
Ex(name: "Arm Circles", sets: 1, reps: 10, load: 0),
Ex(name: "Torso Twist", sets: 1, reps: 10, load: 0),
Ex(name: "Standing Side Bend", sets: 1, reps: 8, load: 0),
Ex(name: "Hip Circles", sets: 1, reps: 8, load: 0),
Ex(name: "Leg Swings", sets: 1, reps: 10, load: 0),
Ex(name: "Standing Calf Raise", sets: 1, reps: 12, load: 0),
Ex(name: "Standing Forward Fold", sets: 1, reps: 0, load: 2, dur: 30),
]),
Sp(name: "Morning Mobility", color: "pink", icon: "figure.yoga", activity: 1, ex: [
Ex(name: "Cat-Cow", sets: 1, reps: 10, load: 0),
Ex(name: "Bird Dog", sets: 1, reps: 8, load: 0),
Ex(name: "Dead Bug", sets: 1, reps: 8, load: 0),
Ex(name: "Glute Bridge", sets: 1, reps: 12, load: 0),
Ex(name: "Cobra Stretch", sets: 1, reps: 8, load: 0),
Ex(name: "Child's Pose", sets: 1, reps: 0, load: 2, dur: 45),
Ex(name: "Standing Forward Fold", sets: 1, reps: 0, load: 2, dur: 30),
]),
Sp(name: "Full Body Stretch", color: "brown", icon: "figure.flexibility", activity: 1, ex: [
Ex(name: "Standing Forward Fold", sets: 1, reps: 0, load: 2, dur: 30),
Ex(name: "Standing Quad Stretch", sets: 2, reps: 0, load: 2, dur: 30),
Ex(name: "Standing Calf Stretch", sets: 2, reps: 0, load: 2, dur: 30),
Ex(name: "Chest Opener", sets: 1, reps: 0, load: 2, dur: 30),
Ex(name: "Overhead Triceps Stretch", sets: 2, reps: 0, load: 2, dur: 30),
Ex(name: "Kneeling Hip Flexor Stretch", sets: 2, reps: 0, load: 2, dur: 30),
Ex(name: "Child's Pose", sets: 1, reps: 0, load: 2, dur: 45),
]),
Sp(name: "Evening Stretch", color: "indigo", icon: "figure.mind.and.body", activity: 1, ex: [
Ex(name: "Cat-Cow", sets: 1, reps: 10, load: 0),
Ex(name: "Butterfly Stretch", sets: 1, reps: 0, load: 2, dur: 45),
Ex(name: "Kneeling Hip Flexor Stretch", sets: 2, reps: 0, load: 2, dur: 30),
Ex(name: "Cobra Stretch", sets: 1, reps: 8, load: 0),
Ex(name: "Child's Pose", sets: 1, reps: 0, load: 2, dur: 45),
]),
]
// MARK: - Emit
@@ -123,7 +190,7 @@ try FileManager.default.createDirectory(at: outDir, withIntermediateDirectories:
for (order, sp) in seeds.enumerated() {
let slug = sp.name.lowercased().replacingOccurrences(of: " ", with: "-")
let doc = SplitDocument(
schemaVersion: 2,
schemaVersion: 3,
id: deterministicULID(label: "starter.\(slug)"),
name: sp.name, color: sp.color, systemImage: sp.icon, order: order,
createdAt: fixedDate, updatedAt: fixedDate,