feat(15-01): fix 13 markdown violations + wire md:lint to fast-checks CI step

- Fix MD040 (11 bare fences): add language tags (text/bash) across 7 files
- Fix MD031 (2 violations): add blank lines around fence in GETTING-STARTED.md
- Wire 'Markdown lint' step to fast-checks job (after Format check, before Typecheck)
- Reformat .markdownlint-cli2.jsonc per Prettier (trailing commas in JSONC)
- pnpm md:lint exits 0; pnpm format:check exits 0; gate can fail on bare fence (verified)
This commit is contained in:
Lucas Berger
2026-06-12 10:46:01 -04:00
parent adb7641c19
commit 46bea03757
10 changed files with 18 additions and 13 deletions
+3
View File
@@ -31,6 +31,9 @@ jobs:
- name: Format check - name: Format check
run: pnpm format:check run: pnpm format:check
- name: Markdown lint
run: pnpm md:lint
- name: Typecheck - name: Typecheck
run: pnpm typecheck run: pnpm typecheck
+2 -2
View File
@@ -16,8 +16,8 @@
// Rules DISABLED (Prettier owns these OR they fire on non-author-controlled files): // Rules DISABLED (Prettier owns these OR they fire on non-author-controlled files):
"MD041": false, // first-line-h1: CLAUDE.md legitimately starts with ## Project "MD041": false, // first-line-h1: CLAUDE.md legitimately starts with ## Project
"MD034": false, // no-bare-urls: CLAUDE.md version table uses pkg@version syntax "MD034": false, // no-bare-urls: CLAUDE.md version table uses pkg@version syntax
"MD036": false // no-emphasis-as-heading: docs/API.md uses **Response 200** as label "MD036": false, // no-emphasis-as-heading: docs/API.md uses **Response 200** as label
}, },
"globs": ["docs/**/*.md", "*.md", "apps/**/*.md"], "globs": ["docs/**/*.md", "*.md", "apps/**/*.md"],
"ignores": [".planning/**", "node_modules/**", "**/node_modules/**", ".pnpm-store/**"] "ignores": [".planning/**", "node_modules/**", "**/node_modules/**", ".pnpm-store/**"],
} }
+2 -2
View File
@@ -75,7 +75,7 @@ The API listens on port 3000. The PWA build is served separately (Vite `preview`
## Monorepo Structure ## Monorepo Structure
``` ```text
apps/ apps/
api/ Hono backend — CalDAV sync, OIDC auth, lists API, push notifications api/ Hono backend — CalDAV sync, OIDC auth, lists API, push notifications
pwa/ React 19 PWA — calendar view, lists UI, service worker pwa/ React 19 PWA — calendar view, lists UI, service worker
@@ -116,7 +116,7 @@ docker-compose.dev.yml Dev overrides (bind-mount src/, expose DB/Redis ports)
FamilySync reads and writes calendars via CalDAV against Fastmail — not JMAP (not available for Fastmail calendars). Configure your Fastmail app password under the "Mail, Contacts & Calendars" scope. The principal URL follows the pattern: FamilySync reads and writes calendars via CalDAV against Fastmail — not JMAP (not available for Fastmail calendars). Configure your Fastmail app password under the "Mail, Contacts & Calendars" scope. The principal URL follows the pattern:
``` ```text
https://caldav.fastmail.com/dav/principals/user/<your-fastmail-address>/ https://caldav.fastmail.com/dav/principals/user/<your-fastmail-address>/
``` ```
+1 -1
View File
@@ -16,7 +16,7 @@ Part of the [FamilySync monorepo](../../README.md).
## Source layout ## Source layout
``` ```text
src/ src/
index.ts Hono app entrypoint; server startup; background worker initialization index.ts Hono app entrypoint; server startup; background worker initialization
routes/ routes/
+1 -1
View File
@@ -42,7 +42,7 @@ The API backend must also be running for most features. See [GETTING-STARTED.md]
## Source layout ## Source layout
``` ```text
src/ src/
api/ # Typed fetch wrappers for @familysync/api (client.ts, listsClient.ts) api/ # Typed fetch wrappers for @familysync/api (client.ts, listsClient.ts)
components/ # Shared UI components co-located with their *.test.tsx files components/ # Shared UI components co-located with their *.test.tsx files
+1 -1
View File
@@ -73,7 +73,7 @@ Set `DB_PASSWORD` (and other non-default values) via the shell or the repo root
The API enforces this via `apps/api/src/auth/devBypass.ts`: The API enforces this via `apps/api/src/auth/devBypass.ts`:
``` ```text
if (process.env.NODE_ENV === 'production') → bypass is a no-op (always) if (process.env.NODE_ENV === 'production') → bypass is a no-op (always)
if (process.env.DEV_AUTH_BYPASS !== 'true') → bypass is a no-op if (process.env.DEV_AUTH_BYPASS !== 'true') → bypass is a no-op
``` ```
+2 -2
View File
@@ -514,7 +514,7 @@ Streams `heartbeat` events every 10 seconds indefinitely. Used as a Pangolin tun
**Event format** **Event format**
``` ```text
event: heartbeat event: heartbeat
id: 0 id: 0
data: {"ts":"2025-06-10T14:00:00.000Z","id":0} data: {"ts":"2025-06-10T14:00:00.000Z","id":0}
@@ -541,7 +541,7 @@ A `heartbeat` event is sent every 30 seconds to keep the Pangolin connection ali
**Event format example** **Event format example**
``` ```text
event: item:added event: item:added
id: 1-1718020800000 id: 1-1718020800000
data: {"type":"item:added","listId":1,"payload":{"id":11,"listId":1,"text":"Eggs"}} data: {"type":"item:added","listId":1,"payload":{"id":11,"listId":1,"text":"Eggs"}}
+2 -2
View File
@@ -61,7 +61,7 @@ graph TD
## Directory Structure ## Directory Structure
``` ```text
familysync/ familysync/
├── apps/ ├── apps/
│ ├── api/ # Hono backend (Node 22 + TypeScript) │ ├── api/ # Hono backend (Node 22 + TypeScript)
@@ -168,7 +168,7 @@ familysync/
### Backend modules ### Backend modules
``` ```text
routes/events.ts ──→ broker/expand.ts (read: RRULE expansion) routes/events.ts ──→ broker/expand.ts (read: RRULE expansion)
──→ calendarOutbox (DB) (write: enqueue) ──→ calendarOutbox (DB) (write: enqueue)
──→ broker/sync.ts (write-sync after outbox drain) ──→ broker/sync.ts (write-sync after outbox drain)
+2 -2
View File
@@ -6,7 +6,7 @@ Local development setup and workflows for FamilySync — a pnpm monorepo with tw
## Repo Layout ## Repo Layout
``` ```text
familysync/ familysync/
├── apps/ ├── apps/
│ ├── api/ # Hono API server — Node.js 22, TypeScript, Drizzle/MariaDB │ ├── api/ # Hono API server — Node.js 22, TypeScript, Drizzle/MariaDB
@@ -19,7 +19,7 @@ familysync/
Key paths inside `apps/api/src/`: Key paths inside `apps/api/src/`:
``` ```text
src/ src/
├── db/ ├── db/
│ ├── schema.ts # Drizzle table definitions (source of truth for migrations) │ ├── schema.ts # Drizzle table definitions (source of truth for migrations)
+2
View File
@@ -49,9 +49,11 @@ Open `.env` and fill in the required values. See [docs/CONFIGURATION.md](CONFIGU
- `DB_PASSWORD` and `DB_ROOT_PASSWORD` — pick any local passwords - `DB_PASSWORD` and `DB_ROOT_PASSWORD` — pick any local passwords
- `APP_PASSWORD_ENCRYPTION_KEY` — 64 hex characters; generate with: - `APP_PASSWORD_ENCRYPTION_KEY` — 64 hex characters; generate with:
```bash ```bash
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))" node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
``` ```
- `DEV_AUTH_BYPASS=true` — bypasses the live Authelia OIDC flow for local dev - `DEV_AUTH_BYPASS=true` — bypasses the live Authelia OIDC flow for local dev
- `DB_HOST=localhost` — the dev Docker Compose exposes MariaDB on the host at `localhost:3306` - `DB_HOST=localhost` — the dev Docker Compose exposes MariaDB on the host at `localhost:3306`