Resolves wayfinder tickets #2 and #3 on the calendar-backend
groundwork map (#1):
- smart-tablet-screen-calendar-webhooks.md: Nextcloud CalDAV push
support (none usable — Mail-in-a-Box's bundled Nextcloud predates
the Webhooks app) vs Microsoft Graph webhook subscriptions
(supported, with renewal-job requirements).
- smart-tablet-screen-frankenphp-docker.md: FrankenPHP-based dev/prod
Docker image and compose setup for the Symfony backend.
Also gitignore .scratch/, the repo-local scratchpad directory for
throwaway working files.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QshNimeB3TVU2vMjN7tEuz
Checked docs/research for more useful MCP servers beyond leankg/
codebase-memory-mcp/playwright. Added Context7 (@upstash/context7-mcp,
61.5K stars, official Upstash) via npx — live docs lookup for the
libraries this project actually pulls in (sabre/dav, sabre/vobject,
laminas-feed, endroid/qr-code, FullCalendar, Vite, Symfony), none of
which have an offline index the way msgraph does for Graph.
Evaluated and rejected CalDAV/Nextcloud MCP servers (caldav-mcp 98
stars, aiquila-mcp 34 stars — real but too young, and would need a
live Nextcloud app-password before any account is even provisioned)
and Gitea MCP servers (0-1 stars, redundant with the tea CLI already
standardized on via the gitea-tea skill). No Docker MCP found as an
installable package — Docker's own MCP tooling lives inside Docker
Desktop's MCP Toolkit, not npm/pip, and there's no Dockerfile/CI yet
to make it relevant.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Tu1c13iVNdj1iWL633yazG
These were only registered in the user's global ~/.claude.json (with
machine-specific absolute paths), so they weren't available to anyone
else working in this repo. Added a repo-root .mcp.json using bare
command names (leankg, codebase-memory-mcp) so it's portable across
machines once those binaries are on PATH, plus the official Playwright
MCP server via npx (no install needed) — closing the "no separate
Playwright MCP server configured" gap noted in
docs/research/smart-tablet-screen-stack.md §5.
Also gitignore .leankg/ (leankg's local runtime pid/index state,
regenerated on start, not source).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Tu1c13iVNdj1iWL633yazG
Research in docs/research flagged missing tooling for the project's
actual stack: Symfony backend work and Microsoft Graph calendar sync
had no matching local skill. Searched skills.sh and installed
project-level:
- dev-toolings/superpowers-symfony (11 of 44 skills, matching what
stack.md/config-secrets.md already decided on: config/secrets vault,
bootstrap check, PHPUnit TDD + functional tests + mocking, controller
cleanup, quality checks, DI/autowiring, Cache component, Doctrine
migrations). Skipped the API Platform, Messenger/CQRS, hexagonal-
architecture, Twig-component, and Pest skills — none of those are
part of the decided stack (plain MVC JSON API, no API Platform, TS
frontend not Twig, PHPUnit not Pest).
- merill/msgraph (offline-indexed Graph API search, no network calls)
for the Outlook/Exchange calendar sync decided in stack.md.
No CalDAV/Nextcloud skill was installed: every candidate on skills.sh
is either a personal-calendar CLI wrapper (vdirsyncer+khal) or gated
behind a third-party SaaS account (Membrane) — neither fits writing a
PHP backend integration against sabre/dav, which the research doc
already speccs out directly.
skills-lock.json is tracked; .claude/skills/ payloads are gitignored
(msgraph alone is 112MB of multi-platform binaries + SQLite indexes)
and restored per-clone via `npx skills experimental_install -y`.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Tu1c13iVNdj1iWL633yazG
Cover Symfony Config component typed-list patterns (Doctrine/Messenger
precedents) and the native secrets vault vs. plaintext YAML/SOPS for
encrypting account credentials.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>