Run once at the start of each skill session. First locate the script (works regardless of which client installed the skill):
find ~/.codex/skills ~/.claude/skills ~/.openclaw/skills ~/skills -maxdepth 3 -name "check-version.py" 2>/dev/null | head -1
Then run it with python3 .
UPDATE|X.X.X|Y.Y.Y|| → tell the user in English: "chat-visualizer-ymind vY.Y.Y is available (you're on vX.X.X).\n\cd — continue with current version?"
Wait for their reply before proceeding.
Two ways to get conversation data:
Requires Playwright. Check first:
python3 -c "import playwright" 2>/dev/null && echo "OK" || echo "NOT INSTALLED"
If not installed, ask: "Playwright 可以自动抓取对话内容,要装吗?(pip install playwright && playwright install chromium,一次性操作)" If they decline, use Way 2.
If available, fetch:
bash scripts/run.sh fetch "<url>"
# prints RUN_DIR — read <run_dir>/raw_chat.json, use items[0].messages
ChatGPT 403: script retries with Playwright headed mode. If still fails, fall back to Way 2.
User opens the conversation in browser → Ctrl+A → Ctrl+C → pastes into chat. No share link needed — any conversation page works.
When handling pasted text or a local JSON file:
_paste — do not use the filename, title, or any other label:```bash
YMIND_DIR="${YMIND_DIR:-$HOME/ymind-ws}"
RUN_DIR="$YMIND_DIR/$(date +%Y%m%d-%H%M%S)_paste"
mkdir -p "$RUN_DIR"
```
raw_chat.json in the same format as fetch produces:```json
{
"fetched_at": "...",
"items": [{
"url": null,
"provider": "paste",
"title": "...",
"messages": [{"role": "user", "content": "..."}, {"role": "assistant", "content": "..."}, ...],
"message_count": N
}]
}
```
meta.json: {"provider": "paste", "url": null, "created_at": "..."}Users often give the wrong link type. Correct them if needed:
| Platform | Share link ✓ | Wrong link ✗ |
|---|---|---|
| ---------- | ------------- | ------------- |
| ChatGPT | chatgpt.com/share/xxx | chatgpt.com/c/xxx (private chat URL) |
| Claude | claude.ai/share/xxx | claude.ai/chat/xxx (private chat URL) |
| Gemini | gemini.google.com/share/xxx or g.co/gemini/share/xxx | gemini.google.com/app/xxx (app URL) |
| DeepSeek | chat.deepseek.com/share/xxx | chat.deepseek.com/a/xxx (private chat URL) |
| Doubao | www.doubao.com/thread/xxx | www.doubao.com/chat/xxx (private chat URL) |
Note: g.co/gemini/share/... short links work — script auto-resolves them.
Read references/graph-schema.md for node types, edge types, label rules, and output schema.
Critical rules (non-obvious):
turn_id: assign actual turn number (1-based). One user message + one AI response = 1 turn — not one message per turn. A 3-round conversation yields turn_id 1, 2, 3 only. Never default all nodes to the same value — this drives horizontal spread in the D3 visualization.「」 not curly quotes "" inside JSON values — curly quotes break JSON parsing./graph.json Before proceeding: verify graph.json exists and contains at least one node. If extraction failed or produced an empty graph, delete entirely and stop — do not render, do not update the index.
dirname() , so graph and index always stay in the same workspace tree):bash scripts/run.sh render <run_dir>
# validates JSON, renders graph.html + graph.png (screenshot, requires Playwright)
# then rebuilds <ymind_dir>/index.json and <ymind_dir>/index.html automatically
graph.html is a split-view output when raw_chat.json is present in : left panel shows the original conversation, right panel shows the thinking map. If raw_chat.json is absent, only the graph is shown (no split).
references/graph-schema.md).Run dir files: raw_chat.json, graph.json, graph.html, graph.png (requires Playwright), meta.json.
Workspace files (auto-updated after every render, in the same root as ):
/index.json — machine-readable session registry/index.html — visual timeline index, opens each session's graph.htmlTo rebuild the index manually at any time:
bash scripts/run.sh index
If message tool is available and graph.png was generated, send the graph image (works on OpenClaw, Kimi Claw, and similar — detect by tool availability):
graph.png is outside the bot's media allow-roots, copy it to /.outbox/ first, then send the copied path.message tool using the filePath (or media) field — not as plain text, not as base64.All output (labels, summaries, analysis) must match the conversation language.
Minimal (paste text only — zero dependencies):
No pip install needed. render-html.py is stdlib-only, and the paste path skips fetch-chat.py entirely.
Full (auto-fetch URLs + screenshot):
pip install requests playwright && playwright install chromium
Without Playwright: paste works fully, render produces graph.html but skips graph.png screenshot.
共 2 个版本