[grade=B] DC-058: close as done — share UI shipped + tests pass
CI / Test & Lint (push) Has been cancelled
CI / Security audit (push) Has been cancelled

This commit is contained in:
Hermes
2026-08-06 15:13:19 -07:00
parent a7057e4fba
commit 9ab3452b19
+3 -2
View File
@@ -366,11 +366,12 @@ Tickets DC-046 through DC-049 implement pluggable auth + email magic link. Sami
- **result:** Hoisted `const NotificationManager = require(...)` and used `new NotificationManager({...})` in the server.js init block. Verified live on dc-contabo-de: workflow engine now logs `Workflow engine initialized` on startup; 90s of post-restart logs show zero `getState is not a function` errors, zero `WorkflowEngine Action health-check failed` spam, zero error-priority entries. Health check: 200 OK with uptime reporting.
### DC-058: Share UI — admin modal + public preview page (completes DC-053)
- **status:** in-progress
- **owner:** hermes
- **status:** done
- **owner:** hermes (graded B by codex-as-judge)
- **details:** DC-053 shipped the full share backend (share-store + 8 routes, 53 tests, Pro tier-gate, Tailscale coordination, email delivery). The `BACKLOG.md` result explicitly says: "**UI side still pending** — no 'Share' button on service cards yet, modal not built (admin can still exercise via curl)." Two missing UI surfaces: (1) **Admin share modal** — a "Share" button on each service card (next to the existing options/delete buttons in `status/js/core/grid.js:264-281`) that opens a modal with two tabs: "Public link" (1h/24h/7d TTL picker → POST `/api/v1/share` → show returned URL with copy button + revoke list) and "Tailscale invite" (email input → POST `/api/v1/share/tailscale` → show delivered status + fallback URL on SMTP failure). Modal should also list outstanding shares for the service (GET `/api/v1/share`) with revoke buttons. (2) **Public share preview page** at `/share/:token` — standalone HTML (similar to `status/pricing/index.html` and `status/billing/success.html`) that hits GET `/api/v1/share/:token/preview`, renders service metadata + an "email me when status changes" subscribe form (POST `/api/v1/share/:token/subscribe`). The URL path is already returned by the issue endpoints as `urlPath` (e.g. `/share/<token>`) — the public-preview page just needs to live at that route. Zero Pro gating on the public page (only the admin modal needs Pro check, since issuing shares is Pro-only). Effort: ~2 hr. Risk: low — the API contract is fully tested.
- **impact:** Closes the gap between the public sale surface (DC-057 pricing page) and the Pro feature it sells (DC-053 share API). Without this UI, paying customers have no way to actually use the feature they paid for. Manual `curl` is not a UX.
- **prerequisite:** DC-053 (shipped). DC-052 (Pro gate, shipped).
- **result:** Shipped codex-graded B. Admin modal (status/js/share-modal.js, 382 LOC, in features.js bundle) opens via the new share button on each service card (added in status/js/core/grid.js, gated on s.id !== internet same as siblings). Two tabs: Public link (1h/24h/7d TTL picker -> POST /api/v1/share) and Tailscale invite (email -> POST /api/v1/share/tailscale). Modal lists outstanding shares (GET /api/v1/share) with revoke buttons. 402 -> Pro upgrade prompt. 400 (no Tailscale) -> setup prompt. Public preview page (status/share/index.html, 253 LOC) extracts the token from /share/<token> URL path, fetches GET /api/v1/share/<token>/preview, renders service metadata + health badge + Open service CTA. For Tailscale shares, the CTA points to the service URL (the share token is the credential -- Caddy forward_auth checks the share store on each request, so no client-side redemption is needed). Subscribe form posts to /api/v1/share/<token>/subscribe. Caddy route required: DNS2 needs a rewrite /share/* /share/index.html rule to serve the page for any /share/<token> URL. Frontend tests: 3 new node --test files (status/tests/share-modal.test.js, share-preview.test.js, core-grid-share-button.test.js) covering IIFE registration, idempotency, DOM contract, callable openShareModal, source syntax check, public preview endpoint contracts, and the regression guard for the original bug codex flagged (redeem-tailscale must NOT be called from the client -- redemption is server-side). Total: 26 frontend tests pass (was 8 + 4 share-modal + 9 share-preview + 5 grid-button). 1498/1498 backend tests still pass; zero new ESLint warnings. Codex also flagged the original redeem-tailscale placeholder as a critical bug (JS fabricating random deviceIds and silently consuming the one-shot share) -- the redesigned page now leaves redemption entirely to the server.
1. **Always `git pull` before starting work.**
2. **Claim a task by editing BACKLOG.md:** set `status: in-progress` and `owner: hermes` or `owner: krystie`.