Phase 15: skip api/harness CI for doc-only PRs + markdown lint gate #11

Merged
luckberg merged 18 commits from gsd/phase-15-ci-skip-api-harness-jobs-for-doc-only-prs into main 2026-06-12 11:08:54 -04:00
10 changed files with 18 additions and 13 deletions
Showing only changes of commit 46bea03757 - Show all commits
+3
View File
@@ -31,6 +31,9 @@ jobs:
- name: Format check
run: pnpm format:check
- name: Markdown lint
run: pnpm md:lint
- name: 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):
"MD041": false, // first-line-h1: CLAUDE.md legitimately starts with ## Project
"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"],
"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
```
```text
apps/
api/ Hono backend — CalDAV sync, OIDC auth, lists API, push notifications
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:
```
```text
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
```
```text
src/
index.ts Hono app entrypoint; server startup; background worker initialization
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
```
```text
src/
api/ # Typed fetch wrappers for @familysync/api (client.ts, listsClient.ts)
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`:
```
```text
if (process.env.NODE_ENV === 'production') → bypass is a no-op (always)
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**
```
```text
event: heartbeat
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**
```
```text
event: item:added
id: 1-1718020800000
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
```
```text
familysync/
├── apps/
│ ├── api/ # Hono backend (Node 22 + TypeScript)
@@ -168,7 +168,7 @@ familysync/
### Backend modules
```
```text
routes/events.ts ──→ broker/expand.ts (read: RRULE expansion)
──→ calendarOutbox (DB) (write: enqueue)
──→ 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
```
```text
familysync/
├── apps/
│ ├── api/ # Hono API server — Node.js 22, TypeScript, Drizzle/MariaDB
@@ -19,7 +19,7 @@ familysync/
Key paths inside `apps/api/src/`:
```
```text
src/
├── db/
│ ├── 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
- `APP_PASSWORD_ENCRYPTION_KEY` — 64 hex characters; generate with:
```bash
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
```
- `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`