Trigger when user shares a DeepSeek chat link and wants to continue the work from that conversation.
Match these URL patterns:
https://chat.deepseek.com/share/*https://chat.deepseek.com/a/chat/*Also trigger on phrases like "deepseek聊天记录", "deepseek chat link", "继续开发 deepseek".
DeepSeek share pages are JS-rendered — static web_fetch returns an empty shell. Must use the headless browser.
Locate the browser skill — it lives at ~/.openclaw/workspace/skills/browser/index.js (a Puppeteer script).
Check puppeteer is installed before first use:
bash
cd ~/.openclaw/workspace/skills/browser && node -e "require('puppeteer')" 2>&1 || npm install puppeteer
Read the page:
bash
cd ~/.openclaw/workspace/skills/browser && node index.js read "<url>" 2>/dev/null
Timeout 60s — the page is JS-heavy and may take a while to render. If output is ~ 800 chars or just "DeepSeek\n", the page didn't render → retry once.
The browser returns all visible text, including page chrome (headers, disclaimers, "本回答由 AI 生成" etc). Strip trailing boilerplate. Common tail markers to trim after:
本回答由 AI 生成内容仅供参考和 DeepSeek 继续聊Users iterate in DeepSeek until satisfied — later turns contain improved code. When the same file path appears in multiple turns, keep only the latest version (closest to end of output). Work backwards through the chat, skip earlier duplicates.
Look for an ASCII tree near the top of the output:
text
项目结构
WatchDose/
├── Shared/
│ ├── Models/
│ │ └── Foo.swift
...
This tells you what files to expect and where they belong. Compare extracted files against this tree to spot missing ones.
DeepSeek's code blocks render as HTML — innerText strips \ ``` markers. Use these boundary patterns instead:
Pattern A — Explicit file headers (multi-file Swift/Go/Rust/Java projects):
text
文件:Path/To/File.swift
swift ← UI button text, discard
复制 ← UI button text, discard
下载 ← UI button text, discard
import Foo ← actual code starts here
...
文件:Path/To/Next.swift ← next file boundary
Split on ^文件: lines. Strip leading swift/ 复制/ 下载 boilerplate from each file. Save to paths matching the header.
Pattern B — Single-file HTML (common for web projects):
bash
sed -n '/<!DOCTYPE html>/,$p' /tmp/raw.txt | sed '/<\/html>/q' > output.html
Pattern C — No file markers (snippet-only chats):
Save code blocks to extracted/<descriptive-name>.ext. Infer filename from surrounding text.
When DeepSeek runs out of space, it outputs fragments labeled with:
关键代码片段精简 / 实现要点由于长度限制参考 XXX 的结构自行实现These are NOT complete files. Write them to FRAGMENTS_TODO.md with the target file they belong to, rather than as standalone .swift files.
FRAGMENTS_TODO.md.Save <project-dir>/README.md with: source link, extraction time, file list (complete vs fragment), tech stack, feature checklist, completion status.
Show a summary:
text
📋 Extracted from DeepSeek chat:
- N turns
- N complete files: <list>
- N fragments: <list> → FRAGMENTS_TODO.md
- N missing (in tree but not output): <list>
- Goals: <summary>
- Status: ~X% complete
Then proceed to implement the next unfinished task.
CaseActionLink expired / privateAsk for a new share linkChat is discussion-only (no code)Report: "No code found — this conversation is discussion-only."Multi-turn: same file in multiple turnsKeep only the last version (closest to end)Very long chat (>100 turns)Read from end; focus on most recent + code-heavy sectionsMultiple links providedProcess sequentially; cross-reference if same projectCode is snippet-only (no file paths)Save to extracted/, flag as incomplete, ask userCode fragments ("关键代码片段")Write to FRAGMENTS_TODO.md, not as standalone filespuppeteer not foundRun npm install puppeteer in the browser skill directoryPage blocked / anti-botAsk user to copy-paste the chat content manuallyBoilerplate "swift/复制/下载" in outputStrip from start of each extracted file (see Phase 5)Project tree present but files missingList missing files in report, flag as incomplete
memory/YYYY-MM-DD.md so context persists across sessions.