Files
buildfor_life_ops/package.json
T
grabowski 09e0fdc9ac
Deploy to LXC / deploy (push) Successful in 15s
Validate / validate (push) Successful in 35s
feat(maintenance): reminders CLI + systemd timer drop-in
Phase 3-4 of maintenance reminders.

scripts/maintenance-reminders.ts: thin CLI that opens the same
pg pool as the app and calls runRemindersOnce. Flags:
--soon-days N (default 7), --company <id> (default all),
--dry-run (count without firing), --backfill (mark all currently
due as already-sent, mutually exclusive with --dry-run). Prints a
single-line JSON summary so journald/jq handles it cleanly.

package.json: + reminders:check script.

DEPLOYMENT.md: documents the systemd .service + .timer pair for
06:00 daily, with Persistent=true so a missed run during host
downtime still fires on next boot. Includes the first-deploy
protocol (--dry-run to scope, then either let day-one alert or
--backfill for a clean slate).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 16:15:03 +07:00

62 lines
1.8 KiB
JSON

{
"name": "buildfor-life-ops",
"version": "0.1.0",
"private": true,
"type": "module",
"packageManager": "pnpm@9.15.0",
"scripts": {
"dev": "vite dev",
"build": "vite build",
"preview": "vite preview",
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --threshold warning",
"validate": "pnpm run check && pnpm run build",
"db:generate": "drizzle-kit generate",
"db:migrate": "drizzle-kit migrate",
"db:push": "drizzle-kit push",
"db:studio": "drizzle-kit studio",
"db:seed": "tsx scripts/seed/system-asset-types.ts",
"create-user": "tsx scripts/create-user.ts",
"reminders:check": "tsx scripts/maintenance-reminders.ts",
"prepare": "husky || true"
},
"dependencies": {
"@aws-sdk/client-s3": "^3.1035.0",
"@aws-sdk/s3-request-presigner": "^3.1035.0",
"@node-rs/argon2": "^2.0.2",
"@oslojs/crypto": "^1.0.1",
"@oslojs/encoding": "^1.1.0",
"@tailwindcss/typography": "^0.5.19",
"date-fns": "^4.1.0",
"dotenv": "^17.4.1",
"drizzle-orm": "^0.38.4",
"easymde": "^2.20.0",
"marked": "^18.0.0",
"nodemailer": "^8.0.5",
"pg": "^8.13.1",
"qrcode": "^1.5.4",
"sharp": "^0.33.5",
"zod": "^3.24.2"
},
"devDependencies": {
"@sveltejs/adapter-node": "^5.2.12",
"@sveltejs/kit": "^2.15.2",
"@sveltejs/vite-plugin-svelte": "^5.0.3",
"@tailwindcss/vite": "^4.1.3",
"@types/node": "^22.10.5",
"@types/nodemailer": "^8.0.0",
"@types/pg": "^8.11.11",
"@types/qrcode": "^1.5.6",
"drizzle-kit": "^0.30.5",
"husky": "^9.1.7",
"svelte": "^5.19.0",
"svelte-check": "^4.1.4",
"tailwindcss": "^4.1.3",
"tsx": "^4.21.0",
"typescript": "^5.7.3",
"vite": "^6.1.0"
},
"engines": {
"node": ">=20"
}
}