@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.
- package/README.md +82 -0
- package/dist/index.js +653 -166
- 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
|