{"id":"4c5c2f7e-eff6-4aa5-a0c7-0e1cebbd428f","entityType":"agent","slug":"clawhub-leahlu0124-creator-litigation-hub","name":"Litigation Hub","canonicalUrl":"https://www.xpersona.co/agent/clawhub-leahlu0124-creator-litigation-hub","canonicalPath":"/agent/clawhub-leahlu0124-creator-litigation-hub","generatedAt":"2026-10-14T15:16:32.218Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T23:22:48.386Z","emptyReason":null},"description":"诉讼信息中枢系统。接收法院短信、送达链接、纸质文书照片，自动 OCR 识别、下载、归档、归类到标准案卷目录。基于 12 种期限规则库自动匹配，通过系统日历 + QQ 邮件（微信送达）+ 本机电脑提醒（系统通知 + 桌面 Markdown 文件）三条线提醒，支持 macOS / Windows / Linux 全平台。 Skill: Litigation Hub Owner: leahlu0124-creator Summary: 诉讼信息中枢系统。接收法院短信、送达链接、纸质文书照片，自动 OCR 识别、下载、归档、归类到标准案卷目录。基于 12 种期限规则库自动匹配，通过系统日历 + QQ 邮件（微信送达）+ 本机电脑提醒（系统通知 + 桌面 Markdown 文件）三条线提醒，支持 macOS / Windows / Linux 全平台。 Tags: latest:2.2.3 Version history: v2.2.3 | 2026-07-13T13:35:31.085Z | user v2.2.3: macOS 不再生成 .ics 冗余文件 — Apple Calendar 已原生写入，移除桌面 .ics 备份 v2.2.2 | 2026-07-13T12:56:44.366Z | user v2.2.2: 对抗性审查修复 — P0","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 977 downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s17d4kbz58v0dvnhz3bw0qeg8984ak11:litigation-hub","sourceUrl":"https://clawhub.ai/leahlu0124-creator/litigation-hub","homepage":"https://clawhub.ai/leahlu0124-creator/skills/litigation-hub","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/leahlu0124-creator/litigation-hub","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/leahlu0124-creator/skills/litigation-hub","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"诉讼信息中枢系统。接收法院短信、送达链接、纸质文书照片，自动 OCR 识别、下载、归档、归类到标准案卷目录。基于 12 种期限规则库自动匹配，通过系统日历 + QQ 邮件（微信送达）+ 本机电脑提醒（系统通知 + 桌面 Markdown 文件）三条线提醒，支持 macOS / Windows / Linux 全平台。 "},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T23:22:48.386Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T23:22:48.386Z","emptyReason":null},"stars":null,"forks":null,"downloads":977,"likes":null,"task":null,"library":null,"packageName":null,"latestVersion":"2.2.3","tractionLabel":"977 downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T23:22:48.371Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T23:22:48.386Z","lastCrawledAt":"2026-10-11T23:22:48.371Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T23:22:48.371Z","lastVerifiedAt":null,"highlights":[{"version":"2.2.3","createdAt":"2026-07-13T13:35:31.085Z","changelog":"v2.2.3: macOS 不再生成 .ics 冗余文件 — Apple Calendar 已原生写入，移除桌面 .ics 备份","fileCount":21,"zipByteSize":75800},{"version":"2.2.2","createdAt":"2026-07-13T12:56:44.366Z","changelog":"v2.2.2: 对抗性审查修复 — P0: 保全到期日新增当天提醒(deadline-rules.json) + 裁定书强制保全检测(SKILL.md point 8); P1: AppleScript summary/location 双引号转义修复(court_deadline_reminder.py)","fileCount":21,"zipByteSize":75598},{"version":"1.0.1","createdAt":"2026-07-13T12:29:47.635Z","changelog":"安全脱敏：QQ邮箱/本地路径/archive案件数据全部脱敏；代理方识别：首次接触案件自动询问律师代理方，智能区分我方/对方材料归档","fileCount":21,"zipByteSize":73972},{"version":"1.0.0","createdAt":"2026-07-09T15:29:05.783Z","changelog":"提醒时机修正：开庭弹通知和桌面MD改为目标提醒时间触发；删除废弃的 court_appeal_reminder.py；修复 AppleScript + plist XML 注入；TO_EMAIL 默认值修正；死代码清理；安全加固审查通过。","fileCount":29,"zipByteSize":83686}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17d4kbz58v0dvnhz3bw0qeg8984ak11:litigation-hub","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-leahlu0124-creator-litigation-hub/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-leahlu0124-creator-litigation-hub/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-leahlu0124-creator-litigation-hub/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-leahlu0124-creator-litigation-hub/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-leahlu0124-creator-litigation-hub/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-leahlu0124-creator-litigation-hub/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-14T15:16:32.215Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-leahlu0124-creator-litigation-hub/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-leahlu0124-creator-litigation-hub/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-leahlu0124-creator-litigation-hub/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-leahlu0124-creator-litigation-hub/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-11T23:22:48.386Z","emptyReason":null},"readme":"Skill: Litigation Hub\n\nOwner: leahlu0124-creator\n\nSummary: 诉讼信息中枢系统。接收法院短信、送达链接、纸质文书照片，自动 OCR 识别、下载、归档、归类到标准案卷目录。基于 12 种期限规则库自动匹配，通过系统日历 + QQ 邮件（微信送达）+ 本机电脑提醒（系统通知 + 桌面 Markdown 文件）三条线提醒，支持 macOS / Windows / Linux 全平台。\n\nTags: latest:2.2.3\n\nVersion history:\n\nv2.2.3 | 2026-07-13T13:35:31.085Z | user\n\nv2.2.3: macOS 不再生成 .ics 冗余文件 — Apple Calendar 已原生写入，移除桌面 .ics 备份\n\nv2.2.2 | 2026-07-13T12:56:44.366Z | user\n\nv2.2.2: 对抗性审查修复 — P0: 保全到期日新增当天提醒(deadline-rules.json) + 裁定书强制保全检测(SKILL.md point 8); P1: AppleScript summary/location 双引号转义修复(court_deadline_reminder.py)\n\nv1.0.1 | 2026-07-13T12:29:47.635Z | user\n\n安全脱敏：QQ邮箱/本地路径/archive案件数据全部脱敏；代理方识别：首次接触案件自动询问律师代理方，智能区分我方/对方材料归档\n\nv1.0.0 | 2026-07-09T15:29:05.783Z | user\n\n提醒时机修正：开庭弹通知和桌面MD改为目标提醒时间触发；删除废弃的 court_appeal_reminder.py；修复 AppleScript + plist XML 注入；TO_EMAIL 默认值修正；死代码清理；安全加固审查通过。\n\nArchive index:\n\nArchive v2.2.3: 21 files, 75800 bytes\n\nFiles: _meta.json (133b), CHANGELOG.md (10801b), config/case-parties.json (18b), config/case-root.json (106b), config/user-preferences.example.json (1439b), config/user-preferences.json (73b), LICENSE.txt (1206b), references/archive-format.md (4028b), references/ATTRIBUTION.md (2555b), references/china-holidays.json (1472b), references/deadline-rules.json (7649b), references/report-format.md (4519b), references/sms-patterns.json (12068b), scripts/court_calendar.py (29062b), scripts/court_deadline_reminder.py (20616b), scripts/court_photo_ocr.py (26459b), scripts/court_utils.py (8053b), scripts/holiday_utils.py (4336b), scripts/send_court_email.py (3304b), skill-card.md (3152b), SKILL.md (57233b)\n\nFile v2.2.3:SKILL.md\n\n---\nname: litigation-hub\nhomepage: https://github.com/leahlu0124-creator/litigation-hub\nauthor: 陆凌燕\noriginal_author: 杨卫薪律师\nversion: 2.2.3\nlicense: MIT\ndescription: 诉讼信息中枢系统。接收法院短信、送达链接、纸质文书照片，自动 OCR 识别、下载、归档、归类到标准案卷目录。基于 12 种期限规则库自动匹配，通过系统日历 + QQ 邮件（微信送达）+ 本机电脑提醒（系统通知 + 桌面 Markdown 文件）三条线提醒，支持 macOS / Windows / Linux 全平台。\nslug: litigation-hub\ndisplayName: litigation-hub\n---\n\n# litigation-hub · 诉讼信息中枢系统\n\n## 功能概述\n\n处理法院文书的完整流程：**粘贴短信 / 发链接 / 上传照片 → 解析内容（OCR 或文本）→ 匹配案件 → 下载/归档文书 → 开庭日历提醒（传票自动写入系统日历 + 本机电脑提醒 + QQ 邮件（微信送达））**。\n\n## 首次使用：案卷目录设置（必须执行）\n\n**当用户第一次使用本技能时，必须先确认案卷存放目录。**\n\n> ⚠️ 如果没有事先确认目录，后续搜遍整台电脑都找不到案卷，效率极低。这一步一劳永逸。\n\n### 判断是否首次使用\n\n检查是否已有缓存的案卷目录记录：\n\n1. 先读取 `config/case-root.json`，检查 `case_root` 字段是否为有效路径\n2. 如果文件不存在或 `case_root` 为空 → **首次使用**，执行下方交互流程\n3. 如果 `case_root` 已配置且路径存在 → 跳过，直接进入正式工作流\n\n### 首次使用交互流程\n\n**询问格式**：\n\n```\n您好！我是诉讼中枢系统。在开始处理法院文书之前，我需要确认一件事：\n\n您平时把案卷资料存在哪个文件夹？\n\n常见的例子供参考：\n  · macOS   → /Users/你的名字/项目/律师业务/案件/\n  · Windows → C:\\Users\\你的名字\\Documents\\律师业务\\案件\\\n  · Linux   → /home/你的名字/项目/律师业务/案件/\n\n💡 最简单的方式：打开你的案卷文件夹，把地址栏里的路径直接复制粘贴给我就行。\n  · macOS：在访达里选中文件夹 → 按 ⌘+⌥+C (Cmd+Option+C) → 路径就复制好了，直接粘贴过来\n        （或者：访达菜单 → 显示 → 显示路径栏，然后在底部路径栏上右键 → 拷贝路径）\n  · Windows：在资源管理器打开文件夹 → 点一下顶部地址栏 → 按住 Shift 右键空白处 → 选\"复制为路径\"（或直接 Ctrl+Shift+C）\n        （如果不行，就点地址栏后 Ctrl+C 复制）\n\n请把路径发给我：\n```\n\n**用户回复后**：\n\n1. 验证路径是否存在（`ls` / `dir`），如果不存在，创建之\n2. 将路径写入 `config/case-root.json`：\n   ```json\n   {\"case_root\": \"/Users/xxx/项目/02-律师业务\", \"configured_at\": \"YYYY-MM-DD HH:MM\"}\n   ```\n3. 显示确认信息：\n   ```\n   ✅ 已记录案卷目录：/Users/xxx/项目/02-律师业务\n   以后所有法院文书都会在这个目录下匹配和归档。\n   ```\n4. 随后继续执行正式工作流\n\n### 后续使用\n\n- 每次技能触发时，从 `config/case-root.json` 读取路径，**仅在该目录下搜索已有案卷**；\n- **新建案卷始终放在桌面**，与 `case_root` 无关。桌面上的新案卷用户一眼就能看到，整理后自行移入搜索目录即可。\n- 如果用户搬移了案卷目录，用户说\"更新案卷目录\"即可触发重新设置\n\n---\n\n支持三种触发方式：\n\n**方式一：粘贴短信原文**\n\n```text\n收到法院短信，内容如下：\n【xx市人民法院】张三，您好！您有（2025）苏0981民初1234号案件文书送达，请点击链接查收：https://zxfw.court.gov.cn/zxfw/#/pagesAjkj/app/wssd/index?qdbh=DEMO1&sdbh=DEMO2&sdsin=DEMO3\n```\n\n**方式二：直接发送送达链接**\n\n用户可能直接粘贴送达链接（非完整短信文本），此时跳过短信文本解析，直接从 URL 中提取 `qdbh`、`sdbh`、`sdsin` 参数，进入第三步下载流程。\n\n```text\nhttps://zxfw.court.gov.cn/zxfw/#/pagesAjkj/app/wssd/index?qdbh=xxx&sdbh=xxx&sdsin=xxx\n```\n\n**方式三：上传纸质文书照片 / 扫描件**\n\n适用于刑事律师收到纸质传票、判决书、通知书的场景。上传照片（PNG/JPG），MinerU OCR 字符级精度提取文字，再解析为结构化字段。\n\n```text\n上传：传票照片.jpg\n→ MinerU OCR（flash-extract）→ 解析 → 复核 → 归档 + 日历提醒\n```\n\n> 依赖 `mineru-open-api`（`npm install -g mineru-open-api`），首次使用自动安装，用户无感知。\n\n## 短信类型分类\n\n| 类型 | 特征 | 含下载链接 | 处理方式 |\n| --- | --- | --- | --- |\n| 文书送达 | 含送达平台链接 + 案号 | 是 | 下载文书并归档到案件目录 |\n| 立案通知 | 含\"已立案\"等关键词 | 可能有 | 展示解析结果 |\n| 信息通知 | 无链接，纯信息 | 否 | 展示解析结果 |\n\n**支持的送达平台**：`zxfw.court.gov.cn`（全国）、`sd.gdems.com`（广东）、`jysd.10102368.com`（集约送达）、`dzsd.hbfy.gov.cn`（湖北）、`sfpt.cdfy12368.gov.cn`（司法送达网）。同一平台可能使用不同域名（同构异域名），通过 URL 路径特征识别平台。详见 `references/sms-patterns.json`。\n\n---\n\n## 工作流（四步）\n\n### 第一步：输入解析\n\n1. 读取 `references/sms-patterns.json` 作为解析参考\n2. **判断输入类型**：\n   - **完整短信**：包含法院签名（如 `【xx法院】`）+ 正文 + 链接 → 完整解析流程\n   - **纯链接**：用户直接发送送达 URL（如 `https://zxfw.court.gov.cn/...?qdbh=xxx&sdbh=xxx&sdsin=xxx`）→ 跳过短信文本解析，直接从 URL 提取参数，进入第三步下载。案号、当事人等信息在下载文书后从文书内容中提取。\n3. 对用户粘贴的短信文本进行分析（纯链接输入跳过此步）：\n\n**a) 短信分类**：根据关键词判断类型\n- 文书送达：包含 zxfw.court.gov.cn 链接\n- 立案通知：包含\"已立案\"、\"立案通知\"等\n- 信息通知：其他\n\n**b) 案号提取**：使用正则 `[（(〔[]\\d{4}[）)〕]]` 匹配标准案号格式\n\n标准案号格式示例：\n- `（2025）苏0981民初1234号`\n- `(2024)粤0604执保5678号`\n- `〔2025〕京0105民初901号`\n\n**c) 当事人提取**：从短信文本初步识别，最终以文书内容为准\n- **注意**：短信中的称呼（如\"张三，您好\"）仅为短信接收人，不作为案件当事人\n- 公司名称：`xx有限责任公司`、`xx有限公司`、`xx股份有限公司`\n- 诉讼对峙：`A与B`、`A诉B`、`原告A 被告B`\n- 角色前缀：`原告：xxx`、`被告：xxx` 等\n- 下载文书后，以起诉状、传票中的当事人信息为准，覆盖短信阶段的初步判断\n\n**d) 下载链接提取**：识别短信中的送达平台链接并提取参数\n\n| 平台 | 域名 | 下载方式 | 提取参数 |\n|------|------|----------|----------|\n| 全国法院统一送达平台 | `zxfw.court.gov.cn` | curl API 直连 | qdbh, sdbh, sdsin |\n| 广东法院电子送达 | `sd.gdems.com` | 浏览器自动化 | 路径中的送达标识码 |\n| 集约送达平台 | `jysd.10102368.com` | 浏览器自动化 | key |\n| 湖北电子送达 | `dzsd.hbfy.gov.cn` | HTTP API（免账号）/ 浏览器自动化（账号模式） | 免账号：msg；账号模式：账号+密码从正文提取 |\n| 司法送达网 | `sfpt.cdfy12368.gov.cn` | 纯 Playwright（无 API） | 验证码（手机尾号后6位 / 短信验证码） |\n\n**e) 发送时间提取（P0）**：从送达平台 API 响应中提取发送时间，用于后续上诉期限计算\n- **优先来源**：zxfw API 响应中的 `dt_cjsj` 字段（送达记录创建时间，ISO 8601 格式）\n- 短信网关时间：部分手机短信会显示发送时间，匹配 `发送：YYYY-MM-DD HH:mm` 格式\n- 如果无法提取送达时间，展示\"送达时间待确认\"，不阻塞后续流程\n- 记录到归档 JSON 的 `document.sent_at` 字段\n\n> **排除列表**：法院名称、法官姓名、地名、法律术语等不应作为当事人提取。详见 `sms-patterns.json` → `party_extraction.exclude_keywords`。\n\n**输出格式**（向用户展示）：\n\n```text\n📋 短信解析结果：\n- 类型：文书送达\n- 案号：（2025）苏0981民初1234号\n- 当事人：张三、xx有限公司\n- 下载链接：已提取（zxfw.court.gov.cn）\n```\n\n#### 照片/扫描件输入（方式三）\n\n当用户上传的是**纸质文书照片**（传票、判决书、通知书等），而非短信或链接时：\n\n1. **MinerU OCR**：`scripts/court_photo_ocr.py` 调用 `mineru-open-api flash-extract` 提取文字\n   ```bash\n   python3 scripts/court_photo_ocr.py /path/to/传票照片.jpg\n   ```\n   > MinerU 基于 PaddleOCR，字符级精度。首次运行自动安装 `npm install -g mineru-open-api`，用户无感知。\n\n2. **结构化解析**：提取的文字经正则匹配得到案号、案由、当事人、开庭时间/地点等，附带置信度标记\n\n3. **后续流程**：识别到传票/出庭通知 → 跳过下载步骤 → 归档 + 日历提醒；识别到判决书 → 计算上诉期限\n4. **自动归纳**：OCR 完成后按优先级匹配已有案卷，**但「归入已有案卷」必须经过律师确认，绝不自动写入**：\n   - 🥇 **案号匹配**：桌面文件夹名含案号（如 `(2025)苏0411民初6206号`）\n   - 🥈 **当事人姓名匹配**：桌面文件夹名含原告/被告姓名（如 `何玉-诉讼材料`）\n   - 🥉 **新建案卷**：都没匹配到 → 在桌面自动创建 `{原告}诉{被告} {案由}/`（新建不污染既有案卷，故不询问），内含 **10 个标准子目录**\n   - ⚠️ **匹配到已有案卷 → 暂停并请求律师确认**：展示匹配到的文件夹路径、命中依据（案号/姓名）、以及「同名同姓」风险提示，由律师在对话中确认后再归档；未经确认绝不写入。确认后通过 `--to-folder <路径>` 重新运行脚本完成归档。\n\n   标准案卷目录结构（**新建案卷时用这些固定名称，不得自行编造**）：\n   ```\n   {原告}诉{被告} {案由}/\n   ├── 01 法院送达文书/     ← 传票、判决书、裁定书、通知书等所有法院来源材料\n   ├── 02 我方提交资料/     ← 我方向法院递交的材料\n   ├── 03 对方提交资料/     ← 对方通过法院送达的材料\n   ├── 04 案件原始材料/     ← 从当事人收到的原始材料\n   ├── 05 律师工作文本/     ← 法律意见、庭审提纲等\n   ├── 06 委托签署材料/     ← 委托合同、授权书等\n   ├── 07 邮件收寄记录/     ← 邮件往来记录\n   ├── 08 法规类案检索/     ← 法律法规、类案报告\n   ├── 09 法院庭审笔录/     ← 庭审、听证笔录\n   └── 10 案件保全资料/     ← 财产、证据保全文书\n   ```\n   - 法院文书（判决书/裁定书/传票/通知书等）归入 `01 法院送达文书/` 对应子目录（新建案卷时自动归入；匹配到已有案卷时，需律师确认后归入）\n   - 照片原文件和 OCR 识别文本均保存到案卷下对应文书类型子目录\n\n**输出格式**（向用户展示）：\n\n```text\n📷 照片识别结果：\n- 类型：传票\n- 案号：（2025）沪01刑初1234号\n- 当事人：被告人张三\n- 开庭时间：2026-05-07 09:30\n- 地点：上海市第一中级人民法院 第5法庭\n```\n\n> 如 OCR 结果不完整（手写批注、模糊、遮挡），提示用户手动补充关键字段。\n\n### 第二步：确定归档目录\n\n1. **扫描桌面**：识别目录结构，找到与短信案号或当事人匹配的案件目录\n2. **查找归档子目录**：在匹配到的案件目录下，查找法院文书相关的子目录（如 `01*`、`法院送达`、`court` 等）\n3. **匹配结果分两种情况**：\n   - **未找到匹配案件** → **自动在桌面新建** `{原告}诉{被告} {案由}/`（新建不污染既有案卷，故不询问用户），随后直接归档\n   - **找到匹配案件** → **不自动归档**，立即向律师展示：①匹配到的文件夹路径 ②命中依据（案号/姓名）③同名同姓误归风险提示，请律师确认后再归档。确认后带 `--to-folder <路径>` 重新运行脚本完成归档\n\n#### 确认代理方（首次接触案件时）\n\n> ⛔ **每个案件第一次处理时必须确认代理方，否则后续无法区分「我方提交资料」和「对方提交资料」。**\n\n当新建案卷或首次匹配到已有案卷时：\n\n1. **读取 `config/case-parties.json`**，检查该案号是否已记录代理方：\n   - 已记录 → 直接使用，无需重复询问\n   - 未记录 → 执行下方交互\n\n2. **向用户提问**（从解析结果中提取已知当事人）：\n   ```\n   ⚖️ 案件 (2025)苏0981民初1234号，原告：张三，被告：xx有限公司。\n   请问您是代理哪一方？\n     → 原告 张三（我方）\n     → 被告 xx有限公司（我方）\n     → 暂时不确定\n   ```\n\n3. **记录答案**：写入 `config/case-parties.json`：\n   ```json\n   {\n     \"cases\": {\n       \"（2025）苏0981民初1234号\": {\n         \"represented_party\": \"原告\",\n         \"party_name\": \"张三\",\n         \"configured_at\": \"2026-07-13\"\n       }\n     }\n   }\n   ```\n\n4. **影响后续分类**：\n   - 已知代理方 → 非法院文书归档时自动区分「02 我方提交资料」vs「03 对方提交资料」\n   - 选择\"暂时不确定\" → 暂不区分，后续可通过\"更新代理方 (2025)苏0981民初1234号 原告\"手动补充\n\n### 第三步：文书下载\n\n> **平台判断**：根据第一步识别的链接域名，选择下载策略。\n> - `zxfw.court.gov.cn` → 方案一（API 直连）→ 方案二 → 方案三\n> - `sd.gdems.com` 或 `jysd.10102368.com` → 跳过方案一，直接方案二 → 方案三\n> - `dzsd.hbfy.gov.cn` → 湖北专属流程（见下方）\n> - `sfpt.cdfy12368.gov.cn`（含广西实例 `171.106.48.55:28083`）→ SFDW 专属流程（见下方）\n> - 未知域名但 URL 路径匹配已知平台特征 → 按路径识别平台（同构异域名支持）\n> - 完全无法识别 → 提示用户提供链接信息\n>\n> **⛔ 降级铁律**：严格串行，禁止并行。当前方案成功即停止，绝不降级。禁止\"双保险\"并行尝试多个方案。\n\n#### 依赖\n\n| 依赖 | 用途 | 适用方案 | 安装方式 |\n|------|------|----------|----------|\n| `curl` | API 下载 | 方案一 | macOS/Linux 预装 |\n| `jq` | JSON 解析（可选） | 方案一 | `brew install jq` |\n| Playwright | 浏览器自动化 | 方案二/三 | 见下方 |\n\n**Playwright 安装指引**（仅方案二/三需要）：\n\n```bash\n# 方案二: Playwright CLI\nnpm install -g playwright\nnpx playwright install chromium\n\n# 方案三: Playwright MCP（需在 WorkBuddy 设置中配置）\n# 在 settings.json 的 mcpServers 中添加：\n# \"playwright\": { \"command\": \"npx\", \"args\": [\"@anthropic-ai/mcp-playwright\"] }\n```\n\n> **⛔ 大多数情况下不需要 Playwright**：zxfw 平台方案一直接 curl 调用 API，无需浏览器。仅 gdems/jysd 平台或**方案一失败后**才需要方案二/三。禁止在方案一执行期间同时打开浏览器。\n\n#### 方案一 — API 直连（优先）\n\n完全无头，无需浏览器。直接调用 zxfw 后端 API 获取文书下载链接，再用 curl 下载 PDF。\n\n**API 信息**：\n\n- 端点：`POST https://zxfw.court.gov.cn/yzw/yzw-zxfw-sdfw/api/v1/sdfw/getWsListBySdbhNew`\n- Content-Type：`application/json`\n- 请求体：`{ \"qdbh\": \"xxx\", \"sdbh\": \"xxx\", \"sdsin\": \"xxx\" }`（从短信 URL 提取）\n- 响应字段：`data[].c_wsmc`（文书名称）、`data[].wjlj`（OSS 签名下载链接）、`data[].c_fymc`（法院名称）\n- 无需认证、无需浏览器\n\n```bash\n# 1. 从短信 URL 提取参数（示例）\nqdbh=\"DEMO_qdbh_value\"\nsdbh=\"DEMO_sdbh_value\"\nsdsin=\"DEMO_sdsin_value\"\n\n# 2. 调用 API 获取文书列表\nmkdir -p /tmp/court-sms-staging/\nresp=$(curl -s -X POST \"https://zxfw.court.gov.cn/yzw/yzw-zxfw-sdfw/api/v1/sdfw/getWsListBySdbhNew\" \\\n  -H \"Content-Type: application/json\" \\\n  -d \"{\\\"qdbh\\\":\\\"$qdbh\\\",\\\"sdbh\\\":\\\"$sdbh\\\",\\\"sdsin\\\":\\\"$sdsin\\\"}\")\n\n# 3. 解析文书列表，逐个下载 PDF\necho \"$resp\" | jq -r '.data[] | \"\\(.c_wsmc)\\t\\(.wjlj)\"' | while IFS=$'\\t' read -r name url; do\n  curl -sL -o \"/tmp/court-sms-staging/${name}.pdf\" \"$url\"\ndone\n\n# 4. 验证下载结果\nls -lh /tmp/court-sms-staging/*.pdf\n```\n\n#### 方案二 — 无头浏览器（Playwright CLI）\n\n当方案一 API 不可用或链接过期时，用 Playwright CLI 无头模式打开页面，拦截网络请求获取下载链接。\n\n```bash\n# 需要先安装 playwright\nnpx playwright install chromium 2>/dev/null\n\n# 无头模式运行（脚本需自行编写，拦截 getWsListBySdbhNew API 响应）\nnode scripts/download_court_docs.mjs --url \"{短信链接}\" --output /tmp/court-sms-staging/\n```\n\n#### 方案三 — 交互式浏览器（Playwright MCP）\n\n当方案二不可用时（需要已配置 Playwright MCP）：\n\n```text\n1. browser_navigate → 打开短信中的 zxfw URL\n2. 等待页面加载\n3. browser_evaluate → 直接调用 fetch API 获取文书列表\n4. browser_run_code → 下载 PDF 文件到 /tmp/court-sms-staging/\n```\n\n如 API 调用未成功，改用页面交互：\n\n```text\n1. browser_snapshot → 查看当前页面结构\n2. 找到文书列表或 PDF 预览区域\n3. 定位下载按钮（可能在 iframe 内）\n4. browser_click → 点击下载\n5. 等待下载完成，保存到临时目录\n```\n\n#### 湖北平台下载流程（`dzsd.hbfy.gov.cn`）\n\n湖北电子送达平台有两种链路，根据 URL 格式自动选择：\n\n**链路一：免账号模式**（URL 含 `/hb/msg=xxx`）\n\n1. 从 URL 提取 `msg` 参数值\n2. 尝试 HTTP API 直连：\n\n```bash\nmsg=\"从URL提取的msg值\"\nmkdir -p /tmp/court-sms-staging/\n\n# 查询文书信息\nresp=$(curl -s -X POST \"http://dzsd.hbfy.gov.cn/delimobile/tDeliSms/findSmsInfo?t=$(date +%s%3N)\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Referer: http://dzsd.hbfy.gov.cn/deli-mobile-ui/\" \\\n  -d \"{\\\"msg\\\":\\\"$msg\\\"}\")\n\n# 检查是否需要验证码（data.isNeedCaptcha == \"Y\"）\n# 如需验证码或无可下载文书，降级到 Playwright MCP\n\n# 逐个下载文书\necho \"$resp\" | jq -r '.data.docList[] | \"\\(.docName)\\t\\(.downloadPath)\"' | while IFS=$'\\t' read -r name path; do\n  if [ -n \"$path\" ]; then\n    curl -sL -o \"/tmp/court-sms-staging/${name}.pdf\" \"http://dzsd.hbfy.gov.cn/delimobile${path}\"\n  fi\ndone\n```\n\n3. 如需验证码或 HTTP 失败，降级到 Playwright MCP（方案三）\n\n**链路二：账号模式**（URL 含 `/sfsddz`）\n\n1. 从短信正文提取凭证：\n   - 账号：匹配 `账号\\s*(\\d{15,20})`\n   - 默认密码：匹配 `默认密码[：:]\\s*([0-9A-Za-z]+)`\n2. 需要浏览器自动化（Playwright MCP），登录页包含验证码\n3. 登录后遍历待签收/已签收/已过期文书列表，逐个下载\n\n> **提示**：湖北平台两种模式都可能遇到验证码。免账号模式优先尝试 HTTP API，账号模式建议引导用户手动打开链接或使用 Playwright MCP。\n\n#### 司法送达网下载流程（SFDW - `sfpt.cdfy12368.gov.cn`）\n\n司法送达网所有 POST 请求使用 TDHCryptoUtil 加密，无法通过 HTTP API 下载，只能使用纯 Playwright 流程。\n\n**广西实例**：`171.106.48.55:28083` 域名下的链接路由到同一 SFDW 平台，下载流程相同。\n\n**验证码获取**（两种方式，按优先级尝试）：\n\n1. **手机尾号后6位**（优先）：从案件分配信息中获取律师手机号，取后6位作为验证码输入\n2. **短信验证码**：从短信正文中提取，匹配 `验证码[：:]\\s*(\\w{4,6})`\n\n**Playwright MCP 流程**：\n\n```text\n1. browser_navigate → 打开短信中的 SFDW 链接\n2. 等待页面自动重定向到 pc.html?tdhParams=xxx\n3. browser_snapshot → 查看验证码输入页面（input#checkCode）\n4. 输入验证码（优先手机尾号后6位，其次短信验证码）\n5. browser_evaluate → 调用 Vue app.checkYzm() 触发验证\n6. 验证通过后 browser_evaluate → 获取 app.$data.wsList（文书列表）\n7. 遍历 wsList，逐个调用 downloadFile(app, ws) 下载文书\n8. 保存到 /tmp/court-sms-staging/\n```\n\n> **提示**：如手机尾号验证失败，提示用户查看短信中的验证码并手动输入。wsList 每项包含 wjmc（文件名）、wjgs（格式）。\n\n#### 失败兜底\n\n当三级均失败时：\n\n```text\n⚠️ 自动下载失败，请手动访问以下链接下载：\n{原始链接}\n\n下载后请将文件放到对应案件目录中。\n\n我将为您创建待处理记录。\n```\n\n### 第四步：归档保存\n\n> ⚠️ **归档铁律：匹配到已有案卷必须经律师确认，绝不静默写入。** 同名同姓在中国极为普遍，错误归档会污染他人案卷，因此「找到即归档」是禁止行为。\n\n1. **确定目标目录**：\n   - 扫描桌面，匹配与案号或当事人相关的案件目录\n   - **未找到匹配案件** → **自动在桌面新建** `{原告}诉{被告} {案由}/`（安全，不询问），随后归档\n   - **找到匹配案件** → **暂停，请求律师确认**：展示文件夹路径、命中依据、同名同姓风险提示；律师确认后带 `--to-folder <路径>` 重新运行脚本，再归档到该目录\n   - 如目标目录不存在，自动创建\n2. **获取当前日期**：`date \"+%Y%m%d\"`\n3. **确定文书标题**：\n   - 优先使用 API 返回的标题\n   - 否则根据 `sms-patterns.json` 中的 `document_titles` 映射推断\n   - 最后回退到原始文件名（去除扩展名），如仍无法确定则使用 `未知文书`\n4. **构建文件名**：`{title}（{case_name}）_{YYYYMMDD}收.pdf`\n   - 示例：`受理通知书（张三与李四合同纠纷）_20260404收.pdf`\n   - 清理非法字符：`< > : \" | ? * \\ /`\n   - 如同名文件已存在，追加 `_2` 后缀\n\n### 核心规则：按送达批次打包（强制执行）\n\n> ⛔ **所有法院送达材料一律用日期子文件夹打包，不得直接散放在 `01 法院送达文书/` 根目录。**\n> 法院可能对同一案件分批发送不同文书，散放会导致批次混乱、无法区分送达时间。\n\n**哪怕是只有一份传票，也放进子文件夹里。**\n\n**文件夹命名规则**：`{命名文书}_{送达日期}送达/`\n\n- `送达日期` 取 API 响应中 `dt_cjsj` 的日期部分（如 `20260119`），或文书落款日期\n- `命名文书` 从本次送达的所有文书中选优先级最高的作为文件夹名\n\n**命名优先级**（所有文书地位并列，以下仅用于选文件夹名）：\n\n| 优先级 | 适用场景 | 文件夹名示例 |\n|--------|---------|------------|\n| 1 | 含判决书 | `一审法院判决书_20260318送达/` |\n| 2 | 含裁定书（不含判决书） | `一审法院裁定书_20260401送达/` |\n| 3 | 含传票（不含判决/裁定） | `传票_20260601送达/` |\n| 4 | 含受理案件通知书（不含以上） | `受理案件通知书_20260119送达/` |\n| 5 | 其他（举证通知、应诉通知等） | `举证通知书_20260520送达/` |\n\n**简单理解**：一堆文书里谁最\"重\"就用谁命名。传票比通知书\"重\"，判决书比传票\"重\"——仅此而已，跟文书本身的法律效力无关。 |\n\n**文件夹内文件保持 API 返回的原始文件名**，不重命名、不合并。\n\n**归档路径示例**：\n```\n海筑建设诉淮安瑞悦/01 法院送达文书/受理案件通知书_20260119送达/\n├── 受理案件通知书.pdf\n├── 交纳诉讼费用通知书.pdf\n├── 民事诉讼权利义务告知书.pdf\n└── ...\n\n孙东诉武进建工/01 法院送达文书/传票_20260601送达/\n└── 传票.pdf\n```\n\n5. **移入目标目录**：将子文件夹整体移入 `01 法院送达文书/`\n6. **写入内部记录**：保存本次处理的完整信息到**本技能目录下的 `archive/`**（即 `~/.workbuddy/skills/litigation-hub/archive/`）。格式详见 [`references/archive-format.md`](references/archive-format.md)\n7. **自动归纳到桌面案卷**（短信/链接方式同样适用）：\n   - 扫描桌面是否已有该案号的文件夹\n   - 没有 → 在桌面自动创建 `{原告}诉{被告} {案由}/`（如 `张荷玉诉耿平 被继承人债务清偿纠纷/`），再放入\n   - 有 → **不自动放入**：展示匹配结果 + 同名同姓风险提示，请律师确认；确认后带 `--to-folder <路径>` 重新运行脚本放入\n   - SMS 多文件按文件夹打包规则归纳（如 `一审法院判决书/` 子目录）\n8. **基础文书解析**：法院 PDF 通常带文字层，提取首页文本，快速识别文书类型和关键信息\n   - **传票**：提取开庭时间、地点、法庭、案号，向用户高亮提醒\n   - **通知书/告知书**：提取缴费期限、举证期限等关键日期\n   - **起诉状/答辩状**：提取案由、当事人、诉讼请求概要\n   - **判决书**：识别为一审判决书，记录文书类型，触发上诉期限计算（P1）\n   - **裁定书**：识别裁定类型。**⛔ 如正文含「冻结」「查封」「扣押」任一关键字，必须在后续步骤中强制执行 point 9（期限规则匹配），不得因开庭日期已过、案件状态待定等任何理由跳过。**\n   - **其他文书**：展示文书标题和法院名称\n   - 如一次下载多份文书，逐一解析，汇总为一份报告\n\n   > 深度分析（如判决书解读、合同审查）不在此技能范围内，请使用专用分析技能处理。\n\n9. **期限规则匹配（P0）**：当识别到任何有期限要求的文书时，自动查表 `references/deadline-rules.json` 匹配对应规则\n\n   规则库覆盖 **12 种文书类型**，包括：\n\n   | 分类 | 文书类型 | 期限 | 提醒策略 |\n   |------|---------|------|---------|\n   | 📄 上诉 | 民事/行政判决书 | 15日 | 2天前 + 截止当天 |\n   | 📄 上诉 | 刑事判决书 | 10日 | 2天前 + 截止当天 |\n   | 📑 上诉 | 民事/行政裁定书 | 10日 | 2天前 + 截止当天 |\n   | 📑 上诉 | 刑事裁定书 | 5日 | 2天前 + 截止当天 |\n| ❄️ 保全 | 冻结银行存款裁定 | 1年 | ⚠️ **提前30天** + 14天 + 7天 + **到期当天** |\n| 🏠 保全 | 查封不动产裁定 | 3年 | ⚠️ **提前30天** + 14天 + 7天 + **到期当天** |\n   | 📝 举证 | 举证通知书 | ≥15日 | 5天前 + 1天前 |\n   | 📬 答辩 | 起诉状副本 | 15日 | 3天前 + 截止当天 |\n   | ⚡ 执行 | 生效法律文书 | 2年 | 30天前 + 7天前 |\n   | 🔄 再审 | 生效判决/裁定 | 6个月 | 30天前 + 7天前 |\n   | 🏛️ 管辖 | 管辖权异议裁定 | 10日 | 2天前 + 截止当天 |\n   | 📋 缴费 | 受理通知书 | 7日 | 3天前 + 1天前 |\n\n   > **保全类必须提前处理**：冻结/查封的续期申请不能等到最后一两天，规则库已按 30天 提前提醒。\n   > 新增文书类型只需在 `deadline-rules.json` 的 `rules` 数组中追加一条 JSON 条目，无需改代码。\n\n   - **匹配逻辑**：根据文书类型 + 关键字标签（如\"冻结\"\"银行存款\"）精确匹配规则\n   - **提醒生成**：调用 `scripts/court_deadline_reminder.py` 统一设置 日历 + 本机电脑提醒（系统通知 + 桌面 Markdown 文件）+ QQ 邮件（微信送达）\n   - **⚠️ 提醒确认（P0 — 必须执行）**：在创建任何提醒之前，必须先展示提醒计划并等待用户确认\n     ```\n     📋 即将创建以下提醒：\n     案号: (2025)苏0411民初6206号\n     规则: 民事判决书 → 15日上诉期\n     \n     · 2026-07-13 09:00 — 上诉期限还剩2天 (日历+通知+邮件)\n     · 2026-07-15 09:00 — 上诉期限今天截止 (日历+通知+邮件)\n     \n     👉 回复「确认」创建提醒，或指出需要修改的项。\n     ```\n     - 用户确认前，不得调用任何提醒创建脚本\n     - 用户可以修改提醒时间（如改为提前 5 天）\n     - 用户可以添加自定义额外提醒\n   - **自动提醒设置**：识别到判决书/裁定书后，自动为上诉截止日期设置**三重提醒**：\n     - 📅 日历事件（macOS Apple Calendar / Windows Outlook / .ics 文件）\n    - 🖥️ 本机电脑提醒（系统通知弹窗 + 桌面 Markdown 提醒文件，每次提醒同步生成）\n    - 📧 QQ 邮件（微信送达）（每次提醒同步发送）\n     - 使用脚本：`python3 scripts/court_deadline_reminder.py setup '<案号>' '<案由>' '<文书类型>' '<标签>' '<送达日期>' '<法院>'`\n     - 规则库：`references/deadline-rules.json`（覆盖 12 种文书类型，新增类型只需加 JSON 条目）\n\n   - **🔴 保全裁定强制处理（P0 — 不可跳过）**：当文书类型为「裁定书」且内容包含保全关键字（冻结、查封、扣押）时，**无论其他因素如何（如开庭日期已过、案件状态待定等），都必须执行以下完整流程**：\n\n     1. **提取保全详情**：从裁定书正文中提取以下字段，逐项展示给用户确认：\n        - 保全金额（如\"145万元\"）\n        - 保全方式（冻结银行存款 / 查封不动产 / 扣押动产）\n        - 被申请人名称\n        - 裁定日期\n        - 审判员姓名\n\n     2. **计算到期日**：\n        | 保全方式 | 期限 | 依据 |\n        |---------|------|------|\n        | 冻结银行存款 | 1年（365日） | 《民事保全须知》第3条 |\n        | 查封、扣押动产 | 2年（730日） | 《民事保全须知》第3条 |\n        | 查封不动产、冻结其他财产权 | 3年（1095日） | 《民事保全须知》第3条 |\n        - 到期日 = 裁定日期 + 期限 - 1日\n\n     3. **创建全部提醒（逐条核对，不得遗漏）**：根据 `deadline-rules.json` 中匹配到的规则，**逐条创建所有 `reminders` 数组中的提醒**。以 `preservation_freeze`（冻结银行存款）为例：\n        ```\n        reminders: [\n          提前30天 (critical) → 日历 + 通知 + 邮件\n          提前14天 (warning)  → 日历 + 通知 + 邮件\n          提前7天  (warning)  → 日历 + 通知 + 邮件\n        ]\n        ```\n        - ⛔ **禁止部分创建**：规则里写了几个 `reminders`，就必须全部创建。不允许只创建30天和到期日、漏掉14天和7天。\n        - 到期日当天额外创建一条「🔴 保全到期」事件作为最后兜底。\n\n     4. **汇总确认**：创建完成后展示完整提醒时间线，让用户一目了然：\n        ```\n        📋 (2026)苏0281民初9011号 保全提醒时间线：\n        裁定日期：2026-05-27 → 到期日：2027-05-26（1年）\n        \n        · 2027-04-26 — ⛔ 提前30天：请立即申请续冻！\n        · 2027-05-12 — ⚠️ 提前14天：冻结将在14天后到期\n        · 2027-05-19 — ⚠️ 提前7天：冻结将在7天后到期\n        · 2027-05-26 — 🔴 保全到期日\n        ```\n\n10. **向用户汇报**：按 [`references/report-format.md`](references/report-format.md) 输出结构化报告\n   - 先确认归档完成（案号、法院、当事人、案由、文件数、位置）\n   - 列出所有已归档的文书清单\n   - 如含传票，⚠️ 高亮提醒开庭时间、地点、审理程序\n   - 如含判决书，⏰ 展示上诉期限信息\n   - 如含传票/出庭通知/应诉通知书，自动进入**第五步**创建日历提醒，在汇报末尾追加日历创建结果\n   - 如部分失败，列出失败文书和原始链接\n\n11. **归档确认（P0 — 必须执行）**：向用户展示归档结果，等待确认后才能进入提醒步骤\n    - 输出归档清单：`文件 → {案卷路径}/{子目录}/文件名`\n    - 展示重复检测结果（如有）\n    - **阻止后续操作**：在用户回复\"确认\"之前，**不得创建日历事件、系统通知、或发送邮件**\n    - 用户可修改归档位置或报错\n\n12. **❄️ 重复文件检测**：归档前检查目标目录是否已有同名或大小相似的文件\n    - 文件名匹配：同名文件 → 提示\"已存在，是否覆盖？\"\n    - 文件大小匹配：大小差异 < 5% → 提示\"可能存在重复，是否跳过？\"\n    - 用户选择：跳过 / 覆盖 / 保留两个文件\n\n13. **📋 未处理文件追踪**：OCR 失败或无法归类的文件，记入 `references/pending-items.json` 待处理清单\n    - 每次 skill 启动时检查待处理清单，向用户汇报还有多少未处理文件\n    - 用户可指定文件归类位置，归类后自动从清单移除\n\n14. **📂 非法院文书智能归类**：对非法院发布的文件（代理词、委托书、合同、证据等），根据文件名和内容关键词自动归类到对应子目录\n    - `02 我方提交资料`: 起诉状、答辩状、代理词、证据清单（**仅当文件涉及代理方时才归入此目录**）\n    - `03 对方提交资料`: 对方起诉状、对方答辩状、对方代理词（**仅当文件涉及对方当事人时才归入此目录**）\n    - `04 案件原始材料`: 合同、协议、借条、银行流水\n    - `06 委托签署材料`: 委托代理合同、授权委托书\n    - 等等。详见 `scripts/court_utils.py` → `FILE_CATEGORY_MAP`\n    - **代理方感知**：归类前先读取 `config/case-parties.json`，已知代理方时，涉及代理方的诉讼文书（起诉状、答辩状、代理词等）优先归入 `02 我方提交资料`，涉及对方当事人的归入 `03 对方提交资料`。未确认代理方时，不确定归属的文书先暂存桌面，待确认后再归类。\n\n15. **📅 法定节假日感知**：期限截止日如落在周末或法定假期，自动顺延至最近工作日\n    - 数据源：`references/china-holidays.json`（来自国务院办公厅通知）\n    - 每年 1 月 1 日后首次调用时，主动提醒检查当年节假日数据是否已更新\n    - 如期限内包含长假（如春节、国庆），向用户提示\"实际可用工作日可能不足\"\n\n### 第五步：开庭日历提醒（macOS / Windows）\n\n> **触发条件**：第四步 PDF 解析识别出**传票 / 出庭通知 / 应诉通知书**时自动执行。\n> **自动判断**：无需用户操作，下载 PDF 后自动扫描文书标题，符合条件即触发。\n> **重复安全**：写入前自动删除同一案号的旧事件和邮件提醒，不会重复创建。\n\n下载 PDF 并解析出开庭信息后，自动完成三项工作（根据系统平台自动选择实现）：\n1. **系统日历事件**（macOS Apple Calendar / Windows Outlook \"工作\"分组）\n2. **QQ 邮件（微信送达）通知**（跨平台，发到 YOUR_QQ_EMAIL@qq.com）\n3. **本机电脑提醒**（系统通知中心弹窗 + 桌面 Markdown 提醒文件，双保险）\n\n**本机电脑提醒**由两部分组成，确保律师一定能看到开庭提示：\n- **系统通知**：macOS 提前1天通过 launchd 弹系统通知中心；Windows 通过 schtasks 弹 MessageBox\n- **桌面 Markdown 提醒文件**：同时在桌面生成 `开庭提醒_YYYY-MM-DD_HHMM.md`，写明开庭日期 / 时间 / 案由 / 案号 / 地点及**需准备材料清单**（传票、证据原件、委托手续等）。即使系统通知被勿扰屏蔽或一时没注意，回到桌面也能看到——这是本机提醒的持久化兜底，不依赖系统通知是否真的弹出。\n\n| 平台 | 日历 | 定时提醒 | 本机电脑提醒 |\n|------|------|---------|------------|\n| macOS | Apple Calendar (AppleScript) | launchd plist | 系统通知 + 桌面 Markdown 文件 |\n| Windows | Outlook COM → 失败则 **.ics 文件兜底** | schtasks | MessageBox 弹窗 + 桌面 Markdown 文件 |\n| Linux | .ics 日历文件（双击导入） | ❌ | 桌面 Markdown 文件 |\n\n```text\n📅 日历事件已创建：\n  - 摘要：⚖️ 开庭：{案由}\n  - 时间：YYYY年MM月DD日 HH:MM — HH:MM+2h\n  - 地点：{开庭地点}\n  - PDF链接：已关联（点开事件可查看文书）\n  - 日历分组：工作\n  - 系统提醒：提前1天通知\n📄 桌面提醒文件已生成：/Users/你/Desktop/开庭提醒_YYYY-MM-DD_HHMM.md\n📧 QQ 邮件（微信送达）提醒已设置（提前1天发送）\n\n#### 依赖\n\n| 依赖 | 用途 | 安装 |\n|------|------|------|\n| `pypdf` | PDF 文本提取 | `pip install pypdf` |\n| macOS: `osascript` / `launchctl` | 日历 + 系统通知 | 系统预装 |\n| Windows: `PowerShell` / `schtasks` | Outlook 日历 + 弹窗通知 | 系统预装 |\n| `mineru-open-api` | 纸质文书照片 OCR（方式三） | 自动安装 `npm install -g mineru-open-api` |\n| `node` | 通过 smtp.js 发送 QQ 邮件（微信送达） | 系统已装 |\n| `imap-smtp-email` skill | QQ 邮箱 SMTP 配置 | 已安装 |\n\n#### 操作步骤\n\n**① 从 PDF 中提取开庭信息**\n\n使用脚本 `scripts/court_calendar.py` 的 `parse` 模式：\n\n```bash\n# 提取开庭信息（案号、案由、开庭时间、地点）\npython3 scripts/court_calendar.py parse /tmp/court-sms-staging/传票.pdf\n```\n\n正则匹配规则：\n\n| 字段 | 正则 | 示例 |\n|------|------|------|\n| 案号 | `（(\\d{4})[^）]*\\d+号` | （2025）苏0981民初1234号 |\n| 案由 | `案　?由[：:]\\s*(.+)` | 民间借贷纠纷 |\n| 开庭时间 | `应到时间[：:]\\s*YYYY年M月D日...HH:MM` 或通用日期时间 | 2026年05月07日 09:30 |\n| 地点 | `应到处所[：:]\\s*(.+)` 或 `开庭地点[：:]\\s*(.+)` | xx市人民法院 第3法庭 |\n\n**② 判断是否需要创建日历**\n\n判定规则：文书标题或类型含以下任一关键词即触发：\n- 传票\n- 出庭通知\n- 开庭\n- 应诉通知书\n\n**③ 删除旧事件（去重）**\n\n同一案号可能多次收到文书更新，写入前自动删除该案号的旧日历事件：\n\n```bash\npython3 scripts/court_calendar.py '<案号>' '<案由>' '<YYYY-MM-DD HH:MM>' '<地点>'\n```\n\n脚本内部自动调用 `delete_court_events()` 去重。\n\n**④ 创建日历事件 + 系统提醒 + QQ 邮件（微信送达）提醒**\n\n```bash\npython3 scripts/court_calendar.py '<案号>' '<案由>' '<YYYY-MM-DD HH:MM>' '<地点>' \\\n  '工作' '<PDF远程链接（如有）>'\n```\n\n这步同时完成：\n- AppleScript → Apple Calendar \"工作\" 日历（无弹窗）\n- launchd plist → 提前1天系统通知中心提醒\n- **桌面 Markdown 文件 → 提前1天生成《开庭提醒_YYYY-MM-DD_HHMM.md》（开庭时间、地点、需准备材料清单），落到桌面**\n- **库内脚本 → 提前1天 QQ 邮件（微信送达）通知（到 YOUR_QQ_EMAIL@qq.com）**\n\n#### QQ 邮件（微信送达）内容\n\n开庭前1天在同一时刻自动发送，内容示例：\n\n```\n━━━━━━━━━━━━━━━━━━\n⚖️ 开庭提醒\n━━━━━━━━━━━━━━━━━━\n\n案号：（2025）苏0981民初1234号\n案由：民间借贷纠纷\n时间：2026年5月7日 09:30（周四）\n地点：xx市人民法院 第3法庭\n\n━━━━━━━━━━━━━━━━━━\n此邮件由 court-sms 自动发送，请以传票原件为准。\n```\n\n#### AppleScript 事件内容\n\n| 字段 | 内容 |\n|------|------|\n| summary | ⚖️ 开庭：{案由} |\n| description | 案号 - 案由 - 开庭地点（纯文本，不含链接） |\n| url | PDF 远程访问链接（如无则不传） |\n| location | 开庭地点 |\n| start | 开庭时间（2小时时长） |\n| calendar | 工作 |\n\n#### 日程冲突处理\n\n如果已有同案号日历事件（如之前手动创建或系统自动创建），脚本的 `delete_court_events()` 会先清理再重建，保证不重复。\n\n#### 异常处理\n\n| 状况 | 处理 |\n|------|------|\n| pypdf 未安装 | 提示安装，跳过日历创建 |\n| PDF 无法解析（扫描件） | 跳过自动提取，展示\"请手动查看 PDF 确认开庭时间\" |\n| 提取到案号但无开庭时间 | 只创建事件（摘要以案号命名），不设提醒时间，不发送 QQ 邮件（微信送达） |\n| AppleScript 失败 | 展示错误信息，不阻塞后续流程 |\n| launchd 加载失败 | 仅提示，日历事件已完成创建 |\n| launchd 邮件提醒加载失败 | 仍完成日历创建，展示警告并提示检查 launchd 日志 |\n| QQ 邮件（微信送达）发送失败 | 不影响日历和系统通知，检查 `~/.court-email/*-err.log` |\n\n#### 用户侧汇报格式\n\n日历创建成功后，在文书归档汇报末尾追加：\n\n```text\n📅 开庭日历提醒：\n  - ⚖️ 开庭：{案由}\n  - 🕙 {开庭时间}\n  - 📍 {开庭地点}\n  - 🖥️ 本机电脑提醒：系统通知 + 桌面《开庭提醒_*.md》（含需准备材料清单）\n  - 📧 已设置提前1天 QQ 邮件（微信送达）通知（YOUR_QQ_EMAIL@qq.com）\n```\n\n---\n\n### 第六步：PDF 后处理（可选）\n\n> **不默认启用**。仅在检测到文件拆分时主动提示用户。\n\n归档完成后，扫描目标目录中的 PDF 文件，检测是否有同一文书被拆分为多个文件的情况。\n\n#### 读取用户偏好\n\n读取 `config/user-preferences.json` 获取用户的合并和重命名偏好。如文件不存在，使用默认值（参考 `config/user-preferences.example.json`）。\n\n关键偏好项：\n\n| 偏好 | 默认值 | 说明 |\n|------|--------|------|\n| `merge_strategy` | `per_evidence` | 合并策略：`per_evidence`（按编号分别合并）或 `unified`（统一合并） |\n| `merge_options.unified.bookmarks.enabled` | `true` | 统一合并时是否添加 PDF 书签 |\n| `rename.enabled` | `true` | 是否精简文件名 |\n\n#### 触发检测\n\n读取 `references/sms-patterns.json` → `post_processing.trigger` 配置，按以下规则分组：\n\n```text\n分组规则：\n1. 证据类：文件名以\"证据\"开头 → 按编号分组（证据1、证据2、证据3…）\n2. 其他文书：按文书类型分组（传票、起诉状、应诉通知书…）\n3. 如任一组内文件数 > 3（threshold），触发提示\n```\n\n**示例**：证据3 下有 10 个 PDF → 触发。\n\n#### 用户确认\n\n使用 AskUserQuestion 提示用户，列出检测到的拆分情况：\n\n```text\n检测到以下文书被拆分为多个 PDF：\n- 证据3：10 个文件\n- 证据5：4 个文件\n\n是否执行 PDF 后处理（合并 + 重命名）？\n  → 是，合并所有\n  → 让我选择（逐个确认）\n  → 跳过\n```\n\n#### 执行后处理\n\n用户确认后，根据 `user-preferences.json` 中的 `merge_strategy` 执行：\n\n**策略一：per_evidence（默认）**\n\n按单个证据编号分别合并，每个证据独立保留：\n\n```text\n- 证据3 有 10 个拆分文件 → 合并为「证据3：打印截图.pdf」\n- 证据5 有 4 个拆分文件 → 合并为「证据5：电脑截图.pdf」\n- 未被拆分的证据（如证据1 只有 1 个文件）保持不动\n```\n\n**策略二：unified**\n\n将证据目录 + 所有证据合并为一个「原告证据.pdf」，并添加 PDF 书签：\n\n```text\n合并顺序：证据目录 → 证据1 → 证据2 → … → 证据N\n书签格式：\n  📑 证据目录\n  📑 证据1：仲裁申请书、不予受理通知书\n  📑 证据2：劳动合同、保密协议\n  📑 证据3：被告工资表\n  📑 证据4：泄露账号密码的电脑截图\n  📑 证据5：打印及拷贝资料的电脑截图\n  📑 证据6：删除电脑操作痕迹的截图\n```\n\n书签名称使用简洁版：证据编号 + 冒号 + 证据标题（去除当事人和日期后缀）。使用 pypdf 的 `add_outline_item` 添加书签。\n\n> 用户可随时修改 `user-preferences.json` 切换策略，无需改动 skill 本身。\n\n#### 页面尺寸标准化\n\n合并过程中同时标准化页面尺寸为 A4（210×297mm）。使用 pypdf 逐页处理：\n\n```python\nfrom pypdf import PdfReader, PdfWriter, Transformation\n\nA4_W = 595.27  # 210mm in points\nA4_H = 841.89  # 297mm in points\n\nfor page in reader.pages:\n    pw, ph = float(page.mediabox.width), float(page.mediabox.height)\n    is_landscape = pw > ph\n\n    # 保持原始方向：纵向→A4纵向，横向→A4横向\n    target_w = A4_H if is_landscape else A4_W\n    target_h = A4_W if is_landscape else A4_H\n\n    # 等比缩放并居中\n    scale = min(target_w / pw, target_h / ph)\n    offset_x = (target_w - pw * scale) / 2\n    offset_y = (target_h - ph * scale) / 2\n\n    new_page = writer.add_blank_page(width=target_w, height=target_h)\n    page.add_transformation(Transformation().scale(scale).translate(offset_x, offset_y))\n    new_page.merge_page(page)\n```\n\n**规则**：\n- 纵向页面 → A4 纵向（210×297mm）\n- 横向页面 → A4 横向（297×210mm），不强制旋转为纵向\n- 等比缩放、居中放置，不裁剪、不拉伸\n\n#### 精简文件名\n\n根据 `user-preferences.json` → `rename` 配置对所有文件统一重命名：\n\n```text\n去除规则（strip_patterns）：\n- 去掉括号内的当事人信息：（张三与李四合同纠纷）\n- 去掉日期后缀：_20260405收\n- 去掉平台标记：（合并）、（自贸法庭）、（素）-\n\n特殊映射（special_mappings）：\n- 起诉状（素）… → 起诉状（要素式）.pdf\n- 开庭传票 → 传票.pdf\n```\n\n**重命名示例**：\n\n| 原始 | 重命名后 |\n|------|----------|\n| `传票（张三与李四合同纠纷）_20260405收.pdf` | `传票.pdf` |\n| `起诉状（合并）.pdf` | `起诉状.pdf` |\n| `起诉状（素）-要素式起诉状（合并）.pdf` | `起诉状（要素式）.pdf` |\n| `应诉通知书（自贸法庭）.pdf` | `应诉通知书.pdf` |\n| `E法桥平台使用告知书（xxx）_20260405收.pdf` | `E法桥平台使用告知书.pdf` |\n\n---\n\n## 内部归档格式\n\n每次处理完成后在 `archive/` 下创建 JSON 记录，格式详见 [`references/archive-format.md`](references/archive-format.md)。\n\n> ⚠️ **发布前清空**：`archive/` 目录在运行时自动写入真实案件记录，对外发布前必须清空所有 `.json` 文件（保留 `.gitkeep` 和目录结构），确保案件数据不外泄。\n\n---\n\n## 常见法院短信格式参考\n\n### 文书送达短信\n\n```text\n【xx市人民法院】张三，您好！您有（2025）苏0981民初1234号案件文书送达，\n请点击链接查收：\nhttps://zxfw.court.gov.cn/zxfw/#/pagesAjkj/app/wssd/index?qdbh=DEMO1&sdbh=DEMO2&sdsin=DEMO3\n如非本人操作请联系法院。\n```\n\n### 立案通知短信\n\n```text\n【xx市xx区人民法院】您好，您提交的立案材料已审核通过。\n案号：（2025）京0105民初54321号\n请及时缴纳诉讼费用。\n```\n\n### 开庭提醒短信\n\n```text\n【xx市xx区人民法院】提醒：您有（2025）苏0508民初567号案件，\n定于2025年3月15日上午9:30在第3法庭开庭，请准时到庭。\n```\n\n### 湖北电子送达短信（免账号）\n\n```text\n【xx人民法院】您有案件文书待查收，请点击链接查收：\nhttp://dzsd.hbfy.gov.cn/hb/msg=XXXXXXX\n如有疑问请联系法院。\n```\n\n### 湖北电子送达短信（账号模式）\n\n```text\n【xx人民法院】您有（2025）鄂xxxx民初xxxx号案件文书送达。\n账号 420xxxxxxxxxxxxx\n默认密码：xxxxxx\n请登录 http://dzsd.hbfy.gov.cn/sfsddz 查收。\n```\n\n### 司法送达网短信\n\n```text\n【xx人民法院】您有（2025）川xxxx民初xxxx号案件文书送达。\n验证码：A1B2C3\n请点击链接查收：https://sfpt.cdfy12368.gov.cn/sfsdw//r/xxxxxxxxxxxx\n```\n\n---\n\n## 故障排除\n\n| 问题 | 解决方案 |\n| --- | --- |\n| 短信无法识别类型 | 展示原文，请用户确认类型后继续 |\n| 案号提取失败 | 手动输入案号 |\n| 当事人识别不准 | 提示用户确认/修正当事人列表 |\n| 无匹配案件 | 自动在桌面新建 `{原告}诉{被告} {案由}/`（不询问） |\n| 找到已有案卷 | **不自动归档**：展示匹配路径 + 命中依据 + 同名同姓风险，请律师确认后带 `--to-folder <路径>` 重新运行脚本归档 |\n| Playwright 下载超时 | 检查网络连接，尝试刷新页面重试 |\n| 页面需要验证码 | 通知用户，暂停等待手动处理 |\n| 下载文件损坏 | 清理临时目录，重新尝试下载 |\n| 目标目录不存在 | 自动创建对应目录 |\n| SFDW 验证码验证失败 | 尝试手机尾号后6位和短信验证码两种方式，均失败时提示用户联系法院 |\n| 日历创建失败 | 检查 pypdf 是否安装，检查 AppleScript 是否有 Calendar 权限（系统偏好设置→隐私与安全性→自动化） |\n| 日历事件重复 | 已内置去重（写入前自动删除同案号旧事件），如仍有重复请检查 launchd 是否有残留 plist：`ls ~/Library/LaunchAgents/com.mm.court-*` |\n| QQ 邮件（微信送达）未收到 | 检查 `~/.court-email/*-err.log` 查看 smtp.js 报错；检查 QQ 邮箱是否将自动邮件归入垃圾箱；确认授权码未过期（腾讯授权码有效期通常90天） |\n| launchd 邮件提醒未触发 | 检查 `~/.court-email/*.log` 查看执行记录；确认 launchd plist 已加载：`launchctl list | grep court-email` |\n| 照片文字识别不准 | 确保照片清晰、正面、光线充足；避免倾斜/阴影/手写体；如关键字段缺失可手动补充 |\n\n---\n\n## 配置\n\n- **解析规则**：`references/sms-patterns.json`。如需修改解析规则（添加新文书标题、调整正则等），编辑该 JSON 文件即可。\n- **代理方记录**：`config/case-parties.json`。每个案件第一次处理时自动询问并记录代理方（原告/被告），用于区分「我方提交资料」和「对方提交资料」。可通过\"更新代理方 <案号> <原告/被告>\"手动修改。\n- **案卷目录**：`config/case-root.json`。首次使用询问并缓存案卷根目录路径。\n\n---\n\n## 🔄 变更历史\n\n### ⭐ v1.0–v1.5.0（杨卫薪律师）— 基础框架\n\n杨卫薪律师（微信 ywxlaw）完成了以下核心基础工作，本技能的所有后续功能均建立在此之上：\n\n| 模块 | 贡献 |\n|------|------|\n| 📱 **短信解析** | 法院短信文本解析，自动提取案号、当事人、下载链接 |\n| 🌐 **zxfw API 下载** | 全国法院统一送达平台 API 直连，curl 无头下载 PDF |\n| 📁 **基础归档** | 下载 PDF 后归档到案件目录，写入内部 JSON 记录 |\n| 📄 **文书识别** | 正则匹配识别文书类型（传票/判决书/裁定书等） |\n| 📋 **多平台支持** | 广东 gdems、湖北 hbfy、集约送达、司法送达网下载 |\n\n上述工作使本技能从零到一，Stone 了法院短信→下载→归档的核心链路。\n\n---\n\n### ⭐ v2.0.0（2026-07-07）— 陆凌燕 · 全面升级\n\n基于 v1.5.0 核心链路，新增以下能力：\n\n**提醒体系（三条线）**\n- 开庭传票自动写入系统日历 + 本机电脑提醒（系统通知 + 桌面 Markdown 文件）+ QQ 邮件（微信送达）提醒（YOUR_QQ_EMAIL@qq.com）\n- 上诉期限自动设提前2天 + 截止当天双提醒，全部三条线同时到达\n- macOS Apple Calendar / Windows .ics 文件 / Linux .ics 文件，跨平台覆盖\n\n**期限规则库（`references/deadline-rules.json`）**\n- 覆盖 12 种文书类型：上诉/保全/举证/答辩/执行/再审/管辖/缴费\n- 保全类（冻结银行存款 1 年、查封不动产 3 年）特殊处理：提前 30 天 + 14 天 + 7 天三级递进提醒\n- 新增文书类型只需追加一条 JSON 条目，无需改代码\n\n**照片 OCR（方式三）**\n- 纸质传票/判决书/通知书拍照即可识别（MinerU + PaddleOCR，字符精度 >99%）\n- 识别结果强制复核确认（案号、开庭时间永远标记 ⚠️）\n- MinerU 首次运行自动安装，用户零感知\n\n**归档体系优化**\n- 同一条短信多份文书 → 文件夹打包（非合并 PDF），按最高级别文书命名\n- 桌面端案件文件夹即案卷唯一根目录（找到已有案卷须律师确认后写入，不静默同步）\n\n**跨平台支持**\n- macOS：Apple Calendar + launchd + 通知中心\n- Windows：.ics 日历文件 + schtasks + MessageBox 弹窗\n- Linux：.ics 日历文件\n\n**自动归纳与案卷管理**\n- 照片/扫描件自动 OCR 后按案号或当事人姓名匹配已有案卷\n- **匹配到已有案卷 → 必须请求律师确认后才归档**（同名同姓风险，禁止静默写入）；确认后带 `--to-folder <路径>` 重新运行脚本归档\n- 未匹配到 → 自动在桌面新建标准案卷（10 个子目录）：法院送达文书/我方提交/对方提交/原始材料/工作文本/委托签署/邮件记录/法规检索/庭审笔录/保全资料\n- 法院文书（传票/判决书/裁定书等）归入\"01 法院送达文书\"子目录（新建时自动归入；匹配到已有案卷时经律师确认后归入）\n\n### ⭐ v2.1.0（2026-07-09）— 代码审查与安全加固\n\n基于第一性原理+对抗性审查，对全部 6 个核心脚本做了一次系统级排查，修复以下问题：\n\n**提醒时机修正**\n- 开庭提醒的\"本机电脑提醒\"（弹通知 + 桌面 Markdown）从\"创建日历事件时触发\"改为\"目标提醒时间（开庭前 1 天）才触发\"。\n- 新增 `hearing_notify()` 函数：launchd 到点自动调用，弹系统通知 + 在桌面生成 `开庭提醒_YYYY-MM-DD_HHMM.md`（含时间/案号/地点/材料清单）。\n- 创建日历时仅写入日历事件 + 调度提醒任务，不弹窗、不生成文件。\n\n**代码清理（P0）**\n- 删除 `court_appeal_reminder.py`：已被 `court_deadline_reminder.py` 全覆盖且带硬编码路径（换机必炸）、缺少桌面 Markdown 提醒。\n- `TO_EMAIL` 默认值统一为 `YOUR_QQ_EMAIL@qq.com`（修正两处占位符 `YOUR_QQ_EMAIL@qq.com`）。\n\n**安全加固（P1）**\n- **AppleScript 注入**：`court_deadline_reminder.py` 的 `send_system_notification` 补齐双引号转义（`replace('\"', '\\\\\"')`），与 `court_calendar.py` 的 `_macos_pop_notification` 行为一致。\n- **plist XML 注入**：三处 launchd plist 生成函数（`_macos_schedule_notification`、`_macos_schedule_email_script`、`_macos_schedule`）对所有动态数据（case_no/case_type/location/label）增加 `xml.sax.saxutils.escape()` 转义，防止 `&` 等特殊字符导致 plist 解析静默失败。\n- **死代码清理**：`_macos_unload_reminder` 的 `suffix.replace('-email', '-email')` 恒等变换 → 写死字面量。\n\n### ⭐ v2.2.0（2026-07-13）— 隐私脱敏与代理方识别\n\n**安全脱敏**\n- 全部文件中的 QQ 邮箱硬编码替换为 `YOUR_QQ_EMAIL@qq.com` 占位符（SKILL.md、Python 脚本、报告模板等共 16 处）\n- `config/case-root.json` 中本地路径替换为占位符 `/Users/你的用户名/项目/02-律师业务`\n- `archive/` 目录发布前清空规则：保留目录结构和 `.gitkeep`，删除所有真实案件 JSON 数据\n- `_meta.json` 中 `ownerId` 替换为占位符\n- 脱敏审查清单新增第 11 项：运行时数据目录发布前清空\n\n**代理方识别（P1 新增功能）**\n- 新增 `config/case-parties.json`：首次接触案件时自动询问律师代理哪一方（原告/被告）\n- 非法院文书智能归类（第 14 步）加入代理方感知：已知代理方时自动区分「02 我方提交资料」与「03 对方提交资料」\n- 支持手动补充：`更新代理方 <案号> <原告/被告>`\n\n### ⭐ v2.2.1（2026-07-13）— 保全裁定处理强化\n\n**问题**：(2026)苏0281民初9011号保全裁定书下载后未触发期限规则匹配，导致：①未提取保全金额/方式/到期日等具体信息；②未创建任何日历提醒；③未计算保全到期日。\n\n**修复**：\n- **新增「保全裁定强制处理」节点**（第四步第9项 `deadline-rules.json` 匹配之后）：当文书为裁定书 + 含保全关键字时，强制走完整流程——提取详情 → 算到期 → 逐条创建全部提醒 → 汇总确认时间线\n- **明确禁止部分提醒**：规则里 `reminders` 数组有几个条目就必须全建。以冻结银行存款为例：30天 + 14天 + 7天，一条不能少。到期日当天额外追加一条兜底事件\n- 到期日计算公式纳入 SKILL.md 正文（不必每次查《民事保全须知》原文）\n\n### ⭐ v2.2.2（2026-07-13）— 对抗性审查修复\n\n**P0 修复：**\n- **保全到期日当天新增提醒**：`deadline-rules.json` 中 `preservation_freeze` 和 `preservation_seal` 规则各追加一条 `before_days=0` (critical) 提醒。此前只提醒 30/14/7 天前，到期日当天无通知无邮件，仅靠日历事件兜底\n- **裁定书强制保全检测**：SKILL.md 第四步 point 8（基础文书解析）新增「裁定书」子类——正文含「冻结」「查封」「扣押」关键字时，必须强制执行 point 9 期限匹配，禁止以任何理由跳过\n\n**P1 修复：**\n- **AppleScript 注入防护**：`court_deadline_reminder.py` 的 `_macos_create_calendar` 函数对 `summary` 和 `location` 字段增加 `replace('\"', '\\\\\"')` 转义，防止案由含双引号导致 AppleScript 解析失败（此前仅 `description` 被转义）\n\n### ⭐ v2.2.3（2026-07-13）— macOS 不再生成 .ics 冗余文件\n\n- `court_deadline_reminder.py`：移除 macOS 上强制生成桌面 `.ics` 备份文件的逻辑。macOS 已通过 AppleScript 直接写入 Apple Calendar，`.ics` 是冗余文件；仅在 Apple Calendar 写入失败时降级生成 `.ics`（与 Windows/Linux 行为一致）\n\nFile v2.2.3:_meta.json\n\n{\n  \"ownerId\": \"kn7ak8kq701dd4kpk6qgm4gek984aspp\",\n  \"slug\": \"litigation-hub\",\n  \"version\": \"2.2.3\",\n  \"publishedAt\": 1783949731085\n}\n\nFile v2.2.3:references/archive-format.md\n\n# 内部归档格式\n\n每次处理一条短信后，在 `archive/` 下创建一条 JSON 记录，不保存文书本身（文书归档到案件目录）。\n\n## 文件路径\n\n`archive/YYYYMMDD_HHMMSS_{案号后4位}.json`\n\n## JSON 结构\n\n```json\n{\n  \"id\": \"20260404_143025_1234\",\n  \"timestamp\": \"2026-04-04T14:30:25+08:00\",\n  \"sms_raw\": \"【xx市人民法院】张三，您好！您有（2025）苏0981民初1234号案件文书送达，请点击链接查收：https://zxfw.court.gov.cn/...\",\n  \"parsed\": {\n    \"type\": \"document_delivery\",\n    \"case_number\": \"（2025）苏0981民初1234号\",\n    \"parties\": [\"张三\", \"xx有限公司\"],\n    \"court\": \"xx市人民法院\"\n  },\n  \"download\": {\n    \"source_url\": \"https://zxfw.court.gov.cn/zxfw/#/pagesAjkj/app/wssd/index?qdbh=XX&sdbh=XX&sdsin=XX\",\n    \"params\": { \"qdbh\": \"XX\", \"sdbh\": \"XX\", \"sdsin\": \"XX\" },\n    \"method\": \"curl\",\n    \"status\": \"success\",\n    \"document_title\": \"受理通知书\",\n    \"api_response\": {\n      \"c_fymc\": \"苏州工业园区人民法院\",\n      \"c_fybh\": \"1275\",\n      \"dt_cjsj\": \"2026-03-18T07:44:00.000+00:00\",\n      \"documents\": [\n        {\n          \"c_wsmc\": \"传票（东沙湖法庭）\",\n          \"c_wsbh\": \"ecb8fe64e4834804b50ea0f9257327e0\",\n          \"dt_cjsj\": \"2026-03-18T07:44:00.000+00:00\"\n        }\n      ]\n    }\n  },\n  \"document\": {\n    \"type\": \"一审判决书\",\n    \"sent_at\": \"2026-04-08T10:00:00+08:00\",\n    \"received_at\": \"2026-04-08T14:30:00+08:00\",\n    \"appeal_deadline\": \"2026-04-23T23:59:59+08:00\",\n    \"appeal_days_remaining\": 15\n  },\n  \"archive\": {\n    \"matched_case\": \"260101 张三与李四合同纠纷\",\n    \"target_path\": \"260101 张三与李四合同纠纷/受理通知书（张三与李四合同纠纷）_20260404收.pdf\",\n    \"summary\": \"传票：2025年4月15日 14:30 第3法庭开庭\"\n  }\n}\n```\n\n## 字段说明\n\n| 字段 | 必需 | 说明 |\n|------|------|------|\n| `id` | 是 | 归档唯一标识，即文件名（不含扩展名） |\n| `timestamp` | 是 | ISO 8601 格式的处理时间 |\n| `sms_raw` | 是 | 短信原文，完整保留 |\n| `parsed.type` | 是 | 短信类型：`document_delivery` / `filing_notification` / `info_notification` |\n| `parsed.case_number` | 否 | 提取到的案号，未提取到时为 `null` |\n| `parsed.parties` | 否 | 提取到的当事人列表 |\n| `parsed.court` | 否 | 提取到的法院名称 |\n| `parsed.sent_at` | 否 | 法院发送时间，从短信或送达平台提取 |\n| `parsed.received_at` | 否 | 用户收到时间（如有） |\n| `download.source_url` | 否 | 原始下载链接 |\n| `download.params` | 否 | 从 URL 提取的参数（如 qdbh/sdbh/sdsin） |\n| `download.method` | 否 | 实际使用的下载方式：`curl` / `cli` / `mcp` / `manual` / `null`（无下载链接） |\n| `download.status` | 是 | 下载状态：`success` / `failed` / `manual` / `skipped` |\n| `download.api_response` | 否 | API 完整响应，包含 c_fymc（法院名称）、c_fybh（法院编号）、dt_cjsj（送达时间）、documents 数组（每份文书详情） |\n| `download.api_response.c_fymc` | 否 | 法院名称（来自 API） |\n| `download.api_response.c_fybh` | 否 | 法院编号 |\n| `download.api_response.dt_cjsj` | 否 | 送达记录创建时间（ISO 8601），作为 sent_at 来源 |\n| `download.api_response.documents[].c_wsmc` | 否 | 文书名称 |\n| `download.api_response.documents[].c_wsbh` | 否 | 文书编号（UUID） |\n| `download.api_response.documents[].dt_cjsj` | 否 | 单份文书的送达时间 |\n| `document.type` | 否 | 文书类型：判决书/裁定书/调解书等（从 PDF 解析） |\n| `document.sent_at` | 否 | 法院发送时间（送达平台记录） |\n| `document.received_at` | 否 | 用户收到时间（手机短信网关时间） |\n| `document.appeal_deadline` | 否 | 上诉截止日期（根据案件类型计算） |\n| `document.appeal_days_remaining` | 否 | 剩余上诉天数 |\n| `archive.matched_case` | 否 | 匹配到的案件目录名 |\n| `archive.target_path` | 否 | 文书最终归档的相对路径 |\n\nFile v2.2.3:references/ATTRIBUTION.md\n\n# 归属声明与致谢\n\n## 参考项目\n\n本技能（court-sms）在开发过程中，使用 AI 参考了以下开源项目的思路和规则：\n\n### FachuanHybridSystem（法穿AI案件管理系统）\n\n- **项目地址**：https://github.com/Lawyer-ray/FachuanHybridSystem\n- **许可证**：PolyForm Noncommercial License 1.0.0 (附特别许可)\n- **版权所有**：(C) 2025-2099 法穿\n\n### 具体参考内容\n\n本技能参考了 FachuanHybridSystem 中以下模块的**设计思路和解析规则**（非直接复制代码）：\n\n1. **短信解析服务** (`backend/apps/automation/services/sms/sms_parser_service.py`)\n   - 短信类型分类逻辑（文书送达 / 信息通知 / 立案通知）\n   - zxfw.court.gov.cn 下载链接正则匹配规则\n   - 同构异域名正则更新（从硬编码域名改为通用主机匹配，通过 URL 路径特征识别平台）\n   - 案号提取正则模式\n   - 当事人名称提取策略（公司名模式、对峙模式、角色前缀模式）\n   - 当事人排除关键词列表\n   - 司法送达网（SFDW）链接正则和验证码提取规则\n\n2. **案件匹配算法** (`backend/apps/automation/services/sms/case_matcher.py`)\n   - 三级匹配策略的设计思路（案号精确 → 当事人双向 → 特征筛选）\n\n3. **文书重命名逻辑** (`backend/apps/automation/services/sms/document_renamer.py`)\n   - 已知文书标题映射表\n   - 文件命名格式：`{title}（{case_name}）_{YYYYMMDD}收.pdf`\n\n4. **zxfw 下载策略** (`backend/apps/automation/services/scraper/scrapers/court_document/zxfw_scraper.py`)\n   - 多级下载回退策略的架构设计\n   - API 拦截与页面操作结合的思路\n\n5. **司法送达网下载策略** (`backend/apps/automation/services/scraper/scrapers/court_document/sfdw_scraper.py`)\n   - 纯 Playwright 下载流程（TDHCryptoUtil 加密导致无法使用 HTTP API）\n   - 验证码双模式策略：手机尾号后6位优先 + 短信验证码回退\n   - Vue app.checkYzm() → wsList → downloadFile() 页面交互流程\n\n### 实现差异\n\n本技能并未直接复制 FachuanHybridSystem 的代码，而是将其核心逻辑重新实现为 AI 技能格式：\n\n- **原项目**：Python / Django 服务，使用 Ollama LLM + ddddocr + Playwright\n- **本技能**：AI Agent Skill，利用自然语言理解能力 + Playwright MCP\n- **无代码复用**：所有解析逻辑由 AI 自然语言理解完成，配置规则以 JSON 参考\n\n### 致谢\n\n感谢法穿团队开源的法律科技实践成果，为社区提供了宝贵的设计参考。\n\nFile v2.2.3:references/china-holidays.json\n\n{\n  \"_description\": \"中国法定节假日数据。由国务院办公厅每年公布，通过 gov.cn 官方源自动获取。\",\n  \"_updated\": \"2026-07-08\",\n  \"_source\": \"https://www.gov.cn/zhengce/content/202511/content_7047090.htm\",\n  \"_auto_update\": \"每年1月1日后首次调用时，自动从 gov.cn 检索当年最新数据更新本文件。\",\n\n  \"2026\": {\n    \"holidays\": {\n      \"元旦\": {\n        \"dates\": [\"2026-01-01\", \"2026-01-02\", \"2026-01-03\"],\n        \"days_off\": 3\n      },\n      \"春节\": {\n        \"dates\": [\"2026-02-15\", \"2026-02-16\", \"2026-02-17\", \"2026-02-18\", \"2026-02-19\", \"2026-02-20\", \"2026-02-21\", \"2026-02-22\", \"2026-02-23\"],\n        \"days_off\": 9\n      },\n      \"清明节\": {\n        \"dates\": [\"2026-04-04\", \"2026-04-05\", \"2026-04-06\"],\n        \"days_off\": 3\n      },\n      \"劳动节\": {\n        \"dates\": [\"2026-05-01\", \"2026-05-02\", \"2026-05-03\", \"2026-05-04\", \"2026-05-05\"],\n        \"days_off\": 5\n      },\n      \"端午节\": {\n        \"dates\": [\"2026-06-19\", \"2026-06-20\", \"2026-06-21\"],\n        \"days_off\": 3\n      },\n      \"中秋节\": {\n        \"dates\": [\"2026-09-25\", \"2026-09-26\", \"2026-09-27\"],\n        \"days_off\": 3\n      },\n      \"国庆节\": {\n        \"dates\": [\"2026-10-01\", \"2026-10-02\", \"2026-10-03\", \"2026-10-04\", \"2026-10-05\", \"2026-10-06\", \"2026-10-07\"],\n        \"days_off\": 7\n      }\n    },\n    \"makeup_workdays\": [\n      \"2026-01-04\", \"2026-02-14\", \"2026-02-28\",\n      \"2026-05-09\", \"2026-09-20\", \"2026-10-10\"\n    ]\n  }\n}\n\nFile v2.2.3:references/deadline-rules.json\n\n{\n  \"_description\": \"法院文书期限规则库。当 court-sms 识别到文书类型时，自动查表生成对应的日历 + 系统通知 + QQ 邮件提醒。\",\n  \"_usage\": \"由 court_deadline_reminder.py 在文书归档完成后自动读取、匹配、设置提醒。\",\n  \"_extend\": \"新增文书类型在此 JSON 中追加条目即可，无需改代码。\",\n\n  \"rules\": [\n    {\n      \"id\": \"appeal_civil_judgment\",\n      \"match\": { \"document_type\": \"判决书\", \"tags\": [\"民事\", \"行政\"] },\n      \"deadline\": { \"value\": 15, \"unit\": \"日\", \"description\": \"提起上诉\" },\n      \"reminders\": [\n        { \"before_days\": 2, \"level\": \"warning\", \"label\": \"上诉期限还剩2天\" },\n        { \"before_days\": 0, \"level\": \"critical\", \"label\": \"上诉期限今天截止\" }\n      ],\n      \"calendar\": { \"title\": \"⏰ 上诉截止：{case_type}\", \"all_day\": true }\n    },\n    {\n      \"id\": \"appeal_criminal_judgment\",\n      \"match\": { \"document_type\": \"判决书\", \"tags\": [\"刑事\"] },\n      \"deadline\": { \"value\": 10, \"unit\": \"日\", \"description\": \"提起上诉（刑事）\" },\n      \"reminders\": [\n        { \"before_days\": 2, \"level\": \"warning\", \"label\": \"上诉期限还剩2天\" },\n        { \"before_days\": 0, \"level\": \"critical\", \"label\": \"上诉期限今天截止\" }\n      ],\n      \"calendar\": { \"title\": \"⏰ 上诉截止：{case_type}\", \"all_day\": true }\n    },\n    {\n      \"id\": \"appeal_civil_ruling\",\n      \"match\": { \"document_type\": \"裁定书\", \"tags\": [\"民事\", \"行政\"] },\n      \"deadline\": { \"value\": 10, \"unit\": \"日\", \"description\": \"对裁定提起上诉\" },\n      \"reminders\": [\n        { \"before_days\": 2, \"level\": \"warning\", \"label\": \"上诉期限还剩2天\" },\n        { \"before_days\": 0, \"level\": \"critical\", \"label\": \"上诉期限今天截止\" }\n      ],\n      \"calendar\": { \"title\": \"⏰ 上诉截止：{case_type}\", \"all_day\": true }\n    },\n    {\n      \"id\": \"appeal_criminal_ruling\",\n      \"match\": { \"document_type\": \"裁定书\", \"tags\": [\"刑事\"] },\n      \"deadline\": { \"value\": 5, \"unit\": \"日\", \"description\": \"对裁定提起上诉（刑事）\" },\n      \"reminders\": [\n        { \"before_days\": 2, \"level\": \"warning\", \"label\": \"上诉期限还剩2天\" },\n        { \"before_days\": 0, \"level\": \"critical\", \"label\": \"上诉期限今天截止\" }\n      ],\n      \"calendar\": { \"title\": \"⏰ 上诉截止：{case_type}\", \"all_day\": true }\n    },\n    {\n      \"id\": \"preservation_freeze\",\n      \"match\": { \"document_type\": \"裁定书\", \"tags\": [\"冻结\", \"银行存款\"] },\n      \"deadline\": { \"value\": 365, \"unit\": \"日\", \"description\": \"冻结期满，需申请续冻\" },\n      \"reminders\": [\n        { \"before_days\": 30, \"level\": \"critical\", \"label\": \"⛔ 银行存款冻结将到期！请立即申请续冻！\" },\n        { \"before_days\": 14, \"level\": \"warning\", \"label\": \"银行存款冻结将在14天后到期\" },\n        { \"before_days\": 7, \"level\": \"warning\", \"label\": \"银行存款冻结将在7天后到期\" },\n        { \"before_days\": 0, \"level\": \"critical\", \"label\": \"⛔⛔ 银行存款冻结今日到期！如未续冻，冻结效力消灭！\" }\n      ],\n      \"calendar\": { \"title\": \"⛔ 续冻截止：{case_type}\", \"all_day\": true },\n      \"note\": \"保全类必须提前处理，不可等到最后一天！建议在收到裁定后立即在日历中标注。\"\n    },\n    {\n      \"id\": \"preservation_seal\",\n      \"match\": { \"document_type\": \"裁定书\", \"tags\": [\"查封\", \"不动产\"] },\n      \"deadline\": { \"value\": 1095, \"unit\": \"日\", \"description\": \"查封期满，需申请续封\" },\n      \"reminders\": [\n        { \"before_days\": 30, \"level\": \"critical\", \"label\": \"⛔ 不动产查封将到期！请立即申请续封！\" },\n        { \"before_days\": 14, \"level\": \"warning\", \"label\": \"不动产查封将在14天后到期\" },\n        { \"before_days\": 7, \"level\": \"warning\", \"label\": \"不动产查封将在7天后到期\" },\n        { \"before_days\": 0, \"level\": \"critical\", \"label\": \"⛔⛔ 不动产查封今日到期！如未续封，查封效力消灭！\" }\n      ],\n      \"calendar\": { \"title\": \"⛔ 续封截止：{case_type}\", \"all_day\": true },\n      \"note\": \"查封续期必须提前30天申请，到期待处理将导致查封失效！\"\n    },\n    {\n      \"id\": \"evidence_deadline\",\n      \"match\": { \"document_type\": \"举证通知书\" },\n      \"deadline\": { \"value\": 15, \"unit\": \"日\", \"description\": \"举证期限届满\" },\n      \"reminders\": [\n        { \"before_days\": 5, \"level\": \"warning\", \"label\": \"举证期限还剩5天\" },\n        { \"before_days\": 1, \"level\": \"critical\", \"label\": \"举证期限仅剩1天！\" }\n      ],\n      \"calendar\": { \"title\": \"📝 举证截止：{case_type}\", \"all_day\": true }\n    },\n    {\n      \"id\": \"defense_deadline\",\n      \"match\": { \"document_type\": \"起诉状\" },\n      \"deadline\": { \"value\": 15, \"unit\": \"日\", \"description\": \"提交答辩状\" },\n      \"reminders\": [\n        { \"before_days\": 3, \"level\": \"warning\", \"label\": \"答辩期限还剩3天\" },\n        { \"before_days\": 0, \"level\": \"critical\", \"label\": \"答辩期限今天截止！\" }\n      ],\n      \"calendar\": { \"title\": \"📬 答辩截止：{case_type}\", \"all_day\": true }\n    },\n    {\n      \"id\": \"enforcement_deadline\",\n      \"match\": { \"document_type\": \"生效法律文书\", \"tags\": [\"判决书\", \"裁定书\", \"调解书\"] },\n      \"deadline\": { \"value\": 730, \"unit\": \"日\", \"description\": \"申请强制执行\" },\n      \"reminders\": [\n        { \"before_days\": 30, \"level\": \"critical\", \"label\": \"⚠️ 强制执行申请期限还剩30天\" },\n        { \"before_days\": 7, \"level\": \"critical\", \"label\": \"⚠️ 强制执行申请期限仅剩7天！\" }\n      ],\n      \"calendar\": { \"title\": \"⚡ 执行申请截止：{case_type}\", \"all_day\": true }\n    },\n    {\n      \"id\": \"retrial_deadline\",\n      \"match\": { \"document_type\": \"判决书\", \"tags\": [\"生效\", \"再审\"] },\n      \"deadline\": { \"value\": 180, \"unit\": \"日\", \"description\": \"申请再审\" },\n      \"reminders\": [\n        { \"before_days\": 30, \"level\": \"warning\", \"label\": \"再审申请期限还剩30天\" },\n        { \"before_days\": 7, \"level\": \"critical\", \"label\": \"再审申请期限仅剩7天！\" }\n      ],\n      \"calendar\": { \"title\": \"🔄 再审申请截止：{case_type}\", \"all_day\": true }\n    },\n    {\n      \"id\": \"jurisdiction_appeal\",\n      \"match\": { \"document_type\": \"裁定书\", \"tags\": [\"管辖权异议\"] },\n      \"deadline\": { \"value\": 10, \"unit\": \"日\", \"description\": \"对管辖权异议裁定上诉\" },\n      \"reminders\": [\n        { \"before_days\": 2, \"level\": \"warning\", \"label\": \"管辖权异议上诉期限还剩2天\" },\n        { \"before_days\": 0, \"level\": \"critical\", \"label\": \"管辖权异议上诉期限今天截止！\" }\n      ],\n      \"calendar\": { \"title\": \"🏛️ 管辖权异议上诉截止\", \"all_day\": true }\n    },\n    {\n      \"id\": \"fee_payment\",\n      \"match\": { \"document_type\": \"受理通知书\" },\n      \"deadline\": { \"value\": 7, \"unit\": \"日\", \"description\": \"缴纳诉讼费\" },\n      \"reminders\": [\n        { \"before_days\": 3, \"level\": \"warning\", \"label\": \"诉讼费缴纳还剩3天\" },\n        { \"before_days\": 1, \"level\": \"critical\", \"label\": \"⚠️ 诉讼费缴纳仅剩1天！逾期按撤诉处理！\" }\n      ],\n      \"calendar\": { \"title\": \"📋 缴纳诉讼费截止\", \"all_day\": true }\n    }\n  ],\n\n  \"matching_logic\": {\n    \"description\": \"匹配优先级：按 rules 数组顺序逐条匹配，首次命中即停止。document_type 必须完全匹配，tags 中任一关键词在文书标题或正文中出现即视为匹配。\",\n    \"example\": \"文书标题='民事裁定书（冻结）' → document_type='裁定书' + tags['民事','冻结'] → 命中 preservation_freeze\"\n  }\n}\n\nFile v2.2.3:references/report-format.md\n\n# 归档汇报格式\n\n## 汇报结构\n\n汇报分五部分，按顺序输出：\n\n1. **归档完成** — 确认信息\n2. **文书清单** — 所有已归档文件\n3. **特别注意** — 仅当包含传票时显示开庭信息\n4. **上诉期限** — 仅当文书类型为一审判决书且能计算上诉期限时显示\n5. **开庭日历提醒** — 仅当文书为传票/出庭通知/应诉通知书且日历创建成功时显示\n\n---\n\n## 模板\n\n```text\n✅ 文书归档完成：\n- 案号：（2025）苏0981民初1234号\n- 法院：xx市人民法院\n- 当事人：原告 xx有限公司 / 被告 张三\n- 案由：合同纠纷\n- 文件数：N 份\n- 归档位置：{案件目录}/\n\n文书清单：\n  1. 传票（东沙湖法庭）                     传票\n  2. 应诉通知书                             通知书\n  3. 起诉状                                 起诉状\n  4. 证据1：xxx                              证据\n  ...\n\n⚠️ 已收到传票，请注意：\n  - 开庭时间：2025年4月15日（周二）14:30\n  - 开庭地点：xx市人民法院 第3法庭\n  - 审理程序：简易程序\n\n⏰ 上诉期限提醒：\n  - 文书类型：一审判决书\n  - 送达时间：2026年4月8日\n  - 上诉截止：2026年4月23日（剩余15天）\n\n📅 开庭日历提醒：\n  - ⚖️ 开庭：民间借贷纠纷\n  - 🕙 2026年5月7日（周四）09:30\n  - 📍 xx市人民法院 第3法庭\n  - ⏰ 已设置提前1天通知提醒\n  - 📧 已设置提前1天 QQ 邮件通知（YOUR_QQ_EMAIL@qq.com）\n```\n\n---\n\n## 各部分规则\n\n### 1. 归档完成\n\n必填字段：\n\n| 字段 | 来源 |\n|------|------|\n| 案号 | 短信解析 或 文书提取 |\n| 法院 | 短信解析 或 API 返回 `c_fymc` |\n| 当事人 | 文书提取（起诉状/传票），非短信接收人 |\n| 案由 | 文书提取（起诉状/传票） |\n| 文件数 | 实际归档数量 |\n| 归档位置 | 相对路径 |\n\n> **当事人提取优先级**：文书内容 > API 返回 > 短信文本。短信中的姓名（如\"xx，您好\"）仅为接收人，不作为案件当事人。\n\n### 2. 文书清单\n\n列出所有已归档文件，每行格式：\n\n```text\n{序号}. {文书名}                    {类型标签}\n```\n\n类型标签来自 `sms-patterns.json` → `document_titles` 映射，未匹配的标注为\"其他\"。\n\n### 3. 特别注意（仅传票）\n\n触发条件：文书清单中包含标题含\"传票\"的文件。\n\n从传票 PDF 首页文本提取以下字段（正则匹配）：\n\n| 字段 | 提取方式 |\n|------|----------|\n| 开庭时间 | 匹配 `应到时间` 附近的日期时间 |\n| 开庭地点 | 匹配 `应到处所` 附近的文本 |\n| 审理程序 | 从应诉通知书中匹配\"小额诉讼/简易程序/普通程序\" |\n\n**日期格式化**：原始日期（如 `2026年05月07日 09:30`）应追加星期几，方便用户快速判断是否为工作日。\n\n**提醒语气**：使用 ⚠️ 标记，加粗关键日期时间，确保用户不会遗漏。\n\n### 4. 上诉期限（仅判决书/裁定书）\n\n触发条件：文书清单中包含\"判决书\"或\"裁定书\"且能提取到送达时间。\n\n**上诉期限计算规则**：\n\n| 案件类型 | 上诉期限 |\n|---------|---------|\n| 民事一审判决 | 送达后15天 |\n| 民事裁定 | 送达后10天 |\n| 行政判决 | 送达后15天 |\n| 刑事判决 | 送达后10天 |\n| 刑事裁定 | 送达后5天 |\n\n**日期格式化**：展示为 `X月X日` 格式，追加星期几。\n\n**剩余天数计算**：`截止日期 - 当前日期`\n\n### 5. 开庭日历提醒\n\n触发条件：文书为传票 / 出庭通知 / 应诉通知书，且 PDF 成功提取到开庭时间。\n\n同时完成三项：\n- Apple Calendar \"工作\" 日历事件\n- launchd 提前1天系统通知\n- QQ 邮件提前1天发送（YOUR_QQ_EMAIL@qq.com）\n\n**字段说明**：\n\n| 字段 | 来源 |\n|------|------|\n| 案由 | PDF 解析 `parse_hearing_info_from_pdf()` |\n| 开庭时间 | PDF 解析，格式化后追加星期几 |\n| 地点 | PDF 解析 |\n| 提醒状态 | 创建成功/失败 |\n\n**输出条件**：\n- 仅当日历事件创建成功时输出，失败时只打印错误不体现在汇报中\n- 已在第三部分展示开庭信息的传票，这里不再重复开庭详情\n\n---\n\n## 归档失败时的汇报\n\n```text\n⚠️ 文书归档部分完成：\n- 案号：（2025）苏0981民初1234号\n- 法院：xx市人民法院\n- 成功：N 份\n- 失败：N 份\n\n失败的文书：\n  - xxx.pdf（原因：下载超时）\n\n请手动访问以下链接下载失败文书：\n{原始链接}\n```\n\nFile v2.2.3:references/sms-patterns.json\n\n{\n  \"download_link_patterns\": [\n    {\n      \"domain\": \"zxfw.court.gov.cn\",\n      \"canonical_domain\": \"zxfw.court.gov.cn\",\n      \"description\": \"全国法院统一送达平台（最常见）\",\n      \"pattern\": \"https?://[^\\\\s/]+/zxfw/#/pagesAjkj/app/wssd/index\\\\?[^\\\\s]*\",\n      \"required_params\": [\"qdbh\", \"sdbh\", \"sdsin\"],\n      \"param_extract\": \"从 URL query string 中提取 qdbh、sdbh、sdsin 三个参数值\",\n      \"download_strategy\": \"api_first\",\n      \"api\": {\n        \"endpoint\": \"https://zxfw.court.gov.cn/yzw/yzw-zxfw-sdfw/api/v1/sdfw/getWsListBySdbhNew\",\n        \"method\": \"POST\",\n        \"content_type\": \"application/json\",\n        \"request_body\": { \"qdbh\": \"{全局编号}\", \"sdbh\": \"{送达编号}\", \"sdsin\": \"{送达签名}\" },\n        \"response_fields\": {\n          \"court_name\": \"data[].c_fymc\",\n          \"court_id\": \"data[].c_fybh\",\n          \"document_name\": \"data[].c_wsmc\",\n          \"document_id\": \"data[].c_wsbh\",\n          \"download_url\": \"data[].wjlj\",\n          \"file_format\": \"data[].c_wjgs\",\n          \"create_time\": \"data[].dt_cjsj\"\n        },\n        \"download_method\": \"curl -sL -o \\\"{filename}\\\" \\\"{wjlj}\\\"\",\n        \"notes\": \"OSS 签名 URL 有过期时间（约1小时），获取后应尽快下载。无需浏览器，直接 curl 即可。dt_cjsj 为送达记录创建时间，可作为 sent_at 使用。\"\n      }\n    },\n    {\n      \"domain\": \"sd.gdems.com\",\n      \"canonical_domain\": \"sd.gdems.com\",\n      \"description\": \"广东法院电子送达平台（限广东地区）\",\n      \"pattern\": \"https?://[^\\\\s/]+/v3/dzsd/[a-zA-Z0-9]+\",\n      \"required_params\": [],\n      \"param_extract\": \"从 URL 路径末尾提取送达标识码\",\n      \"download_strategy\": \"browser_only\",\n      \"api\": null,\n      \"notes\": \"无公开 API，需通过浏览器打开页面后手动或 Playwright 自动化下载。页面可能需要输入验证码或手机号验证。\"\n    },\n    {\n      \"domain\": \"jysd.10102368.com\",\n      \"canonical_domain\": \"jysd.10102368.com\",\n      \"description\": \"集约送达平台（邮政集约送达服务）\",\n      \"pattern\": \"https?://[^\\\\s/]+/sd\\\\?key=[a-zA-Z0-9_\\\\-]+\",\n      \"required_params\": [\"key\"],\n      \"param_extract\": \"从 URL query string 中提取 key 参数值\",\n      \"download_strategy\": \"browser_only\",\n      \"api\": null,\n      \"notes\": \"无公开 API，需通过浏览器打开页面后下载。部分链接可能需要短信验证码验证身份。\"\n    },\n    {\n      \"domain\": \"dzsd.hbfy.gov.cn\",\n      \"canonical_domain\": \"dzsd.hbfy.gov.cn\",\n      \"description\": \"湖北电子送达平台（限湖北地区法院）\",\n      \"pattern\": \"https?://[^\\\\s/]+/(?:hb/msg=[a-zA-Z0-9]+|sfsddz\\\\b)\",\n      \"required_params\": [],\n      \"param_extract\": \"免账号模式：从 URL 路径提取 msg 参数值；账号模式：从短信正文提取账号和默认密码\",\n      \"download_strategy\": \"browser_only\",\n      \"api\": {\n        \"public_mode\": {\n          \"endpoint\": \"http://dzsd.hbfy.gov.cn/delimobile/tDeliSms/findSmsInfo\",\n          \"method\": \"POST\",\n          \"content_type\": \"application/json\",\n          \"request_body\": { \"msg\": \"{msg参数值}\", \"code\": \"{验证码（如需）}\", \"uuid\": \"{验证码UUID（如需）}\" },\n          \"response_fields\": {\n            \"need_captcha\": \"data.isNeedCaptcha\",\n            \"doc_list\": \"data.docList\",\n            \"doc_name\": \"data.docList[].docName\",\n            \"download_path\": \"data.docList[].downloadPath\",\n            \"pdf_path\": \"data.docList[].pdfPath\"\n          },\n          \"captcha_endpoint\": \"http://dzsd.hbfy.gov.cn/delimobile/loginCaptcha\",\n          \"notes\": \"免账号模式有 HTTP API，但可能需要验证码（OCR）。验证码获取：POST loginCaptcha，返回 data.uuid + data.img（base64）。\"\n        },\n        \"account_mode\": {\n          \"credential_patterns\": {\n            \"account\": \"账号\\\\s*([0-9]{15,20})\",\n            \"password\": \"默认密码[：:]\\\\s*([0-9A-Za-z]+)\"\n          },\n          \"notes\": \"账号模式需从短信正文提取账号和默认密码，登录需要验证码 OCR，建议使用 Playwright MCP 浏览器自动化。\"\n        }\n      },\n      \"notes\": \"湖北电子送达平台支持两种模式：1）免账号模式（短信含 /hb/msg= 链接）可直接通过 HTTP API 查询文书；2）账号模式（短信含 /sfsddz 入口）需登录后下载。两种模式都可能需要验证码。建议优先尝试免账号 HTTP API，失败后降级到 Playwright MCP。\"\n    },\n    {\n      \"domain\": \"sfpt.cdfy12368.gov.cn\",\n      \"alias_domains\": [\"171.106.48.55:28083\"],\n      \"description\": \"司法送达网（全国法院司法送达平台）\",\n      \"pattern\": \"https?://[^\\\\s/]+/sfsdw//r/[a-zA-Z0-9]+\",\n      \"required_params\": [],\n      \"param_extract\": \"从短信正文提取验证码（验证码[：:]\\\\s*(\\\\w{4,6})），或使用案件关联律师手机号后6位作为验证码。无 URL 参数。\",\n      \"download_strategy\": \"browser_only\",\n      \"api\": null,\n      \"verification\": {\n        \"modes\": [\n          {\n            \"type\": \"phone_tail\",\n            \"description\": \"手机尾号后6位验证（优先）\",\n            \"source\": \"从案件分配信息中获取律师手机号，取后6位\"\n          },\n          {\n            \"type\": \"sms_code\",\n            \"pattern\": \"验证码[：:]\\\\s*(\\\\w{4,6})\",\n            \"description\": \"从短信正文中提取验证码\"\n          }\n        ]\n      },\n      \"browser_flow\": {\n        \"description\": \"纯 Playwright 流程（无 API 可用，所有 POST 请求经 TDHCryptoUtil 加密）\",\n        \"steps\": [\n          \"browser_navigate → 打开短信中的 SFDW 链接\",\n          \"页面自动重定向到 pc.html?tdhParams=xxx\",\n          \"browser_snapshot → 查看验证码输入页面（input#checkCode）\",\n          \"输入验证码（优先手机尾号后6位，其次短信验证码）\",\n          \"browser_evaluate → 调用 Vue app.checkYzm() 触发验证\",\n          \"验证通过后 browser_evaluate → 获取 app.$data.wsList（文书列表）\",\n          \"遍历 wsList，逐个调用 downloadFile(app, ws) 下载文书\",\n          \"保存到 /tmp/court-sms-staging/\"\n        ]\n      },\n      \"notes\": \"司法送达网所有 POST 请求使用 TDHCryptoUtil 加密，无法通过 HTTP API 下载，只能使用纯 Playwright 流程。广西实例（171.106.48.55:28083）路由到同一平台，下载流程相同。wsList 每项包含 wjmc（文件名）、wjgs（格式）、sdjzwjid（文件ID）。\"\n    }\n  ],\n  \"case_number_pattern\": \"[（(〔\\\\[]\\\\d{4}[）)\\\\]〕]\\\\s*[\\\\u4e00-\\\\u9fa5]{1,10}\\\\d+[\\\\u4e00-\\\\u9fa5]{1,5}\\\\d+号?\",\n  \"case_number_examples\": [\n    \"（2025）苏0981民初1234号\",\n    \"(2024)粤0604执保5678号\",\n    \"〔2025〕京0105民初901号\"\n  ],\n  \"sms_type_keywords\": {\n    \"document_delivery\": [\"文书送达\", \"请查收\", \"查收文书\", \"下载文书\", \"送达文书\", \"案件文书\", \"受理通知书\", \"缴费通知书\", \"告知书\", \"廉政监督卡\"],\n    \"filing_notification\": [\"已立案\", \"立案通知\", \"受理案件\", \"案件受理\"],\n    \"info_notification\": [\"开庭时间\", \"延期\", \"取消\", \"变更\", \"提醒\"]\n  },\n  \"document_titles\": {\n    \"受理案件通知书\": \"受理案件通知书\",\n    \"应诉通知书\": \"应诉通知书\",\n    \"传票\": \"传票\",\n    \"开庭传票\": \"传票\",\n    \"举证通知书\": \"举证通知书\",\n    \"判决书\": \"判决书\",\n    \"民事判决书\": \"一审判决书\",\n    \"裁定书\": \"裁定书\",\n    \"调解书\": \"调解书\",\n    \"执行通知书\": \"执行通知书\",\n    \"诉讼权利义务告知书\": \"诉讼权利义务告知书\",\n    \"诉讼费用交费通知书\": \"诉讼费用交费通知书\",\n    \"廉政监督卡\": \"廉政监督卡\",\n    \"诉讼材料提交告知书\": \"诉讼材料提交告知书\",\n    \"出庭通知书\": \"出庭通知书\",\n    \"合议庭组成人员通知书\": \"合议庭组成人员通知书\",\n    \"举证期限通知书\": \"举证期限通知书\",\n    \"转换程序通知书\": \"转换程序通知书\",\n    \"参加诉讼通知书\": \"参加诉讼通知书\"\n  },\n  \"sent_time_extraction\": {\n    \"_doc\": \"送达时间提取规则，用于计算上诉期限等关键日期\",\n    \"api_field\": \"dt_cjsj\",\n    \"api_field_description\": \"送达平台 API 响应中的创建时间字段，即送达记录创建时间（北京时间）\",\n    \"patterns\": [\n      {\n        \"type\": \"sms_gateway\",\n        \"description\": \"短信网关时间（部分手机短信显示）\",\n        \"regex\": \"(?:发送|时间)[：:]?\\\\s*(\\\\d{4}[-/年]\\\\d{1,2}[-/月]\\\\d{1,2}[日]?\\\\s+\\\\d{1,2}[时:]?\\\\d{0,2})\",\n        \"format\": \"yyyy-MM-dd HH:mm\"\n      }\n    ]\n  },\n  \"appeal_calculation\": {\n    \"_doc\": \"上诉期限计算规则，不同案件类型上诉期限不同\",\n    \"first_instance_civil_judgment\": {\n      \"deadline_days\": 15,\n      \"description\": \"民事一审判决：送达后15天\",\n      \"document_types\": [\"一审判决书\", \"民事判决书\", \"判决书\"]\n    },\n    \"first_instance_civil_ruling\": {\n      \"deadline_days\": 10,\n      \"description\": \"民事裁定：送达后10天\",\n      \"document_types\": [\"裁定书\"]\n    },\n    \"first_instance_administrative\": {\n      \"deadline_days\": 15,\n      \"description\": \"行政判决：送达后15天\",\n      \"document_types\": [\"行政判决书\"]\n    },\n    \"first_instance_criminal_judgment\": {\n      \"deadline_days\": 10,\n      \"description\": \"刑事判决：送达后10天\",\n      \"document_types\": [\"刑事判决书\"]\n    },\n    \"first_instance_criminal_ruling\": {\n      \"deadline_days\": 5,\n      \"description\": \"刑事裁定：送达后5天\",\n      \"document_types\": [\"刑事裁定书\"]\n    }\n  },\n  \"party_extraction\": {\n    \"company_patterns\": [\n      \"[\\\\u4e00-\\\\u9fa5]{2,30}(?:有限责任公司|股份有限公司)\",\n      \"[\\\\u4e00-\\\\u9fa5]{2,20}有限公司\",\n      \"[\\\\u4e00-\\\\u9fa5]{2,20}(?:集团|企业)\"\n    ],\n    \"versus_patterns\": [\n      \"{company}与{company}\",\n      \"{company}与{person}\",\n      \"{person}与{company}\",\n      \"{person}与{person}\",\n      \"{person}诉{person}\",\n      \"{person}诉{company}\"\n    ],\n    \"role_prefixes\": [\"原告\", \"被告\", \"申请人\", \"被申请人\", \"上诉人\", \"被上诉人\", \"申请执行人\", \"被执行人\", \"第三人\"],\n    \"exclude_keywords\": [\n      \"法院\", \"人民法院\", \"书记员\", \"法官\", \"审判员\", \"执行员\",\n      \"系统\", \"平台\", \"服务\", \"通知\", \"短信\", \"案件\", \"纠纷\", \"争议\",\n      \"你好\", \"收到\", \"查收\", \"下载\", \"链接\", \"请于\", \"联系\"\n    ]\n  },\n  \"rename_fallback\": {\n    \"_doc\": \"当文书标题无法识别时的回退策略\",\n    \"strategy\": \"use_original_filename\",\n    \"description\": \"优先使用下载时的原始文件名（去除扩展名），而非默认为'未知文书'\",\n    \"fallback_title\": \"未知文书\"\n  },\n  \"file_naming\": {\n    \"format\": \"{title}（{case_name}）_{YYYYMMDD}收.pdf\",\n    \"example\": \"受理通知书（张三与李四合同纠纷）_20260404收.pdf\",\n    \"target_directory\": null,\n    \"conflict_suffix\": \"_2\"\n  },\n  \"post_processing\": {\n    \"_doc\": \"PDF 后处理：检测拆分文件并合并 + 精简文件名。不默认启用，仅在检测到拆分时提示用户。合并偏好见 user-preferences.json。\",\n    \"trigger\": {\n      \"description\": \"扫描归档目录中的 PDF 文件名，按文书类型分组。任一组文件数 > 3 时触发提示。\",\n      \"group_rules\": [\n        \"证据类：文件名以'证据'开头，按编号分组（证据1、证据2、证据3…）\",\n        \"其他文书：按文书类型分组（传票、起诉状、应诉通知书…）\"\n      ],\n      \"threshold\": 3\n    },\n    \"preferences_file\": \"config/user-preferences.json\",\n    \"preferences_example\": \"config/user-preferences.example.json\",\n    \"default_merge_strategy\": \"per_evidence\",\n    \"user_prompt\": {\n      \"description\": \"检测到拆分文件时，使用 AskUserQuestion 提示用户\",\n      \"options\": [\n        \"是，合并所有 — 按偏好设置合并并重命名\",\n        \"让我选择 — 逐个确认哪些需要合并\",\n        \"跳过 — 不处理\"\n      ]\n    }\n  }\n}\n\nFile v2.2.3:CHANGELOG.md\n\n# 变更日志\n\n本项目的所有重要变更都将记录在此文件。\n\n## [2.2.3] - 2026-07-13\n\n### 修复\n- macOS 不再生成桌面 `.ics` 备份文件（Apple Calendar 已原生写入，`.ics` 是冗余文件）\n\n## [1.5.0] - 2026-04-15\n\n### 新增\n\n- **司法送达网平台支持**：新增 `sfpt.cdfy12368.gov.cn`（司法送达网）的链接识别和文书下载\n  - 纯 Playwright 下载流程：所有 POST 请求使用 TDHCryptoUtil 加密，无法通过 HTTP API 下载\n  - 验证码双模式：优先手机尾号后6位（从案件分配中获取律师手机号），其次从短信正文提取验证码（`验证码[：:]\\s*(\\w{4,6})`）\n  - 广西实例支持：`171.106.48.55:28083` 域名路由到同一 SFDW 平台\n  - `sms-patterns.json` 新增 sfdw 平台配置段（含 verification、browser_flow 字段）\n- **同构异域名支持**：所有平台链接正则从硬编码域名改为通用主机匹配（`[^\\s/]+`），通过 URL 路径特征识别平台而非域名\n  - zxfw: `https?://[^\\s/]+/zxfw/#/pagesAjkj/app/wssd/index?...`\n  - gdems: `https?://[^\\s/]+/v3/dzsd/[a-zA-Z0-9]+`\n  - jysd: `https?://[^\\s/]+/sd?key=[a-zA-Z0-9_\\-]+`\n  - hbfy: `https?://[^\\s/]+/(?:hb/msg=[a-zA-Z0-9]+|sfsddz\\b)`\n  - 新增 `canonical_domain` 字段保留已知主域名用于 API 调用\n- **平台支持扩展至 5 个**：全国法院统一送达（zxfw）、广东电子送达（gdems）、集约送达（jysd）、湖北电子送达（hbfy）、司法送达网（sfdw）\n- SKILL.md 新增 SFDW 下载流程说明（纯 Playwright + 验证码双模式 + 广西实例）\n- SKILL.md 新增 SFDW 短信格式示例\n\n### 改进\n\n- **文书重命名回退**：当文书标题无法识别时，优先使用原始文件名（去除扩展名），而非直接默认为\"未知文书\"\n- `sms-patterns.json` 新增 `rename_fallback` 顶层配置段\n\n### 引用\n\n- 上游参考：[FachuanHybridSystem][fachuan-repo] → `sfdw_scraper.py`（司法送达网纯 Playwright 下载逻辑）、`sms_parser_service.py`（同构异域名正则更新）、`jysd_scraper.py`（手机号验证策略参考）\n\n## [1.4.0] - 2026-04-10\n\n### 新增\n\n- **湖北电子送达平台支持**：新增 `dzsd.hbfy.gov.cn`（湖北法院）的链接识别和文书下载\n  - 免账号模式：识别 `/hb/msg=xxx` 链接，支持 HTTP API 直连下载（`POST /delimobile/tDeliSms/findSmsInfo`），需验证码时降级到浏览器\n  - 账号模式：识别 `/sfsddz` 入口链接，从短信正文提取账号（`账号\\s*(\\d{15,20})`）和默认密码（`默认密码[：:]\\s*([0-9A-Za-z]+)`）\n  - 新增 `sms-patterns.json` 中的 hbfy 平台配置段（含免账号/账号两种模式的 API 信息和凭证提取正则）\n- **平台支持扩展至 4 个**：全国法院统一送达（zxfw）、广东电子送达（gdems）、集约送达（jysd）、湖北电子送达（hbfy）\n- SKILL.md 新增湖北平台下载流程说明（免账号 HTTP API + 账号模式浏览器自动化）\n- SKILL.md 新增湖北短信格式示例（免账号模式和账号模式两种）\n\n### 引用\n\n- 上游参考：[FachuanHybridSystem][fachuan-repo] → `sms_parser_service.py`（短信解析新增 hbfy 正则）、`hbfy_scraper.py`（湖北平台完整下载逻辑）\n\n[fachuan-repo]: https://github.com/Lawyer-ray/FachuanHybridSystem\n\n### 新增\n\n- **送达时间检测（P0）**：从 zxfw API 响应的 `dt_cjsj` 字段提取送达记录创建时间，作为 sent_at 使用，无需从 PDF 解析\n- **上诉期限自动计算（P1）**：识别判决书/裁定书时，根据送达时间自动计算上诉截止日期\n  - 民事一审判决：送达后15天\n  - 民事裁定：送达后10天\n  - 行政判决：送达后15天\n  - 刑事判决：送达后10日\n  - 刑事裁定：送达后5日\n- **归档 JSON 新增字段**：`document.type`、`document.sent_at`、`document.appeal_deadline`、`document.appeal_days_remaining`\n- **归档 JSON 完整保存 API 响应**：将 zxfw API 的完整响应（c_fymc、c_fybh、dt_cjsj、documents 数组）存入 `download.api_response`\n- **汇报格式新增**：上诉期限展示区块（第四部分），格式为 `⏰ 上诉期限提醒`\n- **sms-patterns.json 新增**：`sent_time_extraction`（送达时间提取规则）、`appeal_calculation`（上诉期限计算规则）\n\n### 引用\n\n对应 GitHub Issue：https://github.com/cat-xierluo/legal-skills/issues/10\n\n## [1.2.1] - 2026-04-05\n\n### 新增\n\n- 两种合并策略可切换：`per_evidence`（按编号分别合并，默认）和 `unified`（统一合并为原告证据.pdf + PDF 书签）\n- 页面尺寸标准化：合并 PDF 时自动将所有页面统一为 A4，保持原始方向（纵向→A4 纵向，横向→A4 横向），等比缩放居中放置\n- PDF 书签：unified 策略下自动添加书签，格式为「证据N：标题」，支持点击跳转\n- 重命名规则：精简文件名，去除括号内当事人信息、日期后缀、平台标记等冗余内容\n\n## [1.2.0] - 2026-04-05\n\n### 新增\n\n- PDF 后处理功能（第五步，可选）：归档完成后自动检测拆分文件，提示用户是否合并 + 重命名\n- 触发条件：扫描归档目录，按文书类型分组，任一组文件数 > 3 时弹出提示\n- 用户偏好系统：新增 `config/user-preferences.json`（含 `config/user-preferences.example.json` 模板），支持自定义合并策略和重命名规则\n- 偏好文件按项目约定放入 `config/` 目录（`.example` 入 git，实际配置被 gitignore 忽略），与技能仓库规范保持一致\n- `references/sms-patterns.json` 新增 `post_processing` 配置段（触发阈值、偏好文件路径指向 `config/`）\n- 用户确认交互：AskUserQuestion 三选一（合并所有 / 逐个选择 / 跳过）\n\n## [1.1.2] - 2026-04-05\n\n### 新增\n\n- 归档汇报格式拆分到 `references/report-format.md`：三段式结构（归档确认 → 文书清单 → 传票特别提醒），SKILL.md 只保留引用\n- 当事人提取优先级明确：文书内容（起诉状/传票）> API 返回 > 短信文本；短信中的称呼仅为接收人，不作为当事人\n\n### 改进\n\n- 归档目录策略：未找到匹配案件时自动在桌面新建 `{原告}诉{被告} {案由}/`（内含 10 个标准子目录），不询问用户`（早期版本策略已废弃，以 SKILL.md 核心逻辑为准）`\n- 传票提醒在汇报末尾以 ⚠️ 高亮，包含开庭时间（追加星期几）、地点、审理程序\n\n## [1.1.1] - 2026-04-05\n\n### 改进\n\n- 基础文书解析：下载后提取 PDF 首页文本，快速识别传票（开庭时间/地点）、通知书（缴费期限）、起诉状（案由/当事人）等关键信息并告知用户\n- 归档格式拆分到 `references/archive-format.md`，SKILL.md 只保留引用\n- 收紧功能描述至实际范围：移除案件信息更新、复杂案件匹配、日程提醒等未实现功能\n- frontmatter description 去除 Playwright 硆名实现细节\n- CHANGELOG 措辞修正：去除\"AI 自然语言理解\"和\"替代正则解析\"的说法，正则规则仍在 `sms-patterns.json` 中配合使用\n- 新增 Playwright 安装指引（CLI 和 MCP 两种方式）\n- 短信类型分类表简化，仅保留展示解析结果\n\n## [1.1.0] - 2026-04-04\n\n### 改进\n\n- 下载策略改为三层回退：curl API 直连（优先）→ Playwright CLI → Playwright MCP\n- 实测确认 zxfw 后端 API（`getWsListBySdbhNew`）可无头调用，无需浏览器即可下载全部文书\n- 将 API 端点、请求格式、响应字段写入 `references/sms-patterns.json`，后续同类型短信直接走 curl\n- 去除 SKILL.md 中\"执行者\"写法，保持 agent 无关性\n- frontmatter 规范化：description 改为第三人称，新增 license 字段（MIT），去除关键词堆砌\n- 触发方式从独立章节合并到功能概述，用示例替代关键词列表\n- 归档机制从 Markdown 改为结构化 JSON（`archive/YYYYMMDD_HHMMSS_{案号后4位}.json`），记录短信原文、解析结果、下载参数、归档路径\n- 目录结构规范化：`config/sms-patterns.json` 移入 `references/`，新增 `archive/.gitkeep`\n- 补充 CHANGELOG 1.0.0 的设计缘由和思路演进\n- 新增 LICENSE.txt（MIT）\n\n### 新增\n\n- 多平台送达链接支持：除 zxfw 外，新增 `sd.gdems.com`（广东电子送达）和 `jysd.10102368.com`（集约送达）的链接识别\n- 平台分级下载策略：zxfw 走 curl API 直连，gdems/jysd 无公开 API，直接回退到浏览器自动化\n- `sms-patterns.json` 新增 `download_strategy` 字段，区分 `api_first`（有 API）和 `browser_only`（需浏览器）\n- 基础文书解析：下载后提取 PDF 首页文本，快速识别传票（开庭时间/地点）、通知书（缴费期限）、起诉状（案由/当事人）等关键信息\n- 归档格式拆分到 `references/archive-format.md`，SKILL.md 只保留引用\n- 收紧功能描述至实际范围：移除案件信息更新、复杂案件匹配等未实现功能\n\n## [1.0.0] - 2026-04-04\n\n### 设计缘由\n\n- 律师日常频繁收到法院送达短信（传票、通知书等），需要手动从全国法院送达平台下载文书并归档到案件目录\n- 手动操作流程繁琐：复制链接 → 打开网页 → 下载 PDF → 重命名 → 移入目录 → 更新案件记录\n- 参考 FachuanHybridSystem 的短信解析设计思路，将其核心逻辑转化为 Skill 格式，结合 agent 的自然语言理解能力与结构化正则规则（`references/sms-patterns.json`）进行短信解析\n\n### 思路演进\n\n1. 调研阶段：发现 FachuanHybridSystem 已实现短信解析 → 下载 → 归档的完整流水线\n2. 适配阶段：将 Python/Django 服务架构映射为 Skill 工作流（agent 自然语言理解 + 结构化规则），无需部署额外服务\n3. 当前阶段：以 JSON 配置参考文件替代硬编码规则，保持技能的可维护性和可扩展性\n\n### 新增\n\n- 法院短信智能分类（文书送达 / 信息通知 / 立案通知）\n- 案号自动提取，支持多种标准格式（圆括号、方括号、六角括号）\n- 当事人名称提取（公司名、诉讼对峙模式、角色前缀）\n- 从 zxfw.court.gov.cn 链接中提取下载参数（qdbh、sdbh、sdsin）\n- 三级案件匹配策略（案号精确 → 当事人双向 → 特征筛选）\n- Playwright 两级回退下载（API 拦截 → 页面点击）\n- 文书自动重命名并归档到案件目录\n- 短信原文归档到 archive/\n- 解析规则可配置化（`references/sms-patterns.json`）\n\n### 致谢\n\n本技能参考了 [FachuanHybridSystem（法穿）](https://github.com/Lawyer-ray/FachuanHybridSystem) 中短信解析模块的设计思路和解析规则（非直接复制代码）。详见 [`references/ATTRIBUTION.md`](references/ATTRIBUTION.md)。\n\nFile v2.2.3:skill-card.md\n\n## Description:\n\nLitigation Hub helps agents process Chinese court delivery messages, court links, and document photos into OCR-assisted parsing, document download, case filing, deadline matching, calendar reminders, email notices, and local reminder files across macOS, Windows, and Linux.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[leahlu0124-creator](https://clawhub.ai/user/leahlu0124-creator)\n\n### License/Terms of Use:\n\nMIT\n\n## Use Case:\n\nExternal legal practitioners and their agents use this skill to triage court delivery SMS messages, court delivery URLs, and photographed court documents, then organize the resulting case materials and reminders. It is aimed at litigation document intake, filing, and deadline awareness rather than legal advice.\n\n### Deployment Geography for Use:\n\nChina\n\n## Known Risks and Mitigations:\n\nRisk: Confidential court data may pass through email, OCR, HTTP download, local archives, scheduled tasks, or generated desktop reminder files.\n\nMitigation: Review before installation, start with non-confidential test data, avoid plaintext HTTP court workflows where possible, and restrict or periodically clean local email, archive, scheduled-task, and reminder-file locations.\n\nRisk: OCR, browser automation, email sending, and dependency installation can expose documents or alter the local environment.\n\nMitigation: Require explicit approval before OCR, email, browser automation, or dependency installation, and pin and locally install dependencies before use.\n\nRisk: Court deadline and filing reminders may be incomplete or incorrect if source documents, OCR, or rules are wrong.\n\nMitigation: Treat generated reminders as workflow aids and have a legal professional verify case deadlines and filings before relying on them.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/leahlu0124-creator/skills/litigation-hub)\n- [Publisher profile](https://clawhub.ai/user/leahlu0124-creator)\n- [ClawHub metadata homepage](https://github.com/leahlu0124-creator/litigation-hub)\n- [Attribution](references/ATTRIBUTION.md)\n- [Archive format](references/archive-format.md)\n- [Report format](references/report-format.md)\n- [SMS patterns](references/sms-patterns.json)\n- [Deadline rules](references/deadline-rules.json)\n- [China holidays](references/china-holidays.json)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown and plain text guidance with shell commands and JSON configuration or archive records]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May create local case archive records, downloaded documents, calendar entries, email notices, scheduled reminders, and desktop reminder files depending on the selected workflow.]\n\n## Skill Version(s):\n\n2.2.3 (source: frontmatter and changelog, released 2026-07-13)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v2.2.3:config/case-parties.json\n\n{\n  \"cases\": {}\n}\n\nFile v2.2.3:config/case-root.json\n\n{\n  \"case_root\": \"/Users/你的用户名/项目/02-律师业务\",\n  \"configured_at\": \"2026-07-09 22:32\"\n}\n\nArchive v2.2.2: 21 files, 75598 bytes\n\nFiles: _meta.json (133b), CHANGELOG.md (10656b), config/case-parties.json (18b), config/case-root.json (106b), config/user-preferences.example.json (1439b), config/user-preferences.json (73b), LICENSE.txt (1206b), references/archive-format.md (4028b), references/ATTRIBUTION.md (2555b), references/china-holidays.json (1472b), references/deadline-rules.json (7649b), references/report-format.md (4519b), references/sms-patterns.json (12068b), scripts/court_calendar.py (29062b), scripts/court_deadline_reminder.py (20742b), scripts/court_photo_ocr.py (26459b), scripts/court_utils.py (8053b), scripts/holiday_utils.py (4336b), scripts/send_court_email.py (3304b), skill-card.md (3209b), SKILL.md (56885b)\n\nFile v2.2.2:SKILL.md\n\n---\nname: litigation-hub\nhomepage: https://github.com/leahlu0124-creator/litigation-hub\nauthor: 陆凌燕\noriginal_author: 杨卫薪律师\nversion: 2.2.2\nlicense: MIT\ndescription: 诉讼信息中枢系统。接收法院短信、送达链接、纸质文书照片，自动 OCR 识别、下载、归档、归类到标准案卷目录。基于 12 种期限规则库自动匹配，通过系统日历 + QQ 邮件（微信送达）+ 本机电脑提醒（系统通知 + 桌面 Markdown 文件）三条线提醒，支持 macOS / Windows / Linux 全平台。\nslug: litigation-hub\ndisplayName: litigation-hub\n---\n\n# litigation-hub · 诉讼信息中枢系统\n\n## 功能概述\n\n处理法院文书的完整流程：**粘贴短信 / 发链接 / 上传照片 → 解析内容（OCR 或文本）→ 匹配案件 → 下载/归档文书 → 开庭日历提醒（传票自动写入系统日历 + 本机电脑提醒 + QQ 邮件（微信送达））**。\n\n## 首次使用：案卷目录设置（必须执行）\n\n**当用户第一次使用本技能时，必须先确认案卷存放目录。**\n\n> ⚠️ 如果没有事先确认目录，后续搜遍整台电脑都找不到案卷，效率极低。这一步一劳永逸。\n\n### 判断是否首次使用\n\n检查是否已有缓存的案卷目录记录：\n\n1. 先读取 `config/case-root.json`，检查 `case_root` 字段是否为有效路径\n2. 如果文件不存在或 `case_root` 为空 → **首次使用**，执行下方交互流程\n3. 如果 `case_root` 已配置且路径存在 → 跳过，直接进入正式工作流\n\n### 首次使用交互流程\n\n**询问格式**：\n\n```\n您好！我是诉讼中枢系统。在开始处理法院文书之前，我需要确认一件事：\n\n您平时把案卷资料存在哪个文件夹？\n\n常见的例子供参考：\n  · macOS   → /Users/你的名字/项目/律师业务/案件/\n  · Windows → C:\\Users\\你的名字\\Documents\\律师业务\\案件\\\n  · Linux   → /home/你的名字/项目/律师业务/案件/\n\n💡 最简单的方式：打开你的案卷文件夹，把地址栏里的路径直接复制粘贴给我就行。\n  · macOS：在访达里选中文件夹 → 按 ⌘+⌥+C (Cmd+Option+C) → 路径就复制好了，直接粘贴过来\n        （或者：访达菜单 → 显示 → 显示路径栏，然后在底部路径栏上右键 → 拷贝路径）\n  · Windows：在资源管理器打开文件夹 → 点一下顶部地址栏 → 按住 Shift 右键空白处 → 选\"复制为路径\"（或直接 Ctrl+Shift+C）\n        （如果不行，就点地址栏后 Ctrl+C 复制）\n\n请把路径发给我：\n```\n\n**用户回复后**：\n\n1. 验证路径是否存在（`ls` / `dir`），如果不存在，创建之\n2. 将路径写入 `config/case-root.json`：\n   ```json\n   {\"case_root\": \"/Users/xxx/项目/02-律师业务\", \"configured_at\": \"YYYY-MM-DD HH:MM\"}\n   ```\n3. 显示确认信息：\n   ```\n   ✅ 已记录案卷目录：/Users/xxx/项目/02-律师业务\n   以后所有法院文书都会在这个目录下匹配和归档。\n   ```\n4. 随后继续执行正式工作流\n\n### 后续使用\n\n- 每次技能触发时，从 `config/case-root.json` 读取路径，**仅在该目录下搜索已有案卷**；\n- **新建案卷始终放在桌面**，与 `case_root` 无关。桌面上的新案卷用户一眼就能看到，整理后自行移入搜索目录即可。\n- 如果用户搬移了案卷目录，用户说\"更新案卷目录\"即可触发重新设置\n\n---\n\n支持三种触发方式：\n\n**方式一：粘贴短信原文**\n\n```text\n收到法院短信，内容如下：\n【xx市人民法院】张三，您好！您有（2025）苏0981民初1234号案件文书送达，请点击链接查收：https://zxfw.court.gov.cn/zxfw/#/pagesAjkj/app/wssd/index?qdbh=DEMO1&sdbh=DEMO2&sdsin=DEMO3\n```\n\n**方式二：直接发送送达链接**\n\n用户可能直接粘贴送达链接（非完整短信文本），此时跳过短信文本解析，直接从 URL 中提取 `qdbh`、`sdbh`、`sdsin` 参数，进入第三步下载流程。\n\n```text\nhttps://zxfw.court.gov.cn/zxfw/#/pagesAjkj/app/wssd/index?qdbh=xxx&sdbh=xxx&sdsin=xxx\n```\n\n**方式三：上传纸质文书照片 / 扫描件**\n\n适用于刑事律师收到纸质传票、判决书、通知书的场景。上传照片（PNG/JPG），MinerU OCR 字符级精度提取文字，再解析为结构化字段。\n\n```text\n上传：传票照片.jpg\n→ MinerU OCR（flash-extract）→ 解析 → 复核 → 归档 + 日历提醒\n```\n\n> 依赖 `mineru-open-api`（`npm install -g mineru-open-api`），首次使用自动安装，用户无感知。\n\n## 短信类型分类\n\n| 类型 | 特征 | 含下载链接 | 处理方式 |\n| --- | --- | --- | --- |\n| 文书送达 | 含送达平台链接 + 案号 | 是 | 下载文书并归档到案件目录 |\n| 立案通知 | 含\"已立案\"等关键词 | 可能有 | 展示解析结果 |\n| 信息通知 | 无链接，纯信息 | 否 | 展示解析结果 |\n\n**支持的送达平台**：`zxfw.court.gov.cn`（全国）、`sd.gdems.com`（广东）、`jysd.10102368.com`（集约送达）、`dzsd.hbfy.gov.cn`（湖北）、`sfpt.cdfy12368.gov.cn`（司法送达网）。同一平台可能使用不同域名（同构异域名），通过 URL 路径特征识别平台。详见 `references/sms-patterns.json`。\n\n---\n\n## 工作流（四步）\n\n### 第一步：输入解析\n\n1. 读取 `references/sms-patterns.json` 作为解析参考\n2. **判断输入类型**：\n   - **完整短信**：包含法院签名（如 `【xx法院】`）+ 正文 + 链接 → 完整解析流程\n   - **纯链接**：用户直接发送送达 URL（如 `https://zxfw.court.gov.cn/...?qdbh=xxx&sdbh=xxx&sdsin=xxx`）→ 跳过短信文本解析，直接从 URL 提取参数，进入第三步下载。案号、当事人等信息在下载文书后从文书内容中提取。\n3. 对用户粘贴的短信文本进行分析（纯链接输入跳过此步）：\n\n**a) 短信分类**：根据关键词判断类型\n- 文书送达：包含 zxfw.court.gov.cn 链接\n- 立案通知：包含\"已立案\"、\"立案通知\"等\n- 信息通知：其他\n\n**b) 案号提取**：使用正则 `[（(〔[]\\d{4}[）)〕]]` 匹配标准案号格式\n\n标准案号格式示例：\n- `（2025）苏0981民初1234号`\n- `(2024)粤0604执保5678号`\n- `〔2025〕京0105民初901号`\n\n**c) 当事人提取**：从短信文本初步识别，最终以文书内容为准\n- **注意**：短信中的称呼（如\"张三，您好\"）仅为短信接收人，不作为案件当事人\n- 公司名称：`xx有限责任公司`、`xx有限公司`、`xx股份有限公司`\n- 诉讼对峙：`A与B`、`A诉B`、`原告A 被告B`\n- 角色前缀：`原告：xxx`、`被告：xxx` 等\n- 下载文书后，以起诉状、传票中的当事人信息为准，覆盖短信阶段的初步判断\n\n**d) 下载链接提取**：识别短信中的送达平台链接并提取参数\n\n| 平台 | 域名 | 下载方式 | 提取参数 |\n|------|------|----------|----------|\n| 全国法院统一送达平台 | `zxfw.court.gov.cn` | curl API 直连 | qdbh, sdbh, sdsin |\n| 广东法院电子送达 | `sd.gdems.com` | 浏览器自动化 | 路径中的送达标识码 |\n| 集约送达平台 | `jysd.10102368.com` | 浏览器自动化 | key |\n| 湖北电子送达 | `dzsd.hbfy.gov.cn` | HTTP API（免账号）/ 浏览器自动化（账号模式） | 免账号：msg；账号模式：账号+密码从正文提取 |\n| 司法送达网 | `sfpt.cdfy12368.gov.cn` | 纯 Playwright（无 API） | 验证码（手机尾号后6位 / 短信验证码） |\n\n**e) 发送时间提取（P0）**：从送达平台 API 响应中提取发送时间，用于后续上诉期限计算\n- **优先来源**：zxfw API 响应中的 `dt_cjsj` 字段（送达记录创建时间，ISO 8601 格式）\n- 短信网关时间：部分手机短信会显示发送时间，匹配 `发送：YYYY-MM-DD HH:mm` 格式\n- 如果无法提取送达时间，展示\"送达时间待确认\"，不阻塞后续流程\n- 记录到归档 JSON 的 `document.sent_at` 字段\n\n> **排除列表**：法院名称、法官姓名、地名、法律术语等不应作为当事人提取。详见 `sms-patterns.json` → `party_extraction.exclude_keywords`。\n\n**输出格式**（向用户展示）：\n\n```text\n📋 短信解析结果：\n- 类型：文书送达\n- 案号：（2025）苏0981民初1234号\n- 当事人：张三、xx有限公司\n- 下载链接：已提取（zxfw.court.gov.cn）\n```\n\n#### 照片/扫描件输入（方式三）\n\n当用户上传的是**纸质文书照片**（传票、判决书、通知书等），而非短信或链接时：\n\n1. **MinerU OCR**：`scripts/court_photo_ocr.py` 调用 `mineru-open-api flash-extract` 提取文字\n   ```bash\n   python3 scripts/court_photo_ocr.py /path/to/传票照片.jpg\n   ```\n   > MinerU 基于 PaddleOCR，字符级精度。首次运行自动安装 `npm install -g mineru-open-api`，用户无感知。\n\n2. **结构化解析**：提取的文字经正则匹配得到案号、案由、当事人、开庭时间/地点等，附带置信度标记\n\n3. **后续流程**：识别到传票/出庭通知 → 跳过下载步骤 → 归档 + 日历提醒；识别到判决书 → 计算上诉期限\n4. **自动归纳**：OCR 完成后按优先级匹配已有案卷，**但「归入已有案卷」必须经过律师确认，绝不自动写入**：\n   - 🥇 **案号匹配**：桌面文件夹名含案号（如 `(2025)苏0411民初6206号`）\n   - 🥈 **当事人姓名匹配**：桌面文件夹名含原告/被告姓名（如 `何玉-诉讼材料`）\n   - 🥉 **新建案卷**：都没匹配到 → 在桌面自动创建 `{原告}诉{被告} {案由}/`（新建不污染既有案卷，故不询问），内含 **10 个标准子目录**\n   - ⚠️ **匹配到已有案卷 → 暂停并请求律师确认**：展示匹配到的文件夹路径、命中依据（案号/姓名）、以及「同名同姓」风险提示，由律师在对话中确认后再归档；未经确认绝不写入。确认后通过 `--to-folder <路径>` 重新运行脚本完成归档。\n\n   标准案卷目录结构（**新建案卷时用这些固定名称，不得自行编造**）：\n   ```\n   {原告}诉{被告} {案由}/\n   ├── 01 法院送达文书/     ← 传票、判决书、裁定书、通知书等所有法院来源材料\n   ├── 02 我方提交资料/     ← 我方向法院递交的材料\n   ├── 03 对方提交资料/     ← 对方通过法院送达的材料\n   ├── 04 案件原始材料/     ← 从当事人收到的原始材料\n   ├── 05 律师工作文本/     ← 法律意见、庭审提纲等\n   ├── 06 委托签署材料/     ← 委托合同、授权书等\n   ├── 07 邮件收寄记录/     ← 邮件往来记录\n   ├── 08 法规类案检索/     ← 法律法规、类案报告\n   ├── 09 法院庭审笔录/     ← 庭审、听证笔录\n   └── 10 案件保全资料/     ← 财产、证据保全文书\n   ```\n   - 法院文书（判决书/裁定书/传票/通知书等）归入 `01 法院送达文书/` 对应子目录（新建案卷时自动归入；匹配到已有案卷时，需律师确认后归入）\n   - 照片原文件和 OCR 识别文本均保存到案卷下对应文书类型子目录\n\n**输出格式**（向用户展示）：\n\n```text\n📷 照片识别结果：\n- 类型：传票\n- 案号：（2025）沪01刑初1234号\n- 当事人：被告人张三\n- 开庭时间：2026-05-07 09:30\n- 地点：上海市第一中级人民法院 第5法庭\n```\n\n> 如 OCR 结果不完整（手写批注、模糊、遮挡），提示用户手动补充关键字段。\n\n### 第二步：确定归档目录\n\n1. **扫描桌面**：识别目录结构，找到与短信案号或当事人匹配的案件目录\n2. **查找归档子目录**：在匹配到的案件目录下，查找法院文书相关的子目录（如 `01*`、`法院送达`、`court` 等）\n3. **匹配结果分两种情况**：\n   - **未找到匹配案件** → **自动在桌面新建** `{原告}诉{被告} {案由}/`（新建不污染既有案卷，故不询问用户），随后直接归档\n   - **找到匹配案件** → **不自动归档**，立即向律师展示：①匹配到的文件夹路径 ②命中依据（案号/姓名）③同名同姓误归风险提示，请律师确认后再归档。确认后带 `--to-folder <路径>` 重新运行脚本完成归档\n\n#### 确认代理方（首次接触案件时）\n\n> ⛔ **每个案件第一次处理时必须确认代理方，否则后续无法区分「我方提交资料」和「对方提交资料」。**\n\n当新建案卷或首次匹配到已有案卷时：\n\n1. **读取 `config/case-parties.json`**，检查该案号是否已记录代理方：\n   - 已记录 → 直接使用，无需重复询问\n   - 未记录 → 执行下方交互\n\n2. **向用户提问**（从解析结果中提取已知当事人）：\n   ```\n   ⚖️ 案件 (2025)苏0981民初1234号，原告：张三，被告：xx有限公司。\n   请问您是代理哪一方？\n     → 原告 张三（我方）\n     → 被告 xx有限公司（我方）\n     → 暂时不确定\n   ```\n\n3. **记录答案**：写入 `config/case-parties.json`：\n   ```json\n   {\n     \"cases\": {\n       \"（2025）苏0981民初1234号\": {\n         \"represented_party\": \"原告\",\n         \"party_name\": \"张三\",\n         \"configured_at\": \"2026-07-13\"\n       }\n     }\n   }\n   ```\n\n4. **影响后续分类**：\n   - 已知代理方 → 非法院文书归档时自动区分「02 我方提交资料」vs「03 对方提交资料」\n   - 选择\"暂时不确定\" → 暂不区分，后续可通过\"更新代理方 (2025)苏0981民初1234号 原告\"手动补充\n\n### 第三步：文书下载\n\n> **平台判断**：根据第一步识别的链接域名，选择下载策略。\n> - `zxfw.court.gov.cn` → 方案一（API 直连）→ 方案二 → 方案三\n> - `sd.gdems.com` 或 `jysd.10102368.com` → 跳过方案一，直接方案二 → 方案三\n> - `dzsd.hbfy.gov.cn` → 湖北专属流程（见下方）\n> - `sfpt.cdfy12368.gov.cn`（含广西实例 `171.106.48.55:28083`）→ SFDW 专属流程（见下方）\n> - 未知域名但 URL 路径匹配已知平台特征 → 按路径识别平台（同构异域名支持）\n> - 完全无法识别 → 提示用户提供链接信息\n>\n> **⛔ 降级铁律**：严格串行，禁止并行。当前方案成功即停止，绝不降级。禁止\"双保险\"并行尝试多个方案。\n\n#### 依赖\n\n| 依赖 | 用途 | 适用方案 | 安装方式 |\n|------|------|----------|----------|\n| `curl` | API 下载 | 方案一 | macOS/Linux 预装 |\n| `jq` | JSON 解析（可选） | 方案一 | `brew install jq` |\n| Playwright | 浏览器自动化 | 方案二/三 | 见下方 |\n\n**Playwright 安装指引**（仅方案二/三需要）：\n\n```bash\n# 方案二: Playwright CLI\nnpm install -g playwright\nnpx playwright install chromium\n\n# 方案三: Playwright MCP（需在 WorkBuddy 设置中配置）\n# 在 settings.json 的 mcpServers 中添加：\n# \"playwright\": { \"command\": \"npx\", \"args\": [\"@anthropic-ai/mcp-playwright\"] }\n```\n\n> **⛔ 大多数情况下不需要 Playwright**：zxfw 平台方案一直接 curl 调用 API，无需浏览器。仅 gdems/jysd 平台或**方案一失败后**才需要方案二/三。禁止在方案一执行期间同时打开浏览器。\n\n#### 方案一 — API 直连（优先）\n\n完全无头，无需浏览器。直接调用 zxfw 后端 API 获取文书下载链接，再用 curl 下载 PDF。\n\n**API 信息**：\n\n- 端点：`POST https://zxfw.court.gov.cn/yzw/yzw-zxfw-sdfw/api/v1/sdfw/getWsListBySdbhNew`\n- Content-Type：`application/json`\n- 请求体：`{ \"qdbh\": \"xxx\", \"sdbh\": \"xxx\", \"sdsin\": \"xxx\" }`（从短信 URL 提取）\n- 响应字段：`data[].c_wsmc`（文书名称）、`data[].wjlj`（OSS 签名下载链接）、`data[].c_fymc`（法院名称）\n- 无需认证、无需浏览器\n\n```bash\n# 1. 从短信 URL 提取参数（示例）\nqdbh=\"DEMO_qdbh_value\"\nsdbh=\"DEMO_sdbh_value\"\nsdsin=\"DEMO_sdsin_value\"\n\n# 2. 调用 API 获取文书列表\nmkdir -p /tmp/court-sms-staging/\nresp=$(curl -s -X POST \"https://zxfw.court.gov.cn/yzw/yzw-zxfw-sdfw/api/v1/sdfw/getWsListBySdbhNew\" \\\n  -H \"Content-Type: application/json\" \\\n  -d \"{\\\"qdbh\\\":\\\"$qdbh\\\",\\\"sdbh\\\":\\\"$sdbh\\\",\\\"sdsin\\\":\\\"$sdsin\\\"}\")\n\n# 3. 解析文书列表，逐个下载 PDF\necho \"$resp\" | jq -r '.data[] | \"\\(.c_wsmc)\\t\\(.wjlj)\"' | while IFS=$'\\t' read -r name url; do\n  curl -sL -o \"/tmp/court-sms-staging/${name}.pdf\" \"$url\"\ndone\n\n# 4. 验证下载结果\nls -lh /tmp/court-sms-staging/*.pdf\n```\n\n#### 方案二 — 无头浏览器（Playwright CLI）\n\n当方案一 API 不可用或链接过期时，用 Playwright CLI 无头模式打开页面，拦截网络请求获取下载链接。\n\n```bash\n# 需要先安装 playwright\nnpx playwright install chromium 2>/dev/null\n\n# 无头模式运行（脚本需自行编写，拦截 getWsListBySdbhNew API 响应）\nnode scripts/download_court_docs.mjs --url \"{短信链接}\" --output /tmp/court-sms-staging/\n```\n\n#### 方案三 — 交互式浏览器（Playwright MCP）\n\n当方案二不可用时（需要已配置 Playwright MCP）：\n\n```text\n1. browser_navigate → 打开短信中的 zxfw URL\n2. 等待页面加载\n3. browser_evaluate → 直接调用 fetch API 获取文书列表\n4. browser_run_code → 下载 PDF 文件到 /tmp/court-sms-staging/\n```\n\n如 API 调用未成功，改用页面交互：\n\n```text\n1. browser_snapshot → 查看当前页面结构\n2. 找到文书列表或 PDF 预览区域\n3. 定位下载按钮（可能在 iframe 内）\n4. browser_click → 点击下载\n5. 等待下载完成，保存到临时目录\n```\n\n#### 湖北平台下载流程（`dzsd.hbfy.gov.cn`）\n\n湖北电子送达平台有两种链路，根据 URL 格式自动选择：\n\n**链路一：免账号模式**（URL 含 `/hb/msg=xxx`）\n\n1. 从 URL 提取 `msg` 参数值\n2. 尝试 HTTP API 直连：\n\n```bash\nmsg=\"从URL提取的msg值\"\nmkdir -p /tmp/court-sms-staging/\n\n# 查询文书信息\nresp=$(curl -s -X POST \"http://dzsd.hbfy.gov.cn/delimobile/tDeliSms/findSmsInfo?t=$(date +%s%3N)\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Referer: http://dzsd.hbfy.gov.cn/deli-mobile-ui/\" \\\n  -d \"{\\\"msg\\\":\\\"$msg\\\"}\")\n\n# 检查是否需要验证码（data.isNeedCaptcha == \"Y\"）\n# 如需验证码或无可下载文书，降级到 Playwright MCP\n\n# 逐个下载文书\necho \"$resp\" | jq -r '.data.docList[] | \"\\(.docName)\\t\\(.downloadPath)\"' | while IFS=$'\\t' read -r name path; do\n  if [ -n \"$path\" ]; then\n    curl -sL -o \"/tmp/court-sms-staging/${name}.pdf\" \"http://dzsd.hbfy.gov.cn/delimobile${path}\"\n  fi\ndone\n```\n\n3. 如需验证码或 HTTP 失败，降级到 Playwright MCP（方案三）\n\n**链路二：账号模式**（URL 含 `/sfsddz`）\n\n1. 从短信正文提取凭证：\n   - 账号：匹配 `账号\\s*(\\d{15,20})`\n   - 默认密码：匹配 `默认密码[：:]\\s*([0-9A-Za-z]+)`\n2. 需要浏览器自动化（Playwright MCP），登录页包含验证码\n3. 登录后遍历待签收/已签收/已过期文书列表，逐个下载\n\n> **提示**：湖北平台两种模式都可能遇到验证码。免账号模式优先尝试 HTTP API，账号模式建议引导用户手动打开链接或使用 Playwright MCP。\n\n#### 司法送达网下载流程（SFDW - `sfpt.cdfy12368.gov.cn`）\n\n司法送达网所有 POST 请求使用 TDHCryptoUtil 加密，无法通过 HTTP API 下载，只能使用纯 Playwright 流程。\n\n**广西实例**：`171.106.48.55:28083` 域名下的链接路由到同一 SFDW 平台，下载流程相同。\n\n**验证码获取**（两种方式，按优先级尝试）：\n\n1. **手机尾号后6位**（优先）：从案件分配信息中获取律师手机号，取后6位作为验证码输入\n2. **短信验证码**：从短信正文中提取，匹配 `验证码[：:]\\s*(\\w{4,6})`\n\n**Playwright MCP 流程**：\n\n```text\n1. browser_navigate → 打开短信中的 SFDW 链接\n2. 等待页面自动重定向到 pc.html?tdhParams=xxx\n3. browser_snapshot → 查看验证码输入页面（input#checkCode）\n4. 输入验证码（优先手机尾号后6位，其次短信验证码）\n5. browser_evaluate → 调用 Vue app.checkYzm() 触发验证\n6. 验证通过后 browser_evaluate → 获取 app.$data.wsList（文书列表）\n7. 遍历 wsList，逐个调用 downloadFile(app, ws) 下载文书\n8. 保存到 /tmp/court-sms-staging/\n```\n\n> **提示**：如手机尾号验证失败，提示用户查看短信中的验证码并手动输入。wsList 每项包含 wjmc（文件名）、wjgs（格式）。\n\n#### 失败兜底\n\n当三级均失败时：\n\n```text\n⚠️ 自动下载失败，请手动访问以下链接下载：\n{原始链接}\n\n下载后请将文件放到对应案件目录中。\n\n我将为您创建待处理记录。\n```\n\n### 第四步：归档保存\n\n> ⚠️ **归档铁律：匹配到已有案卷必须经律师确认，绝不静默写入。** 同名同姓在中国极为普遍，错误归档会污染他人案卷，因此「找到即归档」是禁止行为。\n\n1. **确定目标目录**：\n   - 扫描桌面，匹配与案号或当事人相关的案件目录\n   - **未找到匹配案件** → **自动在桌面新建** `{原告}诉{被告} {案由}/`（安全，不询问），随后归档\n   - **找到匹配案件** → **暂停，请求律师确认**：展示文件夹路径、命中依据、同名同姓风险提示；律师确认后带 `--to-folder <路径>` 重新运行脚本，再归档到该目录\n   - 如目标目录不存在，自动创建\n2. **获取当前日期**：`date \"+%Y%m%d\"`\n3. **确定文书标题**：\n   - 优先使用 API 返回的标题\n   - 否则根据 `sms-patterns.json` 中的 `document_titles` 映射推断\n   - 最后回退到原始文件名（去除扩展名），如仍无法确定则使用 `未知文书`\n4. **构建文件名**：`{title}（{case_name}）_{YYYYMMDD}收.pdf`\n   - 示例：`受理通知书（张三与李四合同纠纷）_20260404收.pdf`\n   - 清理非法字符：`< > : \" | ? * \\ /`\n   - 如同名文件已存在，追加 `_2` 后缀\n\n### 核心规则：按送达批次打包（强制执行）\n\n> ⛔ **所有法院送达材料一律用日期子文件夹打包，不得直接散放在 `01 法院送达文书/` 根目录。**\n> 法院可能对同一案件分批发送不同文书，散放会导致批次混乱、无法区分送达时间。\n\n**哪怕是只有一份传票，也放进子文件夹里。**\n\n**文件夹命名规则**：`{命名文书}_{送达日期}送达/`\n\n- `送达日期` 取 API 响应中 `dt_cjsj` 的日期部分（如 `20260119`），或文书落款日期\n- `命名文书` 从本次送达的所有文书中选优先级最高的作为文件夹名\n\n**命名优先级**（所有文书地位并列，以下仅用于选文件夹名）：\n\n| 优先级 | 适用场景 | 文件夹名示例 |\n|--------|---------|------------|\n| 1 | 含判决书 | `一审法院判决书_20260318送达/` |\n| 2 | 含裁定书（不含判决书） | `一审法院裁定书_20260401送达/` |\n| 3 | 含传票（不含判决/裁定） | `传票_20260601送达/` |\n| 4 | 含受理案件通知书（不含以上） | `受理案件通知书_20260119送达/` |\n| 5 | 其他（举证通知、应诉通知等） | `举证通知书_20260520送达/` |\n\n**简单理解**：一堆文书里谁最\"重\"就用谁命名。传票比通知书\"重\"，判决书比传票\"重\"——仅此而已，跟文书本身的法律效力无关。 |\n\n**文件夹内文件保持 API 返回的原始文件名**，不重命名、不合并。\n\n**归档路径示例**：\n```\n海筑建设诉淮安瑞悦/01 法院送达文书/受理案件通知书_20260119送达/\n├── 受理案件通知书.pdf\n├── 交纳诉讼费用通知书.pdf\n├── 民事诉讼权利义务告知书.pdf\n└── ...\n\n孙东诉武进建工/01 法院送达文书/传票_20260601送达/\n└── 传票.pdf\n```\n\n5. **移入目标目录**：将子文件夹整体移入 `01 法院送达文书/`\n6. **写入内部记录**：保存本次处理的完整信息到**本技能目录下的 `archive/`**（即 `~/.workbuddy/skills/litigation-hub/archive/`）。格式详见 [`references/archive-format.md`](references/archive-format.md)\n7. **自动归纳到桌面案卷**（短信/链接方式同样适用）：\n   - 扫描桌面是否已有该案号的文件夹\n   - 没有 → 在桌面自动创建 `{原告}诉{被告} {案由}/`（如 `张荷玉诉耿平 被继承人债务清偿纠纷/`），再放入\n   - 有 → **不自动放入**：展示匹配结果 + 同名同姓风险提示，请律师确认；确认后带 `--to-folder <路径>` 重新运行脚本放入\n   - SMS 多文件按文件夹打包规则归纳（如 `一审法院判决书/` 子目录）\n8. **基础文书解析**：法院 PDF 通常带文字层，提取首页文本，快速识别文书类型和关键信息\n   - **传票**：提取开庭时间、地点、法庭、案号，向用户高亮提醒\n   - **通知书/告知书**：提取缴费期限、举证期限等关键日期\n   - **起诉状/答辩状**：提取案由、当事人、诉讼请求概要\n   - **判决书**：识别为一审判决书，记录文书类型，触发上诉期限计算（P1）\n   - **裁定书**：识别裁定类型。**⛔ 如正文含「冻结」「查封」「扣押」任一关键字，必须在后续步骤中强制执行 point 9（期限规则匹配），不得因开庭日期已过、案件状态待定等任何理由跳过。**\n   - **其他文书**：展示文书标题和法院名称\n   - 如一次下载多份文书，逐一解析，汇总为一份报告\n\n   > 深度分析（如判决书解读、合同审查）不在此技能范围内，请使用专用分析技能处理。\n\n9. **期限规则匹配（P0）**：当识别到任何有期限要求的文书时，自动查表 `references/deadline-rules.json` 匹配对应规则\n\n   规则库覆盖 **12 种文书类型**，包括：\n\n   | 分类 | 文书类型 | 期限 | 提醒策略 |\n   |------|---------|------|---------|\n   | 📄 上诉 | 民事/行政判决书 | 15日 | 2天前 + 截止当天 |\n   | 📄 上诉 | 刑事判决书 | 10日 | 2天前 + 截止当天 |\n   | 📑 上诉 | 民事/行政裁定书 | 10日 | 2天前 + 截止当天 |\n   | 📑 上诉 | 刑事裁定书 | 5日 | 2天前 + 截止当天 |\n| ❄️ 保全 | 冻结银行存款裁定 | 1年 | ⚠️ **提前30天** + 14天 + 7天 + **到期当天** |\n| 🏠 保全 | 查封不动产裁定 | 3年 | ⚠️ **提前30天** + 14天 + 7天 + **到期当天** |\n   | 📝 举证 | 举证通知书 | ≥15日 | 5天前 + 1天前 |\n   | 📬 答辩 | 起诉状副本 | 15日 | 3天前 + 截止当天 |\n   | ⚡ 执行 | 生效法律文书 | 2年 | 30天前 + 7天前 |\n   | 🔄 再审 | 生效判决/裁定 | 6个月 | 30天前 + 7天前 |\n   | 🏛️ 管辖 | 管辖权异议裁定 | 10日 | 2天前 + 截止当天 |\n   | 📋 缴费 | 受理通知书 | 7日 | 3天前 + 1天前 |\n\n   > **保全类必须提前处理**：冻结/查封的续期申请不能等到最后一两天，规则库已按 30天 提前提醒。\n   > 新增文书类型只需在 `deadline-rules.json` 的 `rules` 数组中追加一条 JSON 条目，无需改代码。\n\n   - **匹配逻辑**：根据文书类型 + 关键字标签（如\"冻结\"\"银行存款\"）精确匹配规则\n   - **提醒生成**：调用 `scripts/court_deadline_reminder.py` 统一设置 日历 + 本机电脑提醒（系统通知 + 桌面 Markdown 文件）+ QQ 邮件（微信送达）\n   - **⚠️ 提醒确认（P0 — 必须执行）**：在创建任何提醒之前，必须先展示提醒计划并等待用户确认\n     ```\n     📋 即将创建以下提醒：\n     案号: (2025)苏0411民初6206号\n     规则: 民事判决书 → 15日上诉期\n     \n     · 2026-07-13 09:00 — 上诉期限还剩2天 (日历+通知+邮件)\n     · 2026-07-15 09:00 — 上诉期限今天截止 (日历+通知+邮件)\n     \n     👉 回复「确认」创建提醒，或指出需要修改的项。\n     ```\n     - 用户确认前，不得调用任何提醒创建脚本\n     - 用户可以修改提醒时间（如改为提前 5 天）\n     - 用户可以添加自定义额外提醒\n   - **自动提醒设置**：识别到判决书/裁定书后，自动为上诉截止日期设置**三重提醒**：\n     - 📅 日历事件（macOS Apple Calendar / Windows Outlook / .ics 文件）\n    - 🖥️ 本机电脑提醒（系统通知弹窗 + 桌面 Markdown 提醒文件，每次提醒同步生成）\n    - 📧 QQ 邮件（微信送达）（每次提醒同步发送）\n     - 使用脚本：`python3 scripts/court_deadline_reminder.py setup '<案号>' '<案由>' '<文书类型>' '<标签>' '<送达日期>' '<法院>'`\n     - 规则库：`references/deadline-rules.json`（覆盖 12 种文书类型，新增类型只需加 JSON 条目）\n\n   - **🔴 保全裁定强制处理（P0 — 不可跳过）**：当文书类型为「裁定书」且内容包含保全关键字（冻结、查封、扣押）时，**无论其他因素如何（如开庭日期已过、案件状态待定等），都必须执行以下完整流程**：\n\n     1. **提取保全详情**：从裁定书正文中提取以下字段，逐项展示给用户确认：\n        - 保全金额（如\"145万元\"）\n        - 保全方式（冻结银行存款 / 查封不动产 / 扣押动产）\n        - 被申请人名称\n        - 裁定日期\n        - 审判员姓名\n\n     2. **计算到期日**：\n        | 保全方式 | 期限 | 依据 |\n        |---------|------|------|\n        | 冻结银行存款 | 1年（365日） | 《民事保全须知》第3条 |\n        | 查封、扣押动产 | 2年（730日） | 《民事保全须知》第3条 |\n        | 查封不动产、冻结其他财产权 | 3年（1095日） | 《民事保全须知》第3条 |\n        - 到期日 = 裁定日期 + 期限 - 1日\n\n     3. **创建全部提醒（逐条核对，不得遗漏）**：根据 `deadline-rules.json` 中匹配到的规则，**逐条创建所有 `reminders` 数组中的提醒**。以 `preservation_freeze`（冻结银行存款）为例：\n        ```\n        reminders: [\n          提前30天 (critical) → 日历 + 通知 + 邮件\n          提前14天 (warning)  → 日历 + 通知 + 邮件\n          提前7天  (warning)  → 日历 + 通知 + 邮件\n        ]\n        ```\n        - ⛔ **禁止部分创建**：规则里写了几个 `reminders`，就必须全部创建。不允许只创建30天和到期日、漏掉14天和7天。\n        - 到期日当天额外创建一条「🔴 保全到期」事件作为最后兜底。\n\n     4. **汇总确认**：创建完成后展示完整提醒时间线，让用户一目了然：\n        ```\n        📋 (2026)苏0281民初9011号 保全提醒时间线：\n        裁定日期：2026-05-27 → 到期日：2027-05-26（1年）\n        \n        · 2027-04-26 — ⛔ 提前30天：请立即申请续冻！\n        · 2027-05-12 — ⚠️ 提前14天：冻结将在14天后到期\n        · 2027-05-19 — ⚠️ 提前7天：冻结将在7天后到期\n        · 2027-05-26 — 🔴 保全到期日\n        ```\n\n10. **向用户汇报**：按 [`references/report-format.md`](references/report-format.md) 输出结构化报告\n   - 先确认归档完成（案号、法院、当事人、案由、文件数、位置）\n   - 列出所有已归档的文书清单\n   - 如含传票，⚠️ 高亮提醒开庭时间、地点、审理程序\n   - 如含判决书，⏰ 展示上诉期限信息\n   - 如含传票/出庭通知/应诉通知书，自动进入**第五步**创建日历提醒，在汇报末尾追加日历创建结果\n   - 如部分失败，列出失败文书和原始链接\n\n11. **归档确认（P0 — 必须执行）**：向用户展示归档结果，等待确认后才能进入提醒步骤\n    - 输出归档清单：`文件 → {案卷路径}/{子目录}/文件名`\n    - 展示重复检测结果（如有）\n    - **阻止后续操作**：在用户回复\"确认\"之前，**不得创建日历事件、系统通知、或发送邮件**\n    - 用户可修改归档位置或报错\n\n12. **❄️ 重复文件检测**：归档前检查目标目录是否已有同名或大小相似的文件\n    - 文件名匹配：同名文件 → 提示\"已存在，是否覆盖？\"\n    - 文件大小匹配：大小差异 < 5% → 提示\"可能存在重复，是否跳过？\"\n    - 用户选择：跳过 / 覆盖 / 保留两个文件\n\n13. **📋 未处理文件追踪**：OCR 失败或无法归类的文件，记入 `references/pending-items.json` 待处理清单\n    - 每次 skill 启动时检查待处理清单，向用户汇报还有多少未处理文件\n    - 用户可指定文件归类位置，归类后自动从清单移除\n\n14. **📂 非法院文书智能归类**：对非法院发布的文件（代理词、委托书、合同、证据等），根据文件名和内容关键词自动归类到对应子目录\n    - `02 我方提交资料`: 起诉状、答辩状、代理词、证据清单（**仅当文件涉及代理方时才归入此目录**）\n    - `03 对方提交资料`: 对方起诉状、对方答辩状、对方代理词（**仅当文件涉及对方当事人时才归入此目录**）\n    - `04 案件原始材料`: 合同、协议、借条、银行流水\n    - `06 委托签署材料`: 委托代理合同、授权委托书\n    - 等等。详见 `scripts/court_utils.py` → `FILE_CATEGORY_MAP`\n    - **代理方感知**：归类前先读取 `config/case-parties.json`，已知代理方时，涉及代理方的诉讼文书（起诉状、答辩状、代理词等）优先归入 `02 我方提交资料`，涉及对方当事人的归入 `03 对方提交资料`。未确认代理方时，不确定归属的文书先暂存桌面，待确认后再归类。\n\n15. **📅 法定节假日感知**：期限截止日如落在周末或法定假期，自动顺延至最近工作日\n    - 数据源：`references/china-holidays.json`（来自国务院办公厅通知）\n    - 每年 1 月 1 日后首次调用时，主动提醒检查当年节假日数据是否已更新\n    - 如期限内包含长假（如春节、国庆），向用户提示\"实际可用工作日可能不足\"\n\n### 第五步：开庭日历提醒（macOS / Windows）\n\n> **触发条件**：第四步 PDF 解析识别出**传票 / 出庭通知 / 应诉通知书**时自动执行。\n> **自动判断**：无需用户操作，下载 PDF 后自动扫描文书标题，符合条件即触发。\n> **重复安全**：写入前自动删除同一案号的旧事件和邮件提醒，不会重复创建。\n\n下载 PDF 并解析出开庭信息后，自动完成三项工作（根据系统平台自动选择实现）：\n1. **系统日历事件**（macOS Apple Calendar / Windows Outlook \"工作\"分组）\n2. **QQ 邮件（微信送达）通知**（跨平台，发到 YOUR_QQ_EMAIL@qq.com）\n3. **本机电脑提醒**（系统通知中心弹窗 + 桌面 Markdown 提醒文件，双保险）\n\n**本机电脑提醒**由两部分组成，确保律师一定能看到开庭提示：\n- **系统通知**：macOS 提前1天通过 launchd 弹系统通知中心；Windows 通过 schtasks 弹 MessageBox\n- **桌面 Markdown 提醒文件**：同时在桌面生成 `开庭提醒_YYYY-MM-DD_HHMM.md`，写明开庭日期 / 时间 / 案由 / 案号 / 地点及**需准备材料清单**（传票、证据原件、委托手续等）。即使系统通知被勿扰屏蔽或一时没注意，回到桌面也能看到——这是本机提醒的持久化兜底，不依赖系统通知是否真的弹出。\n\n| 平台 | 日历 | 定时提醒 | 本机电脑提醒 |\n|------|------|---------|------------|\n| macOS | Apple Calendar (AppleScript) | launchd plist | 系统通知 + 桌面 Markdown 文件 |\n| Windows | Outlook COM → 失败则 **.ics 文件兜底** | schtasks | MessageBox 弹窗 + 桌面 Markdown 文件 |\n| Linux | .ics 日历文件（双击导入） | ❌ | 桌面 Markdown 文件 |\n\n```text\n📅 日历事件已创建：\n  - 摘要：⚖️ 开庭：{案由}\n  - 时间：YYYY年MM月DD日 HH:MM — HH:MM+2h\n  - 地点：{开庭地点}\n  - PDF链接：已关联（点开事件可查看文书）\n  - 日历分组：工作\n  - 系统提醒：提前1天通知\n📄 桌面提醒文件已生成：/Users/你/Desktop/开庭提醒_YYYY-MM-DD_HHMM.md\n📧 QQ 邮件（微信送达）提醒已设置（提前1天发送）\n\n#### 依赖\n\n| 依赖 | 用途 | 安装 |\n|------|------|------|\n| `pypdf` | PDF 文本提取 | `pip install pypdf` |\n| macOS: `osascript` / `launchctl` | 日历 + 系统通知 | 系统预装 |\n| Windows: `PowerShell` / `schtasks` | Outlook 日历 + 弹窗通知 | 系统预装 |\n| `mineru-open-api` | 纸质文书照片 OCR（方式三） | 自动安装 `npm install -g mineru-open-api` |\n| `node` | 通过 smtp.js 发送 QQ 邮件（微信送达） | 系统已装 |\n| `imap-smtp-email` skill | QQ 邮箱 SMTP 配置 | 已安装 |\n\n#### 操作步骤\n\n**① 从 PDF 中提取开庭信息**\n\n使用脚本 `scripts/court_calendar.py` 的 `parse` 模式：\n\n```bash\n# 提取开庭信息（案号、案由、开庭时间、地点）\npython3 scripts/court_calendar.py parse /tmp/court-sms-staging/传票.pdf\n```\n\n正则匹配规则：\n\n| 字段 | 正则 | 示例 |\n|------|------|------|\n| 案号 | `（(\\d{4})[^）]*\\d+号` | （2025）苏0981民初1234号 |\n| 案由 | `案　?由[：:]\\s*(.+)` | 民间借贷纠纷 |\n| 开庭时间 | `应到时间[：:]\\s*YYYY年M月D日...HH:MM` 或通用日期时间 | 2026年05月07日 09:30 |\n| 地点 | `应到处所[：:]\\s*(.+)` 或 `开庭地点[：:]\\s*(.+)` | xx市人民法院 第3法庭 |\n\n**② 判断是否需要创建日历**\n\n判定规则：文书标题或类型含以下任一关键词即触发：\n- 传票\n- 出庭通知\n- 开庭\n- 应诉通知书\n\n**③ 删除旧事件（去重）**\n\n同一案号可能多次收到文书更新，写入前自动删除该案号的旧日历事件：\n\n```bash\npython3 scripts/court_calendar.py '<案号>' '<案由>' '<YYYY-MM-DD HH:MM>' '<地点>'\n```\n\n脚本内部自动调用 `delete_court_events()` 去重。\n\n**④ 创建日历事件 + 系统提醒 + QQ 邮件（微信送达）提醒**\n\n```bash\npython3 scripts/court_calendar.py '<案号>' '<案由>' '<YYYY-MM-DD HH:MM>' '<地点>' \\\n  '工作' '<PDF远程链接（如有）>'\n```\n\n这步同时完成：\n- AppleScript → Apple Calendar \"工作\" 日历（无弹窗）\n- launchd plist → 提前1天系统通知中心提醒\n- **桌面 Markdown 文件 → 提前1天生成《开庭提醒_YYYY-MM-DD_HHMM.md》（开庭时间、地点、需准备材料清单），落到桌面**\n- **库内脚本 → 提前1天 QQ 邮件（微信送达）通知（到 YOUR_QQ_EMAIL@qq.com）**\n\n#### QQ 邮件（微信送达）内容\n\n开庭前1天在同一时刻自动发送，内容示例：\n\n```\n━━━━━━━━━━━━━━━━━━\n⚖️ 开庭提醒\n━━━━━━━━━━━━━━━━━━\n\n案号：（2025）苏0981民初1234号\n案由：民间借贷纠纷\n时间：2026年5月7日 09:30（周四）\n地点：xx市人民法院 第3法庭\n\n━━━━━━━━━━━━━━━━━━\n此邮件由 court-sms 自动发送，请以传票原件为准。\n```\n\n#### AppleScript 事件内容\n\n| 字段 | 内容 |\n|------|------|\n| summary | ⚖️ 开庭：{案由} |\n| description | 案号 - 案由 - 开庭地点（纯文本，不含链接） |\n| url | PDF 远程访问链接（如无则不传） |\n| location | 开庭地点 |\n| start | 开庭时间（2小时时长） |\n| calendar | 工作 |\n\n#### 日程冲突处理\n\n如果已有同案号日历事件（如之前手动创建或系统自动创建），脚本的 `delete_court_events()` 会先清理再重建，保证不重复。\n\n#### 异常处理\n\n| 状况 | 处理 |\n|------|------|\n| pypdf 未安装 | 提示安装，跳过日历创建 |\n| PDF 无法解析（扫描件） | 跳过自动提取，展示\"请手动查看 PDF 确认开庭时间\" |\n| 提取到案号但无开庭时间 | 只创建事件（摘要以案号命名），不设提醒时间，不发送 QQ 邮件（微信送达） |\n| AppleScript 失败 | 展示错误信息，不阻塞后续流程 |\n| launchd 加载失败 | 仅提示，日历事件已完成创建 |\n| launchd 邮件提醒加载失败 | 仍完成日历创建，展示警告并提示检查 launchd 日志 |\n| QQ 邮件（微信送达）发送失败 | 不影响日历和系统通知，检查 `~/.court-email/*-err.log` |\n\n#### 用户侧汇报格式\n\n日历创建成功后，在文书归档汇报末尾追加：\n\n```text\n📅 开庭日历提醒：\n  - ⚖️ 开庭：{案由}\n  - 🕙 {开庭时间}\n  - 📍 {开庭地点}\n  - 🖥️ 本机电脑提醒：系统通知 + 桌面《开庭提醒_*.md》（含需准备材料清单）\n  - 📧 已设置提前1天 QQ 邮件（微信送达）通知（YOUR_QQ_EMAIL@qq.com）\n```\n\n---\n\n### 第六步：PDF 后处理（可选）\n\n> **不默认启用**。仅在检测到文件拆分时主动提示用户。\n\n归档完成后，扫描目标目录中的 PDF 文件，检测是否有同一文书被拆分为多个文件的情况。\n\n#### 读取用户偏好\n\n读取 `config/user-preferences.json` 获取用户的合并和重命名偏好。如文件不存在，使用默认值（参考 `config/user-preferences.example.json`）。\n\n关键偏好项：\n\n| 偏好 | 默认值 | 说明 |\n|------|--------|------|\n| `merge_strategy` | `per_evidence` | 合并策略：`per_evidence`（按编号分别合并）或 `unified`（统一合并） |\n| `merge_options.unified.bookmarks.enabled` | `true` | 统一合并时是否添加 PDF 书签 |\n| `rename.enabled` | `true` | 是否精简文件名 |\n\n#### 触发检测\n\n读取 `references/sms-patterns.json` → `post_processing.trigger` 配置，按以下规则分组：\n\n```text\n分组规则：\n1. 证据类：文件名以\"证据\"开头 → 按编号分组（证据1、证据2、证据3…）\n2. 其他文书：按文书类型分组（传票、起诉状、应诉通知书…）\n3. 如任一组内文件数 > 3（threshold），触发提示\n```\n\n**示例**：证据3 下有 10 个 PDF → 触发。\n\n#### 用户确认\n\n使用 AskUserQuestion 提示用户，列出检测到的拆分情况：\n\n```text\n检测到以下文书被拆分为多个 PDF：\n- 证据3：10 个文件\n- 证据5：4 个文件\n\n是否执行 PDF 后处理（合并 + 重命名）？\n  → 是，合并所有\n  → 让我选择（逐个确认）\n  → 跳过\n```\n\n#### 执行后处理\n\n用户确认后，根据 `user-preferences.json` 中的 `merge_strategy` 执行：\n\n**策略一：per_evidence（默认）**\n\n按单个证据编号分别合并，每个证据独立保留：\n\n```text\n- 证据3 有 10 个拆分文件 → 合并为「证据3：打印截图.pdf」\n- 证据5 有 4 个拆分文件 → 合并为「证据5：电脑截图.pdf」\n- 未被拆分的证据（如证据1 只有 1 个文件）保持不动\n```\n\n**策略二：unified**\n\n将证据目录 + 所有证据合并为一个「原告证据.pdf」，并添加 PDF 书签：\n\n```text\n合并顺序：证据目录 → 证据1 → 证据2 → … → 证据N\n书签格式：\n  📑 证据目录\n  📑 证据1：仲裁申请书、不予受理通知书\n  📑 证据2：劳动合同、保密协议\n  📑 证据3：被告工资表\n  📑 证据4：泄露账号密码的电脑截图\n  📑 证据5：打印及拷贝资料的电脑截图\n  📑 证据6：删除电脑操作痕迹的截图\n```\n\n书签名称使用简洁版：证据编号 + 冒号 + 证据标题（去除当事人和日期后缀）。使用 pypdf 的 `add_outline_item` 添加书签。\n\n> 用户可随时修改 `user-preferences.json` 切换策略，无需改动 skill 本身。\n\n#### 页面尺寸标准化\n\n合并过程中同时标准化页面尺寸为 A4（210×297mm）。使用 pypdf 逐页处理：\n\n```python\nfrom pypdf import PdfReader, PdfWriter, Transformation\n\nA4_W = 595.27  # 210mm in points\nA4_H = 841.89  # 297mm in points\n\nfor page in reader.pages:\n    pw, ph = float(page.mediabox.width), float(page.mediabox.height)\n    is_landscape = pw > ph\n\n    # 保持原始方向：纵向→A4纵向，横向→A4横向\n    target_w = A4_H if is_landscape else A4_W\n    target_h = A4_W if is_landscape else A4_H\n\n    # 等比缩放并居中\n    scale = min(target_w / pw, target_h / ph)\n    offset_x = (target_w - pw * scale) / 2\n    offset_y = (target_h - ph * scale) / 2\n\n    new_page = writer.add_blank_page(width=target_w, height=target_h)\n    page.add_transformation(Transformation().scale(scale).translate(offset_x, offset_y))\n    new_page.merge_page(page)\n```\n\n**规则**：\n- 纵向页面 → A4 纵向（210×297mm）\n- 横向页面 → A4 横向（297×210mm），不强制旋转为纵向\n- 等比缩放、居中放置，不裁剪、不拉伸\n\n#### 精简文件名\n\n根据 `user-preferences.json` → `rename` 配置对所有文件统一重命名：\n\n```text\n去除规则（strip_patterns）：\n- 去掉括号内的当事人信息：（张三与李四合同纠纷）\n- 去掉日期后缀：_20260405收\n- 去掉平台标记：（合并）、（自贸法庭）、（素）-\n\n特殊映射（special_mappings）：\n- 起诉状（素）… → 起诉状（要素式）.pdf\n- 开庭传票 → 传票.pdf\n```\n\n**重命名示例**：\n\n| 原始 | 重命名后 |\n|------|----------|\n| `传票（张三与李四合同纠纷）_20260405收.pdf` | `传票.pdf` |\n| `起诉状（合并）.pdf` | `起诉状.pdf` |\n| `起诉状（素）-要素式起诉状（合并）.pdf` | `起诉状（要素式）.pdf` |\n| `应诉通知书（自贸法庭）.pdf` | `应诉通知书.pdf` |\n| `E法桥平台使用告知书（xxx）_20260405收.pdf` | `E法桥平台使用告知书.pdf` |\n\n---\n\n## 内部归档格式\n\n每次处理完成后在 `archive/` 下创建 JSON 记录，格式详见 [`references/archive-format.md`](references/archive-format.md)。\n\n> ⚠️ **发布前清空**：`archive/` 目录在运行时自动写入真实案件记录，对外发布前必须清空所有 `.json` 文件（保留 `.gitkeep` 和目录结构），确保案件数据不外泄。\n\n---\n\n## 常见法院短信格式参考\n\n### 文书送达短信\n\n```text\n【xx市人民法院】张三，您好！您有（2025）苏0981民初1234号案件文书送达，\n请点击链接查收：\nhttps://zxfw.court.gov.cn/zxfw/#/pagesAjkj/app/wssd/index?qdbh=DEMO1&sdbh=DEMO2&sdsin=DEMO3\n如非本人操作请联系法院。\n```\n\n### 立案通知短信\n\n```text\n【xx市xx区人民法院】您好，您提交的立案材料已审核通过。\n案号：（2025）京0105民初54321号\n请及时缴纳诉讼费用。\n```\n\n### 开庭提醒短信\n\n```text\n【xx市xx区人民法院】提醒：您有（2025）苏0508民初567号案件，\n定于2025年3月15日上午9:30在第3法庭开庭，请准时到庭。\n```\n\n### 湖北电子送达短信（免账号）\n\n```text\n【xx人民法院】您有案件文书待查收，请点击链接查收：\nhttp://dzsd.hbfy.gov.cn/hb/msg=XXXXXXX\n如有疑问请联系法院。\n```\n\n### 湖北电子送达短信（账号模式）\n\n```text\n【xx人民法院】您有（2025）鄂xxxx民初xxxx号案件文书送达。\n账号 420xxxxxxxxxxxxx\n默认密码：xxxxxx\n请登录 http://dzsd.hbfy.gov.cn/sfsddz 查收。\n```\n\n### 司法送达网短信\n\n```text\n【xx人民法院】您有（2025）川xxxx民初xxxx号案件文书送达。\n验证码：A1B2C3\n请点击链接查收：https://sfpt.cdfy12368.gov.cn/sfsdw//r/xxxxxxxxxxxx\n```\n\n---\n\n## 故障排除\n\n| 问题 | 解决方案 |\n| --- | --- |\n| 短信无法识别类型 | 展示原文，请用户确认类型后继续 |\n| 案号提取失败 | 手动输入案号 |\n| 当事人识别不准 | 提示用户确认/修正当事人列表 |\n| 无匹配案件 | 自动在桌面新建 `{原告}诉{被告} {案由}/`（不询问） |\n| 找到已有案卷 | **不自动归档**：展示匹配路径 + 命中依据 + 同名同姓风险，请律师确认后带 `--to-folder <路径>` 重新运行脚本归档 |\n| Playwright 下载超时 | 检查网络连接，尝试刷新页面重试 |\n| 页面需要验证码 | 通知用户，暂停等待手动处理 |\n| 下载文件损坏 | 清理临时目录，重新尝试下载 |\n| 目标目录不存在 | 自动创建对应目录 |\n| SFDW 验证码验证失败 | 尝试手机尾号后6位和短信验证码两种方式，均失败时提示用户联系法院 |\n| 日历创建失败 | 检查 pypdf 是否安装，检查 AppleScript 是否有 Calendar 权限（系统偏好设置→隐私与安全性→自动化） |\n| 日历事件重复 | 已内置去重（写入前自动删除同案号旧事件），如仍有重复请检查 launchd 是否有残留 plist：`ls ~/Library/LaunchAgents/com.mm.court-*` |\n| QQ 邮件（微信送达）未收到 | 检查 `~/.court-email/*-err.log` 查看 smtp.js 报错；检查 QQ 邮箱是否将自动邮件归入垃圾箱；确认授权码未过期（腾讯授权码有效期通常90天） |\n| launchd 邮件提醒未触发 | 检查 `~/.court-email/*.log` 查看执行记录；确认 launchd plist 已加载：`launchctl list | grep court-email` |\n| 照片文字识别不准 | 确保照片清晰、正面、光线充足；避免倾斜/阴影/手写体；如关键字段缺失可手动补充 |\n\n---\n\n## 配置\n\n- **解析规则**：`references/sms-patterns.json`。如需修改解析规则（添加新文书标题、调整正则等），编辑该 JSON 文件即可。\n- **代理方记录**：`config/case-parties.json`。每个案件第一次处理时自动询问并记录代理方（原告/被告），用于区分「我方提交资料」和「对方提交资料」。可通过\"更新代理方 <案号> <原告/被告>\"手动修改。\n- **案卷目录**：`config/case-root.json`。首次使用询问并缓存案卷根目录路径。\n\n---\n\n## 🔄 变更历史\n\n### ⭐ v1.0–v1.5.0（杨卫薪律师）— 基础框架\n\n杨卫薪律师（微信 ywxlaw）完成了以下核心基础工作，本技能的所有后续功能均建立在此之上：\n\n| 模块 | 贡献 |\n|------|------|\n| 📱 **短信解析** | 法院短信文本解析，自动提取案号、当事人、下载链接 |\n| 🌐 **zxfw API 下载** | 全国法院统一送达平台 API 直连，curl 无头下载 PDF |\n| 📁 **基础归档** | 下载 PDF 后归档到案件目录，写入内部 JSON 记录 |\n| 📄 **文书识别** | 正则匹配识别文书类型（传票/判决书/裁定书等） |\n| 📋 **多平台支持** | 广东 gdems、湖北 hbfy、集约送达、司法送达网下载 |\n\n上述工作使本技能从零到一，Stone 了法院短信→下载→归档的核心链路。\n\n---\n\n### ⭐ v2.0.0（2026-07-07）— 陆凌燕 · 全面升级\n\n基于 v1.5.0 核心链路，新增以下能力：\n\n**提醒体系（三条线）**\n- 开庭传票自动写入系统日历 + 本机电脑提醒（系统通知 + 桌面 Markdown 文件）+ QQ 邮件（微信送达）提醒（YOUR_QQ_EMAIL@qq.com）\n- 上诉期限自动设提前2天 + 截止当天双提醒，全部三条线同时到达\n- macOS Apple Calendar / Windows .ics 文件 / Linux .ics 文件，跨平台覆盖\n\n**期限规则库（`references/deadline-rules.json`）**\n- 覆盖 12 种文书类型：上诉/保全/举证/答辩/执行/再审/管辖/缴费\n- 保全类（冻结银行存款 1 年、查封不动产 3 年）特殊处理：提前 30 天 + 14 天 + 7 天三级递进提醒\n- 新增文书类型只需追加一条 JSON 条目，无需改代码\n\n**照片 OCR（方式三）**\n- 纸质传票/判决书/通知书拍照即可识别（MinerU + PaddleOCR，字符精度 >99%）\n- 识别结果强制复核确认（案号、开庭时间永远标记 ⚠️）\n- MinerU 首次运行自动安装，用户零感知\n\n**归档体系优化**\n- 同一条短信多份文书 → 文件夹打包（非合并 PDF），按最高级别文书命名\n- 桌面端案件文件夹即案卷唯一根目录（找到已有案卷须律师确认后写入，不静默同步）\n\n**跨平台支持**\n- macOS：Apple Calendar + launchd + 通知中心\n- Windows：.ics 日历文件 + schtasks + MessageBox 弹窗\n- Linux：.ics 日历文件\n\n**自动归纳与案卷管理**\n- 照片/扫描件自动 OCR 后按案号或当事人姓名匹配已有案卷\n- **匹配到已有案卷 → 必须请求律师确认后才归档**（同名同姓风险，禁止静默写入）；确认后带 `--to-folder <路径>` 重新运行脚本归档\n- 未匹配到 → 自动在桌面新建标准案卷（10 个子目录）：法院送达文书/我方提交/对方提交/原始材料/工作文本/委托签署/邮件记录/法规检索/庭审笔录/保全资料\n- 法院文书（传票/判决书/裁定书等）归入\"01 法院送达文书\"子目录（新建时自动归入；匹配到已有案卷时经律师确认后归入）\n\n### ⭐ v2.1.0（2026-07-09）— 代码审查与安全加固\n\n基于第一性原理+对抗性审查，对全部 6 个核心脚本做了一次系统级排查，修复以下问题：\n\n**提醒时机修正**\n- 开庭提醒的\"本机电脑提醒\"（弹通知 + 桌面 Markdown）从\"创建日历事件时触发\"改为\"目标提醒时间（开庭前 1 天）才触发\"。\n- 新增 `hearing_notify()` 函数：launchd 到点自动调用，弹系统通知 + 在桌面生成 `开庭提醒_YYYY-MM-DD_HHMM.md`（含时间/案号/地点/材料清单）。\n- 创建日历时仅写入日历事件 + 调度提醒任务，不弹窗、不生成文件。\n\n**代码清理（P0）**\n- 删除 `court_appeal_reminder.py`：已被 `court_deadline_reminder.py` 全覆盖且带硬编码路径（换机必炸）、缺少桌面 Markdown 提醒。\n- `TO_EMAIL` 默认值统一为 `YOUR_QQ_EMAIL@qq.com`（修正两处占位符 `YOUR_QQ_EMAIL@qq.com`）。\n\n**安全加固（P1）**\n- **AppleScript 注入**：`court_deadline_reminder.py` 的 `send_system_notification` 补齐双引号转义（`replace('\"', '\\\\\"')`），与 `court_calendar.py` 的 `_macos_pop_notification` 行为一致。\n- **plist XML 注入**：三处 launchd plist 生成函数（`_macos_schedule_notification`、`_macos_schedule_email_script`、`_macos_schedule`）对所有动态数据（case_no/case_type/location/label）增加 `xml.sax.saxutils.escape()` 转义，防止 `&` 等特殊字符导致 plist 解析静默失败。\n- **死代码清理**：`_macos_unload_reminder` 的 `suffix.replace('-email', '-email')` 恒等变换 → 写死字面量。\n\n### ⭐ v2.2.0（2026-07-13）— 隐私脱敏与代理方识别\n\n**安全脱敏**\n- 全部文件中的 QQ 邮箱硬编码替换为 `YOUR_QQ_EMAIL@qq.com` 占位符（SKILL.md、Python 脚本、报告模板等共 16 处）\n- `config/case-root.json` 中本地路径替换为占位符 `/Users/你的用户名/项目/02-律师业务`\n- `archive/` 目录发布前清空规则：保留目录结构和 `.gitkeep`，删除所有真实案件 JSON 数据\n- `_meta.json` 中 `ownerId` 替换为占位符\n- 脱敏审查清单新增第 11 项：运行时数据目录发布前清空\n\n**代理方识别（P1 新增功能）**\n- 新增 `config/case-parties.json`：首次接触案件时自动询问律师代理哪一方（原告/被告）\n- 非法院文书智能归类（第 14 步）加入代理方感知：已知代理方时自动区分「02 我方提交资料」与「03 对方提交资料」\n- 支持手动补充：`更新代理方 <案号> <原告/被告>`\n\n### ⭐ v2.2.1（2026-07-13）— 保全裁定处理强化\n\n**问题**：(2026)苏0281民初9011号保全裁定书下载后未触发期限规则匹配，导致：①未提取保全金额/方式/到期日等具体信息；②未创建任何日历提醒；③未计算保全到期日。\n\n**修复**：\n- **新增「保全裁定强制处理」节点**（第四步第9项 `deadline-rules.json` 匹配之后）：当文书为裁定书 + 含保全关键字时，强制走完整流程——提取详情 → 算到期 → 逐条创建全部提醒 → 汇总确认时间线\n- **明确禁止部分提醒**：规则里 `reminders` 数组有几个条目就必须全建。以冻结银行存款为例：30天 + 14天 + 7天，一条不能少。到期日当天额外追加一条兜底事件\n- 到期日计算公式纳入 SKILL.md 正文（不必每次查《民事保全须知》原文）\n\n### ⭐ v2.2.2（2026-07-13）— 对抗性审查修复\n\n**P0 修复：**\n- **保全到期日当天新增提醒**：`deadline-rules.json` 中 `preservation_freeze` 和 `preservation_seal` 规则各追加一条 `before_days=0` (critical) 提醒。此前只提醒 30/14/7 天前，到期日当天无通知无邮件，仅靠日历事件兜底\n- **裁定书强制保全检测**：SKILL.md 第四步 point 8（基础文书解析）新增「裁定书」子类——正文含「冻结」「查封」「扣押」关键字时，必须强制执行 point 9 期限匹配，禁止以任何理由跳过\n\n**P1 修复：**\n- **AppleScript 注入防护**：`court_deadline_reminder.py` 的 `_macos_create_calendar` 函数对 `summary` 和 `location` 字段增加 `replace('\"', '\\\\\"')` 转义，防止案由含双引号导致 AppleScript 解析失败（此前仅 `description` 被转义）\n\nFile v2.2.2:_meta.json\n\n{\n  \"ownerId\": \"kn7ak8kq701dd4kpk6qgm4gek984aspp\",\n  \"slug\": \"litigation-hub\",\n  \"version\": \"2.2.2\",\n  \"publishedAt\": 1783947404366\n}\n\nFile v2.2.2:references/archive-format.md\n\n# 内部归档格式\n\n每次处理一条短信后，在 `archive/` 下创建一条 JSON 记录，不保存文书本身（文书归档到案件目录）。\n\n## 文件路径\n\n`archive/YYYYMMDD_HHMMSS_{案号后4位}.json`\n\n## JSON 结构\n\n```json\n{\n  \"id\": \"20260404_143025_1234\",\n  \"timestamp\": \"2026-04-04T14:30:25+08:00\",\n  \"sms_raw\": \"【xx市人民法院】张三，您好！您有（2025）苏0981民初1234号案件文书送达，请点击链接查收：https://zxfw.court.gov.cn/...\",\n  \"parsed\": {\n    \"type\": \"document_delivery\",\n    \"case_number\": \"（2025）苏0981民初1234号\",\n    \"parties\": [\"张三\", \"xx有限公司\"],\n    \"court\": \"xx市人民法院\"\n  },\n  \"download\": {\n    \"source_url\": \"https://zxfw.court.gov.cn/zxfw/#/pagesAjkj/app/wssd/index?qdbh=XX&sdbh=XX&sdsin=XX\",\n    \"params\": { \"qdbh\": \"XX\", \"sdbh\": \"XX\", \"sdsin\": \"XX\" },\n    \"method\": \"curl\",\n    \"status\": \"success\",\n    \"document_title\": \"受理通知书\",\n    \"api_response\": {\n      \"c_fymc\": \"苏州工业园区人民法院\",\n      \"c_fybh\": \"1275\",\n      \"dt_cjsj\": \"2026-03-18T07:44:00.000+00:00\",\n      \"documents\": [\n        {\n          \"c_wsmc\": \"传票（东沙湖法庭）\",\n          \"c_wsbh\": \"ecb8fe64e4834804b50ea0f9257327e0\",\n          \"dt_cjsj\": \"2026-03-18T07:44:00.000+00:00\"\n        }\n      ]\n    }\n  },\n  \"document\": {\n    \"type\": \"一审判决书\",\n    \"sent_at\": \"2026-04-08T10:00:00+08:00\",\n    \"received_at\": \"2026-04-08T14:30:00+08:00\",\n    \"appeal_deadline\": \"2026-04-23T23:59:59+08:00\",\n    \"appeal_days_remaining\": 15\n  },\n  \"archive\": {\n    \"matched_case\": \"260101 张三与李四合同纠纷\",\n    \"target_path\": \"260101 张三与李四合同纠纷/受理通知书（张三与李四合同纠纷）_20260404收.pdf\",\n    \"summary\": \"传票：2025年4月15日 14:30 第3法庭开庭\"\n  }\n}\n```\n\n## 字段说明\n\n| 字段 | 必需 | 说明 |\n|------|------|------|\n| `id` | 是 | 归档唯一标识，即文件名（不含扩展名） |\n| `timestamp` | 是 | ISO 8601 格式的处理时间 |\n| `sms_raw` | 是 | 短信原文，完整保留 |\n| `parsed.type` | 是 | 短信类型：`document_delivery` / `filing_notification` / `info_notification` |\n| `parsed.case_number` | 否 | 提取到的案号，未提取到时为 `null` |\n| `parsed.parties` | 否 | 提取到的当事人列表 |\n| `parsed.court` | 否 | 提取到的法院名称 |\n| `parsed.sent_at` | 否 | 法院发送时间，从短信或送达平台提取 |\n| `parsed.received_at` | 否 | 用户收到时间（如有） |\n| `download.source_url` | 否 | 原始下载链接 |\n| `download.params` | 否 | 从 URL 提取的参数（如 qdbh/sdbh/sdsin） |\n| `download.method` | 否 | 实际使用的下载方式：`curl` / `cli` / `mcp` / `manual` / `null`（无下载链接） |\n| `download.status` | 是 | 下载状态：`success` / `failed` / `manual` / `skipped` |\n| `download.api_response` | 否 | API 完整响应，包含 c_fymc（法院名称）、c_fybh（法院编号）、dt_cjsj（送达时间）、documents 数组（每份文书详情） |\n| `download.api_response.c_fymc` | 否 | 法院名称（来自 API） |\n| `download.api_response.c_fybh` | 否 | 法院编号 |\n| `download.api_response.dt_cjsj` | 否 | 送达记录创建时间（ISO 8601），作为 sent_at 来源 |\n| `download.api_response.documents[].c_wsmc` | 否 | 文书名称 |\n| `download.api_response.documents[].c_wsbh` | 否 | 文书编号（UUID） |\n| `download.api_response.documents[].dt_cjsj` | 否 | 单份文书的送达时间 |\n| `document.type` | 否 | 文书类型：判决书/裁定书/调解书等（从 PDF 解析） |\n| `document.sent_at` | 否 | 法院发送时间（送达平台记录） |\n| `document.received_at` | 否 | 用户收到时间（手机短信网关时间） |\n| `document.appeal_deadline` | 否 | 上诉截止日期（根据案件类型计算） |\n| `document.appeal_days_remaining` | 否 | 剩余上诉天数 |\n| `archive.matched_case` | 否 | 匹配到的案件目录名 |\n| `archive.target_path` | 否 | 文书最终归档的相对路径 |\n\nFile v2.2.2:references/ATTRIBUTION.md\n\n# 归属声明与致谢\n\n## 参考项目\n\n本技能（court-sms）在开发过程中，使用 AI 参考了以下开源项目的思路和规则：\n\n### FachuanHybridSystem（法穿AI案件管理系统）\n\n- **项目地址**：https://github.com/Lawyer-ray/FachuanHybridSystem\n- **许可证**：PolyForm Noncommercial License 1.0.0 (附特别许可)\n- **版权所有**：(C) 2025-2099 法穿\n\n### 具体参考内容\n\n本技能参考了 FachuanHybridSystem 中以下模块的**设计思路和解析规则**（非直接复制代码）：\n\n1. **短信解析服务** (`backend/apps/automation/services/sms/sms_parser_service.py`)\n   - 短信类型分类逻辑（文书送达 / 信息通知 / 立案通知）\n   - zxfw.court.gov.cn 下载链接正则匹配规则\n   - 同构异域名正则更新（从硬编码域名改为通用主机匹配，通过 URL 路径特征识别平台）\n   - 案号提取正则模式\n   - 当事人名称提取策略（公司名模式、对峙模式、角色前缀模式）\n   - 当事人排除关键词列表\n   - 司法送达网（SFDW）链接正则和验证码提取规则\n\n2. **案件匹配算法** (`backend/apps/automation/services/sms/case_matcher.py`)\n   - 三级匹配策略的设计思路（案号精确 → 当事人双向 → 特征筛选）\n\n3. **文书重命名逻辑** (`backend/apps/automation/services/sms/document_renamer.py`)\n   - 已知文书标题映射表\n   - 文件命名格式：`{title}（{case_name}）_{YYYYMMDD}收.pdf`\n\n4. **zxfw 下载策略** (`backend/apps/automation/services/scraper/scrapers/court_document/zxfw_scraper.py`)\n   - 多级下载回退策略的架构设计\n   - API 拦截与页面操作结合的思路\n\n5. **司法送达网下载策略** (`backend/apps/automation/services/scraper/scrapers/court_document/sfdw_scraper.py`)\n   - 纯 Playwright 下载流程（TDHCryptoUtil 加密导致无法使用 HTTP API）\n   - 验证码双模式策略：手机尾号后6位优先 + 短信验证码回退\n   - Vue app.checkYzm() → wsList → downloadFile() 页面交互流程\n\n### 实现差异\n\n本技能并未直接复制 FachuanHybridSystem 的代码，而是将其核心逻辑重新实现为 AI 技能格式：\n\n- **原项目**：Python / Django 服务，使用 Ollama LLM + ddddocr + Playwright\n- **本技能**：AI Agent Skill，利用自然语言理解能力 + Playwright MCP\n- **无代码复用**：所有解析逻辑由 AI 自然语言理解完成，配置规则以 JSON 参考\n\n### 致谢\n\n感谢法穿团队开源的法律科技实践成果，为社区提供了宝贵的设计参考。\n\nFile v2.2.2:references/china-holidays.json\n\n{\n  \"_description\": \"中国法定节假日数据。由国务院办公厅每年公布，通过 gov.cn 官方源自动获取。\",\n  \"_updated\": \"2026-07-08\",\n  \"_source\": \"https://www.gov.cn/zhengce/content/202511/content_7047090.htm\",\n  \"_auto_update\": \"每年1月1日后首次调用时，自动从 gov.cn 检索当年最新数据更新本文件。\",\n\n  \"2026\": {\n    \"holidays\": {\n      \"元旦\": {\n        \"dates\": [\"2026-01-01\", \"2026-01-02\", \"2026-01-03\"],\n        \"days_off\": 3\n      },\n      \"春节\": {\n        \"dates\": [\"2026-02-15\", \"2026-02-16\", \"2026-02-17\", \"2026-02-18\", \"2026-02-19\", \"2026-02-20\", \"2026-02-21\", \"2026-02-22\", \"2026-02-23\"],\n        \"days_off\": 9\n      },\n      \"清明节\": {\n        \"dates\": [\"2026-04-04\", \"2026-04-05\", \"2026-04-06\"],\n        \"days_off\": 3\n      },\n      \"劳动节\": {\n        \"dates\": [\"2026-05-01\", \"2026-05-02\", \"2026-05-03\", \"2026-05-04\", \"2026-05-05\"],\n        \"days_off\": 5\n      },\n      \"端午节\": {\n        \"dates\": [\"2026-06-19\", \"2026-06-20\", \"2026-06-21\"],\n        \"days_off\": 3\n      },\n      \"中秋节\": {\n        \"dates\": [\"2026-09-25\", \"2026-09-26\", \"2026-09-27\"],\n        \"days_off\": 3\n      },\n      \"国庆节\": {\n        \"dates\": [\"2026-10-01\", \"2026-10-02\", \"2026-10-03\", \"2026-10-04\", \"2026-10-05\", \"2026-10-06\", \"2026-10-07\"],\n        \"days_off\": 7\n      }\n    },\n    \"makeup_workdays\": [\n      \"2026-01-04\", \"2026-02-14\", \"2026-02-28\",\n      \"2026-05-09\", \"2026-09-20\", \"2026-10-10\"\n    ]\n  }\n}\n\nFile v2.2.2:references/deadline-rules.json\n\n{\n  \"_description\": \"法院文书期限规则库。当 court-sms 识别到文书类型时，自动查表生成对应的日历 + 系统通知 + QQ 邮件提醒。\",\n  \"_usage\": \"由 court_deadline_reminder.py 在文书归档完成后自动读取、匹配、设置提醒。\",\n  \"_extend\": \"新增文书类型在此 JSON 中追加条目即可，无需改代码。\",\n\n  \"rules\": [\n    {\n      \"id\": \"appeal_civil_judgment\",\n      \"match\": { \"document_type\": \"判决书\", \"tags\": [\"民事\", \"行政\"] },\n      \"deadline\": { \"value\": 15, \"unit\": \"日\", \"description\": \"提起上诉\" },\n      \"reminders\": [\n        { \"before_days\": 2, \"level\": \"warning\", \"label\": \"上诉期限还剩2天\" },\n        { \"before_days\": 0, \"level\": \"critical\", \"label\": \"上诉期限今天截止\" }\n      ],\n      \"calendar\": { \"title\": \"⏰ 上诉截止：{case_type}\", \"all_day\": true }\n    },\n    {\n      \"id\": \"appeal_criminal_judgment\",\n      \"match\": { \"document_type\": \"判决书\", \"tags\": [\"刑事\"] },\n      \"deadline\": { \"value\": 10, \"unit\": \"日\", \"description\": \"提起上诉（刑事）\" },\n      \"reminders\": [\n        { \"before_days\": 2, \"level\": \"warning\", \"label\": \"上诉期限还剩2天\" },\n        { \"before_days\": 0, \"level\": \"critical\", \"label\": \"上诉期限今天截止\" }\n      ],\n      \"calendar\": { \"title\": \"⏰ 上诉截止：{case_type}\", \"all_day\": true }\n    },\n    {\n      \"id\": \"appeal_civil_ruling\",\n      \"match\": { \"document_type\": \"裁定书\", \"tags\": [\"民事\", \"行政\"] },\n      \"deadline\": { \"value\": 10, \"unit\": \"日\", \"description\": \"对裁定提起上诉\" },\n      \"reminders\": [\n        { \"before_days\": 2, \"level\": \"warning\", \"label\": \"上诉期限还剩2天\" },\n        { \"before_days\": 0, \"level\": \"critical\", \"label\": \"上诉期限今天截止\" }\n      ],\n      \"calendar\": { \"title\": \"⏰ 上诉截止：{case_type}\", \"all_day\": true }\n    },\n    {\n      \"id\": \"appeal_criminal_ruling\",\n      \"match\": { \"document_type\": \"裁定书\", \"tags\": [\"刑事\"] },\n      \"deadline\": { \"value\": 5, \"unit\": \"日\", \"description\": \"对裁定提起上诉（刑事）\" },\n      \"reminders\": [\n        { \"before_days\": 2, \"level\": \"warning\", \"label\": \"上诉期限还剩2天\" },\n        { \"before_days\": 0, \"level\": \"critical\", \"label\": \"上诉期限今天截止\" }\n      ],\n      \"calendar\": { \"title\": \"⏰ 上诉截止：{case_type}\", \"all_day\": true }\n    },\n    {\n      \"id\": \"preservation_freeze\",\n      \"match\": { \"document_type\": \"裁定书\", \"tags\": [\"冻结\", \"银行存款\"] },\n      \"deadline\": { \"value\": 365, \"unit\": \"日\", \"description\": \"冻结期满，需申请续冻\" },\n      \"reminders\": [\n        { \"before_days\": 30, \"level\": \"critical\", \"label\": \"⛔ 银行存款冻结将到期！请立即申请续冻！\" },\n        { \"before_days\": 14, \"level\": \"warning\", \"label\": \"银行存款冻结将在14天后到期\" },\n        { \"before_days\": 7, \"level\": \"warning\", \"label\": \"银行存款冻结将在7天后到期\" },\n        { \"before_days\": 0, \"level\": \"critical\", \"label\": \"⛔⛔ 银行存款冻结今日到期！如未续冻，冻结效力消灭！\" }\n      ],\n      \"calendar\": { \"title\": \"⛔ 续冻截止：{case_type}\", \"all_day\": true },\n      \"note\": \"保全类必须提前处理，不可等到最后一天！建议在收到裁定后立即在日历中标注。\"\n    },\n    {\n      \"id\": \"preservation_seal\",\n      \"match\": { \"document_type\": \"裁定书\", \"tags\": [\"查封\", \"不动产\"] },\n      \"deadline\": { \"value\": 1095, \"unit\": \"日\", \"description\": \"查封期满，需申请续封\" },\n      \"reminders\": [\n        { \"before_days\": 30, \"level\": \"critical\", \"label\": \"⛔ 不动产查封将到期！请立即申请续封！\" },\n        { \"before_days\": 14, \"level\": \"warning\", \"label\": \"不动产查封将在14天后到期\" },\n        { \"before_days\": 7, \"level\": \"warning\", \"label\": \"不动产查封将在7天后到期\" },\n        { \"before_days\": 0, \"level\": \"critical\", \"label\": \"⛔⛔ 不动产查封今日到期！如未续封，查封效力消灭！\" }\n      ],\n      \"calendar\": { \"title\": \"⛔ 续封截止：{case_type}\", \"all_day\": true },\n      \"note\": \"查封续期必须提前30天申请，到期待处理将导致查封失效！\"\n    },\n    {\n      \"id\": \"evidence_deadline\",\n      \"match\": { \"document_type\": \"举证通知书\" },\n      \"deadline\": { \"value\": 15, \"unit\": \"日\", \"description\": \"举证期限届满\" },\n      \"reminders\": [\n        { \"before_days\": 5, \"level\": \"warning\", \"label\": \"举证期限还剩5天\" },\n        { \"before_days\": 1, \"level\": \"critical\", \"label\": \"举证期限仅剩1天！\" }\n      ],\n      \"calendar\": { \"title\": \"📝 举证截止：{case_type}\", \"all_day\": true }\n    },\n    {\n      \"id\": \"defense_deadline\",\n      \"match\": { \"document_type\": \"起诉状\" },\n      \"deadline\": { \"value\": 15, \"unit\": \"日\", \"description\": \"提交答辩状\" },\n      \"reminders\": [\n        { \"before_days\": 3, \"level\": \"warning\", \"label\": \"答辩期限还剩3天\" },\n        { \"before_days\": 0, \"level\": \"critical\", \"label\": \"答辩期限今天截止！\" }\n      ],\n      \"calendar\": { \"title\": \"📬 答辩截止：{case_type}\", \"all_day\": true }\n    },\n    {\n      \"id\": \"enforcement_deadline\",\n      \"match\": { \"document_type\": \"生效法律文书\", \"tags\": [\"判决书\", \"裁定书\", \"调解书\"] },\n      \"deadline\": { \"value\": 730, \"unit\": \"日\", \"description\": \"申请强制执行\" },\n      \"reminders\": [\n        { \"before_days\": 30, \"level\": \"critical\", \"label\": \"⚠️ 强制执行申请期限还剩30天\" },\n        { \"before_days\": 7, \"level\": \"critical\", \"label\": \"⚠️ 强制执行申请期限仅剩7天！\" }\n      ],\n      \"calendar\": { \"title\": \"⚡ 执行申请截止：{case_type}\", \"all_day\": true }\n    },\n    {\n      \"id\": \"retrial_deadline\",\n      \"match\": { \"document_type\": \"判决书\", \"tags\": [\"生效\", \"再审\"] },\n      \"deadline\": { \"value\": 180, \"unit\": \"日\", \"description\": \"申请再审\" },\n      \"reminders\": [\n        { \"before_days\": 30, \"level\": \"warning\", \"label\": \"再审申请期限还剩30天\" },\n        { \"before_days\": 7, \"level\": \"critical\", \"label\": \"再审申请期限仅剩7天！\" }\n      ],\n      \"calendar\": { \"title\": \"🔄 再审申请截止：{case_type}\", \"all_day\": true }\n    },\n    {\n      \"id\": \"jurisdiction_appeal\",\n      \"match\": { \"document_type\": \"裁定书\", \"tags\": [\"管辖权异议\"] },\n      \"deadline\": { \"value\": 10, \"unit\": \"日\", \"description\": \"对管辖权异议裁定上诉\" },\n      \"reminders\": [\n        { \"before_days\": 2, \"level\": \"warning\", \"label\": \"管辖权异议上诉期限还剩2天\" },\n        { \"before_days\": 0, \"level\": \"critical\", \"label\": \"管辖权异议上诉期限今天截止！\" }\n      ],\n      \"calendar\": { \"title\": \"🏛️ 管辖权异议上诉截止\", \"all_day\": true }\n    },\n    {\n      \"id\": \"fee_payment\",\n      \"match\": { \"document_type\": \"受理通知书\" },\n      \"deadline\": { \"value\": 7, \"unit\": \"日\", \"description\": \"缴纳诉讼费\" },\n      \"reminders\": [\n        { \"before_days\": 3, \"level\": \"warning\", \"label\": \"诉讼费缴纳还剩3天\" },\n        { \"before_days\": 1, \"level\": \"critical\", \"label\": \"⚠️ 诉讼费缴纳仅剩1天！逾期按撤诉处理！\" }\n      ],\n      \"calendar\": { \"title\": \"📋 缴纳诉讼费截止\", \"all_day\": true }\n    }\n  ],\n\n  \"matching_logic\": {\n    \"description\": \"匹配优先级：按 rules 数组顺序逐条匹配，首次命中即停止。document_type 必须完全匹配，tags 中任一关键词在文书标题或正文中出现即视为匹配。\",\n    \"example\": \"文书标题='民事裁定书（冻结）' → document_type='裁定书' + tags['民事','冻结'] → 命中 preservation_freeze\"\n  }\n}\n\nFile v2.2.2:references/report-format.md\n\n# 归档汇报格式\n\n## 汇报结构\n\n汇报分五部分，按顺序输出：\n\n1. **归档完成** — 确认信息\n2. **文书清单** — 所有已归档文件\n3. **特别注意** — 仅当包含传票时显示开庭信息\n4. **上诉期限** — 仅当文书类型为一审判决书且能计算上诉期限时显示\n5. **开庭日历提醒** — 仅当文书为传票/出庭通知/应诉通知书且日历创建成功时显示\n\n---\n\n## 模板\n\n```text\n✅ 文书归档完成：\n- 案号：（2025）苏0981民初1234号\n- 法院：xx市人民法院\n- 当事人：原告 xx有限公司 / 被告 张三\n- 案由：合同纠纷\n- 文件数：N 份\n- 归档位置：{案件目录}/\n\n文书清单：\n  1. 传票（东沙湖法庭）                     传票\n  2. 应诉通知书                             通知书\n  3. 起诉状                                 起诉状\n  4. 证据1：xxx                              证据\n  ...\n\n⚠️ 已收到传票，请注意：\n  - 开庭时间：2025年4月15日（周二）14:30\n  - 开庭地点：xx市人民法院 第3法庭\n  - 审理程序：简易程序\n\n⏰ 上诉期限提醒：\n  - 文书类型：一审判决书\n  - 送达时间：2026年4月8日\n  - 上诉截止：2026年4月23日（剩余15天）\n\n📅 开庭日历提醒：\n  - ⚖️ 开庭：民间借贷纠纷\n  - 🕙 2026年5月7日（周四）09:30\n  - 📍 xx市人民法院 第3法庭\n  - ⏰ 已设置提前1天通知提醒\n  - 📧 已设置提前1天 QQ 邮件通知（YOUR_QQ_EMAIL@qq.com）\n```\n\n---\n\n## 各部分规则\n\n### 1. 归档完成\n\n必填字段：\n\n| 字段 | 来源 |\n|------|------|\n| 案号 | 短信解析 或 文书提取 |\n| 法院 | 短信解析 或 API 返回 `c_fymc` |\n| 当事人 | 文书提取（起诉状/传票），非短信接收人 |\n| 案由 | 文书提取（起诉状/传票） |\n| 文件数 | 实际归档数量 |\n| 归档位置 | 相对路径 |\n\n> **当事人提取优先级**：文书内容 > API 返回 > 短信文本。短信中的姓名（如\"xx，您好\"）仅为接收人，不作为案件当事人。\n\n### 2. 文书清单\n\n列出所有已归档文件，每行格式：\n\n```text\n{序号}. {文书名}                    {类型标签}\n```\n\n类型标签来自 `sms-patterns.json` → `document_titles` 映射，未匹配的标注为\"其他\"。\n\n### 3. 特别注意（仅传票）\n\n触发条件：文书清单中包含标题含\"传票\"的文件。\n\n从传票 PDF 首页文本提取以下字段（正则匹配）：\n\n| 字段 | 提取方式 |\n|------|----------|\n| 开庭时间 | 匹配 `应到时间` 附近的日期时间 |\n| 开庭地点 | 匹配 `应到处所` 附近的文本 |\n| 审理程序 | 从应诉通知书中匹配\"小额诉讼/简易程序/普通程序\" |\n\n**日期格式化**：原始日期（如 `2026年05月07日 09:30`）应追加星期几，方便用户快速判断是否为工作日。\n\n**提醒语气**：使用 ⚠️ 标记，加粗关键日期时间，确保用户不会遗漏。\n\n### 4. 上诉期限（仅判决书/裁定书）\n\n触发条件：文书清单中包含\"判决书\"或\"裁定书\"且能提取到送达时间。\n\n**上诉期限计算规则**：\n\n| 案件类型 | 上诉期限 |\n|---------|---------|\n| 民事一审判决 | 送达后15天 |\n| 民事裁定 | 送达后10天 |\n| 行政判决 | 送达后15天 |\n| 刑事判决 | 送达后10天 |\n| 刑事裁定 | 送达后5天 |\n\n**日期格式化**：展示为 `X月X日` 格式，追加星期几。\n\n**剩余天数计算**：`截止日期 - 当前日期`\n\n### 5. 开庭日历提醒\n\n触发条件：文书为传票 / 出庭通知 / 应诉通知书，且 PDF 成功提取到开庭时间。\n\n同时完成三项：\n- Apple Calendar \"工作\" 日历事件\n- launchd 提前1天系统通知\n- QQ 邮件提前1天发送（YOUR_QQ_EMAIL@qq.com）\n\n**字段说明**：\n\n| 字段 | 来源 |\n|------|------|\n| 案由 | PDF 解析 `parse_hearing_info_from_pdf()` |\n| 开庭时间 | PDF 解析，格式化后追加星期几 |\n| 地点 | PDF 解析 |\n| 提醒状态 | 创建成功/失败 |\n\n**输出条件**：\n- 仅当日历事件创建成功时输出，失败时只打印错误不体现在汇报中\n- 已在第三部分展示开庭信息的传票，这里不再重复开庭详情\n\n---\n\n## 归档失败时的汇报\n\n```text\n⚠️ 文书归档部分完成：\n- 案号：（2025）苏0981民初1234号\n- 法院：xx市人民法院\n- 成功：N 份\n- 失败：N 份\n\n失败的文书：\n  - xxx.pdf（原因：下载超时）\n\n请手动访问以下链接下载失败文书：\n{原始链接}\n```\n\nFile v2.2.2:references/sms-patterns.json\n\n{\n  \"download_link_patterns\": [\n    {\n      \"domain\": \"zxfw.court.gov.cn\",\n      \"canonical_domain\": \"zxfw.court.gov.cn\",\n      \"description\": \"全国法院统一送达平台（最常见）\",\n      \"pattern\": \"https?://[^\\\\s/]+/zxfw/#/pagesAjkj/app/wssd/index\\\\?[^\\\\s]*\",\n      \"required_params\": [\"qdbh\", \"sdbh\", \"sdsin\"],\n      \"param_extract\": \"从 URL query string 中提取 qdbh、sdbh、sdsin 三个参数值\",\n      \"download_strategy\": \"api_first\",\n      \"api\": {\n        \"endpoint\": \"https://zxfw.court.gov.cn/yzw/yzw-zxfw-sdfw/api/v1/sdfw/getWsListBySdbhNew\",\n        \"method\": \"POST\",\n        \"content_type\": \"application/json\",\n        \"request_body\": { \"qdbh\": \"{全局编号}\", \"sdbh\": \"{送达编号}\", \"sdsin\": \"{送达签名}\" },\n        \"response_fields\": {\n          \"court_name\": \"data[].c_fymc\",\n          \"court_id\": \"data[].c_fybh\",\n          \"document_name\": \"data[].c_wsmc\",\n          \"document_id\": \"data[].c_wsbh\",\n          \"download_url\": \"data[].wjlj\",\n          \"file_format\": \"data[].c_wjgs\",\n          \"create_time\": \"data[].dt_cjsj\"\n        },\n        \"download_method\": \"curl -sL -o \\\"{filename}\\\" \\\"{wjlj}\\\"\",\n        \"notes\": \"OSS 签名 URL 有过期时间（约1小时），获取后应尽快下载。无需浏览器，直接 curl 即可。dt_cjsj 为送达记录创建时间，可作为 sent_at 使用。\"\n      }\n    },\n    {\n      \"domain\": \"sd.gdems.com\",\n      \"canonical_domain\": \"sd.gdems.com\",\n      \"description\": \"广东法院电子送达平台（限广东地区）\",\n      \"pattern\": \"https?://[^\\\\s/]+/v3/dzsd/[a-zA-Z0-9]+\",\n      \"required_params\": [],\n      \"param_extract\": \"从 URL 路径末尾提取送达标识码\",\n      \"download_strategy\": \"browser_only\",\n      \"api\": null,\n      \"notes\": \"无公开 API，需通过浏览器打开页面后手动或 Playwright 自动化下载。页面可能需要输入验证码或手机号验证。\"\n    },\n    {\n      \"domain\": \"jysd.10102368.com\",\n      \"canonical_domain\": \"jysd.10102368.com\",\n      \"description\": \"集约送达平台（邮政集约送达服务）\",\n      \"pattern\": \"https?://[^\\\\s/]+/sd\\\\?key=[a-zA-Z0-9_\\\\-]+\",\n      \"required_params\": [\"key\"],\n      \"param_extract\": \"从 URL query string 中提取 key 参数值\",\n      \"download_strategy\": \"browser_only\",\n      \"api\": null,\n      \"notes\": \"无公开 API，需通过浏览器打开页面后下载。部分链接可能需要短信验证码验证身份。\"\n    },\n    {\n      \"domain\": \"dzsd.hbfy.gov.cn\",\n      \"canonical_domain\": \"dzsd.hbfy.gov.cn\",\n      \"description\": \"湖北电子送达平台（限湖北地区法院）\",\n      \"pattern\": \"https?://[^\\\\s/]+/(?:hb/msg=[a-zA-Z0-9]+|sfsddz\\\\b)\",\n      \"required_params\": [],\n      \"param_extract\": \"免账号模式：从 URL 路径提取 msg 参数值；账号模式：从短信正文提取账号和默认密码\",\n      \"download_strategy\": \"browser_only\",\n      \"api\": {\n        \"public_mode\": {\n          \"endpoint\": \"http://dzsd.hbfy.gov.cn/delimobile/tDeliSms/findSmsInfo\",\n          \"method\": \"POST\",\n          \"content_type\": \"application/json\",\n          \"request_body\": { \"msg\": \"{msg参数值}\", \"code\": \"{验证码（如需）}\", \"uuid\": \"{验证码UUID（如需）}\" },\n          \"response_fields\": {\n            \"need_captcha\": \"data.isNeedCaptcha\",\n            \"doc_list\": \"data.docList\",\n            \"doc_name\": \"data.docList[].docName\",\n            \"download_path\": \"data.docList[].downloadPath\",\n            \"pdf_path\": \"data.docList[].pdfPath\"\n          },\n          \"captcha_endpoint\": \"http://dzsd.hbfy.gov.cn/delimobile/loginCaptcha\",\n          \"notes\": \"免账号模式有 HTTP API，但可能需要验证码（OCR）。验证码获取：POST loginCaptcha，返回 data.uuid + data.img（base64）。\"\n        },\n        \"account_mode\": {\n          \"credential_patterns\": {\n            \"account\": \"账号\\\\s*([0-9]{15,20})\",\n            \"password\": \"默认密码[：:]\\\\s*([0-9A-Za-z]+)\"\n          },\n          \"notes\": \"账号模式需从短信正文提取账号和默认密码，登录需要验证码 OCR，建议使用 Playwright MCP 浏览器自动化。\"\n        }\n      },\n      \"notes\": \"湖北电子送达平台支持两种模式：1）免账号模式（短信含 /hb/msg= 链接）可直接通过 HTTP API 查询文书；2）账号模式（短信含 /sfsddz 入口）需登录后下载。两种模式都可能需要验证码。建议优先尝试免账号 HTTP API，失败后降级到 Playwright MCP。\"\n    },\n    {\n      \"domain\": \"sfpt.cdfy12368.gov.cn\",\n      \"alias_domains\": [\"171.106.48.55:28083\"],\n      \"description\": \"司法送达网（全国法院司法送达平台）\",\n      \"pattern\": \"https?://[^\\\\s/]+/sfsdw//r/[a-zA-Z0-9]+\",\n      \"required_params\": [],\n      \"param_extract\": \"从短信正文提取验证码（验证码[：:]\\\\s*(\\\\w{4,6})），或使用案件关联律师手机号后6位作为验证码。无 URL 参数。\",\n      \"download_strategy\": \"browser_only\",\n      \"api\": null,\n      \"verification\": {\n        \"modes\": [\n          {\n            \"type\": \"phone_tail\",\n            \"description\": \"手机尾号后6位验证（优先）\",\n            \"source\": \"从案件分配信息中获取律师手机号，取后6位\"\n          },\n          {\n            \"type\": \"sms_code\",\n            \"pattern\": \"验证码[：:]\\\\s*(\\\\w{4,6})\",\n            \"description\": \"从短信正文中提取验证码\"\n          }\n        ]\n      },\n      \"browser_flow\": {\n        \"description\": \"纯 Playwright 流程（无 API 可用，所有 POST 请求经 TDHCryptoUtil 加密）\",\n        \"steps\": [\n          \"browser_navigate → 打开短信中的 SFDW 链接\",\n          \"页面自动重定向到 pc.html?tdhParams=xxx\",\n          \"browser_snapshot → 查看验证码输入页面（input#checkCode）\",\n          \"输入验证码（优先手机尾号后6位，其次短信验证码）\",\n          \"browser_evaluate → 调用 Vue app.checkYzm() 触发验证\",\n          \"验证通过后 browser_evaluate → 获取 app.$data.wsList（文书列表）\",\n          \"遍历 wsList，逐个调用 downloadFile(app, ws) 下载文书\",\n          \"保存到 /tmp/court-sms-staging/\"\n        ]\n      },\n      \"notes\": \"司法送达网所有 POST 请求使用 TDHCryptoUtil 加密，无法通过 HTTP API 下载，只能使用纯 Playwright 流程。广西实例（171.106.48.55:28083）路由到同一平台，下载流程相同。wsList 每项包含 wjmc（文件名）、wjgs（格式）、sdjzwjid（文件ID）。\"\n    }\n  ],\n  \"case_number_pattern\": \"[（(〔\\\\[]\\\\d{4}[）)\\\\]〕]\\\\s*[\\\\u4e00-\\\\u9fa5]{1,10}\\\\d+[\\\\u4e00-\\\\u9fa5]{1,5}\\\\d+号?\",\n  \"case_number_examples\": [\n    \"（2025）苏0981民初1234号\",\n    \"(2024)粤0604执保5678号\",\n    \"〔2025〕京0105民初901号\"\n  ],\n  \"sms_type_keywords\": {\n    \"document_delivery\": [\"文书送达\", \"请查收\", \"查收文书\", \"下载文书\", \"送达文书\", \"案件文书\", \"受理通知书\", \"缴费通知书\", \"告知书\", \"廉政监督卡\"],\n    \"filing_notification\": [\"已立案\", \"立案通知\", \"受理案件\", \"案件受理\"],\n    \"info_notification\": [\"开庭时间\", \"延期\", \"取消\", \"变更\", \"提醒\"]\n  },\n  \"document_titles\": {\n    \"受理案件通知书\": \"受理案件通知书\",\n    \"应诉通知书\": \"应诉通知书\",\n    \"传票\": \"传票\",\n    \"开庭传票\": \"传票\",\n    \"举证通知书\": \"举证通知书\",\n    \"判决书\": \"判决书\",\n    \"民事判决书\": \"一审判决书\",\n    \"裁定书\": \"裁定书\",\n    \"调解书\": \"调解书\",\n    \"执行通知书\": \"执行通知书\",\n    \"诉讼权利义务告知书\": \"诉讼权利义务告知书\",\n    \"诉讼费用交费通知书\": \"诉讼费用交费通知书\",\n    \"廉政监督卡\": \"廉政监督卡\",\n    \"诉讼材料提交告知书\": \"诉讼材料提交告知书\",\n    \"出庭通知书\": \"出庭通知书\",\n    \"合议庭组成人员通知书\": \"合议庭组成人员通知书\",\n    \"举证期限通知书\": \"举证期限通知书\",\n    \"转换程序通知书\": \"转换程序通知书\",\n    \"参加诉讼通知书\": \"参加诉讼通知书\"\n  },\n  \"sent_time_extraction\": {\n    \"_doc\": \"送达时间提取规则，用于计算上诉期限等关键日期\",\n    \"api_field\": \"dt_cjsj\",\n    \"api_field_description\": \"送达平台 API 响应中的创建时间字段，即送达记录创建时间（北京时间）\",\n    \"patterns\": [\n      {\n        \"type\": \"sms_gateway\",\n        \"description\": \"短信网关时间（部分手机短信显示）\",\n        \"regex\": \"(?:发送|时间)[：:]?\\\\s*(\\\\d{4}[-/年]\\\\d{1,2}[-/月]\\\\d{1,2}[日]?\\\\s+\\\\d{1,2}[时:]?\\\\d{0,2})\",\n        \"format\": \"yyyy-MM-dd HH:mm\"\n      }\n    ]\n  },\n  \"appeal_calculation\": {\n    \"_doc\": \"上诉期限计算规则，不同案件类型上诉期限不同\",\n    \"first_instance_civil_judgment\": {\n      \"deadline_days\": 15,\n      \"description\": \"民事一审判决：送达后15天\",\n      \"document_types\": [\"一审判决书\", \"民事判决书\", \"判决书\"]\n    },\n    \"first_instance_civil_ruling\": {\n      \"deadline_days\": 10,\n      \"description\": \"民事裁定：送达后10天\",\n      \"document_types\": [\"裁定书\"]\n    },\n    \"first_instance_administrative\": {\n      \"deadline_days\": 15,\n      \"description\": \"行政判决：送达后15天\",\n      \"document_types\": [\"行政判决书\"]\n    },\n    \"first_instance_criminal_judgment\": {\n      \"deadline_days\": 10,\n      \"description\": \"刑事判决：送达后10天\",\n      \"document_types\": [\"刑事判决书\"]\n    },\n    \"first_instance_criminal_ruling\": {\n      \"deadline_days\": 5,\n      \"description\": \"刑事裁定：送达后5天\",\n      \"document_types\": [\"刑事裁定书\"]\n    }\n  },\n  \"party_extraction\": {\n    \"company_patterns\": [\n      \"[\\\\u4e00-\\\\u9fa5]{2,30}(?:有限责任公司|股份有限公司)\",\n      \"[\\\\u4e00-\\\\u9fa5]{2,20}有限公司\",\n      \"[\\\\u4e00-\\\\u9fa5]{2,20}(?:集团|企业)\"\n    ],\n    \"versus_patterns\": [\n      \"{company}与{company}\",\n      \"{company}与{person}\",\n      \"{person}与{company}\",\n      \"{person}与{person}\",\n      \"{person}诉{person}\",\n      \"{person}诉{company}\"\n    ],\n    \"role_prefixes\": [\"原告\", \"被告\", \"申请人\", \"被申请人\", \"上诉人\", \"被上诉人\", \"申请执行人\", \"被执行人\", \"第三人\"],\n    \"exclude_keywords\": [\n      \"法院\", \"人民法院\", \"书记员\", \"法官\", \"审判员\", \"执行员\",\n      \"系统\", \"平台\", \"服务\", \"通知\", \"短信\", \"案件\", \"纠纷\", \"争议\",\n      \"你好\", \"收到\", \"查收\", \"下载\", \"链接\", \"请于\", \"联系\"\n    ]\n  },\n  \"rename_fallback\": {\n    \"_doc\": \"当文书标题无法识别时的回退策略\",\n    \"strategy\": \"use_original_filename\",\n    \"description\": \"优先使用下载时的原始文件名（去除扩展名），而非默认为'未知文书'\",\n    \"fallback_title\": \"未知文书\"\n  },\n  \"file_naming\": {\n    \"format\": \"{title}（{case_name}）_{YYYYMMDD}收.pdf\",\n    \"example\": \"受理通知书（张三与李四合同纠纷）_20260404收.pdf\",\n    \"target_directory\": null,\n    \"conflict_suffix\": \"_2\"\n  },\n  \"post_processing\": {\n    \"_doc\": \"PDF 后处理：检测拆分文件并合并 + 精简文件名。不默认启用，仅在检测到拆分时提示用户。合并偏好见 user-preferences.json。\",\n    \"trigger\": {\n      \"description\": \"扫描归档目录中的 PDF 文件名，按文书类型分组。任一组文件数 > 3 时触发提示。\",\n      \"group_rules\": [\n        \"证据类：文件名以'证据'开头，按编号分组（证据1、证据2、证据3…）\",\n        \"其他文书：按文书类型分组（传票、起诉状、应诉通知书…）\"\n      ],\n      \"threshold\": 3\n    },\n    \"preferences_file\": \"config/user-preferences.json\",\n    \"preferences_example\": \"config/user-preferences.example.json\",\n    \"default_merge_strategy\": \"per_evidence\",\n    \"user_prompt\": {\n      \"description\": \"检测到拆分文件时，使用 AskUserQuestion 提示用户\",\n      \"options\": [\n        \"是，合并所有 — 按偏好设置合并并重命名\",\n        \"让我选择 — 逐个确认哪些需要合并\",\n        \"跳过 — 不处理\"\n      ]\n    }\n  }\n}\n\nFile v2.2.2:CHANGELOG.md\n\n# 变更日志\n\n本项目的所有重要变更都将记录在此文件。\n\n## [1.5.0] - 2026-04-15\n\n### 新增\n\n- **司法送达网平台支持**：新增 `sfpt.cdfy12368.gov.cn`（司法送达网）的链接识别和文书下载\n  - 纯 Playwright 下载流程：所有 POST 请求使用 TDHCryptoUtil 加密，无法通过 HTTP API 下载\n  - 验证码双模式：优先手机尾号后6位（从案件分配中获取律师手机号），其次从短信正文提取验证码（`验证码[：:]\\s*(\\w{4,6})`）\n  - 广西实例支持：`171.106.48.55:28083` 域名路由到同一 SFDW 平台\n  - `sms-patterns.json` 新增 sfdw 平台配置段（含 verification、browser_flow 字段）\n- **同构异域名支持**：所有平台链接正则从硬编码域名改为通用主机匹配（`[^\\s/]+`），通过 URL 路径特征识别平台而非域名\n  - zxfw: `https?://[^\\s/]+/zxfw/#/pagesAjkj/app/wssd/index?...`\n  - gdems: `https?://[^\\s/]+/v3/dzsd/[a-zA-Z0-9]+`\n  - jysd: `https?://[^\\s/]+/sd?key=[a-zA-Z0-9_\\-]+`\n  - hbfy: `https?://[^\\s/]+/(?:hb/msg=[a-zA-Z0-9]+|sfsddz\\b)`\n  - 新增 `canonical_domain` 字段保留已知主域名用于 API 调用\n- **平台支持扩展至 5 个**：全国法院统一送达（zxfw）、广东电子送达（gdems）、集约送达（jysd）、湖北电子送达（hbfy）、司法送达网（sfdw）\n- SKILL.md 新增 SFDW 下载流程说明（纯 Playwright + 验证码双模式 + 广西实例）\n- SKILL.md 新增 SFDW 短信格式示例\n\n### 改进\n\n- **文书重命名回退**：当文书标题无法识别时，优先使用原始文件名（去除扩展名），而非直接默认为\"未知文书\"\n- `sms-patterns.json` 新增 `rename_fallback` 顶层配置段\n\n### 引用\n\n- 上游参考：[FachuanHybridSystem][fachuan-repo] → `sfdw_scraper.py`（司法送达网纯 Playwright 下载逻辑）、`sms_parser_service.py`（同构异域名正则更新）、`jysd_scraper.py`（手机号验证策略参考）\n\n## [1.4.0] - 2026-04-10\n\n### 新增\n\n- **湖北电子送达平台支持**：新增 `dzsd.hbfy.gov.cn`（湖北法院）的链接识别和文书下载\n  - 免账号模式：识别 `/hb/msg=xxx` 链接，支持 HTTP API 直连下载（`POST /delimobile/tDeliSms/findSmsInfo`），需验证码时降级到浏览器\n  - 账号模式：识别 `/sfsddz` 入口链接，从短信正文提取账号（`账号\\s*(\\d{15,20})`）和默认密码（`默认密码[：:]\\s*([0-9A-Za-z]+)`）\n  - 新增 `sms-patterns.json` 中的 hbfy 平台配置段（含免账号/账号两种模式的 API 信息和凭证提取正则）\n- **平台支持扩展至 4 个**：全国法院统一送达（zxfw）、广东电子送达（gdems）、集约送达（jysd）、湖北电子送达（hbfy）\n- SKILL.md 新增湖北平台下载流程说明（免账号 HTTP API + 账号模式浏览器自动化）\n- SKILL.md 新增湖北短信格式示例（免账号模式和账号模式两种）\n\n### 引用\n\n- 上游参考：[FachuanHybridSystem][fachuan-repo] → `sms_parser_service.py`（短信解析新增 hbfy 正则）、`hbfy_scraper.py`（湖北平台完整下载逻辑）\n\n[fachuan-repo]: https://github.com/Lawyer-ray/FachuanHybridSystem\n\n### 新增\n\n- **送达时间检测（P0）**：从 zxfw API 响应的 `dt_cjsj` 字段提取送达记录创建时间，作为 sent_at 使用，无需从 PDF 解析\n- **上诉期限自动计算（P1）**：识别判决书/裁定书时，根据送达时间自动计算上诉截止日期\n  - 民事一审判决：送达后15天\n  - 民事裁定：送达后10天\n  - 行政判决：送达后15天\n  - 刑事判决：送达后10日\n  - 刑事裁定：送达后5日\n- **归档 JSON 新增字段**：`document.type`、`document.sent_at`、`document.appeal_deadline`、`document.appeal_days_remaining`\n- **归档 JSON 完整保存 API 响应**：将 zxfw API 的完整响应（c_fymc、c_fybh、dt_cjsj、documents 数组）存入 `download.api_response`\n- **汇报格式新增**：上诉期限展示区块（第四部分），格式为 `⏰ 上诉期限提醒`\n- **sms-patterns.json 新增**：`sent_time_extraction`（送达时间提取规则）、`appeal_calculation`（上诉期限计算规则）\n\n### 引用\n\n对应 GitHub Issue：https://github.com/cat-xierluo/legal-skills/issues/10\n\n## [1.2.1] - 2026-04-05\n\n### 新增\n\n- 两种合并策略可切换：`per_evidence`（按编号分别合并，默认）和 `unified`（统一合并为原告证据.pdf + PDF 书签）\n- 页面尺寸标准化：合并 PDF 时自动将所有页面统一为 A4，保持原始方向（纵向→A4 纵向，横向→A4 横向），等比缩放居中放置\n- PDF 书签：unified 策略下自动添加书签，格式为「证据N：标题」，支持点击跳转\n- 重命名规则：精简文件名，去除括号内当事人信息、日期后缀、平台标记等冗余内容\n\n## [1.2.0] - 2026-04-05\n\n### 新增\n\n- PDF 后处理功能（第五步，可选）：归档完成后自动检测拆分文件，提示用户是否合并 + 重命名\n- 触发条件：扫描归档目录，按文书类型分组，任一组文件数 > 3 时弹出提示\n- 用户偏好系统：新增 `config/user-preferences.json`（含 `config/user-preferences.example.json` 模板），支持自定义合并策略和重命名规则\n- 偏好文件按项目约定放入 `config/` 目录（`.example` 入 git，实际配置被 gitignore 忽略），与技能仓库规范保持一致\n- `references/sms-patterns.json` 新增 `post_processing` 配置段（触发阈值、偏好文件路径指向 `config/`）\n- 用户确认交互：AskUserQuestion 三选一（合并所有 / 逐个选择 / 跳过）\n\n## [1.1.2] - 2026-04-05\n\n### 新增\n\n- 归档汇报格式拆分到 `references/report-format.md`：三段式结构（归档确认 → 文书清单 → 传票特别提醒），SKILL.md 只保留引用\n- 当事人提取优先级明确：文书内容（起诉状/传票）> API 返回 > 短信文本；短信中的称呼仅为接收人，不作为当事人\n\n### 改进\n\n- 归档目录策略：未找到匹配案件时自动在桌面新建 `{原告}诉{被告} {案由}/`（内含 10 个标准子目录），不询问用户`（早期版本策略已废弃，以 SKILL.md 核心逻辑为准）`\n- 传票提醒在汇报末尾以 ⚠️ 高亮，包含开庭时间（追加星期几）、地点、审理程序\n\n## [1.1.1] - 2026-04-05\n\n### 改进\n\n- 基础文书解析：下载后提取 PDF 首页文本，快速识别传票（开庭时间/地点）、通知书（缴费期限）、起诉状（案由/当事人）等关键信息并告知用户\n- 归档格式拆分到 `references/archive-format.md`，SKILL.md 只保留引用\n- 收紧功能描述至实际范围：移除案件信息更新、复杂案件匹配、日程提醒等未实现功能\n- frontmatter description 去除 Playwright 硆名实现细节\n- CHANGELOG 措辞修正：去除\"AI 自然语言理解\"和\"替代正则解析\"的说法，正则规则仍在 `sms-patterns.json` 中配合使用\n- 新增 Playwright 安装指引（CLI 和 MCP 两种方式）\n- 短信类型分类表简化，仅保留展示解析结果\n\n## [1.1.0] - 2026-04-04\n\n### 改进\n\n- 下载策略改为三层回退：curl API 直连（优先）→ Playwright CLI → Playwright MCP\n- 实测确认 zxfw 后端 API（`getWsListBySdbhNew`）可无头调用，无需浏览器即可下载全部文书\n- 将 API 端点、请求格式、响应字段写入 `references/sms-patterns.json`，后续同类型短信直接走 curl\n- 去除 SKILL.md 中\"执行者\"写法，保持 agent 无关性\n- frontmatter 规范化：description 改为第三人称，新增 license 字段（MIT），去除关键词堆砌\n- 触发方式从独立章节合并到功能概述，用示例替代关键词列表\n- 归档机制从 Markdown 改为结构化 JSON（`archive/YYYYMMDD_HHMMSS_{案号后4位}.json`），记录短信原文、解析结果、下载参数、归档路径\n- 目录结构规范化：`config/sms-patterns.json` 移入 `references/`，新增 `archive/.gitkeep`\n- 补充 CHANGELOG 1.0.0 的设计缘由和思路演进\n- 新增 LICENSE.txt（MIT）\n\n### 新增\n\n- 多平台送达链接支持：除 zxfw 外，新增 `sd.gdems.com`（广东电子送达）和 `jysd.10102368.com`（集约送达）的链接识别\n- 平台分级下载策略：zxfw 走 curl API 直连，gdems/jysd 无公开 API，直接回退到浏览器自动化\n- `sms-patterns.json` 新增 `download_strategy` 字段，区分 `api_first`（有 API）和 `browser_only`（需浏览器）\n- 基础文书解析：下载后提取 PDF 首页文本，快速识别传票（开庭时间/地点）、通知书（缴费期限）、起诉状（案由/当事人）等关键信息\n- 归档格式拆分到 `references/archive-format.md`，SKILL.md 只保留引用\n- 收紧功能描述至实际范围：移除案件信息更新、复杂案件匹配等未实现功能\n\n## [1.0.0] - 2026-04-04\n\n### 设计缘由\n\n- 律师日常频繁收到法院送达短信（传票、通知书等），需要手动从全国法院送达平台下载文书并归档到案件目录\n- 手动操作流程繁琐：复制链接 → 打开网页 → 下载 PDF → 重命名 → 移入目录 → 更新案件记录\n- 参考 FachuanHybridSystem 的短信解析设计思路，将其核心逻辑转化为 Skill 格式，结合 agent 的自然语言理解能力与结构化正则规则（`references/sms-patterns.json`）进行短信解析\n\n### 思路演进\n\n1. 调研阶段：发现 FachuanHybridSystem 已实现短信解析 → 下载 → 归档的完整流水线\n2. 适配阶段：将 Python/Django 服务架构映射为 Skill 工作流（agent 自然语言理解 + 结构化规则），无需部署额外服务\n3. 当前阶段：以 JSON 配置参考文件替代硬编码规则，保持技能的可维护性和可扩展性\n\n### 新增\n\n- 法院短信智能分类（文书送达 / 信息通知 / 立案通知）\n- 案号自动提取，支持多种标准格式（圆括号、方括号、六角括号）\n- 当事人名称提取（公司名、诉讼对峙模式、角色前缀）\n- 从 zxfw.court.gov.cn 链接中提取下载参数（qdbh、sdbh、sdsin）\n- 三级案件匹配策略（案号精确 → 当事人双向 → 特征筛选）\n- Playwright 两级回退下载（API 拦截 → 页面点击）\n- 文书自动重命名并归档到案件目录\n- 短信原文归档到 archive/\n- 解析规则可配置化（`references/sms-patterns.json`）\n\n### 致谢\n\n本技能参考了 [FachuanHybridSystem（法穿）](https://github.com/Lawyer-ray/FachuanHybridSystem) 中短信解析模块的设计思路和解析规则（非直接复制代码）。详见 [`references/ATTRIBUTION.md`](references/ATTRIBUTION.md)。\n\nFile v2.2.2:skill-card.md\n\n## Description: <br>\nLitigation Hub helps legal users process court SMS messages, service links, and document photos into parsed case records, archived court documents, deadline reminders, calendar entries, email notifications, and local reminder files. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[leahlu0124-creator](https://clawhub.ai/user/leahlu0124-creator) <br>\n\n### License/Terms of Use: <br>\nMIT <br>\n\n\n## Use Case: <br>\nExternal legal practitioners and legal operations users can use this skill to triage court delivery messages, download or OCR court documents, organize case files, and set litigation deadline reminders. The skill is oriented toward Chinese court document workflows and local desktop/email notification practices. <br>\n\n### Deployment Geography for Use: <br>\nChina <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill may install OCR tooling globally without explicit package pinning. <br>\nMitigation: Review the dependency path before use, preinstall and pin OCR tooling in a controlled environment, and avoid running the install flow in privileged or shared accounts. <br>\nRisk: The skill handles sensitive case data while creating persistent calendar events, scheduled tasks, emails, Desktop folders, and archive records. <br>\nMitigation: Use a controlled workspace, verify every calendar entry, scheduled task, email recipient, folder path, and archive file before relying on the output, and avoid confidential matters until the workflow is reviewed. <br>\nRisk: Unsafe command construction may affect generated shell, calendar, or reminder actions. <br>\nMitigation: Review commands before execution, prefer sanitized inputs, and confirm case names, locations, recipients, and paths before allowing the skill to create local automation. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/leahlu0124-creator/skills/litigation-hub) <br>\n- [Project homepage](https://github.com/leahlu0124-creator/litigation-hub) <br>\n- [Attribution](references/ATTRIBUTION.md) <br>\n- [Archive format](references/archive-format.md) <br>\n- [Deadline rules](references/deadline-rules.json) <br>\n- [Report format](references/report-format.md) <br>\n- [SMS patterns](references/sms-patterns.json) <br>\n- [China holidays](references/china-holidays.json) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance] <br>\n**Output Format:** [Markdown guidance with command snippets, JSON records, generated files, calendar/email reminder actions, and concise status reports] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [May create or update local case folders, archive JSON records, calendar events, scheduled reminders, and email reminder configuration during supported workflows.] <br>\n\n## Skill Version(s): <br>\n2.2.2 (source: server release and SKILL.md frontmatter) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nFile v2.2.2:config/case-parties.json\n\n{\n  \"cases\": {}\n}\n\nFile v2.2.2:config/case-root.json\n\n{\n  \"case_root\": \"/Users/你的用户名/项目/02-律师业务\",\n  \"configured_at\": \"2026-07-09 22:32\"\n}\n\nArchive v1.0.1: 21 files, 73972 bytes\n\nFiles: _meta.json (133b), CHANGELOG.md (10656b), config/case-parties.json (18b), config/case-root.json (106b), config/user-preferences.example.json (1439b), config/user-preferences.json (73b), LICENSE.txt (1206b), references/archive-format.md (4028b), references/ATTRIBUTION.md (2555b), references/china-holidays.json (1472b), references/deadline-rules.json (7372b), references/report-format.md (4519b), references/sms-patterns.json (12068b), scripts/court_calendar.py (29062b), scripts/court_deadline_reminder.py (20670b), scripts/court_photo_ocr.py (26459b), scripts/court_utils.py (8053b), scripts/holiday_utils.py (4336b), scripts/send_court_email.py (3304b), skill-card.md (3036b), SKILL.md (52549b)\n\nFile v1.0.1:SKILL.md\n\n---\nname: litigation-hub\nhomepage: https://github.com/cat-xierluo/legal-skills\nauthor: 陆凌燕\noriginal_author: 杨卫薪律师\nversion: 2.2.0\nlicense: MIT\ndescription: 诉讼信息中枢系统。接收法院短信、送达链接、纸质文书照片，自动 OCR 识别、下载、归档、归类到标准案卷目录。基于 12 种期限规则库自动匹配，通过系统日历 + QQ 邮件（微信送达）+ 本机电脑提醒（系统通知 + 桌面 Markdown 文件）三条线提醒，支持 macOS / Windows / Linux 全平台。\nslug: litigation-hub\ndisplayName: litigation-hub\n---\n\n# litigation-hub · 诉讼信息中枢系统\n\n## 功能概述\n\n处理法院文书的完整流程：**粘贴短信 / 发链接 / 上传照片 → 解析内容（OCR 或文本）→ 匹配案件 → 下载/归档文书 → 开庭日历提醒（传票自动写入系统日历 + 本机电脑提醒 + QQ 邮件（微信送达））**。\n\n## 首次使用：案卷目录设置（必须执行）\n\n**当用户第一次使用本技能时，必须先确认案卷存放目录。**\n\n> ⚠️ 如果没有事先确认目录，后续搜遍整台电脑都找不到案卷，效率极低。这一步一劳永逸。\n\n### 判断是否首次使用\n\n检查是否已有缓存的案卷目录记录：\n\n1. 先读取 `config/case-root.json`，检查 `case_root` 字段是否为有效路径\n2. 如果文件不存在或 `case_root` 为空 → **首次使用**，执行下方交互流程\n3. 如果 `case_root` 已配置且路径存在 → 跳过，直接进入正式工作流\n\n### 首次使用交互流程\n\n**询问格式**：\n\n```\n您好！我是诉讼中枢系统。在开始处理法院文书之前，我需要确认一件事：\n\n您平时把案卷资料存在哪个文件夹？\n\n常见的例子供参考：\n  · macOS   → /Users/你的名字/项目/律师业务/案件/\n  · Windows → C:\\Users\\你的名字\\Documents\\律师业务\\案件\\\n  · Linux   → /home/你的名字/项目/律师业务/案件/\n\n💡 最简单的方式：打开你的案卷文件夹，把地址栏里的路径直接复制粘贴给我就行。\n  · macOS：在访达里选中文件夹 → 按 ⌘+⌥+C (Cmd+Option+C) → 路径就复制好了，直接粘贴过来\n        （或者：访达菜单 → 显示 → 显示路径栏，然后在底部路径栏上右键 → 拷贝路径）\n  · Windows：在资源管理器打开文件夹 → 点一下顶部地址栏 → 按住 Shift 右键空白处 → 选\"复制为路径\"（或直接 Ctrl+Shift+C）\n        （如果不行，就点地址栏后 Ctrl+C 复制）\n\n请把路径发给我：\n```\n\n**用户回复后**：\n\n1. 验证路径是否存在（`ls` / `dir`），如果不存在，创建之\n2. 将路径写入 `config/case-root.json`：\n   ```json\n   {\"case_root\": \"/Users/xxx/项目/02-律师业务\", \"configured_at\": \"YYYY-MM-DD HH:MM\"}\n   ```\n3. 显示确认信息：\n   ```\n   ✅ 已记录案卷目录：/Users/xxx/项目/02-律师业务\n   以后所有法院文书都会在这个目录下匹配和归档。\n   ```\n4. 随后继续执行正式工作流\n\n### 后续使用\n\n- 每次技能触发时，从 `config/case-root.json` 读取路径，**仅在该目录下搜索已有案卷**；\n- **新建案卷始终放在桌面**，与 `case_root` 无关。桌面上的新案卷用户一眼就能看到，整理后自行移入搜索目录即可。\n- 如果用户搬移了案卷目录，用户说\"更新案卷目录\"即可触发重新设置\n\n---\n\n支持三种触发方式：\n\n**方式一：粘贴短信原文**\n\n```text\n收到法院短信，内容如下：\n【xx市人民法院】张三，您好！您有（2025）苏0981民初1234号案件文书送达，请点击链接查收：https://zxfw.court.gov.cn/zxfw/#/pagesAjkj/app/wssd/index?qdbh=DEMO1&sdbh=DEMO2&sdsin=DEMO3\n```\n\n**方式二：直接发送送达链接**\n\n用户可能直接粘贴送达链接（非完整短信文本），此时跳过短信文本解析，直接从 URL 中提取 `qdbh`、`sdbh`、`sdsin` 参数，进入第三步下载流程。\n\n```text\nhttps://zxfw.court.gov.cn/zxfw/#/pagesAjkj/app/wssd/index?qdbh=xxx&sdbh=xxx&sdsin=xxx\n```\n\n**方式三：上传纸质文书照片 / 扫描件**\n\n适用于刑事律师收到纸质传票、判决书、通知书的场景。上传照片（PNG/JPG），MinerU OCR 字符级精度提取文字，再解析为结构化字段。\n\n```text\n上传：传票照片.jpg\n→ MinerU OCR（flash-extract）→ 解析 → 复核 → 归档 + 日历提醒\n```\n\n> 依赖 `mineru-open-api`（`npm install -g mineru-open-api`），首次使用自动安装，用户无感知。\n\n## 短信类型分类\n\n| 类型 | 特征 | 含下载链接 | 处理方式 |\n| --- | --- | --- | --- |\n| 文书送达 | 含送达平台链接 + 案号 | 是 | 下载文书并归档到案件目录 |\n| 立案通知 | 含\"已立案\"等关键词 | 可能有 | 展示解析结果 |\n| 信息通知 | 无链接，纯信息 | 否 | 展示解析结果 |\n\n**支持的送达平台**：`zxfw.court.gov.cn`（全国）、`sd.gdems.com`（广东）、`jysd.10102368.com`（集约送达）、`dzsd.hbfy.gov.cn`（湖北）、`sfpt.cdfy12368.gov.cn`（司法送达网）。同一平台可能使用不同域名（同构异域名），通过 URL 路径特征识别平台。详见 `references/sms-patterns.json`。\n\n---\n\n## 工作流（四步）\n\n### 第一步：输入解析\n\n1. 读取 `references/sms-patterns.json` 作为解析参考\n2. **判断输入类型**：\n   - **完整短信**：包含法院签名（如 `【xx法院】`）+ 正文 + 链接 → 完整解析流程\n   - **纯链接**：用户直接发送送达 URL（如 `https://zxfw.court.gov.cn/...?qdbh=xxx&sdbh=xxx&sdsin=xxx`）→ 跳过短信文本解析，直接从 URL 提取参数，进入第三步下载。案号、当事人等信息在下载文书后从文书内容中提取。\n3. 对用户粘贴的短信文本进行分析（纯链接输入跳过此步）：\n\n**a) 短信分类**：根据关键词判断类型\n- 文书送达：包含 zxfw.court.gov.cn 链接\n- 立案通知：包含\"已立案\"、\"立案通知\"等\n- 信息通知：其他\n\n**b) 案号提取**：使用正则 `[（(〔[]\\d{4}[）)〕]]` 匹配标准案号格式\n\n标准案号格式示例：\n- `（2025）苏0981民初1234号`\n- `(2024)粤0604执保5678号`\n- `〔2025〕京0105民初901号`\n\n**c) 当事人提取**：从短信文本初步识别，最终以文书内容为准\n- **注意**：短信中的称呼（如\"张三，您好\"）仅为短信接收人，不作为案件当事人\n- 公司名称：`xx有限责任公司`、`xx有限公司`、`xx股份有限公司`\n- 诉讼对峙：`A与B`、`A诉B`、`原告A 被告B`\n- 角色前缀：`原告：xxx`、`被告：xxx` 等\n- 下载文书后，以起诉状、传票中的当事人信息为准，覆盖短信阶段的初步判断\n\n**d) 下载链接提取**：识别短信中的送达平台链接并提取参数\n\n| 平台 | 域名 | 下载方式 | 提取参数 |\n|------|------|----------|----------|\n| 全国法院统一送达平台 | `zxfw.court.gov.cn` | curl API 直连 | qdbh, sdbh, sdsin |\n| 广东法院电子送达 | `sd.gdems.com` | 浏览器自动化 | 路径中的送达标识码 |\n| 集约送达平台 | `jysd.10102368.com` | 浏览器自动化 | key |\n| 湖北电子送达 | `dzsd.hbfy.gov.cn` | HTTP API（免账号）/ 浏览器自动化（账号模式） | 免账号：msg；账号模式：账号+密码从正文提取 |\n| 司法送达网 | `sfpt.cdfy12368.gov.cn` | 纯 Playwright（无 API） | 验证码（手机尾号后6位 / 短信验证码） |\n\n**e) 发送时间提取（P0）**：从送达平台 API 响应中提取发送时间，用于后续上诉期限计算\n- **优先来源**：zxfw API 响应中的 `dt_cjsj` 字段（送达记录创建时间，ISO 8601 格式）\n- 短信网关时间：部分手机短信会显示发送时间，匹配 `发送：YYYY-MM-DD HH:mm` 格式\n- 如果无法提取送达时间，展示\"送达时间待确认\"，不阻塞后续流程\n- 记录到归档 JSON 的 `document.sent_at` 字段\n\n> **排除列表**：法院名称、法官姓名、地名、法律术语等不应作为当事人提取。详见 `sms-patterns.json` → `party_extraction.exclude_keywords`。\n\n**输出格式**（向用户展示）：\n\n```text\n📋 短信解析结果：\n- 类型：文书送达\n- 案号：（2025）苏0981民初1234号\n- 当事人：张三、xx有限公司\n- 下载链接：已提取（zxfw.court.gov.cn）\n```\n\n#### 照片/扫描件输入（方式三）\n\n当用户上传的是**纸质文书照片**（传票、判决书、通知书等），而非短信或链接时：\n\n1. **MinerU OCR**：`scripts/court_photo_ocr.py` 调用 `mineru-open-api flash-extract` 提取文字\n   ```bash\n   python3 scripts/court_photo_ocr.py /path/to/传票照片.jpg\n   ```\n   > MinerU 基于 PaddleOCR，字符级精度。首次运行自动安装 `npm install -g mineru-open-api`，用户无感知。\n\n2. **结构化解析**：提取的文字经正则匹配得到案号、案由、当事人、开庭时间/地点等，附带置信度标记\n\n3. **后续流程**：识别到传票/出庭通知 → 跳过下载步骤 → 归档 + 日历提醒；识别到判决书 → 计算上诉期限\n4. **自动归纳**：OCR 完成后按优先级匹配已有案卷，**但「归入已有案卷」必须经过律师确认，绝不自动写入**：\n   - 🥇 **案号匹配**：桌面文件夹名含案号（如 `(2025)苏0411民初6206号`）\n   - 🥈 **当事人姓名匹配**：桌面文件夹名含原告/被告姓名（如 `何玉-诉讼材料`）\n   - 🥉 **新建案卷**：都没匹配到 → 在桌面自动创建 `{原告}诉{被告} {案由}/`（新建不污染既有案卷，故不询问），内含 **10 个标准子目录**\n   - ⚠️ **匹配到已有案卷 → 暂停并请求律师确认**：展示匹配到的文件夹路径、命中依据（案号/姓名）、以及「同名同姓」风险提示，由律师在对话中确认后再归档；未经确认绝不写入。确认后通过 `--to-folder <路径>` 重新运行脚本完成归档。\n\n   标准案卷目录结构（**新建案卷时用这些固定名称，不得自行编造**）：\n   ```\n   {原告}诉{被告} {案由}/\n   ├── 01 法院送达文书/     ← 传票、判决书、裁定书、通知书等所有法院来源材料\n   ├── 02 我方提交资料/     ← 我方向法院递交的材料\n   ├── 03 对方提交资料/     ← 对方通过法院送达的材料\n   ├── 04 案件原始材料/     ← 从当事人收到的原始材料\n   ├── 05 律师工作文本/     ← 法律意见、庭审提纲等\n   ├── 06 委托签署材料/     ← 委托合同、授权书等\n   ├── 07 邮件收寄记录/     ← 邮件往来记录\n   ├── 08 法规类案检索/     ← 法律法规、类案报告\n   ├── 09 法院庭审笔录/     ← 庭审、听证笔录\n   └── 10 案件保全资料/     ← 财产、证据保全文书\n   ```\n   - 法院文书（判决书/裁定书/传票/通知书等）归入 `01 法院送达文书/` 对应子目录（新建案卷时自动归入；匹配到已有案卷时，需律师确认后归入）\n   - 照片原文件和 OCR 识别文本均保存到案卷下对应文书类型子目录\n\n**输出格式**（向用户展示）：\n\n```text\n📷 照片识别结果：\n- 类型：传票\n- 案号：（2025）沪01刑初1234号\n- 当事人：被告人张三\n- 开庭时间：2026-05-07 09:30\n- 地点：上海市第一中级人民法院 第5法庭\n```\n\n> 如 OCR 结果不完整（手写批注、模糊、遮挡），提示用户手动补充关键字段。\n\n### 第二步：确定归档目录\n\n1. **扫描桌面**：识别目录结构，找到与短信案号或当事人匹配的案件目录\n2. **查找归档子目录**：在匹配到的案件目录下，查找法院文书相关的子目录（如 `01*`、`法院送达`、`court` 等）\n3. **匹配结果分两种情况**：\n   - **未找到匹配案件** → **自动在桌面新建** `{原告}诉{被告} {案由}/`（新建不污染既有案卷，故不询问用户），随后直接归档\n   - **找到匹配案件** → **不自动归档**，立即向律师展示：①匹配到的文件夹路径 ②命中依据（案号/姓名）③同名同姓误归风险提示，请律师确认后再归档。确认后带 `--to-folder <路径>` 重新运行脚本完成归档\n\n#### 确认代理方（首次接触案件时）\n\n> ⛔ **每个案件第一次处理时必须确认代理方，否则后续无法区分「我方提交资料」和「对方提交资料」。**\n\n当新建案卷或首次匹配到已有案卷时：\n\n1. **读取 `config/case-parties.json`**，检查该案号是否已记录代理方：\n   - 已记录 → 直接使用，无需重复询问\n   - 未记录 → 执行下方交互\n\n2. **向用户提问**（从解析结果中提取已知当事人）：\n   ```\n   ⚖️ 案件 (2025)苏0981民初1234号，原告：张三，被告：xx有限公司。\n   请问您是代理哪一方？\n     → 原告 张三（我方）\n     → 被告 xx有限公司（我方）\n     → 暂时不确定\n   ```\n\n3. **记录答案**：写入 `config/case-parties.json`：\n   ```json\n   {\n     \"cases\": {\n       \"（2025）苏0981民初1234号\": {\n         \"represented_party\": \"原告\",\n         \"party_name\": \"张三\",\n         \"configured_at\": \"2026-07-13\"\n       }\n     }\n   }\n   ```\n\n4. **影响后续分类**：\n   - 已知代理方 → 非法院文书归档时自动区分「02 我方提交资料」vs「03 对方提交资料」\n   - 选择\"暂时不确定\" → 暂不区分，后续可通过\"更新代理方 (2025)苏0981民初1234号 原告\"手动补充\n\n### 第三步：文书下载\n\n> **平台判断**：根据第一步识别的链接域名，选择下载策略。\n> - `zxfw.court.gov.cn` → 方案一（API 直连）→ 方案二 → 方案三\n> - `sd.gdems.com` 或 `jysd.10102368.com` → 跳过方案一，直接方案二 → 方案三\n> - `dzsd.hbfy.gov.cn` → 湖北专属流程（见下方）\n> - `sfpt.cdfy12368.gov.cn`（含广西实例 `171.106.48.55:28083`）→ SFDW 专属流程（见下方）\n> - 未知域名但 URL 路径匹配已知平台特征 → 按路径识别平台（同构异域名支持）\n> - 完全无法识别 → 提示用户提供链接信息\n>\n> **⛔ 降级铁律**：严格串行，禁止并行。当前方案成功即停止，绝不降级。禁止\"双保险\"并行尝试多个方案。\n\n#### 依赖\n\n| 依赖 | 用途 | 适用方案 | 安装方式 |\n|------|------|----------|----------|\n| `curl` | API 下载 | 方案一 | macOS/Linux 预装 |\n| `jq` | JSON 解析（可选） | 方案一 | `brew install jq` |\n| Playwright | 浏览器自动化 | 方案二/三 | 见下方 |\n\n**Playwright 安装指引**（仅方案二/三需要）：\n\n```bash\n# 方案二: Playwright CLI\nnpm install -g playwright\nnpx playwright install chromium\n\n# 方案三: Playwright MCP（需在 WorkBuddy 设置中配置）\n# 在 settings.json 的 mcpServers 中添加：\n# \"playwright\": { \"command\": \"npx\", \"args\": [\"@anthropic-ai/mcp-playwright\"] }\n```\n\n> **⛔ 大多数情况下不需要 Playwright**：zxfw 平台方案一直接 curl 调用 API，无需浏览器。仅 gdems/jysd 平台或**方案一失败后**才需要方案二/三。禁止在方案一执行期间同时打开浏览器。\n\n#### 方案一 — API 直连（优先）\n\n完全无头，无需浏览器。直接调用 zxfw 后端 API 获取文书下载链接，再用 curl 下载 PDF。\n\n**API 信息**：\n\n- 端点：`POST https://zxfw.court.gov.cn/yzw/yzw-zxfw-sdfw/api/v1/sdfw/getWsListBySdbhNew`\n- Content-Type：`application/json`\n- 请求体：`{ \"qdbh\": \"xxx\", \"sdbh\": \"xxx\", \"sdsin\": \"xxx\" }`（从短信 URL 提取）\n- 响应字段：`data[].c_wsmc`（文书名称）、`data[].wjlj`（OSS 签名下载链接）、`data[].c_fymc`（法院名称）\n- 无需认证、无需浏览器\n\n```bash\n# 1. 从短信 URL 提取参数（示例）\nqdbh=\"DEMO_qdbh_value\"\nsdbh=\"DEMO_sdbh_value\"\nsdsin=\"DEMO_sdsin_value\"\n\n# 2. 调用 API 获取文书列表\nmkdir -p /tmp/court-sms-staging/\nresp=$(curl -s -X POST \"https://zxfw.court.gov.cn/yzw/yzw-zxfw-sdfw/api/v1/sdfw/getWsListBySdbhNew\" \\\n  -H \"Content-Type: application/json\" \\\n  -d \"{\\\"qdbh\\\":\\\"$qdbh\\\",\\\"sdbh\\\":\\\"$sdbh\\\",\\\"sdsin\\\":\\\"$sdsin\\\"}\")\n\n# 3. 解析文书列表，逐个下载 PDF\necho \"$resp\" | jq -r '.data[] | \"\\(.c_wsmc)\\t\\(.wjlj)\"' | while IFS=$'\\t' read -r name url; do\n  curl -sL -o \"/tmp/court-sms-staging/${name}.pdf\" \"$url\"\ndone\n\n# 4. 验证下载结果\nls -lh /tmp/court-sms-staging/*.pdf\n```\n\n#### 方案二 — 无头浏览器（Playwright CLI）\n\n当方案一 API 不可用或链接过期时，用 Playwright CLI 无头模式打开页面，拦截网络请求获取下载链接。\n\n```bash\n# 需要先安装 playwright\nnpx playwright install chromium 2>/dev/null\n\n# 无头模式运行（脚本需自行编写，拦截 getWsListBySdbhNew API 响应）\nnode scripts/download_court_docs.mjs --url \"{短信链接}\" --output /tmp/court-sms-staging/\n```\n\n#### 方案三 — 交互式浏览器（Playwright MCP）\n\n当方案二不可用时（需要已配置 Playwright MCP）：\n\n```text\n1. browser_navigate → 打开短信中的 zxfw URL\n2. 等待页面加载\n3. browser_evaluate → 直接调用 fetch API 获取文书列表\n4. browser_run_code → 下载 PDF 文件到 /tmp/court-sms-staging/\n```\n\n如 API 调用未成功，改用页面交互：\n\n```text\n1. browser_snapshot → 查看当前页面结构\n2. 找到文书列表或 PDF 预览区域\n3. 定位下载按钮（可能在 iframe 内）\n4. browser_click → 点击下载\n5. 等待下载完成，保存到临时目录\n```\n\n#### 湖北平台下载流程（`dzsd.hbfy.gov.cn`）\n\n湖北电子送达平台有两种链路，根据 URL 格式自动选择：\n\n**链路一：免账号模式**（URL 含 `/hb/msg=xxx`）\n\n1. 从 URL 提取 `msg` 参数值\n2. 尝试 HTTP API 直连：\n\n```bash\nmsg=\"从URL提取的msg值\"\nmkdir -p /tmp/court-sms-staging/\n\n# 查询文书信息\nresp=$(curl -s -X POST \"http://dzsd.hbfy.gov.cn/delimobile/tDeliSms/findSmsInfo?t=$(date +%s%3N)\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Referer: http://dzsd.hbfy.gov.cn/deli-mobile-ui/\" \\\n  -d \"{\\\"msg\\\":\\\"$msg\\\"}\")\n\n# 检查是否需要验证码（data.isNeedCaptcha == \"Y\"）\n# 如需验证码或无可下载文书，降级到 Playwright MCP\n\n# 逐个下载文书\necho \"$resp\" | jq -r '.data.docList[] | \"\\(.docName)\\t\\(.downloadPath)\"' | while IFS=$'\\t' read -r name path; do\n  if [ -n \"$path\" ]; then\n    curl -sL -o \"/tmp/court-sms-staging/${name}.pdf\" \"http://dzsd.hbfy.gov.cn/delimobile${path}\"\n  fi\ndone\n```\n\n3. 如需验证码或 HTTP 失败，降级到 Playwright MCP（方案三）\n\n**链路二：账号模式**（URL 含 `/sfsddz`）\n\n1. 从短信正文提取凭证：\n   - 账号：匹配 `账号\\s*(\\d{15,20})`\n   - 默认密码：匹配 `默认密码[：:]\\s*([0-9A-Za-z]+)`\n2. 需要浏览器自动化（Playwright MCP），登录页包含验证码\n3. 登录后遍历待签收/已签收/已过期文书列表，逐个下载\n\n> **提示**：湖北平台两种模式都可能遇到验证码。免账号模式优先尝试 HTTP API，账号模式建议引导用户手动打开链接或使用 Playwright MCP。\n\n#### 司法送达网下载流程（SFDW - `sfpt.cdfy12368.gov.cn`）\n\n司法送达网所有 POST 请求使用 TDHCryptoUtil 加密，无法通过 HTTP API 下载，只能使用纯 Playwright 流程。\n\n**广西实例**：`171.106.48.55:28083` 域名下的链接路由到同一 SFDW 平台，下载流程相同。\n\n**验证码获取**（两种方式，按优先级尝试）：\n\n1. **手机尾号后6位**（优先）：从案件分配信息中获取律师手机号，取后6位作为验证码输入\n2. **短信验证码**：从短信正文中提取，匹配 `验证码[：:]\\s*(\\w{4,6})`\n\n**Playwright MCP 流程**：\n\n```text\n1. browser_navigate → 打开短信中的 SFDW 链接\n2. 等待页面自动重定向到 pc.html?tdhParams=xxx\n3. browser_snapshot → 查看验证码输入页面（input#checkCode）\n4. 输入验证码（优先手机尾号后6位，其次短信验证码）\n5. browser_evaluate → 调用 Vue app.checkYzm() 触发验证\n6. 验证通过后 browser_evaluate → 获取 app.$data.wsList（文书列表）\n7. 遍历 wsList，逐个调用 downloadFile(app, ws) 下载文书\n8. 保存到 /tmp/court-sms-staging/\n```\n\n> **提示**：如手机尾号验证失败，提示用户查看短信中的验证码并手动输入。wsList 每项包含 wjmc（文件名）、wjgs（格式）。\n\n#### 失败兜底\n\n当三级均失败时：\n\n```text\n⚠️ 自动下载失败，请手动访问以下链接下载：\n{原始链接}\n\n下载后请将文件放到对应案件目录中。\n\n我将为您创建待处理记录。\n```\n\n### 第四步：归档保存\n\n> ⚠️ **归档铁律：匹配到已有案卷必须经律师确认，绝不静默写入。** 同名同姓在中国极为普遍，错误归档会污染他人案卷，因此「找到即归档」是禁止行为。\n\n1. **确定目标目录**：\n   - 扫描桌面，匹配与案号或当事人相关的案件目录\n   - **未找到匹配案件** → **自动在桌面新建** `{原告}诉{被告} {案由}/`（安全，不询问），随后归档\n   - **找到匹配案件** → **暂停，请求律师确认**：展示文件夹路径、命中依据、同名同姓风险提示；律师确认后带 `--to-folder <路径>` 重新运行脚本，再归档到该目录\n   - 如目标目录不存在，自动创建\n2. **获取当前日期**：`date \"+%Y%m%d\"`\n3. **确定文书标题**：\n   - 优先使用 API 返回的标题\n   - 否则根据 `sms-patterns.json` 中的 `document_titles` 映射推断\n   - 最后回退到原始文件名（去除扩展名），如仍无法确定则使用 `未知文书`\n4. **构建文件名**：`{title}（{case_name}）_{YYYYMMDD}收.pdf`\n   - 示例：`受理通知书（张三与李四合同纠纷）_20260404收.pdf`\n   - 清理非法字符：`< > : \" | ? * \\ /`\n   - 如同名文件已存在，追加 `_2` 后缀\n\n### 核心规则：按送达批次打包（强制执行）\n\n> ⛔ **所有法院送达材料一律用日期子文件夹打包，不得直接散放在 `01 法院送达文书/` 根目录。**\n> 法院可能对同一案件分批发送不同文书，散放会导致批次混乱、无法区分送达时间。\n\n**哪怕是只有一份传票，也放进子文件夹里。**\n\n**文件夹命名规则**：`{命名文书}_{送达日期}送达/`\n\n- `送达日期` 取 API 响应中 `dt_cjsj` 的日期部分（如 `20260119`），或文书落款日期\n- `命名文书` 从本次送达的所有文书中选优先级最高的作为文件夹名\n\n**命名优先级**（所有文书地位并列，以下仅用于选文件夹名）：\n\n| 优先级 | 适用场景 | 文件夹名示例 |\n|--------|---------|------------|\n| 1 | 含判决书 | `一审法院判决书_20260318送达/` |\n| 2 | 含裁定书（不含判决书） | `一审法院裁定书_20260401送达/` |\n| 3 | 含传票（不含判决/裁定） | `传票_20260601送达/` |\n| 4 | 含受理案件通知书（不含以上） | `受理案件通知书_20260119送达/` |\n| 5 | 其他（举证通知、应诉通知等） | `举证通知书_20260520送达/` |\n\n**简单理解**：一堆文书里谁最\"重\"就用谁命名。传票比通知书\"重\"，判决书比传票\"重\"——仅此而已，跟文书本身的法律效力无关。 |\n\n**文件夹内文件保持 API 返回的原始文件名**，不重命名、不合并。\n\n**归档路径示例**：\n```\n海筑建设诉淮安瑞悦/01 法院送达文书/受理案件通知书_20260119送达/\n├── 受理案件通知书.pdf\n├── 交纳诉讼费用通知书.pdf\n├── 民事诉讼权利义务告知书.pdf\n└── ...\n\n孙东诉武进建工/01 法院送达文书/传票_20260601送达/\n└── 传票.pdf\n```\n\n5. **移入目标目录**：将子文件夹整体移入 `01 法院送达文书/`\n6. **写入内部记录**：保存本次处理的完整信息到**本技能目录下的 `archive/`**（即 `~/.workbuddy/skills/litigation-hub/archive/`）。格式详见 [`references/archive-format.md`](references/archive-format.md)\n7. **自动归纳到桌面案卷**（短信/链接方式同样适用）：\n   - 扫描桌面是否已有该案号的文件夹\n   - 没有 → 在桌面自动创建 `{原告}诉{被告} {案由}/`（如 `张荷玉诉耿平 被继承人债务清偿纠纷/`），再放入\n   - 有 → **不自动放入**：展示匹配结果 + 同名同姓风险提示，请律师确认；确认后带 `--to-folder <路径>` 重新运行脚本放入\n   - SMS 多文件按文件夹打包规则归纳（如 `一审法院判决书/` 子目录）\n8. **基础文书解析**：法院 PDF 通常带文字层，提取首页文本，快速识别文书类型和关键信息\n   - **传票**：提取开庭时间、地点、法庭、案号，向用户高亮提醒\n   - **通知书/告知书**：提取缴费期限、举证期限等关键日期\n   - **起诉状/答辩状**：提取案由、当事人、诉讼请求概要\n   - **判决书**：识别为一审判决书，记录文书类型，触发上诉期限计算（P1）\n   - **其他文书**：展示文书标题和法院名称\n   - 如一次下载多份文书，逐一解析，汇总为一份报告\n\n   > 深度分析（如判决书解读、合同审查）不在此技能范围内，请使用专用分析技能处理。\n\n9. **期限规则匹配（P0）**：当识别到任何有期限要求的文书时，自动查表 `references/deadline-rules.json` 匹配对应规则\n\n   规则库覆盖 **12 种文书类型**，包括：\n\n   | 分类 | 文书类型 | 期限 | 提醒策略 |\n   |------|---------|------|------\n\nArchive v1.0.0: 29 files, 83686 bytes\n\nFiles: _meta.json (133b), archive/20260405_110200_5426.json (2394b), archive/20260408_194600_5426.json (3729b), archive/20260408_test_api_fields.json (3638b), archive/20260411_court_sms.json (1650b), archive/20260412_112500_7723.json (2336b), archive/20260413_142314_5011.json (3382b), archive/20260707_173900_6206.json (1035b), archive/20260709_222633_0790.json (2186b), archive/20260709_224152_4801.json (996b), CHANGELOG.md (10656b), config/case-root.json (90b), config/user-preferences.example.json (1439b), config/user-preferences.json (73b), LICENSE.txt (1206b), references/archive-format.md (4028b), references/ATTRIBUTION.md (2555b), references/china-holidays.json (1472b), references/deadline-rules.json (7372b), references/report-format.md (4511b), references/sms-patterns.json (12068b), scripts/court_calendar.py (29054b), scripts/court_deadline_reminder.py (20666b), scripts/court_photo_ocr.py (26459b), scripts/court_utils.py (8053b), scripts/holiday_utils.py (4336b), scripts/send_court_email.py (3300b), skill-card.md (3187b), SKILL.md (49174b)","readmeExcerpt":"Skill: Litigation Hub Owner: leahlu0124-creator Summary: 诉讼信息中枢系统。接收法院短信、送达链接、纸质文书照片，自动 OCR 识别、下载、归档、归类到标准案卷目录。基于 12 种期限规则库自动匹配，通过系统日历 + QQ 邮件（微信送达）+ 本机电脑提醒（系统通知 + 桌面 Markdown 文件）三条线提醒，支持 macOS / Windows / Linux 全平台。 Tags: latest:2.2.3 Version history: v2.2.3 | 2026-07-13T13:35:31.085Z | user v2.2.3: macOS 不再生成 .ics 冗余文件 — Apple Calendar 已原生写入，移除桌面 .ics 备份 v2.2.2 | 2026-07-13T12:56:44.366Z | user v2.2.2: 对抗性审查修复 — P0","codeSnippets":[],"executableExamples":[{"language":"text","snippet":"您好！我是诉讼中枢系统。在开始处理法院文书之前，我需要确认一件事：\n\n您平时把案卷资料存在哪个文件夹？\n\n常见的例子供参考：\n  · macOS   → /Users/你的名字/项目/律师业务/案件/\n  · Windows → C:\\Users\\你的名字\\Documents\\律师业务\\案件\\\n  · Linux   → /home/你的名字/项目/律师业务/案件/\n\n💡 最简单的方式：打开你的案卷文件夹，把地址栏里的路径直接复制粘贴给我就行。\n  · macOS：在访达里选中文件夹 → 按 ⌘+⌥+C (Cmd+Option+C) → 路径就复制好了，直接粘贴过来\n        （或者：访达菜单 → 显示 → 显示路径栏，然后在底部路径栏上右键 → 拷贝路径）\n  · Windows：在资源管理器打开文件夹 → 点一下顶部地址栏 → 按住 Shift 右键空白处 → 选\"复制为路径\"（或直接 Ctrl+Shift+C）\n        （如果不行，就点地址栏后 Ctrl+C 复制）\n\n请把路径发给我："},{"language":"json","snippet":"{\"case_root\": \"/Users/xxx/项目/02-律师业务\", \"configured_at\": \"YYYY-MM-DD HH:MM\"}"},{"language":"text","snippet":"✅ 已记录案卷目录：/Users/xxx/项目/02-律师业务\n   以后所有法院文书都会在这个目录下匹配和归档。"},{"language":"text","snippet":"收到法院短信，内容如下：\n【xx市人民法院】张三，您好！您有（2025）苏0981民初1234号案件文书送达，请点击链接查收：https://zxfw.court.gov.cn/zxfw/#/pagesAjkj/app/wssd/index?qdbh=DEMO1&sdbh=DEMO2&sdsin=DEMO3"},{"language":"text","snippet":"https://zxfw.court.gov.cn/zxfw/#/pagesAjkj/app/wssd/index?qdbh=xxx&sdbh=xxx&sdsin=xxx"},{"language":"text","snippet":"上传：传票照片.jpg\n→ MinerU OCR（flash-extract）→ 解析 → 复核 → 归档 + 日历提醒"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: litigation-hub\nhomepage: https://github.com/leahlu0124-creator/litigation-hub\nauthor: 陆凌燕\noriginal_author: 杨卫薪律师\nversion: 2.2.3\nlicense: MIT\ndescription: 诉讼信息中枢系统。接收法院短信、送达链接、纸质文书照片，自动 OCR 识别、下载、归档、归类到标准案卷目录。基于 12 种期限规则库自动匹配，通过系统日历 + QQ 邮件（微信送达）+ 本机电脑提醒（系统通知 + 桌面 Markdown 文件）三条线提醒，支持 macOS / Windows / Linux 全平台。\nslug: litigation-hub\ndisplayName: litigation-hub\n---\n\n# litigation-hub · 诉讼信息中枢系统\n\n## 功能概述\n\n处理法院文书的完整流程：**粘贴短信 / 发链接 / 上传照片 → 解析内容（OCR 或文本）→ 匹配案件 → 下载/归档文书 → 开庭日历提醒（传票自动写入系统日历 + 本机电脑提醒 + QQ 邮件（微信送达））**。\n\n## 首次使用：案卷目录设置（必须执行）\n\n**当用户第一次使用本技能时，必须先确认案卷存放目录。**\n\n> ⚠️ 如果没有事先确认目录，后续搜遍整台电脑都找不到案卷，效率极低。这一步一劳永逸。\n\n### 判断是否首次使用\n\n检查是否已有缓存的案卷目录记录：\n\n1. 先读取 `config/case-root.json`，检查 `case_root` 字段是否为有效路径\n2. 如果文件不存在或 `case_root` 为空 → **首次使用**，执行下方交互流程\n3. 如果 `case_root` 已配置且路径存在 → 跳过，直接进入正式工作流\n\n### 首次使用交互流程\n\n**询问格式**：\n\n```\n您好！我是诉讼中枢系统。在开始处理法院文书之前，我需要确认一件事：\n\n您平时把案卷资料存在哪个文件夹？\n\n常见的例子供参考：\n  · macOS   → /Users/你的名字/项目/律师业务/案件/\n  · Windows → C:\\Users\\你的名字\\Documents\\律师业务\\案件\\\n  · Linux   → /home/你的名字/项目/律师业务/案件/\n\n💡 最简单的方式：打开你的案卷文件夹，把地址栏里的路径直接复制粘贴给我就行。\n  · macOS：在访达里选中文件夹 → 按 ⌘+⌥+C (Cmd+Option+C) → 路径就复制好了，直接粘贴过来\n        （或者：访达菜单 → 显示 → 显示路径栏，然后在底部路径栏上右键 → 拷贝路径）\n  · Windows：在资源管理器打开文件夹 → 点一下顶部地址栏 → 按住 Shift 右键空白处 → 选\"复制为路径\"（或直接 Ctrl+Shift+C）\n        （如果不行，就点地址栏后 Ctrl+C 复制）\n\n请把路径发给我：\n```\n\n**用户回复后**：\n\n1. 验证路径是否存在（`ls` / `dir`），如果不存在，创建之\n2. 将路径写入 `config/case-root.json`：\n   ```json\n   {\"case_root\": \"/Users/xxx/项目/02-律师业务\", \"configured_at\": \"YYYY-MM-DD HH:MM\"}\n   ```\n3. 显示确认信息：\n   ```\n   ✅ 已记录案卷目录：/Users/xxx/项目/02-律师业务\n   以后所有法院文书都会在这个目录下匹配和归档。\n   ```\n4. 随后继续执行正式工作流\n\n### 后续使用\n\n- 每次技能触发时，从 `config/case-root.json` 读取路径，**仅在该目录下搜索已有案卷**；\n- **新建案卷始终放在桌面**，与 `case_root` 无关。桌面上的新案卷用户一眼就能看到，整理后自行移入搜索目录即可。\n- 如果用户搬移了案卷目录，用户说\"更新案卷目录\"即可触发重新设置\n\n---\n\n支持三种触发方式：\n\n**方式一：粘贴短信原文**\n\n```text\n收到法院短信，内容如下：\n【xx市人民法院】张三，您好！您有（2025）苏0981民初1234号案件文书送达，请点击链接查收：https://zxfw.court.gov.cn/zxfw/#/pagesAjkj/app/wssd/index?qdbh=DEMO1&sdbh=DEMO2&sdsin=DEMO3\n```\n\n**方式二：直接发送送达链接**\n\n用户可能直接粘贴送达链接（非完整短信文本），此时跳过短信文本解析，直接从 URL 中提取 `qdbh`、`sdbh`、`sdsin` 参数，进入第三步下载流程。\n\n```text\nhttps://zxfw.court.gov.cn/zxfw/#/pagesAjkj/app/wssd/index?qdbh=xxx&sdbh=xxx&sdsin=xxx\n```\n\n**方式三：上传纸质文书照片 / 扫描件**\n\n适用于刑事律师收到纸质传票、判决书、通知书的场景。上传照片（PNG/JPG），MinerU OCR 字符级精度提取文字，再解析为结构化字段。\n\n```text\n上传：传票照片.jpg\n→ MinerU OCR（flash-extract）→ 解析 → 复核 → 归档 + 日历提醒\n```\n\n> 依赖 `mineru-open-api`（`npm install -g mineru-open-api`），首次使用自动安装，用户无感知。\n\n## 短信类型分类\n\n| 类型 | 特征 | 含下载链接 | 处理方式 |\n| --- | --- | --- | --- |\n| 文书送达 | 含送达平台链接 + 案号 | 是 | 下载文书并归档到案件目录 |\n| 立案通知 | 含\"已立案\"等关键词 | 可能有 | 展示解析结果 |\n| 信息通知 | 无链接，纯信息 | 否 | 展示解析结果 |\n\n**支持的送达平台**：`zxfw.court.gov.cn`（全国）、`sd.gdems.com`（广东）、`jysd.10102368.com`（集约送达）、`dzsd.hbfy.gov.cn`（湖北）、`sfpt.cdfy12368.gov.cn`（司法送达网）。同一平台可能使用不同域名（同构异域名），通过 URL 路径特征识别平台。详见 `references/sms-patterns.json`。\n\n---\n\n## 工作流（四步）\n\n### 第一步：输入解析\n\n1. 读取 `references/sms-patterns.json` 作为解析参考\n2. **判断输入类型**：\n   - **完整短信**：包含法院签名（如 `【xx法院】`）+ 正文 + 链接 → 完整解析流程\n   - **纯链接**：用户直接发送送达 URL（如 `https://zxfw.court.gov.cn/...?qdbh=xxx&sdbh=xxx&sdsin"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7ak8kq701dd4kpk6qgm4gek984aspp\",\n  \"slug\": \"litigation-hub\",\n  \"version\": \"2.2.3\",\n  \"publishedAt\": 1783949731085\n}"},{"path":"references/archive-format.md","content":"# 内部归档格式\n\n每次处理一条短信后，在 `archive/` 下创建一条 JSON 记录，不保存文书本身（文书归档到案件目录）。\n\n## 文件路径\n\n`archive/YYYYMMDD_HHMMSS_{案号后4位}.json`\n\n## JSON 结构\n\n```json\n{\n  \"id\": \"20260404_143025_1234\",\n  \"timestamp\": \"2026-04-04T14:30:25+08:00\",\n  \"sms_raw\": \"【xx市人民法院】张三，您好！您有（2025）苏0981民初1234号案件文书送达，请点击链接查收：https://zxfw.court.gov.cn/...\",\n  \"parsed\": {\n    \"type\": \"document_delivery\",\n    \"case_number\": \"（2025）苏0981民初1234号\",\n    \"parties\": [\"张三\", \"xx有限公司\"],\n    \"court\": \"xx市人民法院\"\n  },\n  \"download\": {\n    \"source_url\": \"https://zxfw.court.gov.cn/zxfw/#/pagesAjkj/app/wssd/index?qdbh=XX&sdbh=XX&sdsin=XX\",\n    \"params\": { \"qdbh\": \"XX\", \"sdbh\": \"XX\", \"sdsin\": \"XX\" },\n    \"method\": \"curl\",\n    \"status\": \"success\",\n    \"document_title\": \"受理通知书\",\n    \"api_response\": {\n      \"c_fymc\": \"苏州工业园区人民法院\",\n      \"c_fybh\": \"1275\",\n      \"dt_cjsj\": \"2026-03-18T07:44:00.000+00:00\",\n      \"documents\": [\n        {\n          \"c_wsmc\": \"传票（东沙湖法庭）\",\n          \"c_wsbh\": \"ecb8fe64e4834804b50ea0f9257327e0\",\n          \"dt_cjsj\": \"2026-03-18T07:44:00.000+00:00\"\n        }\n      ]\n    }\n  },\n  \"document\": {\n    \"type\": \"一审判决书\",\n    \"sent_at\": \"2026-04-08T10:00:00+08:00\",\n    \"received_at\": \"2026-04-08T14:30:00+08:00\",\n    \"appeal_deadline\": \"2026-04-23T23:59:59+08:00\",\n    \"appeal_days_remaining\": 15\n  },\n  \"archive\": {\n    \"matched_case\": \"260101 张三与李四合同纠纷\",\n    \"target_path\": \"260101 张三与李四合同纠纷/受理通知书（张三与李四合同纠纷）_20260404收.pdf\",\n    \"summary\": \"传票：2025年4月15日 14:30 第3法庭开庭\"\n  }\n}\n```\n\n## 字段说明\n\n| 字段 | 必需 | 说明 |\n|------|------|------|\n| `id` | 是 | 归档唯一标识，即文件名（不含扩展名） |\n| `timestamp` | 是 | ISO 8601 格式的处理时间 |\n| `sms_raw` | 是 | 短信原文，完整保留 |\n| `parsed.type` | 是 | 短信类型：`document_delivery` / `filing_notification` / `info_notification` |\n| `parsed.case_number` | 否 | 提取到的案号，未提取到时为 `null` |\n| `parsed.parties` | 否 | 提取到的当事人列表 |\n| `parsed.court` | 否 | 提取到的法院名称 |\n| `parsed.sent_at` | 否 | 法院发送时间，从短信或送达平台提取 |\n| `parsed.received_at` | 否 | 用户收到时间（如有） |\n| `download.source_url` | 否 | 原始下载链接 |\n| `download.params` | 否 | 从 URL 提取的参数（如 qdbh/sdbh/sdsin） |\n| `download.method` | 否 | 实际使用的下载方式：`curl` / `cli` / `mcp` / `manual` / `null`（无下载链接） |\n| `download.status` | 是 | 下载状态：`success` / `failed` / `manual` / `skipped` |\n| `download.api_response` | 否 | API 完整响应，包含 c_fymc（法院名称）、c_fybh（法院编号）、dt_cjsj（送达时间）、documents 数组（每份文书详情） |\n| `download.api_response.c_fymc` | 否 | 法院名称（来自 API） |\n| `download.api_response.c_fybh` | 否 | 法院编号 |\n| `download.api_response.dt_cjsj` | 否 | 送达记录创建时间（ISO 8601），作为 sent_at 来源 |\n| `download.api_response.documents[].c_wsmc` | 否 | 文书名称 |\n| `download.api_response.documents[].c_wsbh` | 否 | 文书编号（UUID） |\n| `download.api_response.documents[].dt_cjsj` | 否 | 单份文书的送达时间 |\n| `document.type` | 否 | 文书类型：判决书/裁定书/调解书等（从 PDF 解析） |\n| `document.sent_at` | 否 | 法院发送时间（送达平台记录） |\n| `document.received_at` | 否 | 用户收到时间（手机短信网关时间） |\n| `document.appeal_deadline` | 否 | 上诉截止日期（根据案件类型计算） |\n| `document.appeal_days_remaining` | 否 | 剩余上诉天数 |\n| `archive.matched_case` | 否 | 匹配到的案件目录名 |\n| `archive.target_path` | 否 | 文书最终归档的相对路径 |"},{"path":"references/ATTRIBUTION.md","content":"# 归属声明与致谢\n\n## 参考项目\n\n本技能（court-sms）在开发过程中，使用 AI 参考了以下开源项目的思路和规则：\n\n### FachuanHybridSystem（法穿AI案件管理系统）\n\n- **项目地址**：https://github.com/Lawyer-ray/FachuanHybridSystem\n- **许可证**：PolyForm Noncommercial License 1.0.0 (附特别许可)\n- **版权所有**：(C) 2025-2099 法穿\n\n### 具体参考内容\n\n本技能参考了 FachuanHybridSystem 中以下模块的**设计思路和解析规则**（非直接复制代码）：\n\n1. **短信解析服务** (`backend/apps/automation/services/sms/sms_parser_service.py`)\n   - 短信类型分类逻辑（文书送达 / 信息通知 / 立案通知）\n   - zxfw.court.gov.cn 下载链接正则匹配规则\n   - 同构异域名正则更新（从硬编码域名改为通用主机匹配，通过 URL 路径特征识别平台）\n   - 案号提取正则模式\n   - 当事人名称提取策略（公司名模式、对峙模式、角色前缀模式）\n   - 当事人排除关键词列表\n   - 司法送达网（SFDW）链接正则和验证码提取规则\n\n2. **案件匹配算法** (`backend/apps/automation/services/sms/case_matcher.py`)\n   - 三级匹配策略的设计思路（案号精确 → 当事人双向 → 特征筛选）\n\n3. **文书重命名逻辑** (`backend/apps/automation/services/sms/document_renamer.py`)\n   - 已知文书标题映射表\n   - 文件命名格式：`{title}（{case_name}）_{YYYYMMDD}收.pdf`\n\n4. **zxfw 下载策略** (`backend/apps/automation/services/scraper/scrapers/court_document/zxfw_scraper.py`)\n   - 多级下载回退策略的架构设计\n   - API 拦截与页面操作结合的思路\n\n5. **司法送达网下载策略** (`backend/apps/automation/services/scraper/scrapers/court_document/sfdw_scraper.py`)\n   - 纯 Playwright 下载流程（TDHCryptoUtil 加密导致无法使用 HTTP API）\n   - 验证码双模式策略：手机尾号后6位优先 + 短信验证码回退\n   - Vue app.checkYzm() → wsList → downloadFile() 页面交互流程\n\n### 实现差异\n\n本技能并未直接复制 FachuanHybridSystem 的代码，而是将其核心逻辑重新实现为 AI 技能格式：\n\n- **原项目**：Python / Django 服务，使用 Ollama LLM + ddddocr + Playwright\n- **本技能**：AI Agent Skill，利用自然语言理解能力 + Playwright MCP\n- **无代码复用**：所有解析逻辑由 AI 自然语言理解完成，配置规则以 JSON 参考\n\n### 致谢\n\n感谢法穿团队开源的法律科技实践成果，为社区提供了宝贵的设计参考。"},{"path":"references/china-holidays.json","content":"{\n  \"_description\": \"中国法定节假日数据。由国务院办公厅每年公布，通过 gov.cn 官方源自动获取。\",\n  \"_updated\": \"2026-07-08\",\n  \"_source\": \"https://www.gov.cn/zhengce/content/202511/content_7047090.htm\",\n  \"_auto_update\": \"每年1月1日后首次调用时，自动从 gov.cn 检索当年最新数据更新本文件。\",\n\n  \"2026\": {\n    \"holidays\": {\n      \"元旦\": {\n        \"dates\": [\"2026-01-01\", \"2026-01-02\", \"2026-01-03\"],\n        \"days_off\": 3\n      },\n      \"春节\": {\n        \"dates\": [\"2026-02-15\", \"2026-02-16\", \"2026-02-17\", \"2026-02-18\", \"2026-02-19\", \"2026-02-20\", \"2026-02-21\", \"2026-02-22\", \"2026-02-23\"],\n        \"days_off\": 9\n      },\n      \"清明节\": {\n        \"dates\": [\"2026-04-04\", \"2026-04-05\", \"2026-04-06\"],\n        \"days_off\": 3\n      },\n      \"劳动节\": {\n        \"dates\": [\"2026-05-01\", \"2026-05-02\", \"2026-05-03\", \"2026-05-04\", \"2026-05-05\"],\n        \"days_off\": 5\n      },\n      \"端午节\": {\n        \"dates\": [\"2026-06-19\", \"2026-06-20\", \"2026-06-21\"],\n        \"days_off\": 3\n      },\n      \"中秋节\": {\n        \"dates\": [\"2026-09-25\", \"2026-09-26\", \"2026-09-27\"],\n        \"days_off\": 3\n      },\n      \"国庆节\": {\n        \"dates\": [\"2026-10-01\", \"2026-10-02\", \"2026-10-03\", \"2026-10-04\", \"2026-10-05\", \"2026-10-06\", \"2026-10-07\"],\n        \"days_off\": 7\n      }\n    },\n    \"makeup_workdays\": [\n      \"2026-01-04\", \"2026-02-14\", \"2026-02-28\",\n      \"2026-05-09\", \"2026-09-20\", \"2026-10-10\"\n    ]\n  }\n}"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"诉讼信息中枢系统。接收法院短信、送达链接、纸质文书照片，自动 OCR 识别、下载、归档、归类到标准案卷目录。基于 12 种期限规则库自动匹配，通过系统日历 + QQ 邮件（微信送达）+ 本机电脑提醒（系统通知 + 桌面 Markdown 文件）三条线提醒，支持 macOS / Windows / Linux 全平台。 Skill: Litigation Hub Owner: leahlu0124-creator Summary: 诉讼信息中枢系统。接收法院短信、送达链接、纸质文书照片，自动 OCR 识别、下载、归档、归类到标准案卷目录。基于 12 种期限规则库自动匹配，通过系统日历 + QQ 邮件（微信送达）+ 本机电脑提醒（系统通知 + 桌面 Markdown 文件）三条线提醒，支持 macOS / Windows / Linux 全平台。 Tags: latest:2.2.3 Version history: v2.2.3 | 2026-07-13T13:35:31.085Z | user v2.2.3: macOS 不再生成 .ics 冗余文件 — Apple Calendar 已原生写入，移除桌面 .ics 备份 v2.2.2 | 2026-07-13T12:56:44.366Z | user v2.2.2: 对抗性审查修复 — P0","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":895,"uniquenessScore":51,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T23:22:48.386Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T23:22:48.386Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-14T15:16:32.218Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}