{"id":"96cd14b9-ec77-4247-8b99-68f412134ebf","entityType":"agent","slug":"clawhub-harven-droid-wechat-article-archive","name":"WeChat Article Archive","canonicalUrl":"https://www.xpersona.co/agent/clawhub-harven-droid-wechat-article-archive","canonicalPath":"/agent/clawhub-harven-droid-wechat-article-archive","generatedAt":"2026-10-10T14:44:48.858Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-10T12:28:38.617Z","emptyReason":null},"description":"Archive WeChat articles and image notes locally Skill: WeChat Article Archive Owner: harven-droid Summary: Archive WeChat articles and image notes locally Tags: archive:1.1.5, latest:1.1.5, wechat:1.1.5 Version history: v1.1.5 | 2026-09-10T06:57:06.710Z | user Fix missing images in Xiaolushu image notes by supporting picture_page_info_list in both assignment (=) and object-property (:) syntax. Preserve image order and substantive full-article content. v1.1.4 | 202","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.4K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s17b95kvfzb5cdt2sy8s534dns842jax:wechat-article-archive","sourceUrl":"https://clawhub.ai/harven-droid/wechat-article-archive","homepage":"https://clawhub.ai/harven-droid/skills/wechat-article-archive","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/harven-droid/wechat-article-archive","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/harven-droid/skills/wechat-article-archive","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":63,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Archive WeChat articles and image notes locally Skill: WeChat Article Archive Owner: harven-droid Summary: Archive WeChat articles and image notes locally Tags:"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T12:28:38.617Z","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-10T12:28:38.617Z","emptyReason":null},"stars":null,"forks":null,"downloads":1432,"packageName":null,"latestVersion":"1.1.5","tractionLabel":"1.4K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T12:28:38.617Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T12:28:38.617Z","lastCrawledAt":"2026-10-10T12:28:38.617Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T12:28:38.617Z","lastVerifiedAt":null,"highlights":[{"version":"1.1.5","createdAt":"2026-09-10T06:57:06.710Z","changelog":"Fix missing images in Xiaolushu image notes by supporting picture_page_info_list in both assignment (=) and object-property (:) syntax. Preserve image order and substantive full-article content.","fileCount":10,"zipByteSize":22508},{"version":"1.1.4","createdAt":"2026-07-16T00:03:57.334Z","changelog":"Prevent normal long articles from being misclassified as image notes when picture_page_info_list is present; recover full structured body text from #js_content/content_noencode; preserve Xiaolüshu text plus ordered multi-image output; strengthen JSON completeness verification guidance.","fileCount":10,"zipByteSize":22447},{"version":"1.1.3","createdAt":"2026-07-14T04:19:26.586Z","changelog":"Preserve image-note/Xiaolüshu body text from page metadata; decode escaped line breaks into Markdown paragraphs before ordered images; add body_text_length to JSON verification output.","fileCount":10,"zipByteSize":21826},{"version":"1.1.2","createdAt":"2026-07-13T14:57:58.226Z","changelog":"Republish the hardened 1.1 artifact after checking ClawHub verification metadata. No runtime changes from 1.1.0.","fileCount":10,"zipByteSize":21666},{"version":"1.1.0","createdAt":"2026-07-13T14:55:48.988Z","changelog":"Add WeChat image-note/Xiaolüshu multi-image archiving; support saved page source via --html-file and configurable image timeouts; replace fetched-page JavaScript execution with static metadata parsing; enforce strict WeChat host and redirect validation; improve date and account extraction; remove deprecated request-promise dependency.","fileCount":10,"zipByteSize":21641},{"version":"1.0.0","createdAt":"2026-06-25T13:30:32.139Z","changelog":"Add WeChat article archive skill","fileCount":10,"zipByteSize":26295}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17b95kvfzb5cdt2sy8s534dns842jax:wechat-article-archive","setupComplexity":"low","setupSteps":["Node.js workspace detected. Install dependencies securely: run `npm ci --ignore-scripts` to prevent post-install lifecycle triggers from running arbitrary code, then selectively audit the dependency tree.","Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","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-harven-droid-wechat-article-archive/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-harven-droid-wechat-article-archive/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-harven-droid-wechat-article-archive/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-harven-droid-wechat-article-archive/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-harven-droid-wechat-article-archive/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-harven-droid-wechat-article-archive/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-10T14:44:48.854Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-harven-droid-wechat-article-archive/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-harven-droid-wechat-article-archive/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-harven-droid-wechat-article-archive/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-harven-droid-wechat-article-archive/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-10T12:28:38.617Z","emptyReason":null},"readme":"Skill: WeChat Article Archive\n\nOwner: harven-droid\n\nSummary: Archive WeChat articles and image notes locally\n\nTags: archive:1.1.5, latest:1.1.5, wechat:1.1.5\n\nVersion history:\n\nv1.1.5 | 2026-09-10T06:57:06.710Z | user\n\nFix missing images in Xiaolushu image notes by supporting picture_page_info_list in both assignment (=) and object-property (:) syntax. Preserve image order and substantive full-article content.\n\nv1.1.4 | 2026-07-16T00:03:57.334Z | user\n\nPrevent normal long articles from being misclassified as image notes when picture_page_info_list is present; recover full structured body text from #js_content/content_noencode; preserve Xiaolüshu text plus ordered multi-image output; strengthen JSON completeness verification guidance.\n\nv1.1.3 | 2026-07-14T04:19:26.586Z | user\n\nPreserve image-note/Xiaolüshu body text from page metadata; decode escaped line breaks into Markdown paragraphs before ordered images; add body_text_length to JSON verification output.\n\nv1.1.2 | 2026-07-13T14:57:58.226Z | user\n\nRepublish the hardened 1.1 artifact after checking ClawHub verification metadata. No runtime changes from 1.1.0.\n\nv1.1.0 | 2026-07-13T14:55:48.988Z | user\n\nAdd WeChat image-note/Xiaolüshu multi-image archiving; support saved page source via --html-file and configurable image timeouts; replace fetched-page JavaScript execution with static metadata parsing; enforce strict WeChat host and redirect validation; improve date and account extraction; remove deprecated request-promise dependency.\n\nv1.0.0 | 2026-06-25T13:30:32.139Z | user\n\nAdd WeChat article archive skill\n\nArchive index:\n\nArchive v1.1.5: 10 files, 22508 bytes\n\nFiles: agents/openai.yaml (244b), package-lock.json (21097b), package.json (131b), requirements.txt (21b), scripts/archive_wechat_article.py (14825b), scripts/errors.js (957b), scripts/extract.js (24371b), skill-card.md (2261b), SKILL.md (4256b), _meta.json (141b)\n\nFile v1.1.5:SKILL.md\n\n---\nname: wechat-article-archive\ndescription: Save WeChat Official Account articles and image-note / 小绿书 pages from mp.weixin.qq.com into a user-specified local folder as Markdown plus local assets. Use when the user asks to 保存/归档/下载/导出公众号文章、提取多张图片、从浏览器保存的最终 HTML 恢复文章，or generate Markdown with WeChat images copied locally instead of uploading to IMA or another cloud service.\n---\n\n# WeChat Article Archive\n\nArchive a WeChat Official Account article to local files:\n\n```text\ntarget-folder/\n  Article title.md\n  assets/\n    image-01-xxxx.jpg\n    image-02-xxxx.png\n```\n\n## Workflow\n\n1. Confirm the user provided both:\n   - a `mp.weixin.qq.com` article URL\n   - a destination folder\n2. Run the bundled script from this skill directory:\n\n```bash\ncd \"${CODEX_HOME:-$HOME/.codex}/skills/wechat-article-archive\"\n.venv/bin/python scripts/archive_wechat_article.py \"<wechat-url>\" \"<destination-folder>\"\n```\n\n3. Read the JSON output and report:\n   - Markdown file path\n   - `assets/` directory path\n   - downloaded image count\n   - any image download failures\n\n## Script\n\nUse `scripts/archive_wechat_article.py`.\n\nArguments:\n\n```bash\n.venv/bin/python scripts/archive_wechat_article.py \"<url>\" \"<output_dir>\" [--filename \"custom.md\"] [--skip-images] [--html-file \"page.html\"] [--image-timeout 30]\n```\n\nBehavior:\n\n- Parses the article with the bundled `extract.js`.\n- Preserves title, author, account name, publish time, original link, body text, headings, tables, blockquotes, lists, code blocks, and inline image order.\n- Downloads body images into `<output_dir>/assets/`.\n- Rewrites Markdown image links to relative `assets/...` paths.\n- Supports WeChat image-note / 小绿书 pages by extracting every top-level image from `picture_page_info_list` in display order.\n- Preserves image-note / 小绿书 body text from the page description, decodes escaped line breaks, and writes the text before the ordered images.\n- When `picture_page_info_list` also appears on a normal long article, prefers the substantive structured HTML body instead of replacing it with the short page description and image list.\n- Accepts a browser-saved final page source through `--html-file` when direct URL fetching is blocked or returns a different page. Keep the original WeChat URL as the first argument so metadata retains the source link.\n- If the body contains no inline images but the article has a cover image, inserts and downloads the cover image.\n- Prints a JSON result for verification. Check `body_text_length`, `body_img_count`, `downloaded_image_count`, and `image_failures`; do not treat `ok: true` alone as proof that the article is complete.\n\n## Dependencies\n\nRun once if dependencies are missing:\n\n```bash\ncd \"${CODEX_HOME:-$HOME/.codex}/skills/wechat-article-archive\"\nnpm install\npython3 -m venv .venv\n.venv/bin/python -m pip install -r requirements.txt\n```\n\nRequired commands:\n\n- `python3`\n- `node`\n- npm dependencies declared in `package.json`\n\nIf `node` is not on PATH but available elsewhere, set:\n\n```bash\nNODE=/absolute/path/to/node .venv/bin/python scripts/archive_wechat_article.py \"<url>\" \"<output_dir>\"\n```\n\n## Errors\n\n- `不支持的链接` → URL is not a supported WeChat article link.\n- `访问过于频繁` → WeChat blocked the request temporarily; retry later or use another network/session.\n- `extractor not found` → skill files are incomplete.\n- `Cannot find module ...` → run `npm install` in the skill directory.\n- image failures in JSON → Markdown was created, but one or more images could not be downloaded; report the failures and keep the original URLs in Markdown for those images.\n- Image-note / 小绿书 pages use a different WeChat page structure from normal articles. Do not treat an empty `#js_content` as an image-less article when `picture_page_info_list` is present.\n\n## Notes\n\n- Prefer this skill only for local file archiving. Do not use it for IMA upload, knowledge-base import, or WeChat message sending.\n- Do not create nested folders per article unless the user asks. The destination folder itself is the article archive folder.\n- Do not overwrite unrelated files manually. The script creates or reuses the destination folder and `assets/`.\n\nFile v1.1.5:_meta.json\n\n{\n  \"ownerId\": \"kn72j0qng9f6mm49z983cyzw1982naag\",\n  \"slug\": \"wechat-article-archive\",\n  \"version\": \"1.1.5\",\n  \"publishedAt\": 1789023426710\n}\n\nFile v1.1.5:skill-card.md\n\n## Description:\n\nSaves WeChat Official Account articles and image-note pages from mp.weixin.qq.com into a user-specified local folder as Markdown with local assets.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[harven-droid](https://clawhub.ai/user/harven-droid)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers, researchers, and content archivists use this skill to save supported WeChat article or image-note URLs, or browser-saved final HTML, as local Markdown with copied images. It is intended for local archiving and verification of article content, not cloud upload, knowledge-base import, or message sending.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Embedded image URLs can be downloaded into the archive without host, scheme, size, or network-safety limits.\n\nMitigation: Use the skill only with WeChat URLs and output folders you choose, consider --skip-images for untrusted content, and run it in a sandboxed environment without access to internal networks or sensitive local files.\n\nRisk: Browser-saved HTML from an untrusted source may contain asset references that affect what the downloader fetches.\n\nMitigation: Review saved HTML before use or disable image downloading for untrusted inputs until asset URL and size limits are added.\n\n## Reference(s):\n\n- [WeChat Article Archive on ClawHub](https://clawhub.ai/harven-droid/skills/wechat-article-archive)\n- [Publisher profile: harven-droid](https://clawhub.ai/user/harven-droid)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, files, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown article file, local asset files, JSON run summary, and concise text guidance]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Creates or reuses the requested destination folder and assets directory; image downloads can be skipped with --skip-images.]\n\n## Skill Version(s):\n\n1.1.5 (source: server release evidence)\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 v1.1.5:package-lock.json\n\n{\n  \"name\": \"wechat-article-archive\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"dependencies\": {\n        \"cheerio\": \"^1.2.0\",\n        \"dayjs\": \"^1.11.19\",\n        \"lodash.unescape\": \"^4.0.1\",\n        \"qs\": \"^6.15.0\"\n      }\n    },\n    \"node_modules/boolbase\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz\",\n      \"integrity\": \"sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/call-bind-apply-helpers\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz\",\n      \"integrity\": \"sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"function-bind\": \"^1.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/call-bound\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz\",\n      \"integrity\": \"sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.2\",\n        \"get-intrinsic\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/cheerio\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz\",\n      \"integrity\": \"sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"cheerio-select\": \"^2.1.0\",\n        \"dom-serializer\": \"^2.0.0\",\n        \"domhandler\": \"^5.0.3\",\n        \"domutils\": \"^3.2.2\",\n        \"encoding-sniffer\": \"^0.2.1\",\n        \"htmlparser2\": \"^10.1.0\",\n        \"parse5\": \"^7.3.0\",\n        \"parse5-htmlparser2-tree-adapter\": \"^7.1.0\",\n        \"parse5-parser-stream\": \"^7.1.2\",\n        \"undici\": \"^7.19.0\",\n        \"whatwg-mimetype\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.1\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/cheeriojs/cheerio?sponsor=1\"\n      }\n    },\n    \"node_modules/cheerio-select\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz\",\n      \"integrity\": \"sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==\",\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"boolbase\": \"^1.0.0\",\n        \"css-select\": \"^5.1.0\",\n        \"css-what\": \"^6.1.0\",\n        \"domelementtype\": \"^2.3.0\",\n        \"domhandler\": \"^5.0.3\",\n        \"domutils\": \"^3.0.1\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/fb55\"\n      }\n    },\n    \"node_modules/css-select\": {\n      \"version\": \"5.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz\",\n      \"integrity\": \"sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==\",\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"boolbase\": \"^1.0.0\",\n        \"css-what\": \"^6.1.0\",\n        \"domhandler\": \"^5.0.2\",\n        \"domutils\": \"^3.0.1\",\n        \"nth-check\": \"^2.0.1\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/fb55\"\n      }\n    },\n    \"node_modules/css-what\": {\n      \"version\": \"6.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz\",\n      \"integrity\": \"sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==\",\n      \"license\": \"BSD-2-Clause\",\n      \"engines\": {\n        \"node\": \">= 6\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/fb55\"\n      }\n    },\n    \"node_modules/dayjs\": {\n      \"version\": \"1.11.21\",\n      \"resolved\": \"https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz\",\n      \"integrity\": \"sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/dom-serializer\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz\",\n      \"integrity\": \"sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"domelementtype\": \"^2.3.0\",\n        \"domhandler\": \"^5.0.2\",\n        \"entities\": \"^4.2.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/cheeriojs/dom-serializer?sponsor=1\"\n      }\n    },\n    \"node_modules/domelementtype\": {\n      \"version\": \"2.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz\",\n      \"integrity\": \"sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/fb55\"\n        }\n      ],\n      \"license\": \"BSD-2-Clause\"\n    },\n    \"node_modules/domhandler\": {\n      \"version\": \"5.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz\",\n      \"integrity\": \"sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==\",\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"domelementtype\": \"^2.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/domhandler?sponsor=1\"\n      }\n    },\n    \"node_modules/domutils\": {\n      \"version\": \"3.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz\",\n      \"integrity\": \"sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==\",\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"dom-serializer\": \"^2.0.0\",\n        \"domelementtype\": \"^2.3.0\",\n        \"domhandler\": \"^5.0.3\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/domutils?sponsor=1\"\n      }\n    },\n    \"node_modules/dunder-proto\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz\",\n      \"integrity\": \"sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.1\",\n        \"es-errors\": \"^1.3.0\",\n        \"gopd\": \"^1.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/encoding-sniffer\": {\n      \"version\": \"0.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz\",\n      \"integrity\": \"sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"iconv-lite\": \"^0.6.3\",\n        \"whatwg-encoding\": \"^3.1.1\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/encoding-sniffer?sponsor=1\"\n      }\n    },\n    \"node_modules/entities\": {\n      \"version\": \"4.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/entities/-/entities-4.5.0.tgz\",\n      \"integrity\": \"sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==\",\n      \"license\": \"BSD-2-Clause\",\n      \"engines\": {\n        \"node\": \">=0.12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/entities?sponsor=1\"\n      }\n    },\n    \"node_modules/es-define-property\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz\",\n      \"integrity\": \"sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/es-errors\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz\",\n      \"integrity\": \"sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/es-object-atoms\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz\",\n      \"integrity\": \"sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/function-bind\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz\",\n      \"integrity\": \"sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==\",\n      \"license\": \"MIT\",\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/get-intrinsic\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz\",\n      \"integrity\": \"sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.2\",\n        \"es-define-property\": \"^1.0.1\",\n        \"es-errors\": \"^1.3.0\",\n        \"es-object-atoms\": \"^1.1.1\",\n        \"function-bind\": \"^1.1.2\",\n        \"get-proto\": \"^1.0.1\",\n        \"gopd\": \"^1.2.0\",\n        \"has-symbols\": \"^1.1.0\",\n        \"hasown\": \"^2.0.2\",\n        \"math-intrinsics\": \"^1.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/get-proto\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz\",\n      \"integrity\": \"sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"dunder-proto\": \"^1.0.1\",\n        \"es-object-atoms\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/gopd\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz\",\n      \"integrity\": \"sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/has-symbols\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz\",\n      \"integrity\": \"sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/hasown\": {\n      \"version\": \"2.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz\",\n      \"integrity\": \"sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"function-bind\": \"^1.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/htmlparser2\": {\n      \"version\": \"10.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz\",\n      \"integrity\": \"sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==\",\n      \"funding\": [\n        \"https://github.com/fb55/htmlparser2?sponsor=1\",\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/fb55\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"domelementtype\": \"^2.3.0\",\n        \"domhandler\": \"^5.0.3\",\n        \"domutils\": \"^3.2.2\",\n        \"entities\": \"^7.0.1\"\n      }\n    },\n    \"node_modules/htmlparser2/node_modules/entities\": {\n      \"version\": \"7.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/entities/-/entities-7.0.1.tgz\",\n      \"integrity\": \"sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==\",\n      \"license\": \"BSD-2-Clause\",\n      \"engines\": {\n        \"node\": \">=0.12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/entities?sponsor=1\"\n      }\n    },\n    \"node_modules/iconv-lite\": {\n      \"version\": \"0.6.3\",\n      \"resolved\": \"https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz\",\n      \"integrity\": \"sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"safer-buffer\": \">= 2.1.2 < 3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/lodash.unescape\": {\n      \"version\": \"4.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz\",\n      \"integrity\": \"sha512-DhhGRshNS1aX6s5YdBE3njCCouPgnG29ebyHvImlZzXZf2SHgt+J08DHgytTPnpywNbO1Y8mNUFyQuIDBq2JZg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/math-intrinsics\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz\",\n      \"integrity\": \"sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/nth-check\": {\n      \"version\": \"2.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz\",\n      \"integrity\": \"sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==\",\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"boolbase\": \"^1.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/nth-check?sponsor=1\"\n      }\n    },\n    \"node_modules/object-inspect\": {\n      \"version\": \"1.13.4\",\n      \"resolved\": \"https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz\",\n      \"integrity\": \"sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/parse5\": {\n      \"version\": \"7.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz\",\n      \"integrity\": \"sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"entities\": \"^6.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/inikulin/parse5?sponsor=1\"\n      }\n    },\n    \"node_modules/parse5-htmlparser2-tree-adapter\": {\n      \"version\": \"7.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz\",\n      \"integrity\": \"sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"domhandler\": \"^5.0.3\",\n        \"parse5\": \"^7.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/inikulin/parse5?sponsor=1\"\n      }\n    },\n    \"node_modules/parse5-parser-stream\": {\n      \"version\": \"7.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz\",\n      \"integrity\": \"sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"parse5\": \"^7.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/inikulin/parse5?sponsor=1\"\n      }\n    },\n    \"node_modules/parse5/node_modules/entities\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/entities/-/entities-6.0.1.tgz\",\n      \"integrity\": \"sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==\",\n      \"license\": \"BSD-2-Clause\",\n      \"engines\": {\n        \"node\": \">=0.12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/entities?sponsor=1\"\n      }\n    },\n    \"node_modules/qs\": {\n      \"version\": \"6.15.3\",\n      \"resolved\": \"https://registry.npmjs.org/qs/-/qs-6.15.3.tgz\",\n      \"integrity\": \"sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==\",\n      \"license\": \"BSD-3-Clause\",\n      \"dependencies\": {\n        \"es-define-property\": \"^1.0.1\",\n        \"side-channel\": \"^1.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=0.6\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/safer-buffer\": {\n      \"version\": \"2.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz\",\n      \"integrity\": \"sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/side-channel\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz\",\n      \"integrity\": \"sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"object-inspect\": \"^1.13.4\",\n        \"side-channel-list\": \"^1.0.1\",\n        \"side-channel-map\": \"^1.0.1\",\n        \"side-channel-weakmap\": \"^1.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/side-channel-list\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz\",\n      \"integrity\": \"sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"object-inspect\": \"^1.13.4\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/side-channel-map\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz\",\n      \"integrity\": \"sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bound\": \"^1.0.2\",\n        \"es-errors\": \"^1.3.0\",\n        \"get-intrinsic\": \"^1.2.5\",\n        \"object-inspect\": \"^1.13.3\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/side-channel-weakmap\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz\",\n      \"integrity\": \"sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bound\": \"^1.0.2\",\n        \"es-errors\": \"^1.3.0\",\n        \"get-intrinsic\": \"^1.2.5\",\n        \"object-inspect\": \"^1.13.3\",\n        \"side-channel-map\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/undici\": {\n      \"version\": \"7.28.0\",\n      \"resolved\": \"https://registry.npmjs.org/undici/-/undici-7.28.0.tgz\",\n      \"integrity\": \"sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=20.18.1\"\n      }\n    },\n    \"node_modules/whatwg-encoding\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz\",\n      \"integrity\": \"sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==\",\n      \"deprecated\": \"Use @exodus/bytes instead for a more spec-conformant and faster implementation\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"iconv-lite\": \"0.6.3\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/whatwg-mimetype\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz\",\n      \"integrity\": \"sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    }\n  }\n}\n\nFile v1.1.5:package.json\n\n{\n  \"dependencies\": {\n    \"cheerio\": \"^1.2.0\",\n    \"dayjs\": \"^1.11.19\",\n    \"lodash.unescape\": \"^4.0.1\",\n    \"qs\": \"^6.15.0\"\n  }\n}\n\nFile v1.1.5:agents/openai.yaml\n\ninterface:\n  display_name: \"WeChat Article Archive\"\n  short_description: \"Archive WeChat articles and image notes locally\"\n  default_prompt: \"Use $wechat-article-archive to save this WeChat article or image note as Markdown with local images.\"\n\nFile v1.1.5:requirements.txt\n\nbeautifulsoup4>=4.12\n\nArchive v1.1.4: 10 files, 22447 bytes\n\nFiles: agents/openai.yaml (244b), package-lock.json (21097b), package.json (131b), requirements.txt (21b), scripts/archive_wechat_article.py (14825b), scripts/errors.js (957b), scripts/extract.js (24368b), skill-card.md (2290b), SKILL.md (4256b), _meta.json (141b)\n\nFile v1.1.4:SKILL.md\n\n---\nname: wechat-article-archive\ndescription: Save WeChat Official Account articles and image-note / 小绿书 pages from mp.weixin.qq.com into a user-specified local folder as Markdown plus local assets. Use when the user asks to 保存/归档/下载/导出公众号文章、提取多张图片、从浏览器保存的最终 HTML 恢复文章，or generate Markdown with WeChat images copied locally instead of uploading to IMA or another cloud service.\n---\n\n# WeChat Article Archive\n\nArchive a WeChat Official Account article to local files:\n\n```text\ntarget-folder/\n  Article title.md\n  assets/\n    image-01-xxxx.jpg\n    image-02-xxxx.png\n```\n\n## Workflow\n\n1. Confirm the user provided both:\n   - a `mp.weixin.qq.com` article URL\n   - a destination folder\n2. Run the bundled script from this skill directory:\n\n```bash\ncd \"${CODEX_HOME:-$HOME/.codex}/skills/wechat-article-archive\"\n.venv/bin/python scripts/archive_wechat_article.py \"<wechat-url>\" \"<destination-folder>\"\n```\n\n3. Read the JSON output and report:\n   - Markdown file path\n   - `assets/` directory path\n   - downloaded image count\n   - any image download failures\n\n## Script\n\nUse `scripts/archive_wechat_article.py`.\n\nArguments:\n\n```bash\n.venv/bin/python scripts/archive_wechat_article.py \"<url>\" \"<output_dir>\" [--filename \"custom.md\"] [--skip-images] [--html-file \"page.html\"] [--image-timeout 30]\n```\n\nBehavior:\n\n- Parses the article with the bundled `extract.js`.\n- Preserves title, author, account name, publish time, original link, body text, headings, tables, blockquotes, lists, code blocks, and inline image order.\n- Downloads body images into `<output_dir>/assets/`.\n- Rewrites Markdown image links to relative `assets/...` paths.\n- Supports WeChat image-note / 小绿书 pages by extracting every top-level image from `picture_page_info_list` in display order.\n- Preserves image-note / 小绿书 body text from the page description, decodes escaped line breaks, and writes the text before the ordered images.\n- When `picture_page_info_list` also appears on a normal long article, prefers the substantive structured HTML body instead of replacing it with the short page description and image list.\n- Accepts a browser-saved final page source through `--html-file` when direct URL fetching is blocked or returns a different page. Keep the original WeChat URL as the first argument so metadata retains the source link.\n- If the body contains no inline images but the article has a cover image, inserts and downloads the cover image.\n- Prints a JSON result for verification. Check `body_text_length`, `body_img_count`, `downloaded_image_count`, and `image_failures`; do not treat `ok: true` alone as proof that the article is complete.\n\n## Dependencies\n\nRun once if dependencies are missing:\n\n```bash\ncd \"${CODEX_HOME:-$HOME/.codex}/skills/wechat-article-archive\"\nnpm install\npython3 -m venv .venv\n.venv/bin/python -m pip install -r requirements.txt\n```\n\nRequired commands:\n\n- `python3`\n- `node`\n- npm dependencies declared in `package.json`\n\nIf `node` is not on PATH but available elsewhere, set:\n\n```bash\nNODE=/absolute/path/to/node .venv/bin/python scripts/archive_wechat_article.py \"<url>\" \"<output_dir>\"\n```\n\n## Errors\n\n- `不支持的链接` → URL is not a supported WeChat article link.\n- `访问过于频繁` → WeChat blocked the request temporarily; retry later or use another network/session.\n- `extractor not found` → skill files are incomplete.\n- `Cannot find module ...` → run `npm install` in the skill directory.\n- image failures in JSON → Markdown was created, but one or more images could not be downloaded; report the failures and keep the original URLs in Markdown for those images.\n- Image-note / 小绿书 pages use a different WeChat page structure from normal articles. Do not treat an empty `#js_content` as an image-less article when `picture_page_info_list` is present.\n\n## Notes\n\n- Prefer this skill only for local file archiving. Do not use it for IMA upload, knowledge-base import, or WeChat message sending.\n- Do not create nested folders per article unless the user asks. The destination folder itself is the article archive folder.\n- Do not overwrite unrelated files manually. The script creates or reuses the destination folder and `assets/`.\n\nFile v1.1.4:_meta.json\n\n{\n  \"ownerId\": \"kn72j0qng9f6mm49z983cyzw1982naag\",\n  \"slug\": \"wechat-article-archive\",\n  \"version\": \"1.1.4\",\n  \"publishedAt\": 1784160237334\n}\n\nFile v1.1.4:skill-card.md\n\n## Description: <br>\nSave WeChat Official Account articles and image-note / Xiaolushu pages from mp.weixin.qq.com into a user-specified local folder as Markdown plus local assets. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[harven-droid](https://clawhub.ai/user/harven-droid) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nExternal users and developers use this skill to archive WeChat Official Account articles or image-note pages into a local folder as Markdown with copied image assets. It is suited for local preservation and review workflows, not cloud import or message sending. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill fetches WeChat content and downloads referenced images from the network. <br>\nMitigation: Use it only for user-selected WeChat URLs or trusted saved HTML, and refresh dependencies from trusted registries. <br>\nRisk: The skill writes Markdown and image files into a user-selected local directory. <br>\nMitigation: Use a dedicated output folder and review generated file paths and image failure reports before relying on the archive. <br>\nRisk: A custom NODE path can change which runtime executes the bundled extractor. <br>\nMitigation: Avoid setting NODE unless the runtime path is trusted. <br>\n\n\n## Reference(s): <br>\n- [ClawHub Skill Page](https://clawhub.ai/harven-droid/skills/wechat-article-archive) <br>\n- [Publisher Profile](https://clawhub.ai/user/harven-droid) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [Markdown, Files, JSON, Shell commands, Guidance] <br>\n**Output Format:** [Markdown files with local image assets and JSON execution summaries] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Creates or reuses a destination folder, writes an assets subdirectory, and reports paths, image counts, and image download failures.] <br>\n\n## Skill Version(s): <br>\n1.1.4 (source: server release metadata) <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 v1.1.4:package-lock.json\n\n{\n  \"name\": \"wechat-article-archive\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"dependencies\": {\n        \"cheerio\": \"^1.2.0\",\n        \"dayjs\": \"^1.11.19\",\n        \"lodash.unescape\": \"^4.0.1\",\n        \"qs\": \"^6.15.0\"\n      }\n    },\n    \"node_modules/boolbase\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz\",\n      \"integrity\": \"sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/call-bind-apply-helpers\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz\",\n      \"integrity\": \"sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"function-bind\": \"^1.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/call-bound\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz\",\n      \"integrity\": \"sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.2\",\n        \"get-intrinsic\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/cheerio\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz\",\n      \"integrity\": \"sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"cheerio-select\": \"^2.1.0\",\n        \"dom-serializer\": \"^2.0.0\",\n        \"domhandler\": \"^5.0.3\",\n        \"domutils\": \"^3.2.2\",\n        \"encoding-sniffer\": \"^0.2.1\",\n        \"htmlparser2\": \"^10.1.0\",\n        \"parse5\": \"^7.3.0\",\n        \"parse5-htmlparser2-tree-adapter\": \"^7.1.0\",\n        \"parse5-parser-stream\": \"^7.1.2\",\n        \"undici\": \"^7.19.0\",\n        \"whatwg-mimetype\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.1\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/cheeriojs/cheerio?sponsor=1\"\n      }\n    },\n    \"node_modules/cheerio-select\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz\",\n      \"integrity\": \"sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==\",\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"boolbase\": \"^1.0.0\",\n        \"css-select\": \"^5.1.0\",\n        \"css-what\": \"^6.1.0\",\n        \"domelementtype\": \"^2.3.0\",\n        \"domhandler\": \"^5.0.3\",\n        \"domutils\": \"^3.0.1\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/fb55\"\n      }\n    },\n    \"node_modules/css-select\": {\n      \"version\": \"5.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz\",\n      \"integrity\": \"sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==\",\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"boolbase\": \"^1.0.0\",\n        \"css-what\": \"^6.1.0\",\n        \"domhandler\": \"^5.0.2\",\n        \"domutils\": \"^3.0.1\",\n        \"nth-check\": \"^2.0.1\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/fb55\"\n      }\n    },\n    \"node_modules/css-what\": {\n      \"version\": \"6.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz\",\n      \"integrity\": \"sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==\",\n      \"license\": \"BSD-2-Clause\",\n      \"engines\": {\n        \"node\": \">= 6\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/fb55\"\n      }\n    },\n    \"node_modules/dayjs\": {\n      \"version\": \"1.11.21\",\n      \"resolved\": \"https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz\",\n      \"integrity\": \"sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/dom-serializer\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz\",\n      \"integrity\": \"sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"domelementtype\": \"^2.3.0\",\n        \"domhandler\": \"^5.0.2\",\n        \"entities\": \"^4.2.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/cheeriojs/dom-serializer?sponsor=1\"\n      }\n    },\n    \"node_modules/domelementtype\": {\n      \"version\": \"2.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz\",\n      \"integrity\": \"sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/fb55\"\n        }\n      ],\n      \"license\": \"BSD-2-Clause\"\n    },\n    \"node_modules/domhandler\": {\n      \"version\": \"5.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz\",\n      \"integrity\": \"sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==\",\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"domelementtype\": \"^2.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/domhandler?sponsor=1\"\n      }\n    },\n    \"node_modules/domutils\": {\n      \"version\": \"3.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz\",\n      \"integrity\": \"sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==\",\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"dom-serializer\": \"^2.0.0\",\n        \"domelementtype\": \"^2.3.0\",\n        \"domhandler\": \"^5.0.3\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/domutils?sponsor=1\"\n      }\n    },\n    \"node_modules/dunder-proto\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz\",\n      \"integrity\": \"sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.1\",\n        \"es-errors\": \"^1.3.0\",\n        \"gopd\": \"^1.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/encoding-sniffer\": {\n      \"version\": \"0.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz\",\n      \"integrity\": \"sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"iconv-lite\": \"^0.6.3\",\n        \"whatwg-encoding\": \"^3.1.1\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/encoding-sniffer?sponsor=1\"\n      }\n    },\n    \"node_modules/entities\": {\n      \"version\": \"4.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/entities/-/entities-4.5.0.tgz\",\n      \"integrity\": \"sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==\",\n      \"license\": \"BSD-2-Clause\",\n      \"engines\": {\n        \"node\": \">=0.12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/entities?sponsor=1\"\n      }\n    },\n    \"node_modules/es-define-property\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz\",\n      \"integrity\": \"sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/es-errors\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz\",\n      \"integrity\": \"sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/es-object-atoms\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz\",\n      \"integrity\": \"sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/function-bind\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz\",\n      \"integrity\": \"sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==\",\n      \"license\": \"MIT\",\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/get-intrinsic\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz\",\n      \"integrity\": \"sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.2\",\n        \"es-define-property\": \"^1.0.1\",\n        \"es-errors\": \"^1.3.0\",\n        \"es-object-atoms\": \"^1.1.1\",\n        \"function-bind\": \"^1.1.2\",\n        \"get-proto\": \"^1.0.1\",\n        \"gopd\": \"^1.2.0\",\n        \"has-symbols\": \"^1.1.0\",\n        \"hasown\": \"^2.0.2\",\n        \"math-intrinsics\": \"^1.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/get-proto\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz\",\n      \"integrity\": \"sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"dunder-proto\": \"^1.0.1\",\n        \"es-object-atoms\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/gopd\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz\",\n      \"integrity\": \"sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/has-symbols\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz\",\n      \"integrity\": \"sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/hasown\": {\n      \"version\": \"2.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz\",\n      \"integrity\": \"sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"function-bind\": \"^1.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/htmlparser2\": {\n      \"version\": \"10.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz\",\n      \"integrity\": \"sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==\",\n      \"funding\": [\n        \"https://github.com/fb55/htmlparser2?sponsor=1\",\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/fb55\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"domelementtype\": \"^2.3.0\",\n        \"domhandler\": \"^5.0.3\",\n        \"domutils\": \"^3.2.2\",\n        \"entities\": \"^7.0.1\"\n      }\n    },\n    \"node_modules/htmlparser2/node_modules/entities\": {\n      \"version\": \"7.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/entities/-/entities-7.0.1.tgz\",\n      \"integrity\": \"sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==\",\n      \"license\": \"BSD-2-Clause\",\n      \"engines\": {\n        \"node\": \">=0.12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/entities?sponsor=1\"\n      }\n    },\n    \"node_modules/iconv-lite\": {\n      \"version\": \"0.6.3\",\n      \"resolved\": \"https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz\",\n      \"integrity\": \"sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"safer-buffer\": \">= 2.1.2 < 3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/lodash.unescape\": {\n      \"version\": \"4.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz\",\n      \"integrity\": \"sha512-DhhGRshNS1aX6s5YdBE3njCCouPgnG29ebyHvImlZzXZf2SHgt+J08DHgytTPnpywNbO1Y8mNUFyQuIDBq2JZg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/math-intrinsics\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz\",\n      \"integrity\": \"sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/nth-check\": {\n      \"version\": \"2.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz\",\n      \"integrity\": \"sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==\",\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"boolbase\": \"^1.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/nth-check?sponsor=1\"\n      }\n    },\n    \"node_modules/object-inspect\": {\n      \"version\": \"1.13.4\",\n      \"resolved\": \"https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz\",\n      \"integrity\": \"sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/parse5\": {\n      \"version\": \"7.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz\",\n      \"integrity\": \"sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"entities\": \"^6.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/inikulin/parse5?sponsor=1\"\n      }\n    },\n    \"node_modules/parse5-htmlparser2-tree-adapter\": {\n      \"version\": \"7.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz\",\n      \"integrity\": \"sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"domhandler\": \"^5.0.3\",\n        \"parse5\": \"^7.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/inikulin/parse5?sponsor=1\"\n      }\n    },\n    \"node_modules/parse5-parser-stream\": {\n      \"version\": \"7.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz\",\n      \"integrity\": \"sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"parse5\": \"^7.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/inikulin/parse5?sponsor=1\"\n      }\n    },\n    \"node_modules/parse5/node_modules/entities\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/entities/-/entities-6.0.1.tgz\",\n      \"integrity\": \"sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==\",\n      \"license\": \"BSD-2-Clause\",\n      \"engines\": {\n        \"node\": \">=0.12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/entities?sponsor=1\"\n      }\n    },\n    \"node_modules/qs\": {\n      \"version\": \"6.15.3\",\n      \"resolved\": \"https://registry.npmjs.org/qs/-/qs-6.15.3.tgz\",\n      \"integrity\": \"sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==\",\n      \"license\": \"BSD-3-Clause\",\n      \"dependencies\": {\n        \"es-define-property\": \"^1.0.1\",\n        \"side-channel\": \"^1.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=0.6\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/safer-buffer\": {\n      \"version\": \"2.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz\",\n      \"integrity\": \"sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/side-channel\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz\",\n      \"integrity\": \"sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"object-inspect\": \"^1.13.4\",\n        \"side-channel-list\": \"^1.0.1\",\n        \"side-channel-map\": \"^1.0.1\",\n        \"side-channel-weakmap\": \"^1.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/side-channel-list\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz\",\n      \"integrity\": \"sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"object-inspect\": \"^1.13.4\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/side-channel-map\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz\",\n      \"integrity\": \"sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bound\": \"^1.0.2\",\n        \"es-errors\": \"^1.3.0\",\n        \"get-intrinsic\": \"^1.2.5\",\n        \"object-inspect\": \"^1.13.3\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/side-channel-weakmap\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz\",\n      \"integrity\": \"sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bound\": \"^1.0.2\",\n        \"es-errors\": \"^1.3.0\",\n        \"get-intrinsic\": \"^1.2.5\",\n        \"object-inspect\": \"^1.13.3\",\n        \"side-channel-map\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/undici\": {\n      \"version\": \"7.28.0\",\n      \"resolved\": \"https://registry.npmjs.org/undici/-/undici-7.28.0.tgz\",\n      \"integrity\": \"sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=20.18.1\"\n      }\n    },\n    \"node_modules/whatwg-encoding\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz\",\n      \"integrity\": \"sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==\",\n      \"deprecated\": \"Use @exodus/bytes instead for a more spec-conformant and faster implementation\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"iconv-lite\": \"0.6.3\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/whatwg-mimetype\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz\",\n      \"integrity\": \"sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    }\n  }\n}\n\nFile v1.1.4:package.json\n\n{\n  \"dependencies\": {\n    \"cheerio\": \"^1.2.0\",\n    \"dayjs\": \"^1.11.19\",\n    \"lodash.unescape\": \"^4.0.1\",\n    \"qs\": \"^6.15.0\"\n  }\n}\n\nFile v1.1.4:agents/openai.yaml\n\ninterface:\n  display_name: \"WeChat Article Archive\"\n  short_description: \"Archive WeChat articles and image notes locally\"\n  default_prompt: \"Use $wechat-article-archive to save this WeChat article or image note as Markdown with local images.\"\n\nFile v1.1.4:requirements.txt\n\nbeautifulsoup4>=4.12\n\nArchive v1.1.3: 10 files, 21826 bytes\n\nFiles: agents/openai.yaml (244b), package-lock.json (21097b), package.json (131b), requirements.txt (21b), scripts/archive_wechat_article.py (14825b), scripts/errors.js (957b), scripts/extract.js (22283b), skill-card.md (2270b), SKILL.md (3907b), _meta.json (141b)\n\nFile v1.1.3:SKILL.md\n\n---\nname: wechat-article-archive\ndescription: Save WeChat Official Account articles and image-note / 小绿书 pages from mp.weixin.qq.com into a user-specified local folder as Markdown plus local assets. Use when the user asks to 保存/归档/下载/导出公众号文章、提取多张图片、从浏览器保存的最终 HTML 恢复文章，or generate Markdown with WeChat images copied locally instead of uploading to IMA or another cloud service.\n---\n\n# WeChat Article Archive\n\nArchive a WeChat Official Account article to local files:\n\n```text\ntarget-folder/\n  Article title.md\n  assets/\n    image-01-xxxx.jpg\n    image-02-xxxx.png\n```\n\n## Workflow\n\n1. Confirm the user provided both:\n   - a `mp.weixin.qq.com` article URL\n   - a destination folder\n2. Run the bundled script from this skill directory:\n\n```bash\ncd \"${CODEX_HOME:-$HOME/.codex}/skills/wechat-article-archive\"\n.venv/bin/python scripts/archive_wechat_article.py \"<wechat-url>\" \"<destination-folder>\"\n```\n\n3. Read the JSON output and report:\n   - Markdown file path\n   - `assets/` directory path\n   - downloaded image count\n   - any image download failures\n\n## Script\n\nUse `scripts/archive_wechat_article.py`.\n\nArguments:\n\n```bash\n.venv/bin/python scripts/archive_wechat_article.py \"<url>\" \"<output_dir>\" [--filename \"custom.md\"] [--skip-images] [--html-file \"page.html\"] [--image-timeout 30]\n```\n\nBehavior:\n\n- Parses the article with the bundled `extract.js`.\n- Preserves title, author, account name, publish time, original link, body text, headings, tables, blockquotes, lists, code blocks, and inline image order.\n- Downloads body images into `<output_dir>/assets/`.\n- Rewrites Markdown image links to relative `assets/...` paths.\n- Supports WeChat image-note / 小绿书 pages by extracting every top-level image from `picture_page_info_list` in display order.\n- Preserves image-note / 小绿书 body text from the page description, decodes escaped line breaks, and writes the text before the ordered images.\n- Accepts a browser-saved final page source through `--html-file` when direct URL fetching is blocked or returns a different page. Keep the original WeChat URL as the first argument so metadata retains the source link.\n- If the body contains no inline images but the article has a cover image, inserts and downloads the cover image.\n- Prints a JSON result for verification.\n\n## Dependencies\n\nRun once if dependencies are missing:\n\n```bash\ncd \"${CODEX_HOME:-$HOME/.codex}/skills/wechat-article-archive\"\nnpm install\npython3 -m venv .venv\n.venv/bin/python -m pip install -r requirements.txt\n```\n\nRequired commands:\n\n- `python3`\n- `node`\n- npm dependencies declared in `package.json`\n\nIf `node` is not on PATH but available elsewhere, set:\n\n```bash\nNODE=/absolute/path/to/node .venv/bin/python scripts/archive_wechat_article.py \"<url>\" \"<output_dir>\"\n```\n\n## Errors\n\n- `不支持的链接` → URL is not a supported WeChat article link.\n- `访问过于频繁` → WeChat blocked the request temporarily; retry later or use another network/session.\n- `extractor not found` → skill files are incomplete.\n- `Cannot find module ...` → run `npm install` in the skill directory.\n- image failures in JSON → Markdown was created, but one or more images could not be downloaded; report the failures and keep the original URLs in Markdown for those images.\n- Image-note / 小绿书 pages use a different WeChat page structure from normal articles. Do not treat an empty `#js_content` as an image-less article when `picture_page_info_list` is present.\n\n## Notes\n\n- Prefer this skill only for local file archiving. Do not use it for IMA upload, knowledge-base import, or WeChat message sending.\n- Do not create nested folders per article unless the user asks. The destination folder itself is the article archive folder.\n- Do not overwrite unrelated files manually. The script creates or reuses the destination folder and `assets/`.\n\nFile v1.1.3:_meta.json\n\n{\n  \"ownerId\": \"kn72j0qng9f6mm49z983cyzw1982naag\",\n  \"slug\": \"wechat-article-archive\",\n  \"version\": \"1.1.3\",\n  \"publishedAt\": 1784002766586\n}\n\nFile v1.1.3:skill-card.md\n\n## Description: <br>\nSave WeChat Official Account articles and image-note pages from mp.weixin.qq.com into a user-specified local folder as Markdown plus local assets. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[harven-droid](https://clawhub.ai/user/harven-droid) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and content archivists use this skill to save WeChat articles or image-note pages as local Markdown with downloaded assets for offline reference, migration, or review. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill fetches WeChat pages and article images from the network. <br>\nMitigation: Use trusted WeChat article URLs or saved HTML files, and review the JSON result for image download failures. <br>\nRisk: The skill writes Markdown and assets into the destination folder and could overwrite an existing Markdown file with the same generated or requested name. <br>\nMitigation: Choose a dedicated archive folder and avoid sensitive directories or filenames that already contain important files. <br>\nRisk: The skill may install and run local Python and Node dependencies. <br>\nMitigation: Install dependencies in the skill's isolated environment and review dependency changes before use. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/harven-droid/skills/wechat-article-archive) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, files, shell commands, configuration, guidance] <br>\n**Output Format:** [Markdown guidance with bash commands; the bundled script produces JSON verification output plus local Markdown and asset files.] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Requires a WeChat article URL and destination folder; can use a saved HTML file when direct fetching is blocked.] <br>\n\n## Skill Version(s): <br>\n1.1.3 (source: server release evidence) <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 v1.1.3:package-lock.json\n\n{\n  \"name\": \"wechat-article-archive\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"dependencies\": {\n        \"cheerio\": \"^1.2.0\",\n        \"dayjs\": \"^1.11.19\",\n        \"lodash.unescape\": \"^4.0.1\",\n        \"qs\": \"^6.15.0\"\n      }\n    },\n    \"node_modules/boolbase\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz\",\n      \"integrity\": \"sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/call-bind-apply-helpers\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz\",\n      \"integrity\": \"sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"function-bind\": \"^1.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/call-bound\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz\",\n      \"integrity\": \"sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.2\",\n        \"get-intrinsic\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/cheerio\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz\",\n      \"integrity\": \"sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"cheerio-select\": \"^2.1.0\",\n        \"dom-serializer\": \"^2.0.0\",\n        \"domhandler\": \"^5.0.3\",\n        \"domutils\": \"^3.2.2\",\n        \"encoding-sniffer\": \"^0.2.1\",\n        \"htmlparser2\": \"^10.1.0\",\n        \"parse5\": \"^7.3.0\",\n        \"parse5-htmlparser2-tree-adapter\": \"^7.1.0\",\n        \"parse5-parser-stream\": \"^7.1.2\",\n        \"undici\": \"^7.19.0\",\n        \"whatwg-mimetype\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.1\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/cheeriojs/cheerio?sponsor=1\"\n      }\n    },\n    \"node_modules/cheerio-select\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz\",\n      \"integrity\": \"sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==\",\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"boolbase\": \"^1.0.0\",\n        \"css-select\": \"^5.1.0\",\n        \"css-what\": \"^6.1.0\",\n        \"domelementtype\": \"^2.3.0\",\n        \"domhandler\": \"^5.0.3\",\n        \"domutils\": \"^3.0.1\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/fb55\"\n      }\n    },\n    \"node_modules/css-select\": {\n      \"version\": \"5.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz\",\n      \"integrity\": \"sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==\",\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"boolbase\": \"^1.0.0\",\n        \"css-what\": \"^6.1.0\",\n        \"domhandler\": \"^5.0.2\",\n        \"domutils\": \"^3.0.1\",\n        \"nth-check\": \"^2.0.1\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/fb55\"\n      }\n    },\n    \"node_modules/css-what\": {\n      \"version\": \"6.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz\",\n      \"integrity\": \"sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==\",\n      \"license\": \"BSD-2-Clause\",\n      \"engines\": {\n        \"node\": \">= 6\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/fb55\"\n      }\n    },\n    \"node_modules/dayjs\": {\n      \"version\": \"1.11.21\",\n      \"resolved\": \"https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz\",\n      \"integrity\": \"sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/dom-serializer\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz\",\n      \"integrity\": \"sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"domelementtype\": \"^2.3.0\",\n        \"domhandler\": \"^5.0.2\",\n        \"entities\": \"^4.2.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/cheeriojs/dom-serializer?sponsor=1\"\n      }\n    },\n    \"node_modules/domelementtype\": {\n      \"version\": \"2.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz\",\n      \"integrity\": \"sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/fb55\"\n        }\n      ],\n      \"license\": \"BSD-2-Clause\"\n    },\n    \"node_modules/domhandler\": {\n      \"version\": \"5.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz\",\n      \"integrity\": \"sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==\",\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"domelementtype\": \"^2.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/domhandler?sponsor=1\"\n      }\n    },\n    \"node_modules/domutils\": {\n      \"version\": \"3.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz\",\n      \"integrity\": \"sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==\",\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"dom-serializer\": \"^2.0.0\",\n        \"domelementtype\": \"^2.3.0\",\n        \"domhandler\": \"^5.0.3\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/domutils?sponsor=1\"\n      }\n    },\n    \"node_modules/dunder-proto\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz\",\n      \"integrity\": \"sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.1\",\n        \"es-errors\": \"^1.3.0\",\n        \"gopd\": \"^1.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/encoding-sniffer\": {\n      \"version\": \"0.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz\",\n      \"integrity\": \"sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"iconv-lite\": \"^0.6.3\",\n        \"whatwg-encoding\": \"^3.1.1\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/encoding-sniffer?sponsor=1\"\n      }\n    },\n    \"node_modules/entities\": {\n      \"version\": \"4.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/entities/-/entities-4.5.0.tgz\",\n      \"integrity\": \"sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==\",\n      \"license\": \"BSD-2-Clause\",\n      \"engines\": {\n        \"node\": \">=0.12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/entities?sponsor=1\"\n      }\n    },\n    \"node_modules/es-define-property\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz\",\n      \"integrity\": \"sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/es-errors\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz\",\n      \"integrity\": \"sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/es-object-atoms\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz\",\n      \"integrity\": \"sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/function-bind\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz\",\n      \"integrity\": \"sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==\",\n      \"license\": \"MIT\",\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/get-intrinsic\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz\",\n      \"integrity\": \"sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.2\",\n        \"es-define-property\": \"^1.0.1\",\n        \"es-errors\": \"^1.3.0\",\n        \"es-object-atoms\": \"^1.1.1\",\n        \"function-bind\": \"^1.1.2\",\n        \"get-proto\": \"^1.0.1\",\n        \"gopd\": \"^1.2.0\",\n        \"has-symbols\": \"^1.1.0\",\n        \"hasown\": \"^2.0.2\",\n        \"math-intrinsics\": \"^1.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/get-proto\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz\",\n      \"integrity\": \"sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"dunder-proto\": \"^1.0.1\",\n        \"es-object-atoms\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/gopd\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz\",\n      \"integrity\": \"sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/has-symbols\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz\",\n      \"integrity\": \"sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/hasown\": {\n      \"version\": \"2.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz\",\n      \"integrity\": \"sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"function-bind\": \"^1.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/htmlparser2\": {\n      \"version\": \"10.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz\",\n      \"integrity\": \"sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==\",\n      \"funding\": [\n        \"https://github.com/fb55/htmlparser2?sponsor=1\",\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/fb55\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"domelementtype\": \"^2.3.0\",\n        \"domhandler\": \"^5.0.3\",\n        \"domutils\": \"^3.2.2\",\n        \"entities\": \"^7.0.1\"\n      }\n    },\n    \"node_modules/htmlparser2/node_modules/entities\": {\n      \"version\": \"7.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/entities/-/entities-7.0.1.tgz\",\n      \"integrity\": \"sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==\",\n      \"license\": \"BSD-2-Clause\",\n      \"engines\": {\n        \"node\": \">=0.12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/entities?sponsor=1\"\n      }\n    },\n    \"node_modules/iconv-lite\": {\n      \"version\": \"0.6.3\",\n      \"resolved\": \"https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz\",\n      \"integrity\": \"sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"safer-buffer\": \">= 2.1.2 < 3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/lodash.unescape\": {\n      \"version\": \"4.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz\",\n      \"integrity\": \"sha512-DhhGRshNS1aX6s5YdBE3njCCouPgnG29ebyHvImlZzXZf2SHgt+J08DHgytTPnpywNbO1Y8mNUFyQuIDBq2JZg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/math-intrinsics\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz\",\n      \"integrity\": \"sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/nth-check\": {\n      \"version\": \"2.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz\",\n      \"integrity\": \"sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==\",\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"boolbase\": \"^1.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/nth-check?sponsor=1\"\n      }\n    },\n    \"node_modules/object-inspect\": {\n      \"version\": \"1.13.4\",\n      \"resolved\": \"https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz\",\n      \"integrity\": \"sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/parse5\": {\n      \"version\": \"7.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz\",\n      \"integrity\": \"sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"entities\": \"^6.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/inikulin/parse5?sponsor=1\"\n      }\n    },\n    \"node_modules/parse5-htmlparser2-tree-adapter\": {\n      \"version\": \"7.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz\",\n      \"integrity\": \"sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"domhandler\": \"^5.0.3\",\n        \"parse5\": \"^7.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/inikulin/parse5?sponsor=1\"\n      }\n    },\n    \"node_modules/parse5-parser-stream\": {\n      \"version\": \"7.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz\",\n      \"integrity\": \"sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"parse5\": \"^7.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/inikulin/parse5?sponsor=1\"\n      }\n    },\n    \"node_modules/parse5/node_modules/entities\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/entities/-/entities-6.0.1.tgz\",\n      \"integrity\": \"sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==\",\n      \"license\": \"BSD-2-Clause\",\n      \"engines\": {\n        \"node\": \">=0.12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/entities?sponsor=1\"\n      }\n    },\n    \"node_modules/qs\": {\n      \"version\": \"6.15.3\",\n      \"resolved\": \"https://registry.npmjs.org/qs/-/qs-6.15.3.tgz\",\n      \"integrity\": \"sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==\",\n      \"license\": \"BSD-3-Clause\",\n      \"dependencies\": {\n        \"es-define-property\": \"^1.0.1\",\n        \"side-channel\": \"^1.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=0.6\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/safer-buffer\": {\n      \"version\": \"2.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz\",\n      \"integrity\": \"sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/side-channel\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz\",\n      \"integrity\": \"sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"object-inspect\": \"^1.13.4\",\n        \"side-channel-list\": \"^1.0.1\",\n        \"side-channel-map\": \"^1.0.1\",\n        \"side-channel-weakmap\": \"^1.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/side-channel-list\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz\",\n      \"integrity\": \"sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"object-inspect\": \"^1.13.4\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/side-channel-map\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz\",\n      \"integrity\": \"sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bound\": \"^1.0.2\",\n        \"es-errors\": \"^1.3.0\",\n        \"get-intrinsic\": \"^1.2.5\",\n        \"object-inspect\": \"^1.13.3\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/side-channel-weakmap\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz\",\n      \"integrity\": \"sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bound\": \"^1.0.2\",\n        \"es-errors\": \"^1.3.0\",\n        \"get-intrinsic\": \"^1.2.5\",\n        \"object-inspect\": \"^1.13.3\",\n        \"side-channel-map\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/undici\": {\n      \"version\": \"7.28.0\",\n      \"resolved\": \"https://registry.npmjs.org/undici/-/undici-7.28.0.tgz\",\n      \"integrity\": \"sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=20.18.1\"\n      }\n    },\n    \"node_modules/whatwg-encoding\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz\",\n      \"integrity\": \"sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==\",\n      \"deprecated\": \"Use @exodus/bytes instead for a more spec-conformant and faster implementation\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"iconv-lite\": \"0.6.3\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/whatwg-mimetype\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz\",\n      \"integrity\": \"sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    }\n  }\n}\n\nFile v1.1.3:package.json\n\n{\n  \"dependencies\": {\n    \"cheerio\": \"^1.2.0\",\n    \"dayjs\": \"^1.11.19\",\n    \"lodash.unescape\": \"^4.0.1\",\n    \"qs\": \"^6.15.0\"\n  }\n}\n\nFile v1.1.3:agents/openai.yaml\n\ninterface:\n  display_name: \"WeChat Article Archive\"\n  short_description: \"Archive WeChat articles and image notes locally\"\n  default_prompt: \"Use $wechat-article-archive to save this WeChat article or image note as Markdown with local images.\"\n\nFile v1.1.3:requirements.txt\n\nbeautifulsoup4>=4.12\n\nArchive v1.1.2: 10 files, 21666 bytes\n\nFiles: agents/openai.yaml (244b), package-lock.json (21097b), package.json (131b), requirements.txt (21b), scripts/archive_wechat_article.py (14660b), scripts/errors.js (957b), scripts/extract.js (21713b), skill-card.md (2454b), SKILL.md (3759b), _meta.json (141b)\n\nFile v1.1.2:SKILL.md\n\n---\nname: wechat-article-archive\ndescription: Save WeChat Official Account articles and image-note / 小绿书 pages from mp.weixin.qq.com into a user-specified local folder as Markdown plus local assets. Use when the user asks to 保存/归档/下载/导出公众号文章、提取多张图片、从浏览器保存的最终 HTML 恢复文章，or generate Markdown with WeChat images copied locally instead of uploading to IMA or another cloud service.\n---\n\n# WeChat Article Archive\n\nArchive a WeChat Official Account article to local files:\n\n```text\ntarget-folder/\n  Article title.md\n  assets/\n    image-01-xxxx.jpg\n    image-02-xxxx.png\n```\n\n## Workflow\n\n1. Confirm the user provided both:\n   - a `mp.weixin.qq.com` article URL\n   - a destination folder\n2. Run the bundled script from this skill directory:\n\n```bash\ncd \"${CODEX_HOME:-$HOME/.codex}/skills/wechat-article-archive\"\n.venv/bin/python scripts/archive_wechat_article.py \"<wechat-url>\" \"<destination-folder>\"\n```\n\n3. Read the JSON output and report:\n   - Markdown file path\n   - `assets/` directory path\n   - downloaded image count\n   - any image download failures\n\n## Script\n\nUse `scripts/archive_wechat_article.py`.\n\nArguments:\n\n```bash\n.venv/bin/python scripts/archive_wechat_article.py \"<url>\" \"<output_dir>\" [--filename \"custom.md\"] [--skip-images] [--html-file \"page.html\"] [--image-timeout 30]\n```\n\nBehavior:\n\n- Parses the article with the bundled `extract.js`.\n- Preserves title, author, account name, publish time, original link, body text, headings, tables, blockquotes, lists, code blocks, and inline image order.\n- Downloads body images into `<output_dir>/assets/`.\n- Rewrites Markdown image links to relative `assets/...` paths.\n- Supports WeChat image-note / 小绿书 pages by extracting every top-level image from `picture_page_info_list` in display order.\n- Accepts a browser-saved final page source through `--html-file` when direct URL fetching is blocked or returns a different page. Keep the original WeChat URL as the first argument so metadata retains the source link.\n- If the body contains no inline images but the article has a cover image, inserts and downloads the cover image.\n- Prints a JSON result for verification.\n\n## Dependencies\n\nRun once if dependencies are missing:\n\n```bash\ncd \"${CODEX_HOME:-$HOME/.codex}/skills/wechat-article-archive\"\nnpm install\npython3 -m venv .venv\n.venv/bin/python -m pip install -r requirements.txt\n```\n\nRequired commands:\n\n- `python3`\n- `node`\n- npm dependencies declared in `package.json`\n\nIf `node` is not on PATH but available elsewhere, set:\n\n```bash\nNODE=/absolute/path/to/node .venv/bin/python scripts/archive_wechat_article.py \"<url>\" \"<output_dir>\"\n```\n\n## Errors\n\n- `不支持的链接` → URL is not a supported WeChat article link.\n- `访问过于频繁` → WeChat blocked the request temporarily; retry later or use another network/session.\n- `extractor not found` → skill files are incomplete.\n- `Cannot find module ...` → run `npm install` in the skill directory.\n- image failures in JSON → Markdown was created, but one or more images could not be downloaded; report the failures and keep the original URLs in Markdown for those images.\n- Image-note / 小绿书 pages use a different WeChat page structure from normal articles. Do not treat an empty `#js_content` as an image-less article when `picture_page_info_list` is present.\n\n## Notes\n\n- Prefer this skill only for local file archiving. Do not use it for IMA upload, knowledge-base import, or WeChat message sending.\n- Do not create nested folders per article unless the user asks. The destination folder itself is the article archive folder.\n- Do not overwrite unrelated files manually. The script creates or reuses the destination folder and `assets/`.\n\nFile v1.1.2:_meta.json\n\n{\n  \"ownerId\": \"kn72j0qng9f6mm49z983cyzw1982naag\",\n  \"slug\": \"wechat-article-archive\",\n  \"version\": \"1.1.2\",\n  \"publishedAt\": 1783954678226\n}\n\nFile v1.1.2:skill-card.md\n\n## Description: <br>\nSave WeChat Official Account articles and image-note pages from mp.weixin.qq.com into a user-specified local folder as Markdown plus local assets. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[harven-droid](https://clawhub.ai/user/harven-droid) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers, researchers, and content operators use this skill to archive user-selected WeChat articles or image-note pages into local Markdown files with copied image assets for offline review, documentation, or preservation. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill runs local Python and Node scripts and may install dependencies before use. <br>\nMitigation: Install from the reviewed release, prefer locked or reviewed dependency installs, and run it in a dedicated environment. <br>\nRisk: The skill fetches WeChat pages and image URLs from the network. <br>\nMitigation: Use user-selected WeChat URLs, review the generated Markdown and assets, and use the saved-HTML option when direct fetching is blocked or unsuitable. <br>\nRisk: The skill writes Markdown and assets into the folder selected by the user. <br>\nMitigation: Use a dedicated output folder and avoid mixing archive output with unrelated files. <br>\nRisk: An untrusted NODE environment variable could point execution at an unexpected binary. <br>\nMitigation: Leave NODE unset or set it only to a trusted absolute Node executable. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/harven-droid/skills/wechat-article-archive) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, files, shell commands, configuration, guidance] <br>\n**Output Format:** [Markdown files with local assets and JSON verification output] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Creates or reuses the selected destination folder and assets directory; image download failures are reported in JSON while original image URLs remain in Markdown.] <br>\n\n## Skill Version(s): <br>\n1.1.2 (source: ClawHub release evidence) <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 v1.1.2:package-lock.json\n\n{\n  \"name\": \"wechat-article-archive\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"dependencies\": {\n        \"cheerio\": \"^1.2.0\",\n        \"dayjs\": \"^1.11.19\",\n        \"lodash.unescape\": \"^4.0.1\",\n        \"qs\": \"^6.15.0\"\n      }\n    },\n    \"node_modules/boolbase\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz\",\n      \"integrity\": \"sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/call-bind-apply-helpers\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz\",\n      \"integrity\": \"sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"function-bind\": \"^1.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/call-bound\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz\",\n      \"integrity\": \"sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.2\",\n        \"get-intrinsic\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/cheerio\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz\",\n      \"integrity\": \"sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"cheerio-select\": \"^2.1.0\",\n        \"dom-serializer\": \"^2.0.0\",\n        \"domhandler\": \"^5.0.3\",\n        \"domutils\": \"^3.2.2\",\n        \"encoding-sniffer\": \"^0.2.1\",\n        \"htmlparser2\": \"^10.1.0\",\n        \"parse5\": \"^7.3.0\",\n        \"parse5-htmlparser2-tree-adapter\": \"^7.1.0\",\n        \"parse5-parser-stream\": \"^7.1.2\",\n        \"undici\": \"^7.19.0\",\n        \"whatwg-mimetype\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.1\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/cheeriojs/cheerio?sponsor=1\"\n      }\n    },\n    \"node_modules/cheerio-select\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz\",\n      \"integrity\": \"sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==\",\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"boolbase\": \"^1.0.0\",\n        \"css-select\": \"^5.1.0\",\n        \"css-what\": \"^6.1.0\",\n        \"domelementtype\": \"^2.3.0\",\n        \"domhandler\": \"^5.0.3\",\n        \"domutils\": \"^3.0.1\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/fb55\"\n      }\n    },\n    \"node_modules/css-select\": {\n      \"version\": \"5.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz\",\n      \"integrity\": \"sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==\",\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"boolbase\": \"^1.0.0\",\n        \"css-what\": \"^6.1.0\",\n        \"domhandler\": \"^5.0.2\",\n        \"domutils\": \"^3.0.1\",\n        \"nth-check\": \"^2.0.1\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/fb55\"\n      }\n    },\n    \"node_modules/css-what\": {\n      \"version\": \"6.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz\",\n      \"integrity\": \"sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==\",\n      \"license\": \"BSD-2-Clause\",\n      \"engines\": {\n        \"node\": \">= 6\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/fb55\"\n      }\n    },\n    \"node_modules/dayjs\": {\n      \"version\": \"1.11.21\",\n      \"resolved\": \"https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz\",\n      \"integrity\": \"sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/dom-serializer\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz\",\n      \"integrity\": \"sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"domelementtype\": \"^2.3.0\",\n        \"domhandler\": \"^5.0.2\",\n        \"entities\": \"^4.2.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/cheeriojs/dom-serializer?sponsor=1\"\n      }\n    },\n    \"node_modules/domelementtype\": {\n      \"version\": \"2.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz\",\n      \"integrity\": \"sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/fb55\"\n        }\n      ],\n      \"license\": \"BSD-2-Clause\"\n    },\n    \"node_modules/domhandler\": {\n      \"version\": \"5.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz\",\n      \"integrity\": \"sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==\",\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"domelementtype\": \"^2.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/domhandler?sponsor=1\"\n      }\n    },\n    \"node_modules/domutils\": {\n      \"version\": \"3.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz\",\n      \"integrity\": \"sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==\",\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"dom-serializer\": \"^2.0.0\",\n        \"domelementtype\": \"^2.3.0\",\n        \"domhandler\": \"^5.0.3\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/domutils?sponsor=1\"\n      }\n    },\n    \"node_modules/dunder-proto\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz\",\n      \"integrity\": \"sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.1\",\n        \"es-errors\": \"^1.3.0\",\n        \"gopd\": \"^1.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/encoding-sniffer\": {\n      \"version\": \"0.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz\",\n      \"integrity\": \"sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"iconv-lite\": \"^0.6.3\",\n        \"whatwg-encoding\": \"^3.1.1\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/encoding-sniffer?sponsor=1\"\n      }\n    },\n    \"node_modules/entities\": {\n      \"version\": \"4.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/entities/-/entities-4.5.0.tgz\",\n      \"integrity\": \"sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==\",\n      \"license\": \"BSD-2-Clause\",\n      \"engines\": {\n        \"node\": \">=0.12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/entities?sponsor=1\"\n      }\n    },\n    \"node_modules/es-define-property\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz\",\n      \"integrity\": \"sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/es-errors\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz\",\n      \"integrity\": \"sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/es-object-atoms\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz\",\n      \"integrity\": \"sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/function-bind\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz\",\n      \"integrity\": \"sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==\",\n      \"license\": \"MIT\",\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/get-intrinsic\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz\",\n      \"integrity\": \"sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.2\",\n        \"es-define-property\": \"^1.0.1\",\n        \"es-errors\": \"^1.3.0\",\n        \"es-object-atoms\": \"^1.1.1\",\n        \"function-bind\": \"^1.1.2\",\n        \"get-proto\": \"^1.0.1\",\n        \"gopd\": \"^1.2.0\",\n        \"has-symbols\": \"^1.1.0\",\n        \"hasown\": \"^2.0.2\",\n        \"math-intrinsics\": \"^1.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/get-proto\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz\",\n      \"integrity\": \"sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"dunder-proto\": \"^1.0.1\",\n        \"es-object-atoms\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/gopd\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz\",\n      \"integrity\": \"sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/has-symbols\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz\",\n      \"integrity\": \"sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/hasown\": {\n      \"version\": \"2.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz\",\n      \"integrity\": \"sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"function-bind\": \"^1.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/htmlparser2\": {\n      \"version\": \"10.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz\",\n      \"integrity\": \"sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==\",\n      \"funding\": [\n        \"https://github.com/fb55/htmlparser2?sponsor=1\",\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/fb55\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"domelementtype\": \"^2.3.0\",\n        \"domhandler\": \"^5.0.3\",\n        \"domutils\": \"^3.2.2\",\n        \"entities\": \"^7.0.1\"\n      }\n    },\n    \"node_modules/htmlparser2/node_modules/entities\": {\n      \"version\": \"7.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/entities/-/entities-7.0.1.tgz\",\n      \"integrity\": \"sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==\",\n      \"license\": \"BSD-2-Clause\",\n      \"engines\": {\n        \"node\": \">=0.12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/entities?sponsor=1\"\n      }\n    },\n    \"node_modules/iconv-lite\": {\n      \"version\": \"0.6.3\",\n      \"resolved\": \"https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz\",\n      \"integrity\": \"sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"safer-buffer\": \">= 2.1.2 < 3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/lodash.unescape\": {\n      \"version\": \"4.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz\",\n      \"integrity\": \"sha512-DhhGRshNS1aX6s5YdBE3njCCouPgnG29ebyHvImlZzXZf2SHgt+J08DHgytTPnpywNbO1Y8mNUFyQuIDBq2JZg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/math-intrinsics\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz\",\n      \"integrity\": \"sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/nth-check\": {\n      \"version\": \"2.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz\",\n      \"integrity\": \"sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==\",\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"boolbase\": \"^1.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/nth-check?sponsor=1\"\n      }\n    },\n    \"node_modules/object-inspect\": {\n      \"version\": \"1.13.4\",\n      \"resolved\": \"https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz\",\n      \"integrity\": \"sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/parse5\": {\n      \"version\": \"7.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz\",\n      \"integrity\": \"sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"entities\": \"^6.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/inikulin/parse5?sponsor=1\"\n      }\n    },\n    \"node_modules/parse5-htmlparser2-tree-adapter\": {\n      \"version\": \"7.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz\",\n      \"integrity\": \"sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"domhandler\": \"^5.0.3\",\n        \"parse5\": \"^7.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/inikulin/parse5?sponsor=1\"\n      }\n    },\n    \"node_modules/parse5-parser-stream\": {\n      \"version\": \"7.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz\",\n      \"integrity\": \"sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"parse5\": \"^7.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/inikulin/parse5?sponsor=1\"\n      }\n    },\n    \"node_modules/parse5/node_modules/entities\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/entities/-/entities-6.0.1.tgz\",\n      \"integrity\": \"sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==\",\n      \"license\": \"BSD-2-Clause\",\n      \"engines\": {\n        \"node\": \">=0.12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/entities?sponsor=1\"\n      }\n    },\n    \"node_modules/qs\": {\n      \"version\": \"6.15.3\",\n      \"resolved\": \"https://registry.npmjs.org/qs/-/qs-6.15.3.tgz\",\n      \"integrity\": \"sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==\",\n      \"license\": \"BSD-3-Clause\",\n      \"dependencies\": {\n        \"es-define-property\": \"^1.0.1\",\n        \"side-channel\": \"^1.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=0.6\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/safer-buffer\": {\n      \"version\": \"2.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz\",\n      \"integrity\": \"sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/side-channel\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz\",\n      \"integrity\": \"sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"object-inspect\": \"^1.13.4\",\n        \"side-channel-list\": \"^1.0.1\",\n        \"side-channel-map\": \"^1.0.1\",\n        \"side-channel-weakmap\": \"^1.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/side-channel-list\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz\",\n      \"integrity\": \"sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"object-inspect\": \"^1.13.4\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/side-channel-map\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz\",\n      \"integrity\": \"sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bound\": \"^1.0.2\",\n        \"es-errors\": \"^1.3.0\",\n        \"get-intrinsic\": \"^1.2.5\",\n        \"object-inspect\": \"^1.13.3\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/side-channel-weakmap\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz\",\n      \"integrity\": \"sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bound\": \"^1.0.2\",\n        \"es-errors\": \"^1.3.0\",\n        \"get-intrinsic\": \"^1.2.5\",\n        \"object-inspect\": \"^1.13.3\",\n        \"side-channel-map\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/undici\": {\n      \"version\": \"7.28.0\",\n      \"resolved\": \"https://registry.npmjs.org/undici/-/undici-7.28.0.tgz\",\n      \"integrity\": \"sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=20.18.1\"\n      }\n    },\n    \"node_modules/whatwg-encoding\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz\",\n      \"integrity\": \"sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==\",\n      \"deprecated\": \"Use @exodus/bytes instead for a more spec-conformant and faster implementation\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"iconv-lite\": \"0.6.3\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/whatwg-mimetype\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz\",\n      \"integrity\": \"sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    }\n  }\n}\n\nFile v1.1.2:package.json\n\n{\n  \"dependencies\": {\n    \"cheerio\": \"^1.2.0\",\n    \"dayjs\": \"^1.11.19\",\n    \"lodash.unescape\": \"^4.0.1\",\n    \"qs\": \"^6.15.0\"\n  }\n}\n\nFile v1.1.2:agents/openai.yaml\n\ninterface:\n  display_name: \"WeChat Article Archive\"\n  short_description: \"Archive WeChat articles and image notes locally\"\n  default_prompt: \"Use $wechat-article-archive to save this WeChat article or image note as Markdown with local images.\"\n\nFile v1.1.2:requirements.txt\n\nbeautifulsoup4>=4.12\n\nArchive v1.1.0: 10 files, 21641 bytes\n\nFiles: agents/openai.yaml (244b), package-lock.json (21097b), package.json (131b), requirements.txt (21b), scripts/archive_wechat_article.py (14660b), scripts/errors.js (957b), scripts/extract.js (21713b), skill-card.md (2377b), SKILL.md (3759b), _meta.json (141b)\n\nFile v1.1.0:SKILL.md\n\n---\nname: wechat-article-archive\ndescription: Save WeChat Official Account articles and image-note / 小绿书 pages from mp.weixin.qq.com into a user-specified local folder as Markdown plus local assets. Use when the user asks to 保存/归档/下载/导出公众号文章、提取多张图片、从浏览器保存的最终 HTML 恢复文章，or generate Markdown with WeChat images copied locally instead of uploading to IMA or another cloud service.\n---\n\n# WeChat Article Archive\n\nArchive a WeChat Official Account article to local files:\n\n```text\ntarget-folder/\n  Article title.md\n  assets/\n    image-01-xxxx.jpg\n    image-02-xxxx.png\n```\n\n## Workflow\n\n1. Confirm the user provided both:\n   - a `mp.weixin.qq.com` article URL\n   - a destination folder\n2. Run the bundled script from this skill directory:\n\n```bash\ncd \"${CODEX_HOME:-$HOME/.codex}/skills/wechat-article-archive\"\n.venv/bin/python scripts/archive_wechat_article.py \"<wechat-url>\" \"<destination-folder>\"\n```\n\n3. Read the JSON output and report:\n   - Markdown file path\n   - `assets/` directory path\n   - downloaded image count\n   - any image download failures\n\n## Script\n\nUse `scripts/archive_wechat_article.py`.\n\nArguments:\n\n```bash\n.venv/bin/python scripts/archive_wechat_article.py \"<url>\" \"<output_dir>\" [--filename \"custom.md\"] [--skip-images] [--html-file \"page.html\"] [--image-timeout 30]\n```\n\nBehavior:\n\n- Parses the article with the bundled `extract.js`.\n- Preserves title, author, account name, publish time, original link, body text, headings, tables, blockquotes, lists, code blocks, and inline image order.\n- Downloads body images into `<output_dir>/assets/`.\n- Rewrites Markdown image links to relative `assets/...` paths.\n- Supports WeChat image-note / 小绿书 pages by extracting every top-level image from `picture_page_info_list` in display order.\n- Accepts a browser-saved final page source through `--html-file` when direct URL fetching is blocked or returns a different page. Keep the original WeChat URL as the first argument so metadata retains the source link.\n- If the body contains no inline images but the article has a cover image, inserts and downloads the cover image.\n- Prints a JSON result for verification.\n\n## Dependencies\n\nRun once if dependencies are missing:\n\n```bash\ncd \"${CODEX_HOME:-$HOME/.codex}/skills/wechat-article-archive\"\nnpm install\npython3 -m venv .venv\n.venv/bin/python -m pip install -r requirements.txt\n```\n\nRequired commands:\n\n- `python3`\n- `node`\n- npm dependencies declared in `package.json`\n\nIf `node` is not on PATH but available elsewhere, set:\n\n```bash\nNODE=/absolute/path/to/node .venv/bin/python scripts/archive_wechat_article.py \"<url>\" \"<output_dir>\"\n```\n\n## Errors\n\n- `不支持的链接` → URL is not a supported WeChat article link.\n- `访问过于频繁` → WeChat blocked the request temporarily; retry later or use another network/session.\n- `extractor not found` → skill files are incomplete.\n- `Cannot find module ...` → run `npm install` in the skill directory.\n- image failures in JSON → Markdown was created, but one or more images could not be downloaded; report the failures and keep the original URLs in Markdown for those images.\n- Image-note / 小绿书 pages use a different WeChat page structure from normal articles. Do not treat an empty `#js_content` as an image-less article when `picture_page_info_list` is present.\n\n## Notes\n\n- Prefer this skill only for local file archiving. Do not use it for IMA upload, knowledge-base import, or WeChat message sending.\n- Do not create nested folders per article unless the user asks. The destination folder itself is the article archive folder.\n- Do not overwrite unrelated files manually. The script creates or reuses the destination folder and `assets/`.\n\nFile v1.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn72j0qng9f6mm49z983cyzw1982naag\",\n  \"slug\": \"wechat-article-archive\",\n  \"version\": \"1.1.0\",\n  \"publishedAt\": 1783954548988\n}\n\nFile v1.1.0:skill-card.md\n\n## Description: <br>\nSaves WeChat Official Account articles and image-note / 小绿书 pages from mp.weixin.qq.com to a local Markdown file with copied image assets. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[harven-droid](https://clawhub.ai/user/harven-droid) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nExternal users and developers use this skill to archive user-selected WeChat articles or image-note pages into a local folder as Markdown with local image assets. It is suited for local preservation and review, not for cloud upload, knowledge-base import, or message sending. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill runs local Python and Node code and installs npm and pip dependencies. <br>\nMitigation: Install and run it in a dedicated environment after reviewing the release evidence and dependency files. <br>\nRisk: The skill fetches WeChat pages and image URLs from the network. <br>\nMitigation: Run it only for user-selected WeChat URLs and expect network failures or rate limits to be reported in the JSON result. <br>\nRisk: The skill writes Markdown and assets into the destination folder, and a chosen filename could collide with an existing archive. <br>\nMitigation: Use a dedicated output folder for each archive or choose a filename that will not overwrite existing Markdown. <br>\nRisk: The --html-file option processes saved page source from disk. <br>\nMitigation: Pass --html-file only for saved WeChat page sources you trust. <br>\n\n\n## Reference(s): <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [Markdown, Files, JSON, Shell commands, Guidance] <br>\n**Output Format:** [Markdown file plus local assets, with a JSON verification result from the archiving script] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Writes into a user-selected folder; image download failures are reported and unresolved image URLs remain in Markdown.] <br>\n\n## Skill Version(s): <br>\n1.1.0 (source: server release evidence) <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 v1.1.0:package-lock.json\n\n{\n  \"name\": \"wechat-article-archive\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"dependencies\": {\n        \"cheerio\": \"^1.2.0\",\n        \"dayjs\": \"^1.11.19\",\n        \"lodash.unescape\": \"^4.0.1\",\n        \"qs\": \"^6.15.0\"\n      }\n    },\n    \"node_modules/boolbase\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz\",\n      \"integrity\": \"sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/call-bind-apply-helpers\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz\",\n      \"integrity\": \"sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"function-bind\": \"^1.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/call-bound\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz\",\n      \"integrity\": \"sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.2\",\n        \"get-intrinsic\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/cheerio\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz\",\n      \"integrity\": \"sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"cheerio-select\": \"^2.1.0\",\n        \"dom-serializer\": \"^2.0.0\",\n        \"domhandler\": \"^5.0.3\",\n        \"domutils\": \"^3.2.2\",\n        \"encoding-sniffer\": \"^0.2.1\",\n        \"htmlparser2\": \"^10.1.0\",\n        \"parse5\": \"^7.3.0\",\n        \"parse5-htmlparser2-tree-adapter\": \"^7.1.0\",\n        \"parse5-parser-stream\": \"^7.1.2\",\n        \"undici\": \"^7.19.0\",\n        \"whatwg-mimetype\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.1\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/cheeriojs/cheerio?sponsor=1\"\n      }\n    },\n    \"node_modules/cheerio-select\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz\",\n      \"integrity\": \"sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==\",\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"boolbase\": \"^1.0.0\",\n        \"css-select\": \"^5.1.0\",\n        \"css-what\": \"^6.1.0\",\n        \"domelementtype\": \"^2.3.0\",\n        \"domhandler\": \"^5.0.3\",\n        \"domutils\": \"^3.0.1\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/fb55\"\n      }\n    },\n    \"node_modules/css-select\": {\n      \"version\": \"5.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz\",\n      \"integrity\": \"sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==\",\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"boolbase\": \"^1.0.0\",\n        \"css-what\": \"^6.1.0\",\n        \"domhandler\": \"^5.0.2\",\n        \"domutils\": \"^3.0.1\",\n        \"nth-check\": \"^2.0.1\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/fb55\"\n      }\n    },\n    \"node_modules/css-what\": {\n      \"version\": \"6.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz\",\n      \"integrity\": \"sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==\",\n      \"license\": \"BSD-2-Clause\",\n      \"engines\": {\n        \"node\": \">= 6\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/fb55\"\n      }\n    },\n    \"node_modules/dayjs\": {\n      \"version\": \"1.11.21\",\n      \"resolved\": \"https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz\",\n      \"integrity\": \"sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/dom-serializer\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz\",\n      \"integrity\": \"sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"domelementtype\": \"^2.3.0\",\n        \"domhandler\": \"^5.0.2\",\n        \"entities\": \"^4.2.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/cheeriojs/dom-serializer?sponsor=1\"\n      }\n    },\n    \"node_modules/domelementtype\": {\n      \"version\": \"2.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz\",\n      \"integrity\": \"sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/fb55\"\n        }\n      ],\n      \"license\": \"BSD-2-Clause\"\n    },\n    \"node_modules/domhandler\": {\n      \"version\": \"5.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz\",\n      \"integrity\": \"sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==\",\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"domelementtype\": \"^2.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/domhandler?sponsor=1\"\n      }\n    },\n    \"node_modules/domutils\": {\n      \"version\": \"3.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz\",\n      \"integrity\": \"sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==\",\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"dom-serializer\": \"^2.0.0\",\n        \"domelementtype\": \"^2.3.0\",\n        \"domhandler\": \"^5.0.3\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/domutils?sponsor=1\"\n      }\n    },\n    \"node_modules/dunder-proto\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz\",\n      \"integrity\": \"sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.1\",\n        \"es-errors\": \"^1.3.0\",\n        \"gopd\": \"^1.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/encoding-sniffer\": {\n      \"version\": \"0.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz\",\n      \"integrity\": \"sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"iconv-lite\": \"^0.6.3\",\n        \"whatwg-encoding\": \"^3.1.1\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/encoding-sniffer?sponsor=1\"\n      }\n    },\n    \"node_modules/entities\": {\n      \"version\": \"4.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/entities/-/entities-4.5.0.tgz\",\n      \"integrity\": \"sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==\",\n      \"license\": \"BSD-2-Clause\",\n      \"engines\": {\n        \"node\": \">=0.12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/entities?sponsor=1\"\n      }\n    },\n    \"node_modules/es-define-property\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz\",\n      \"integrity\": \"sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/es-errors\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz\",\n      \"integrity\": \"sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/es-object-atoms\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz\",\n      \"integrity\": \"sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/function-bind\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz\",\n      \"integrity\": \"sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==\",\n      \"license\": \"MIT\",\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/get-intrinsic\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz\",\n      \"integrity\": \"sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.2\",\n        \"es-define-property\": \"^1.0.1\",\n        \"es-errors\": \"^1.3.0\",\n        \"es-object-atoms\": \"^1.1.1\",\n        \"function-bind\": \"^1.1.2\",\n        \"get-proto\": \"^1.0.1\",\n        \"gopd\": \"^1.2.0\",\n        \"has-symbols\": \"^1.1.0\",\n        \"hasown\": \"^2.0.2\",\n        \"math-intrinsics\": \"^1.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/get-proto\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz\",\n      \"integrity\": \"sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"dunder-proto\": \"^1.0.1\",\n        \"es-object-atoms\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/gopd\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz\",\n      \"integrity\": \"sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/has-symbols\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz\",\n      \"integrity\": \"sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/hasown\": {\n      \"version\": \"2.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz\",\n      \"integrity\": \"sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"function-bind\": \"^1.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/htmlparser2\": {\n      \"version\": \"10.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz\",\n      \"integrity\": \"sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==\",\n      \"funding\": [\n        \"https://github.com/fb55/htmlparser2?sponsor=1\",\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/fb55\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"domelementtype\": \"^2.3.0\",\n        \"domhandler\": \"^5.0.3\",\n        \"domutils\": \"^3.2.2\",\n        \"entities\": \"^7.0.1\"\n      }\n    },\n    \"node_modules/htmlparser2/node_modules/entities\": {\n      \"version\": \"7.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/entities/-/entities-7.0.1.tgz\",\n      \"integrity\": \"sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==\",\n      \"license\": \"BSD-2-Clause\",\n      \"engines\": {\n        \"node\": \">=0.12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/entities?sponsor=1\"\n      }\n    },\n    \"node_modules/iconv-lite\": {\n      \"version\": \"0.6.3\",\n      \"resolved\": \"https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz\",\n      \"integrity\": \"sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"safer-buffer\": \">= 2.1.2 < 3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/lodash.unescape\": {\n      \"version\": \"4.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz\",\n      \"integrity\": \"sha512-DhhGRshNS1aX6s5YdBE3njCCouPgnG29ebyHvImlZzXZf2SHgt+J08DHgytTPnpywNbO1Y8mNUFyQuIDBq2JZg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/math-intrinsics\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz\",\n      \"integrity\": \"sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/nth-check\": {\n      \"version\": \"2.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz\",\n      \"integrity\": \"sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==\",\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"boolbase\": \"^1.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/nth-check?sponsor=1\"\n      }\n    },\n    \"node_modules/object-inspect\": {\n      \"version\": \"1.13.4\",\n      \"resolved\": \"https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz\",\n      \"integrity\": \"sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/parse5\": {\n      \"version\": \"7.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz\",\n      \"integrity\": \"sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"entities\": \"^6.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/inikulin/parse5?sponsor=1\"\n      }\n    },\n    \"node_modules/parse5-htmlparser2-tree-adapter\": {\n      \"version\": \"7.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz\",\n      \"integrity\": \"sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"domhandler\": \"^5.0.3\",\n        \"parse5\": \"^7.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/inikulin/parse5?sponsor=1\"\n      }\n    },\n    \"node_modules/parse5-parser-stream\": {\n      \"version\": \"7.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz\",\n      \"integrity\": \"sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"parse5\": \"^7.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/inikulin/parse5?sponsor=1\"\n      }\n    },\n    \"node_modules/parse5/node_modules/entities\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/entities/-/entities-6.0.1.tgz\",\n      \"integrity\": \"sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==\",\n      \"license\": \"BSD-2-Clause\",\n      \"engines\": {\n        \"node\": \">=0.12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/entities?sponsor=1\"\n      }\n    },\n    \"node_modules/qs\": {\n      \"version\": \"6.15.3\",\n      \"resolved\": \"https://registry.npmjs.org/qs/-/qs-6.15.3.tgz\",\n      \"integrity\": \"sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==\",\n      \"license\": \"BSD-3-Clause\",\n      \"dependencies\": {\n        \"es-define-property\": \"^1.0.1\",\n        \"side-channel\": \"^1.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=0.6\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/safer-buffer\": {\n      \"version\": \"2.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz\",\n      \"integrity\": \"sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/side-channel\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz\",\n      \"integrity\": \"sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"object-inspect\": \"^1.13.4\",\n        \"side-channel-list\": \"^1.0.1\",\n        \"side-channel-map\": \"^1.0.1\",\n        \"side-channel-weakmap\": \"^1.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/side-channel-list\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz\",\n      \"integrity\": \"sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"object-inspect\": \"^1.13.4\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/side-channel-map\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz\",\n      \"integrity\": \"sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bound\": \"^1.0.2\",\n        \"es-errors\": \"^1.3.0\",\n        \"get-intrinsic\": \"^1.2.5\",\n        \"object-inspect\": \"^1.13.3\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/side-channel-weakmap\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz\",\n      \"integrity\": \"sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bound\": \"^1.0.2\",\n        \"es-errors\": \"^1.3.0\",\n        \"get-intrinsic\": \"^1.2.5\",\n        \"object-inspect\": \"^1.13.3\",\n        \"side-channel-map\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/undici\": {\n      \"version\": \"7.28.0\",\n      \"resolved\": \"https://registry.npmjs.org/undici/-/undici-7.28.0.tgz\",\n      \"integrity\": \"sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=20.18.1\"\n      }\n    },\n    \"node_modules/whatwg-encoding\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz\",\n      \"integrity\": \"sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==\",\n      \"deprecated\": \"Use @exodus/bytes instead for a more spec-conformant and faster implementation\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"iconv-lite\": \"0.6.3\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/whatwg-mimetype\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz\",\n      \"integrity\": \"sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    }\n  }\n}\n\nFile v1.1.0:package.json\n\n{\n  \"dependencies\": {\n    \"cheerio\": \"^1.2.0\",\n    \"dayjs\": \"^1.11.19\",\n    \"lodash.unescape\": \"^4.0.1\",\n    \"qs\": \"^6.15.0\"\n  }\n}\n\nFile v1.1.0:agents/openai.yaml\n\ninterface:\n  display_name: \"WeChat Article Archive\"\n  short_description: \"Archive WeChat articles and image notes locally\"\n  default_prompt: \"Use $wechat-article-archive to save this WeChat article or image note as Markdown with local images.\"\n\nFile v1.1.0:requirements.txt\n\nbeautifulsoup4>=4.12\n\nArchive v1.0.0: 10 files, 26295 bytes\n\nFiles: agents/openai.yaml (251b), package-lock.json (41919b), package.json (164b), requirements.txt (21b), scripts/archive_wechat_article.py (12839b), scripts/errors.js (957b), scripts/extract.js (18813b), skill-card.md (2113b), SKILL.md (3557b), _meta.json (141b)\n\nFile v1.0.0:SKILL.md\n\n---\nname: wechat-article-archive\ndescription: Save WeChat Official Account articles from mp.weixin.qq.com links into a user-specified local folder as Markdown plus a local assets/ image folder. Use when the user provides a WeChat public-account article URL and asks to 保存/归档/下载/导出/存到指定目录/生成 md, especially when they want article.md with WeChat images copied under assets/ instead of saving to IMA or another cloud service.\n---\n\n# WeChat Article Archive\n\nArchive a WeChat Official Account article to local files:\n\n```text\ntarget-folder/\n  Article title.md\n  assets/\n    image-01-xxxx.jpg\n    image-02-xxxx.png\n```\n\n## Workflow\n\n1. Confirm the user provided both:\n   - a `mp.weixin.qq.com` article URL\n   - a destination folder\n2. Run the bundled script from this skill directory:\n\n```bash\ncd \"${CODEX_HOME:-$HOME/.codex}/skills/wechat-article-archive\"\n.venv/bin/python scripts/archive_wechat_article.py \"<w","readmeExcerpt":"Skill: WeChat Article Archive Owner: harven-droid Summary: Archive WeChat articles and image notes locally Tags: archive:1.1.5, latest:1.1.5, wechat:1.1.5 Version history: v1.1.5 | 2026-09-10T06:57:06.710Z | user Fix missing images in Xiaolushu image notes by supporting picture_page_info_list in both assignment (=) and object-property (:) syntax. Preserve image order and substantive full-article content. v1.1.4 | 202","codeSnippets":[],"executableExamples":[{"language":"text","snippet":"target-folder/\n  Article title.md\n  assets/\n    image-01-xxxx.jpg\n    image-02-xxxx.png"},{"language":"bash","snippet":"cd \"${CODEX_HOME:-$HOME/.codex}/skills/wechat-article-archive\"\n.venv/bin/python scripts/archive_wechat_article.py \"<wechat-url>\" \"<destination-folder>\""},{"language":"bash","snippet":".venv/bin/python scripts/archive_wechat_article.py \"<url>\" \"<output_dir>\" [--filename \"custom.md\"] [--skip-images] [--html-file \"page.html\"] [--image-timeout 30]"},{"language":"bash","snippet":"cd \"${CODEX_HOME:-$HOME/.codex}/skills/wechat-article-archive\"\nnpm install\npython3 -m venv .venv\n.venv/bin/python -m pip install -r requirements.txt"},{"language":"bash","snippet":"NODE=/absolute/path/to/node .venv/bin/python scripts/archive_wechat_article.py \"<url>\" \"<output_dir>\""},{"language":"text","snippet":"target-folder/\n  Article title.md\n  assets/\n    image-01-xxxx.jpg\n    image-02-xxxx.png"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: wechat-article-archive\ndescription: Save WeChat Official Account articles and image-note / 小绿书 pages from mp.weixin.qq.com into a user-specified local folder as Markdown plus local assets. Use when the user asks to 保存/归档/下载/导出公众号文章、提取多张图片、从浏览器保存的最终 HTML 恢复文章，or generate Markdown with WeChat images copied locally instead of uploading to IMA or another cloud service.\n---\n\n# WeChat Article Archive\n\nArchive a WeChat Official Account article to local files:\n\n```text\ntarget-folder/\n  Article title.md\n  assets/\n    image-01-xxxx.jpg\n    image-02-xxxx.png\n```\n\n## Workflow\n\n1. Confirm the user provided both:\n   - a `mp.weixin.qq.com` article URL\n   - a destination folder\n2. Run the bundled script from this skill directory:\n\n```bash\ncd \"${CODEX_HOME:-$HOME/.codex}/skills/wechat-article-archive\"\n.venv/bin/python scripts/archive_wechat_article.py \"<wechat-url>\" \"<destination-folder>\"\n```\n\n3. Read the JSON output and report:\n   - Markdown file path\n   - `assets/` directory path\n   - downloaded image count\n   - any image download failures\n\n## Script\n\nUse `scripts/archive_wechat_article.py`.\n\nArguments:\n\n```bash\n.venv/bin/python scripts/archive_wechat_article.py \"<url>\" \"<output_dir>\" [--filename \"custom.md\"] [--skip-images] [--html-file \"page.html\"] [--image-timeout 30]\n```\n\nBehavior:\n\n- Parses the article with the bundled `extract.js`.\n- Preserves title, author, account name, publish time, original link, body text, headings, tables, blockquotes, lists, code blocks, and inline image order.\n- Downloads body images into `<output_dir>/assets/`.\n- Rewrites Markdown image links to relative `assets/...` paths.\n- Supports WeChat image-note / 小绿书 pages by extracting every top-level image from `picture_page_info_list` in display order.\n- Preserves image-note / 小绿书 body text from the page description, decodes escaped line breaks, and writes the text before the ordered images.\n- When `picture_page_info_list` also appears on a normal long article, prefers the substantive structured HTML body instead of replacing it with the short page description and image list.\n- Accepts a browser-saved final page source through `--html-file` when direct URL fetching is blocked or returns a different page. Keep the original WeChat URL as the first argument so metadata retains the source link.\n- If the body contains no inline images but the article has a cover image, inserts and downloads the cover image.\n- Prints a JSON result for verification. Check `body_text_length`, `body_img_count`, `downloaded_image_count`, and `image_failures`; do not treat `ok: true` alone as proof that the article is complete.\n\n## Dependencies\n\nRun once if dependencies are missing:\n\n```bash\ncd \"${CODEX_HOME:-$HOME/.codex}/skills/wechat-article-archive\"\nnpm install\npython3 -m venv .venv\n.venv/bin/python -m pip install -r requirements.txt\n```\n\nRequired commands:\n\n- `python3`\n- `node`\n- npm dependencies declared in `package.json`\n\nIf `node` is not on PATH but available elsewhere, set:\n\n```bash\nNODE=/absol"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn72j0qng9f6mm49z983cyzw1982naag\",\n  \"slug\": \"wechat-article-archive\",\n  \"version\": \"1.1.5\",\n  \"publishedAt\": 1789023426710\n}"},{"path":"skill-card.md","content":"## Description:\n\nSaves WeChat Official Account articles and image-note pages from mp.weixin.qq.com into a user-specified local folder as Markdown with local assets.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[harven-droid](https://clawhub.ai/user/harven-droid)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers, researchers, and content archivists use this skill to save supported WeChat article or image-note URLs, or browser-saved final HTML, as local Markdown with copied images. It is intended for local archiving and verification of article content, not cloud upload, knowledge-base import, or message sending.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Embedded image URLs can be downloaded into the archive without host, scheme, size, or network-safety limits.\n\nMitigation: Use the skill only with WeChat URLs and output folders you choose, consider --skip-images for untrusted content, and run it in a sandboxed environment without access to internal networks or sensitive local files.\n\nRisk: Browser-saved HTML from an untrusted source may contain asset references that affect what the downloader fetches.\n\nMitigation: Review saved HTML before use or disable image downloading for untrusted inputs until asset URL and size limits are added.\n\n## Reference(s):\n\n- [WeChat Article Archive on ClawHub](https://clawhub.ai/harven-droid/skills/wechat-article-archive)\n- [Publisher profile: harven-droid](https://clawhub.ai/user/harven-droid)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, files, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown article file, local asset files, JSON run summary, and concise text guidance]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Creates or reuses the requested destination folder and assets directory; image downloads can be skipped with --skip-images.]\n\n## Skill Version(s):\n\n1.1.5 (source: server release evidence)\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."},{"path":"package-lock.json","content":"{\n  \"name\": \"wechat-article-archive\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"dependencies\": {\n        \"cheerio\": \"^1.2.0\",\n        \"dayjs\": \"^1.11.19\",\n        \"lodash.unescape\": \"^4.0.1\",\n        \"qs\": \"^6.15.0\"\n      }\n    },\n    \"node_modules/boolbase\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz\",\n      \"integrity\": \"sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/call-bind-apply-helpers\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz\",\n      \"integrity\": \"sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"function-bind\": \"^1.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/call-bound\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz\",\n      \"integrity\": \"sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.2\",\n        \"get-intrinsic\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/cheerio\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz\",\n      \"integrity\": \"sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"cheerio-select\": \"^2.1.0\",\n        \"dom-serializer\": \"^2.0.0\",\n        \"domhandler\": \"^5.0.3\",\n        \"domutils\": \"^3.2.2\",\n        \"encoding-sniffer\": \"^0.2.1\",\n        \"htmlparser2\": \"^10.1.0\",\n        \"parse5\": \"^7.3.0\",\n        \"parse5-htmlparser2-tree-adapter\": \"^7.1.0\",\n        \"parse5-parser-stream\": \"^7.1.2\",\n        \"undici\": \"^7.19.0\",\n        \"whatwg-mimetype\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.18.1\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/cheeriojs/cheerio?sponsor=1\"\n      }\n    },\n    \"node_modules/cheerio-select\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz\",\n      \"integrity\": \"sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==\",\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"boolbase\": \"^1.0.0\",\n        \"css-select\": \"^5.1.0\",\n        \"css-what\": \"^6.1.0\",\n        \"domelementtype\": \"^2.3.0\",\n        \"domhandler\": \"^5.0.3\",\n        \"domutils\": \"^3.0.1\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/spo"},{"path":"package.json","content":"{\n  \"dependencies\": {\n    \"cheerio\": \"^1.2.0\",\n    \"dayjs\": \"^1.11.19\",\n    \"lodash.unescape\": \"^4.0.1\",\n    \"qs\": \"^6.15.0\"\n  }\n}"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Archive WeChat articles and image notes locally Skill: WeChat Article Archive Owner: harven-droid Summary: Archive WeChat articles and image notes locally Tags: archive:1.1.5, latest:1.1.5, wechat:1.1.5 Version history: v1.1.5 | 2026-09-10T06:57:06.710Z | user Fix missing images in Xiaolushu image notes by supporting picture_page_info_list in both assignment (=) and object-property (:) syntax. Preserve image order and substantive full-article content. v1.1.4 | 202","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1438,"uniquenessScore":49,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T12:28:38.617Z","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-10T12:28:38.617Z","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-10T14:44:48.858Z","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"}]}}}