Files
HealthLog/scripts
Marc-André Bombeck 4537ff0d8e feat(medications): add a note to the medication (#1371)
Directions such as "30 to 60 minutes before food" had nowhere to go: a
medication carried no free text of its own, only the notes on a dose
change or a course. The medication now has one note, edited on the last
step of the wizard and shown under the name on the detail page, above
the dose actions on both card variants, under the picked medication in
the log-dose sheet, and per row in the take-all-due list. One
MedicationNote component renders it everywhere, in foreground text.

The note is sealed at rest in Medication.noteEncrypted (migration
0498_medication_note, lock-bounded), with no plaintext column. Create
and update take an optional `note`: trimmed, at most 500 characters, an
empty string or null clears it, absent keeps it. The wizard sends it on
an edit only when it changed, so an unrelated save never clears it. The
list and detail reads strip the ciphertext and answer `note`.

Both ends of the data path carry it: the backup (decrypted in a portable
file, ciphertext in a disaster-recovery file), the restore, the data
export, the key-rotation registry and script, and the MCP medication
schedule, resources and fetch, fenced as user text. The doctor report
and the FHIR export leave it out: it is the person's own reminder, and
the report has no selection for personal prose.

The size baselines rise by the one-line wiring of the field in the
medication page, detail tabs, cards, log-dose sheet, wizard step and
list read; the wizard payload grows by the field's own encode and
hydrate.
2026-11-14 09:30:40 +01:00
..
2026-05-16 09:28:40 +02:00
2026-05-16 14:19:57 +02:00

scripts/

One-shot operator and build scripts. They are not part of the running application: they are run by hand during a deploy, a backfill, or a release, or wired into CI. Recurring work belongs on pg-boss (src/lib/jobs/), not here.

How to run them

From a source checkout:

pnpm dlx tsx scripts/<file>.ts

The production image intentionally removes npm, pnpm, and Corepack. Only container-safe scripts named by an operator runbook use its pinned healthlog-tsx launcher; scripts that import the full application dependency graph must run from a source checkout. scripts/ is excluded from the project typecheck.

What lives here

  • generate-openapi.ts: emits docs/api/openapi.yaml from the registered Zod schemas (pnpm openapi:generate).
  • check-openapi.ts: compares a freshly generated spec against the committed YAML; CI fails on drift (pnpm openapi:check).
  • check-env.ts: pre-deploy env-var sanity check against env-manifest.json (pnpm check-env); wired into CI.
  • assert-deploy.ts: post-deploy /api/version assertion.
  • rotate-encryption-key.ts: AES-256-GCM key rotation; see docs/ops/encryption-key-rotation.md.
  • restore-backup.ts: restore an off-host AES-GCM backup from an S3-compatible bucket.
  • repair-apple-health-distance.ts: repair walking-distance rows the export.zip import stored 1000x too small; dry-run by default, see docs/ops/apple-health-distance-repair.md.
  • repair-intake-anomalies.ts: repair historic medication-ledger defects (duplicate dose-slot rows, implausible taken_at); dry-run by default, see docs/ops/intake-repair.md.
  • backfill-rollups.ts, drain-per-sample-cumulative.ts, backfill-mood-note-column.ts: historical data backfills (the boot-time rollup-full-backfill queue handles new accounts automatically; the CLI is the manual fallback).
  • seed-demo.ts + seed-demo-v15.sql: populate a demo tenant.
  • bench/: seed-large-account.ts (a synthetic ten-year account of about 1.26 million measurement rows) and run.ts (latency and SQL statements per request against it); see docs/contributing/benchmarks.md. Results land in bench/results/.
  • test-notifications.ts: exercise the notification dispatcher + reminder check.
  • fetch-geolite2.sh: download the MaxMind GeoLite2 MMDBs (needs a licence key) before docker build.
  • build-pdf-fonts.py: rebuild the fonts the doctor-report PDF embeds (src/lib/doctor-report-pdf/fonts/) from the upstream Noto sources; needs fonttools. The source URLs are in its header.
  • install-hooks.sh: install the local git hooks.
  • generate-sw-version.mjs, check-bundle-budget.mjs: service-worker version stamp and bundle-size report (pnpm bundle-report).
  • repair-google-health-sleep.ts: re-syncs every Google Health connection so nights stored twice before v1.28.18 collapse to one set; dry-run by default, --run to execute.
  • i18n-key-tool.mjs, split-description.mjs: edit one key across every messages/*.json (show, set, drop) and move an over-long card description's tail into its own key; measure-description-lengths.mjs measures the Settings and Admin description strings against the 120-character guideline.
  • audit-column-readers.ts: lists write-only schema columns and open @pending-consumer markers; a review tool, not a gate.
  • migrate-demo-account.sh: copies the demo account from one instance to a separate demo instance; see its README.
  • __tests__/: tests for the scripts above.

Conventions

Operator runbooks that drive these scripts live in ../docs/ops/.