mirror of
https://github.com/MBombeck/HealthLog.git
synced 2026-11-14 14:40:52 +00:00
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.
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: emitsdocs/api/openapi.yamlfrom 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 againstenv-manifest.json(pnpm check-env); wired into CI.assert-deploy.ts: post-deploy/api/versionassertion.rotate-encryption-key.ts: AES-256-GCM key rotation; seedocs/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 theexport.zipimport stored 1000x too small; dry-run by default, seedocs/ops/apple-health-distance-repair.md.repair-intake-anomalies.ts: repair historic medication-ledger defects (duplicate dose-slot rows, implausibletaken_at); dry-run by default, seedocs/ops/intake-repair.md.backfill-rollups.ts,drain-per-sample-cumulative.ts,backfill-mood-note-column.ts: historical data backfills (the boot-timerollup-full-backfillqueue 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) andrun.ts(latency and SQL statements per request against it); seedocs/contributing/benchmarks.md. Results land inbench/results/.test-notifications.ts: exercise the notification dispatcher + reminder check.fetch-geolite2.sh: download the MaxMind GeoLite2 MMDBs (needs a licence key) beforedocker build.build-pdf-fonts.py: rebuild the fonts the doctor-report PDF embeds (src/lib/doctor-report-pdf/fonts/) from the upstream Noto sources; needsfonttools. 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,--runto execute.i18n-key-tool.mjs,split-description.mjs: edit one key across everymessages/*.json(show, set, drop) and move an over-long card description's tail into its own key;measure-description-lengths.mjsmeasures the Settings and Admin description strings against the 120-character guideline.audit-column-readers.ts: lists write-only schema columns and open@pending-consumermarkers; 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/.