[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6E37NT10JD43VTVYHTSPZ95":3,"skill-same:01M6E37NT10JD43VTVYHTSPZ95":93},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":32,"linkOnly":33,"markdownContent":34,"markdownBody":35,"frontMatter":36,"refName":52,"commitSha":53,"skillDirectory":54,"forksCount":13,"repositoryHtmlUrl":55,"repositoryHomepageUrl":56,"ownerHtmlUrl":57,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":58,"install":59,"resources":72},"01M6E37NT10JD43VTVYHTSPZ95","session-logs",null,"Search and analyze your own session logs (older\u002Fparent conversations) using jq.","7dvq6yrkgs-stack\u002Fplaywright","7dvq6yrkgs-stack","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F251638143?v=4","01M6E061J2AMGWYZ6TK7Y8NM74","01M6E061PQCQJGQMPBERMCFN5G",0,"Apache-2.0","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Fsession-logs\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[23,24,25,26,27,28,29,30,31],"logs","session","session logs","search","analyze","jq","brew","install","ripgrep","2026-11-10 10:12:30",false,"---\nname: session-logs\ndescription: Search and analyze your own session logs (older\u002Fparent conversations) using jq.\nmetadata:\n  {\n    \"openclaw\":\n      {\n        \"emoji\": \"?\",\n        \"requires\": { \"bins\": [\"jq\", \"rg\"] },\n        \"install\":\n          [\n            {\n              \"id\": \"brew-jq\",\n              \"kind\": \"brew\",\n              \"formula\": \"jq\",\n              \"bins\": [\"jq\"],\n              \"label\": \"Install jq (brew)\",\n            },\n            {\n              \"id\": \"brew-rg\",\n              \"kind\": \"brew\",\n              \"formula\": \"ripgrep\",\n              \"bins\": [\"rg\"],\n              \"label\": \"Install ripgrep (brew)\",\n            },\n          ],\n      },\n  }\n---\n\n# session-logs\n\nSearch your complete conversation history stored in session JSONL files. Use this when a user references older\u002Fparent conversations or asks what was said before.\n\n## Trigger\n\nUse this skill when the user asks about prior chats, parent conversations, or historical context that isn't in memory files.\n\n## Location\n\nSession logs live under the active state directory:\n`$OPENCLAW_STATE_DIR\u002Fagents\u002F\u003CagentId>\u002Fsessions\u002F` (default: `~\u002F.openclaw\u002Fagents\u002F\u003CagentId>\u002Fsessions\u002F`).\nUse the `agent=\u003Cid>` value from the system prompt Runtime line.\n\n- **`sessions.json`** - Index mapping session keys to session IDs\n- **`\u003Csession-id>.jsonl`** - Full conversation transcript per session\n\n## Structure\n\nEach `.jsonl` file contains messages with:\n\n- `type`: \"session\" (metadata) or \"message\"\n- `timestamp`: ISO timestamp\n- `message.role`: \"user\", \"assistant\", or \"toolResult\"\n- `message.content[]`: Text, thinking, or tool calls (filter `type==\"text\"` for human-readable content)\n- `message.usage.cost.total`: Cost per response\n\n## Common Queries\n\n### List all sessions by date and size\n\n```bash\nAGENT_ID=\"\u003CagentId>\"\nSESSION_DIR=\"${OPENCLAW_STATE_DIR:-$HOME\u002F.openclaw}\u002Fagents\u002F$AGENT_ID\u002Fsessions\"\nfor f in \"$SESSION_DIR\"\u002F*.jsonl; do\n  date=$(head -1 \"$f\" | jq -r '.timestamp' | cut -dT -f1)\n  size=$(ls -lh \"$f\" | awk '{print $5}')\n  echo \"$date $size $(basename $f)\"\ndone | sort -r\n```\n\n### Find sessions from a specific day\n\n```bash\nAGENT_ID=\"\u003CagentId>\"\nSESSION_DIR=\"${OPENCLAW_STATE_DIR:-$HOME\u002F.openclaw}\u002Fagents\u002F$AGENT_ID\u002Fsessions\"\nfor f in \"$SESSION_DIR\"\u002F*.jsonl; do\n  head -1 \"$f\" | jq -r '.timestamp' | grep -q \"2026-01-06\" && echo \"$f\"\ndone\n```\n\n### Extract user messages from a session\n\n```bash\njq -r 'select(.message.role == \"user\") | .message.content[]? | select(.type == \"text\") | .text' \u003Csession>.jsonl\n```\n\n### Search for keyword in assistant responses\n\n```bash\njq -r 'select(.message.role == \"assistant\") | .message.content[]? | select(.type == \"text\") | .text' \u003Csession>.jsonl | rg -i \"keyword\"\n```\n\n### Get total cost for a session\n\n```bash\njq -s '[.[] | .message.usage.cost.total \u002F\u002F 0] | add' \u003Csession>.jsonl\n```\n\n### Daily cost summary\n\n```bash\nAGENT_ID=\"\u003CagentId>\"\nSESSION_DIR=\"${OPENCLAW_STATE_DIR:-$HOME\u002F.openclaw}\u002Fagents\u002F$AGENT_ID\u002Fsessions\"\nfor f in \"$SESSION_DIR\"\u002F*.jsonl; do\n  date=$(head -1 \"$f\" | jq -r '.timestamp' | cut -dT -f1)\n  cost=$(jq -s '[.[] | .message.usage.cost.total \u002F\u002F 0] | add' \"$f\")\n  echo \"$date $cost\"\ndone | awk '{a[$1]+=$2} END {for(d in a) print d, \"$\"a[d]}' | sort -r\n```\n\n### Count messages and tokens in a session\n\n```bash\njq -s '{\n  messages: length,\n  user: [.[] | select(.message.role == \"user\")] | length,\n  assistant: [.[] | select(.message.role == \"assistant\")] | length,\n  first: .[0].timestamp,\n  last: .[-1].timestamp\n}' \u003Csession>.jsonl\n```\n\n### Tool usage breakdown\n\n```bash\njq -r '.message.content[]? | select(.type == \"toolCall\") | .name' \u003Csession>.jsonl | sort | uniq -c | sort -rn\n```\n\n### Search across ALL sessions for a phrase\n\n```bash\nAGENT_ID=\"\u003CagentId>\"\nSESSION_DIR=\"${OPENCLAW_STATE_DIR:-$HOME\u002F.openclaw}\u002Fagents\u002F$AGENT_ID\u002Fsessions\"\nrg -l \"phrase\" \"$SESSION_DIR\"\u002F*.jsonl\n```\n\n## Tips\n\n- Sessions are append-only JSONL (one JSON object per line)\n- Large sessions can be several MB - use `head`\u002F`tail` for sampling\n- The `sessions.json` index maps chat providers (discord, whatsapp, etc.) to session IDs\n- Deleted sessions have `.deleted.\u003Ctimestamp>` suffix\n\n## Fast text-only hint (low noise)\n\n```bash\nAGENT_ID=\"\u003CagentId>\"\nSESSION_DIR=\"${OPENCLAW_STATE_DIR:-$HOME\u002F.openclaw}\u002Fagents\u002F$AGENT_ID\u002Fsessions\"\njq -r 'select(.type==\"message\") | .message.content[]? | select(.type==\"text\") | .text' \"$SESSION_DIR\"\u002F\u003Cid>.jsonl | rg 'keyword'\n```\n","# session-logs\n\nSearch your complete conversation history stored in session JSONL files. Use this when a user references older\u002Fparent conversations or asks what was said before.\n\n## Trigger\n\nUse this skill when the user asks about prior chats, parent conversations, or historical context that isn't in memory files.\n\n## Location\n\nSession logs live under the active state directory:\n`$OPENCLAW_STATE_DIR\u002Fagents\u002F\u003CagentId>\u002Fsessions\u002F` (default: `~\u002F.openclaw\u002Fagents\u002F\u003CagentId>\u002Fsessions\u002F`).\nUse the `agent=\u003Cid>` value from the system prompt Runtime line.\n\n- **`sessions.json`** - Index mapping session keys to session IDs\n- **`\u003Csession-id>.jsonl`** - Full conversation transcript per session\n\n## Structure\n\nEach `.jsonl` file contains messages with:\n\n- `type`: \"session\" (metadata) or \"message\"\n- `timestamp`: ISO timestamp\n- `message.role`: \"user\", \"assistant\", or \"toolResult\"\n- `message.content[]`: Text, thinking, or tool calls (filter `type==\"text\"` for human-readable content)\n- `message.usage.cost.total`: Cost per response\n\n## Common Queries\n\n### List all sessions by date and size\n\n```bash\nAGENT_ID=\"\u003CagentId>\"\nSESSION_DIR=\"${OPENCLAW_STATE_DIR:-$HOME\u002F.openclaw}\u002Fagents\u002F$AGENT_ID\u002Fsessions\"\nfor f in \"$SESSION_DIR\"\u002F*.jsonl; do\n  date=$(head -1 \"$f\" | jq -r '.timestamp' | cut -dT -f1)\n  size=$(ls -lh \"$f\" | awk '{print $5}')\n  echo \"$date $size $(basename $f)\"\ndone | sort -r\n```\n\n### Find sessions from a specific day\n\n```bash\nAGENT_ID=\"\u003CagentId>\"\nSESSION_DIR=\"${OPENCLAW_STATE_DIR:-$HOME\u002F.openclaw}\u002Fagents\u002F$AGENT_ID\u002Fsessions\"\nfor f in \"$SESSION_DIR\"\u002F*.jsonl; do\n  head -1 \"$f\" | jq -r '.timestamp' | grep -q \"2026-01-06\" && echo \"$f\"\ndone\n```\n\n### Extract user messages from a session\n\n```bash\njq -r 'select(.message.role == \"user\") | .message.content[]? | select(.type == \"text\") | .text' \u003Csession>.jsonl\n```\n\n### Search for keyword in assistant responses\n\n```bash\njq -r 'select(.message.role == \"assistant\") | .message.content[]? | select(.type == \"text\") | .text' \u003Csession>.jsonl | rg -i \"keyword\"\n```\n\n### Get total cost for a session\n\n```bash\njq -s '[.[] | .message.usage.cost.total \u002F\u002F 0] | add' \u003Csession>.jsonl\n```\n\n### Daily cost summary\n\n```bash\nAGENT_ID=\"\u003CagentId>\"\nSESSION_DIR=\"${OPENCLAW_STATE_DIR:-$HOME\u002F.openclaw}\u002Fagents\u002F$AGENT_ID\u002Fsessions\"\nfor f in \"$SESSION_DIR\"\u002F*.jsonl; do\n  date=$(head -1 \"$f\" | jq -r '.timestamp' | cut -dT -f1)\n  cost=$(jq -s '[.[] | .message.usage.cost.total \u002F\u002F 0] | add' \"$f\")\n  echo \"$date $cost\"\ndone | awk '{a[$1]+=$2} END {for(d in a) print d, \"$\"a[d]}' | sort -r\n```\n\n### Count messages and tokens in a session\n\n```bash\njq -s '{\n  messages: length,\n  user: [.[] | select(.message.role == \"user\")] | length,\n  assistant: [.[] | select(.message.role == \"assistant\")] | length,\n  first: .[0].timestamp,\n  last: .[-1].timestamp\n}' \u003Csession>.jsonl\n```\n\n### Tool usage breakdown\n\n```bash\njq -r '.message.content[]? | select(.type == \"toolCall\") | .name' \u003Csession>.jsonl | sort | uniq -c | sort -rn\n```\n\n### Search across ALL sessions for a phrase\n\n```bash\nAGENT_ID=\"\u003CagentId>\"\nSESSION_DIR=\"${OPENCLAW_STATE_DIR:-$HOME\u002F.openclaw}\u002Fagents\u002F$AGENT_ID\u002Fsessions\"\nrg -l \"phrase\" \"$SESSION_DIR\"\u002F*.jsonl\n```\n\n## Tips\n\n- Sessions are append-only JSONL (one JSON object per line)\n- Large sessions can be several MB - use `head`\u002F`tail` for sampling\n- The `sessions.json` index maps chat providers (discord, whatsapp, etc.) to session IDs\n- Deleted sessions have `.deleted.\u003Ctimestamp>` suffix\n\n## Fast text-only hint (low noise)\n\n```bash\nAGENT_ID=\"\u003CagentId>\"\nSESSION_DIR=\"${OPENCLAW_STATE_DIR:-$HOME\u002F.openclaw}\u002Fagents\u002F$AGENT_ID\u002Fsessions\"\njq -r 'select(.type==\"message\") | .message.content[]? | select(.type==\"text\") | .text' \"$SESSION_DIR\"\u002F\u003Cid>.jsonl | rg 'keyword'\n```\n",{"name":5,"metadata":37,"description":7},{"openclaw":38},{"emoji":39,"install":40,"requires":50},"?",[41,45],{"id":42,"bins":43,"kind":29,"label":44,"formula":28},"brew-jq",[28],"Install jq (brew)",{"id":46,"bins":47,"kind":29,"label":49,"formula":31},"brew-rg",[48],"rg","Install ripgrep (brew)",{"bins":51},[28,48],"main","a2e3284ed4488780397ee2f78217366e11470dfb","skills\u002Fsession-logs","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright","https:\u002F\u002Fplaywright.dev","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack","2026-04-25 06:04:45",{"source":8,"skillName":5,"commands":60,"prompt":70,"zipAvailable":71},[61,64,67],{"tool":62,"command":63},"npx","npx skills add 7dvq6yrkgs-stack\u002Fplaywright --skill session-logs",{"tool":65,"command":66},"bunx","bunx skills add 7dvq6yrkgs-stack\u002Fplaywright --skill session-logs",{"tool":68,"command":69},"pnpm","pnpm dlx skills add 7dvq6yrkgs-stack\u002Fplaywright --skill session-logs","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Fsession-logs\u002FSKILL.md",true,[73,79,85,89],{"path":74,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":77,"sourceHtmlUrl":78},".skillfish.json","REFERENCE","参考文档",217,"https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Fsession-logs\u002F.skillfish.json",{"path":80,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":83,"sourceHtmlUrl":84},"scripts\u002Fcdp-client.js","SCRIPT","脚本",4759,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__cloudflare--cloudflare-browser\u002Fscripts\u002Fcdp-client.js",{"path":86,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":87,"sourceHtmlUrl":88},"scripts\u002Fscreenshot.js",2876,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__cloudflare--cloudflare-browser\u002Fscripts\u002Fscreenshot.js",{"path":90,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":91,"sourceHtmlUrl":92},"scripts\u002Fvideo.js",4641,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__cloudflare--cloudflare-browser\u002Fscripts\u002Fvideo.js",[94,123,133,143,158,173],{"skillNo":95,"name":96,"nameZh":6,"description":97,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":112,"publishedAt":32},"01M6E3XK4PRPMQHM7Y98FQPTY1","zyte-api-automation","Automate Zyte API tasks via Rube MCP (Composio). Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Fzyte-api-automation\u002FSKILL.md",[100,101,104,107],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":102,"categoryName":103,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":105,"categoryName":106,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":108,"categoryName":109,"taxonomyType":110,"taxonomyTypeDesc":111},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[113,114,115,116,117,26,118,119,120,121,122],"zyte api automation","api","automation","MCP","tasks","Tools","first","automate","composio","via",{"skillNo":124,"name":125,"nameZh":6,"description":126,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":127,"categories":128,"keywords":131,"publishedAt":32},"01M6E3XFX6QSTR1QR59NFXJTMA","zylvie-automation","Automate Zylvie tasks via Rube MCP (Composio). Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Fzylvie-automation\u002FSKILL.md",[129,130],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":105,"categoryName":106,"taxonomyType":20,"taxonomyTypeDesc":21},[132,115,120,116,117,26,118,119,121,122],"zylvie automation",{"skillNo":134,"name":135,"nameZh":6,"description":136,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":137,"categories":138,"keywords":141,"publishedAt":32},"01M6E3XCX2GDYYCHN58ZJHT37M","zoominfo-automation","Automate Zoominfo tasks via Rube MCP (Composio). Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Fzoominfo-automation\u002FSKILL.md",[139,140],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":105,"categoryName":106,"taxonomyType":20,"taxonomyTypeDesc":21},[142,115,26,118,119,120,121,122,117,116],"zoominfo automation",{"skillNo":144,"name":145,"nameZh":6,"description":146,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":147,"categories":148,"keywords":151,"publishedAt":32},"01M6E3X9WJ2T73216WQHHTB9BD","zoho_mail-automation","Automate Zoho Mail tasks via Rube MCP (Composio): email sending, folders, labels, and mailbox management. Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Fzoho_mail-automation\u002FSKILL.md",[149,150],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":105,"categoryName":106,"taxonomyType":20,"taxonomyTypeDesc":21},[152,153,154,115,116,117,26,155,118,119,120,156,121,157,122],"mail","zoho mail automation","zoho","email","management","mailbox",{"skillNo":159,"name":160,"nameZh":6,"description":161,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":162,"categories":163,"keywords":169,"publishedAt":32},"01M6E3X719W648XZBW1EC6JQ64","zoho_invoice-automation","Automate Zoho Invoice tasks via Rube MCP (Composio): invoices, estimates, expenses, clients, and payment tracking. Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Fzoho_invoice-automation\u002FSKILL.md",[164,165,166],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":105,"categoryName":106,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":167,"categoryName":168,"taxonomyType":110,"taxonomyTypeDesc":111},"01JBSEEDCAT000000000000040","财务",[170,154,115,117,26,118,119,120,171,172,121,122,116],"zoho invoice automation","tracking","payment",{"skillNo":174,"name":175,"nameZh":6,"description":176,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":177,"categories":178,"keywords":181,"publishedAt":32},"01M6E3X28JYTC3QTK32AQF7BYB","zoho_inventory-automation","Automate Zoho Inventory tasks via Rube MCP (Composio): items, orders, warehouses, shipments, and stock management. Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Fzoho_inventory-automation\u002FSKILL.md",[179,180],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":105,"categoryName":106,"taxonomyType":20,"taxonomyTypeDesc":21},[115,182,154,183,119,120,118,26,117,116,121,122,184,185,156],"inventory","zoho inventory automation","stock","orders"]