feat: IMAP mail sync with thread-to-contact matching (PRD §6.1)

Real IMAP connection via imapflow library:
- Connects to IMAP server (IMAPFlow, TLS on port 993)
- Fetches recent messages (configurable limit, default 20)
- Extracts: from, fromEmail, subject, date, snippet (200 chars)
- Thread-to-contact matching (PRD §6.1):
  1. Match sender email against persons table
  2. If no person match, extract domain and match against company.website
  3. Returns matchedCompany + matchedPerson for each email
- Audit-logged (action: crm.mailsync:imap)
- Zod validated (host, port, user, password, folder, limit)
- 502 on IMAP connection failure with detail
- 400 on validation failure

Tested: invalid creds → 502 'IMAP connection failed', missing host → 400
This commit is contained in:
Z User committed 2026-10-27 22:50:50 +00:00
1 parent 7acc0c5451
commit e45b68bb8b
1089 files changed
+260614

No files matched your search

@@ -0,0 +1,104 @@
---
name: html-ppt-zhangzara-pin-and-paper
description: Pin & Paper — 黄色纸面 + 安全别针插图 + 墨蓝手写 Caveat + 纸纹理。任何应该感觉手作 / 温暖 / 文学的 deck:定性研究发现 / 创始人反思 / 长篇品牌故事 / workshop 复盘。
visibility: public
mode: template
carrier: deck
scenario: marketing
pattern_source: pattern.html
source_priority: skill-first
triggers:
- "做个手作风 PPT"
- "做个研究分享 deck"
- "做个创始人反思 deck"
- "pin-and-paper"
- "zhangzara-pin-and-paper"
- "Pin & Paper"
- "crafted"
- "handmade"
- "literary"
- "research findings with personality"
- "html deck"
- "html slides"
- "zhangzara"
od:
upstream: "https://github.com/zarazhangrui/beautiful-html-templates/tree/main/templates/pin-and-paper"
upstream_license: MIT
preview:
type: html
entry: pattern.html
design_system:
requires: false
speaker_notes: false
animations: false
---
# Pin & Paper
> Yellow paper with safety-pin illustrations, ink-blue handwritten Caveat, paper-grain texture.
A single self-contained HTML deck — typography, palette, decorative system,
and slide vocabulary are all tuned together. Mixing layouts across templates
breaks the system; stay inside this one.
## At a glance
- **Scheme:** light
- **Formality:** medium
- **Density:** medium
- **Slides in demo:** 11
## Best for
Anything that should feel hand-crafted, warm, and literary: qualitative research findings, founder reflections, longform brand stories, workshop debriefs. The signature safety-pin illustrations and paper-grain texture make it especially good for any deck — including tech or business — that wants personality and warmth over polish.
## Avoid for
Decks that need to feel digital-native polished or rigorously data-driven — handwritten Caveat is intentionally informal.
## Workflow
1. **Use `pattern.html` and `assets/` only as secondary pattern references.** Do not clone them wholesale; extract rhythm, structure, and required runtime behavior, then rebuild for the current brief.
This template ships an `assets/deck-stage.js` runtime (keyboard navigation,
stage rendering) and an `assets/styles.css` stylesheet. The HTML references
them as `assets/deck-stage.js` and `assets/styles.css`, so both must sit next
to the cloned HTML or those paths will 404 in the generated artifact and
navigation/styling will silently break. Inlining the JS/CSS into a single
`<script>`/`<style>` block in the HTML is an acceptable alternative when a
single self-contained file is preferred.
2. **Replace placeholder content** with the user's real headlines, body copy,
numbers, names, dates, and section labels. Match existing dimensions when
swapping image placeholders.
3. **Preserve the design system.** Never substitute fonts, recolor the palette,
restructure the layout grid, or strip decorative elements (corner brackets,
paper grain, geometric shapes, illustrated SVGs). They are part of the
identity.
4. **Adjust deck length by duplicating layouts.** If the user has more content
than the demo holds, duplicate an existing slide of the most appropriate
layout. If less, drop slides from the bottom. Update page-number labels.
5. **Designing missing layouts:** if a slide needs a layout the template
doesn't have, design it from scratch using the same fonts, palette,
decorative vocabulary, spacing rhythm, and component grammar — never bail
to a different template.
6. **Keep the navigation runtime as shipped.** If the deck ships an
`assets/deck-stage.js` or inline keyboard handler, leave it intact.
## Output contract
Emit between `<artifact>` tags:
```
<artifact identifier="zhangzara-pin-and-paper" type="text/html" title="Deck Title">
<!doctype html>
<html>...</html>
</artifact>
```
## Source & license
Vendored from upstream MIT-licensed
[`zarazhangrui/beautiful-html-templates`](https://github.com/zarazhangrui/beautiful-html-templates/tree/main/templates/pin-and-paper).
The full upstream MIT license text — including the original copyright notice — ships in this skill at
[`LICENSE`](./LICENSE) and must be redistributed alongside any copy of `pattern.html`,
`template.json`, or any vendored `assets/` runtime. See `template.json` for the upstream metadata snapshot.