@gehlich/calicomp-mcp 1.4.0 → 1.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +82 -0
  2. package/dist/index.js +653 -166
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -397,8 +397,90 @@ decrypted, and `get_template`, `get_suggestion` and `get_exercise_catalog` say w
397
397
  fields come from encrypted data and when an own name or an own exercise can be missing. A test
398
398
  over the import chain of every tool module keeps that claim out.
399
399
 
400
+ ## New in phase 168 (since 1.5.0)
401
+
402
+ Phase 168 lets the athlete decide which kinds of proposals the app applies directly (protocol 1.56 of
403
+ `docs/COACH-PLANNING-PROTOCOL.md`, §2.8 and §5; the rules themselves are the app contract
404
+ `docs/COACH-PERMISSIONS.md` in the super-repo). Prepared in 1.5.0; published by the athlete.
405
+
406
+ ### Correcting a finished workout
407
+
408
+ The new tool `propose_history_correction` (proposal type `history_correction`) proposes a correction
409
+ of a finished, not deleted workout: change `reps`, `timeSec` or `weight` of a set, add a forgotten
410
+ set after an existing one (`afterSetId`), or remove a wrong set, 1 to 50 changes per proposal. It never
411
+ changes the exercise of a set, the notes or the rating. Before it sends, the tool checks against the
412
+ history it read that the session exists, has ended and is not deleted, that every named set is a live
413
+ set of that session and that no set id stands twice; otherwise it answers with an error and sends
414
+ nothing.
415
+
416
+ Set values are never plaintext on the server, so this is the one proposal type whose content is
417
+ encrypted with the account key: the server stores only `{"v":1,"sessionId":…,"encryptedPayload":…}`,
418
+ and the encrypted inner payload names every live set of the session with its `updatedAt` so the app can
419
+ tell whether the proposal still fits. The app accepts it with status `accepted` only, never
420
+ `accepted_modified`. The type is live once the server has been deployed with it.
421
+
422
+ ### Proposals may be applied directly
423
+
424
+ Every `propose_*` tool description now ends with the same sentence: depending on the athlete's choice
425
+ in the app, the app may apply a proposal directly. The MCP never learns how the athlete chose, and the
426
+ tools no longer say that only the athlete applies a proposal. The tools themselves still change
427
+ nothing: they send the proposal to the app.
428
+
429
+ ### Reading back what happened
430
+
431
+ `get_suggestions` and `get_suggestion` carry two new fields: `decidedBy` (`"auto"` when the app applied
432
+ the proposal directly, `"user"` when the athlete decided, absent when unknown) and `undoneAt` (epoch ms
433
+ when the athlete undid a direct apply, absent otherwise). Both tools show only the fields of their own
434
+ row type; a field that belongs to the app's own list never reaches the coach.
435
+
436
+ ### Personal muscles and capabilities, and the section "Reine Kraft" (phase 168.1)
437
+
438
+ Phase 168.1 adds to the same version (protocol 1.57 of `docs/COACH-PLANNING-PROTOCOL.md`, §1.11, §1.12
439
+ and §2.9).
440
+
441
+ The new tool `propose_catalog_exercise_links` (proposal type `catalog_exercise_links`, tool 22, the
442
+ ninth that writes) proposes a personal muscle list, a personal capability list or both for a catalog
443
+ exercise. Such a list replaces the catalog list of its kind completely for this athlete, everywhere and
444
+ also for old sets; an own exercise stays with `propose_exercise_update`. The tool checks the exercise
445
+ and every key against the unchanged catalog and sends nothing otherwise. The type is live once the
446
+ server has been deployed with it.
447
+
448
+ The app keeps the personal lists encrypted. The MCP decrypts them and lays them over the catalog in
449
+ one place, so every tool that reads the catalog counts with them, and a row it cannot read is reported
450
+ in `unreadable` while its exercise follows the catalog. `get_exercise_catalog` shows the effective lists
451
+ and, only on an entry with a personal list, `personalLinks` with the kinds that are personal.
452
+
453
+ `get_stats { by: "capabilities" }` and each window of `get_training_state.capabilityBalance` carry a
454
+ new field `pureStrength` beside the axes: the section "Reine Kraft", exercises without a capability
455
+ axis, per exercise `{ exerciseId, name, setCount, metric, direction }`. It is never a key in
456
+ `setCounts` and never an eighth axis. `setCount` counts the raw sets of the period; `metric` is `reps`,
457
+ `e1rm` or `timeSeconds`, by its own rule, so a pull-up trained without weight shows a direction and not
458
+ `insufficient-data`; `direction` rests on the last 12 sessions of the whole history, whatever the
459
+ period. An own exercise also carries `exerciseNameFreeText`. `get_progress` is unchanged.
460
+
400
461
  ## Changelog
401
462
 
463
+ ### 1.5.1
464
+
465
+ - **`get_history` leaves deleted rows out:** sessions and set-logs the athlete deleted no longer appear in `sessions`,
466
+ `setLogs` or `matchingSessions`, and the exercise filter no longer finds a session through a deleted set. Until now
467
+ they came along as ordinary entries with a `deletedAt` field for up to 90 days.
468
+
469
+ ### 1.5.0
470
+
471
+ - **Correcting a finished workout:** the new tool `propose_history_correction` with an encrypted
472
+ payload; see [New in phase 168](#new-in-phase-168-since-150).
473
+ - **Direct application:** every proposal tool says that the app may apply a proposal directly,
474
+ depending on the athlete's choice; `get_suggestions` and `get_suggestion` show `decidedBy` and
475
+ `undoneAt`.
476
+ - **Personal lists of catalog exercises:** the new tool `propose_catalog_exercise_links`, the overlay
477
+ of the personal lists on every reader of the catalog, and `personalLinks` in `get_exercise_catalog`;
478
+ see
479
+ [Personal muscles and capabilities](#personal-muscles-and-capabilities-and-the-section-reine-kraft-phase-1681).
480
+ - **Section "Reine Kraft":** `pureStrength` in `get_stats { by: "capabilities" }` and in each window of
481
+ `get_training_state.capabilityBalance`, with its own progress rule.
482
+ - **Node:** still `>=22`. No new dependency.
483
+
402
484
  ### 1.4.0
403
485
 
404
486
  - **Export directory:** `outputFile: true` can write into a directory you choose with