VFS now loads on first has()/getMtime() call rather than requiring
explicit initialization in sync/index.mjs. This ensures it works
regardless of entry point (sync:download, splatnet:quick, etc.).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
No major calendar client renders these inline binary attachments.
The ATTACH URL is kept, which links to the publicly hosted image.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
exists() and olderThan() now check the local filesystem first and only
consult the VFS as a fallback. This means freshly written files are
found naturally without callers needing to register them.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Uses S3 ListObjectsV2 to build an in-memory file listing at startup,
allowing exists() and olderThan() to resolve from the listing instead
of requiring files on disk. sync:download now skips assets/splatnet/,
data/xrank/, data/festivals.ranking.*, and status-screenshots/.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace hourly-only refresh with a 5-minute polling interval that also
aligns to hour boundaries, add tab visibility change detection, and
debounce overlapping triggers.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
dotenv v17: Added quiet option to suppress new default logging.
p-limit v7 and p-queue v9: No code changes needed (only dropped older Node).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
cron v4: No code changes needed (positional constructor args still supported).
ical-generator v10: Removed `new` keyword (now a factory function) and
switched from `attachments` property to `createAttachment()` method.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
jsonpath v1.2.1 (published Feb 2025) fixed the security vulnerability
that prompted the switch to jsonpath-plus. Reverting to the original
package simplifies the code by removing the jsonpathQuery/jsonpathApply
wrapper functions.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Replace JS config (tailwind.config.js) with CSS @theme block in base.css
- Switch from PostCSS to @tailwindcss/vite plugin
- Convert all bg-opacity-*/border-opacity-* to slash syntax (e.g. bg-zinc-900/70)
- Add @custom-variant for mobile and ss variants
- Add @reference to Vue scoped styles using @apply
- Rename v3 utilities: rounded→rounded-sm, backdrop-blur-sm→backdrop-blur-xs,
drop-shadow→drop-shadow-sm, rotate-[25deg]→rotate-25
- Delete obsolete tailwind.config.js and postcss.config.js
- Rename vite.config.js to .mjs for ESM compatibility
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Added mkdirp() helper to app/common/fs.mjs that wraps
fs.mkdir(dir, { recursive: true }). Updated all call sites to use it.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
vue-i18n: 9.10.2 → 11.2.8
Resolves XSS and prototype pollution vulnerabilities in vue-i18n v9.
Total vulnerabilities now down to 1 (axios in threads-api transitive
dependency).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- vite: 3.2.8 → 6.4.1
- @vitejs/plugin-vue: 3.2.0 → 5.2.4
- Replaced @intlify/vite-plugin-vue-i18n with @intlify/unplugin-vue-i18n
- Narrowed i18n include pattern to *.json to avoid parsing .mjs files
This resolves the esbuild moderate severity vulnerability that was
present in Vite <=6.1.6.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>