{"id":"bfbd94be-1463-425d-b2ea-870828abd670","entityType":"agent","slug":"clawhub-archlab-space-x-post-strategist","name":"X Post Strategist","canonicalUrl":"https://www.xpersona.co/agent/clawhub-archlab-space-x-post-strategist","canonicalPath":"/agent/clawhub-archlab-space-x-post-strategist","generatedAt":"2026-10-10T21:48:24.970Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-10T18:16:34.322Z","emptyReason":null},"description":"Use this skill when the user wants to turn ideas, notes, articles, reports, or technical material into compelling X posts or threads. Covers single posts and... Skill: X Post Strategist Owner: archlab-space Summary: Use this skill when the user wants to turn ideas, notes, articles, reports, or technical material into compelling X posts or threads. Covers single posts and... Tags: latest:0.14.0 Version history: v0.14.0 | 2026-06-23T09:48:14.784Z | user Version 0.14.0 v0.13.0 | 2026-06-23T08:42:33.058Z | user Version 0.13.0 v0.7.3 | 2026-06-08T00:45:18.057Z | user Changed - Re","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.3K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s176qz6rwtpzj9gk93r7b3jm6984ty2d:x-post-strategist","sourceUrl":"https://clawhub.ai/archlab-space/x-post-strategist","homepage":"https://clawhub.ai/archlab-space/skills/x-post-strategist","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/archlab-space/x-post-strategist","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/archlab-space/skills/x-post-strategist","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":62,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Use this skill when the user wants to turn ideas, notes, articles, reports, or technical material into compelling X posts or threads. Covers single posts and..."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T18:16:34.322Z","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-10T18:16:34.322Z","emptyReason":null},"stars":null,"forks":null,"downloads":1300,"packageName":null,"latestVersion":"0.14.0","tractionLabel":"1.3K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T18:16:34.321Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T18:16:34.322Z","lastCrawledAt":"2026-10-10T18:16:34.321Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T18:16:34.321Z","lastVerifiedAt":null,"highlights":[{"version":"0.14.0","createdAt":"2026-06-23T09:48:14.784Z","changelog":"Version 0.14.0","fileCount":12,"zipByteSize":42221},{"version":"0.13.0","createdAt":"2026-06-23T08:42:33.058Z","changelog":"Version 0.13.0","fileCount":12,"zipByteSize":41330},{"version":"0.7.3","createdAt":"2026-06-08T00:45:18.057Z","changelog":"### Changed - Rewrite Step 10 saving: drafts now go to a dedicated `X Posts/` subfolder with one file per day (`YYYY-MM-DD.md`) instead of the user's daily note. - Add an explicit first-save location flow: use `OBSIDIAN_VAULT_PATH` if set, else a three-option prompt (folder path / `~/obsidianVault/X Posts/` default / skip). Resolve to an absolute path before writing. - Define the write mechanism: delegate to an available `obsidian` skill when present, otherwise write the markdown file directly; on any write failure, paste the block in chat so content is never lost. - Add a macOS-only hint shown only when a write fails under `~/Documents/` (iCloud sync / TCC permissions). - Update the Output Format save prompt and Key Rules to match.","fileCount":11,"zipByteSize":33913},{"version":"0.7.2","createdAt":"2026-06-07T13:55:09.358Z","changelog":"### Changed - `render-image-setup.md` / `CHANGELOG.md`: remove the literal Chromium sandbox-disabling flag tokens from prose. Docs now use a `<chromium-flags>` placeholder and link to Puppeteer's troubleshooting guide, so static security scanners no longer flag the documentation as a privilege-escalation pattern. No behavior change.","fileCount":11,"zipByteSize":32582},{"version":"0.7.1","createdAt":"2026-06-07T13:43:21.407Z","changelog":"### Changed - `scripts/render-image.js`: stop hardcoding `--no-sandbox` / `--disable-setuid-sandbox`; launch Chromium with the OS sandbox enabled by default and read optional extra flags from the `RENDER_CHROME_ARGS` environment variable. Linux/container users that need a disabled sandbox now opt in explicitly. Behavior is unchanged on macOS and standard desktops. - `render-image-setup.md`: document the `RENDER_CHROME_ARGS` env var for sandbox-restricted environments. - `README.md` / `SKILL.md`: clarify that Phase 1 research runs only when web/search tools are available and uses only the user-provided topic text, with no credentials or personal data transmitted.","fileCount":11,"zipByteSize":32407},{"version":"0.7.0","createdAt":"2026-06-05T14:22:34.644Z","changelog":"### Added - HTML/CSS + headless Chrome image rendering for text/data graphics: `scripts/render-image.js` (Puppeteer, with system-Chrome and manual fallback), `scripts/package.json`, `render-image-setup.md`, and example templates `assets/quote-card.html`, `assets/data-card.html`. - New \"Rendering Text/Data Graphics\" subsection and a decision rule for when to render via HTML/CSS vs. an image model vs. a real screenshot. ### Changed - Extended Step 8 image brief with a `Render method:` line and guidance to render text/data graphics directly to PNG.","fileCount":11,"zipByteSize":31488},{"version":"0.5.7","createdAt":"2026-05-29T00:51:01.605Z","changelog":"- Remove hardcoded `obsidian-vault-writer` skill reference in Step 10; now uses generic language to support any installed Obsidian skill.","fileCount":5,"zipByteSize":12377},{"version":"0.5.6","createdAt":"2026-05-28T09:52:23.023Z","changelog":"Rewrote frontmatter description to concise 200–500 character format for improved agent-trigger clarity.","fileCount":5,"zipByteSize":12270}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s176qz6rwtpzj9gk93r7b3jm6984ty2d:x-post-strategist","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-archlab-space-x-post-strategist/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-archlab-space-x-post-strategist/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-archlab-space-x-post-strategist/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-archlab-space-x-post-strategist/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-archlab-space-x-post-strategist/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-archlab-space-x-post-strategist/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-10T21:48:24.966Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-archlab-space-x-post-strategist/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-archlab-space-x-post-strategist/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-archlab-space-x-post-strategist/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-archlab-space-x-post-strategist/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-10T18:16:34.322Z","emptyReason":null},"readme":"Skill: X Post Strategist\n\nOwner: archlab-space\n\nSummary: Use this skill when the user wants to turn ideas, notes, articles, reports, or technical material into compelling X posts or threads. Covers single posts and...\n\nTags: latest:0.14.0\n\nVersion history:\n\nv0.14.0 | 2026-06-23T09:48:14.784Z | user\n\nVersion 0.14.0\n\nv0.13.0 | 2026-06-23T08:42:33.058Z | user\n\nVersion 0.13.0\n\nv0.7.3 | 2026-06-08T00:45:18.057Z | user\n\n### Changed\n- Rewrite Step 10 saving: drafts now go to a dedicated `X Posts/` subfolder with one file per day (`YYYY-MM-DD.md`) instead of the user's daily note.\n- Add an explicit first-save location flow: use `OBSIDIAN_VAULT_PATH` if set, else a three-option prompt (folder path / `~/obsidianVault/X Posts/` default / skip). Resolve to an absolute path before writing.\n- Define the write mechanism: delegate to an available `obsidian` skill when present, otherwise write the markdown file directly; on any write failure, paste the block in chat so content is never lost.\n- Add a macOS-only hint shown only when a write fails under `~/Documents/` (iCloud sync / TCC permissions).\n- Update the Output Format save prompt and Key Rules to match.\n\nv0.7.2 | 2026-06-07T13:55:09.358Z | user\n\n### Changed\n- `render-image-setup.md` / `CHANGELOG.md`: remove the literal Chromium sandbox-disabling flag tokens from prose. Docs now use a `<chromium-flags>` placeholder and link to Puppeteer's troubleshooting guide, so static security scanners no longer flag the documentation as a privilege-escalation pattern. No behavior change.\n\nv0.7.1 | 2026-06-07T13:43:21.407Z | user\n\n### Changed\n- `scripts/render-image.js`: stop hardcoding `--no-sandbox` / `--disable-setuid-sandbox`; launch Chromium with the OS sandbox enabled by default and read optional extra flags from the `RENDER_CHROME_ARGS` environment variable. Linux/container users that need a disabled sandbox now opt in explicitly. Behavior is unchanged on macOS and standard desktops.\n- `render-image-setup.md`: document the `RENDER_CHROME_ARGS` env var for sandbox-restricted environments.\n- `README.md` / `SKILL.md`: clarify that Phase 1 research runs only when web/search tools are available and uses only the user-provided topic text, with no credentials or personal data transmitted.\n\nv0.7.0 | 2026-06-05T14:22:34.644Z | user\n\n### Added\n- HTML/CSS + headless Chrome image rendering for text/data graphics: `scripts/render-image.js` (Puppeteer, with system-Chrome and manual fallback), `scripts/package.json`, `render-image-setup.md`, and example templates `assets/quote-card.html`, `assets/data-card.html`.\n- New \"Rendering Text/Data Graphics\" subsection and a decision rule for when to render via HTML/CSS vs. an image model vs. a real screenshot.\n### Changed\n- Extended Step 8 image brief with a `Render method:` line and guidance to render text/data graphics directly to PNG.\n\nv0.5.7 | 2026-05-29T00:51:01.605Z | user\n\n- Remove hardcoded `obsidian-vault-writer` skill reference in Step 10; now uses generic language to support any installed Obsidian skill.\n\nv0.5.6 | 2026-05-28T09:52:23.023Z | user\n\nRewrote frontmatter description to concise 200–500 character format for improved agent-trigger clarity.\n\nv0.5.5 | 2026-05-28T08:13:10.884Z | user\n\n- Replace Google Sheets output (Step 10) with Obsidian vault writing via `obsidian-vault-writer` skill\n- Remove `google-sheet-sync.md` and `scripts/` directory\n\nv0.5.3 | 2026-05-20T09:12:29.403Z | user\n\n- Fix `getCredentials()` in `save_to_sheet.js`: load `client_id`/`client_secret` from `credentials.json` before token cache check so token refresh works correctly\n- Add `normalizeToken()` to handle Python-client token format (`token` → `access_token`, `expiry` → `expiry_date`) so tokens created by other Google OAuth clients are reused without re-auth\n\nv0.5.2 | 2026-05-20T08:20:44.296Z | user\n\n- Migrate `scripts/save_to_sheet.py` → `scripts/save_to_sheet.js` (Node.js); identical CLI interface and output; depends only on `googleapis` via `npm install` in the `scripts/` directory; removes Python runtime requirement\n- Add `scripts/package.json`; delete `scripts/save_to_sheet.py`\n- Update `google-sheet-sync.md` and `SKILL.md` to reference `node` / `npm install` instead of `python` / `pip`\n\nv0.4.2 | 2026-05-18T08:13:09.290Z | user\n\nAdded Writing Principles section with 7 concrete principles (natural voice, subjective perspective, scene grounding, cut ornate language, no forced profundity, specific beats vague, leave room). Each principle includes before/after examples in English and Chinese. Added Writing Principles row to Step 9 review rubric.\n\nv0.4.0 | 2026-05-14T02:19:38.041Z | user\n\nx-post-strategist 0.4.0 changelog:\n\n- Added a detailed SKILL.md outlining step-by-step workflow for turning notes, reports, or technical material into clear and engaging X posts or threads.\n- Introduced structured research, context enrichment, and fact-checking phases to guide content creation.\n- Established explicit character limits and content guidelines for both Premium and non-Premium account types.\n- Provided standardized thread narrative templates (Argument, Story, Tutorial) to ensure clarity and consistency.\n- Emphasized user voice preservation with analysis of sentence patterns, vocabulary, and tone.\n- Outlined process for generating multiple drafts when user goals, audience, and tone are unspecified.\n\nArchive index:\n\nArchive v0.14.0: 12 files, 42221 bytes\n\nFiles: assets/data-card.html (2450b), assets/quote-card.html (1799b), CHANGELOG.md (7173b), chinese-ai-tech-posts.md (13278b), README.md (2037b), render-image-setup.md (2944b), scripts/package-lock.json (41495b), scripts/package.json (317b), scripts/render-image.js (5433b), skill-card.md (2466b), SKILL.md (24052b), _meta.json (137b)\n\nFile v0.14.0:SKILL.md\n\n---\nname: x-post-strategist\ndescription: >\n  Use this skill when the user wants to turn ideas, notes, articles, reports, or\n  technical material into compelling X posts or threads. Covers single posts and\n  multi-tweet threads, tone matching, and character-limit handling for Standard\n  and Premium accounts. Not for other platforms (LinkedIn, Reddit, Xiaohongshu),\n  long-form articles, or auto-posting on the user's behalf.\n---\n\n# X Post Strategist\n\nYou are an X content strategist and editor. Your job is to turn raw input into posts or threads that are clear, accurate, engaging, and natural. Optimize for the user's goal, not for generic virality.\n\n**Default language:** Match the language of the source material unless the user specifies otherwise.\n\n## Flow\n\nFollow these steps in order. Ask one question at a time when required information is missing.\n\n---\n\n## Phase 1: Research\n\n### Step 1: Understand The Assignment\n\nIdentify the source material and the publishing goal.\n\nIf the user provides only a vague request, ask for the source material or the intended angle. If the source material is long, summarize the core idea before drafting.\n\n**Required before drafting** — ask the user if not provided. Ask one question at a time and wait for the answer before continuing:\n\n| Input | Options | Why It Matters |\n| --- | --- | --- |\n| Account type | Non-Premium / Premium | Controls the per-post character limit (280 vs 25,000 chars). |\n| Format | Single post / Thread | Determines structure and whether the character limit applies per post or to the whole piece. |\n\nDo not proceed to Step 2 until both are confirmed.\n\n**Optional — infer from source material if not provided:**\n\n| Input | Examples | Why It Matters |\n| --- | --- | --- |\n| Goal | Educate, persuade, react to news, build authority, launch something, drive clicks, start discussion | Shapes hook strategy. |\n| Audience | Developers, investors, founders, operators, researchers, students, general public | Shapes vocabulary and depth. |\n| Desired tone | Analytical, sharp, calm, technical, playful, contrarian, personal, executive, storytelling | Shapes voice. |\n| Style samples | 1–5 past X posts by the user | Lets you extract real voice patterns rather than guessing tone. Used in Step 6. |\n\nIf goal, audience, and tone are all unspecified, read the source material and independently select the **3 best style combinations** (each with a goal, audience, and tone). Draft a post for each combination, score all three using the Step 9 rubric, and present them together for the user to choose from. This applies to short Non-Premium single posts only; for long-form output (any thread or a Premium single post) produce one draft and offer other angles conversationally instead — see Step 7.\n\n### Step 2: Enrich Context\n\nRun these research sub-tasks when web/search tools are available, using only the topic text the user provides — no credentials or personal data are transmitted. Execute all three sub-tasks in order.\n\n**1. Background Search**\nSearch for foundational context on the topic. Summarise to ≤ 3 core facts the user may not have included. If the source material is a well-cited report with clear references, reduce this to a quick gap-fill — but never skip it entirely.\n\n**2. Trending Angle Scan**\nSearch current X / web discourse to find the live conversation: hot takes, common positions, recent developments. Goal: make the post enter an active conversation, not rehash a stale one.\n\n**3. Fact Signal**\nRetrieve source evidence for the core claims in the user's input. Do not render a verdict here — only collect signals for Step 3 to evaluate.\n\nPresent results in this format (internal use; show to user only if asked):\n\n```\n[Context enrichment]\nBackground: ...\nTrending angles: ...\nFact signals: ...\n```\n\n### Step 3: Check Facts And Risk\n\nUse the fact signals from Step 2 to assess whether the input depends on current facts, external claims, or sensitive topics.\n\n- For real-time, market, news, product, legal, medical, political, or scientific claims, verify facts when tools are available. If verification is not available, say what is unverified and avoid presenting uncertain claims as fact.\n- For financial content, avoid guarantees, price predictions stated as certainty, or implied investment advice.\n- For medical, legal, safety, or high-stakes content, keep claims careful and avoid instructions that exceed the user's evidence.\n- Do not invent sources, numbers, quotes, screenshots, charts, or firsthand experience.\n\n---\n\n## Writing Principles\n\n> Read these before drafting. They apply to every post regardless of language, format, or goal.\n\n### 1. Natural Voice\n**Rule:** Write the way a real person talks, not the way an essay is written.\n**Why:** Polished prose creates distance; conversational language creates connection.\n\n**Before (EN):** \"The proliferation of AI tools has fundamentally transformed the landscape of knowledge work.\"\n**After (EN):** \"AI tools changed how I work. I didn't expect it to happen this fast.\"\n\n**Before (ZH):** \"人工智能工具的广泛普及从根本上重塑了知识工作的格局。\"\n**After (ZH):** \"AI 工具真的改变了我的工作方式，快得让自己都没反应过来。\"\n\n### 2. Subjective Perspective\n**Rule:** Include how you feel or what you think — not just what happened.\n**Why:** Facts are searchable; your reaction to them is not.\n\n**Before (EN):** \"OpenAI released a new model today with improved reasoning capabilities.\"\n**After (EN):** \"OpenAI dropped a new model today. Honestly, I didn't expect it to be this good at reasoning.\"\n\n**Before (ZH):** \"OpenAI 今天发布了新模型，推理能力有所提升。\"\n**After (ZH):** \"OpenAI 今天发了新模型。说实话，推理能力比我预期的强很多。\"\n\n### 3. Scene First\n**Rule:** Anchor the post in a specific moment or situation before making the point.\n**Why:** Scenes create immediate context that makes abstract points feel real and lived-in.\n\n**Before (EN):** \"Hiring is harder than people realize.\"\n**After (EN):** \"I read 60 resumes in one afternoon last week. By resume 40, I could barely remember what I was looking for.\"\n\n**Before (ZH):** \"招人比大家想象的难多了。\"\n**After (ZH):** \"上周一个下午我看了 60 份简历。看到第 40 份的时候，我已经忘了自己在找什么了。\"\n\n### 4. Cut Ornate Language\n**Rule:** Use the simplest word that carries the meaning. Ornate phrasing signals effort, not quality.\n**Why:** Complex language makes readers work harder to extract less value.\n\n**Before (EN):** \"This paradigm-shifting innovation will catalyze unprecedented transformations across diverse verticals.\"\n**After (EN):** \"This changes how every industry operates. That's not hype — here's why.\"\n\n**Before (ZH):** \"这一突破性创新将在各领域催生前所未有的深刻变革。\"\n**After (ZH):** \"这东西会改变很多行业的运作方式，不是在夸张，原因在这里。\"\n\n### 5. No Forced Profundity\n**Rule:** End when the point is made. Do not manufacture a philosophical lesson if the post didn't earn one.\n**Why:** Forced takeaways feel preachy and undermine the authenticity of everything before them.\n\n**Before (EN):** \"...and that's why in the end, consistency is the real competitive advantage.\"\n**After (EN):** \"...anyway, that's what I've been thinking about. Curious if anyone else has run into this.\"\n\n**Before (ZH):** \"...所以归根结底，坚持才是真正的竞争优势。\"\n**After (ZH):** \"...就这些，我最近一直在想这个。不知道有没有人也有类似的感受。\"\n\n### 6. Specific Beats Vague\n**Rule:** Replace vague descriptions with numbers, names, or precise observations.\n**Why:** Specificity signals credibility and makes abstract claims feel lived-in.\n\n**Before (EN):** \"I've been reviewing a lot of applications lately.\"\n**After (EN):** \"I've reviewed 200+ applications in the last 3 weeks.\"\n\n**Before (ZH):** \"我最近看了很多简历。\"\n**After (ZH):** \"过去三周我看了超过 200 份简历。\"\n\n### 7. Leave Room\n**Rule:** State your point, then stop. Don't explain what the reader should conclude.\n**Why:** Over-explanation signals distrust of the reader and kills the post's punch.\n\n**Before (EN):** \"This means that if you're a developer, you should start learning AI tools now, because the job market is changing and those who adapt will succeed.\"\n**After (EN):** \"The developers I know who started using AI tools two years ago are now being paid very differently.\"\n\n**Before (ZH):** \"这意味着如果你是开发者，应该立刻开始学习 AI 工具，因为市场在变化，能适应的人才能成功。\"\n**After (ZH):** \"两年前就开始用 AI 工具的开发者，现在的薪资待遇和其他人差了很多。\"\n\n---\n\n## Phase 2: Creation\n\n### Step 4: Choose The Format\n\nChoose the smallest format that can carry the idea well.\n\n- Use a single post when the idea has one clear point, one timely observation, or one concise takeaway.\n- Use a thread when the source material has multiple claims, a process, a technical explanation, a story arc, or several useful examples.\n- For non-Premium accounts, each post must be ≤ **280 characters** (spaces and punctuation included). If the user confirmed \"single post\", compress the content to fit — cut, distil, and sharpen until it fits. Do not ask the user to switch to a thread.\n- For Premium accounts, posts may be up to **25,000 characters**. \"Tight\" means no filler — not necessarily short. Match length to the material: when the source is a long, rich, or structured document (a research report, deep-dive, or spec), default to a fuller, denser treatment that actually uses the material — do not reflexively compress it into a short post. Still cut every word that does not earn its place.\n\n**Thread narrative templates** — select one based on content type and name it in the output:\n\n**① Argument** (opinions, analysis, predictions)\n```\n1/ Hook — sharpest core claim\n2-3/ Evidence — specific facts or cases\n4/ Counterpoint or qualification — adds credibility\n5/ Insight — useful conclusion for the reader\n6/ CTA — question, discussion invite, or action\n```\n\n**② Story** (experiences, case studies, before/after)\n```\n1/ Hook — most dramatic moment or outcome\n2-3/ Background + conflict\n4/ Turning point\n5/ Result + lesson\n6/ CTA\n```\n\n**③ Tutorial** (technical, process, checklist)\n```\n1/ Hook — what problem this solves\n2-N/ Steps (one point each, parallel structure)\nN+1/ Summary + common mistakes\nN+2/ CTA\n```\n\n### Step 5: Draft With A Strong Hook\n\nWrite for X: clear opening, fast payoff, concrete details, and a reason to keep reading.\n\nUseful hook patterns:\n\n- **Specific claim:** State the sharpest useful takeaway.\n- **Contrarian angle:** Challenge a common assumption only if the evidence supports it.\n- **Before and after:** Show what changed and why it matters.\n- **Mistake or lesson:** Frame the post around a practical insight.\n- **Data or signal:** Lead with the most interesting number, trend, or observation.\n- **Question:** Use only when the answer is genuinely interesting.\n\nAvoid generic AI phrasing such as \"In today's fast-paced world\", \"game changer\", \"delve into\", \"unlock\", \"leverage\", \"it is important to note\", and empty hype.\n\nWhen the post is in Chinese **and** the topic is AI / Agent / LLM / tech-frontier, also consult `chinese-ai-tech-posts.md` for language-specific hooks, sentence patterns, structures, templates, and posting timing. It supplements the Writing Principles for that locale and domain; for any other language or topic, ignore it.\n\n### Step 6: Preserve Human Voice\n\nMake the writing sound like a person with a point of view.\n\n**If style samples were provided in Step 1:**\n1. Before drafting, analyse the samples across three dimensions: **sentence patterns** (length ratio, punctuation style), **vocabulary** (jargon, abbreviations, register), **tone** (direct / humble / sharp / humorous).\n2. After drafting, run a quick check — does the draft match the user's profile on all three dimensions? Adjust if not.\n\n**If no style samples were provided:**\nInfer voice from the source material as before.\n\nIn both cases:\n- Keep the user's meaning, expertise, and level of confidence.\n- Prefer concrete nouns and verbs over abstract claims.\n- Vary sentence length naturally.\n- Remove filler, throat-clearing, and overly balanced phrasing.\n- Use plain transitions instead of polished essay structure.\n- Keep personality, but do not force slang, memes, emojis, or outrage.\n- If the user wrote in a distinctive style, preserve that style unless it hurts clarity.\n\n### Step 7: Produce Options\n\nFirst decide by **output length**, not by account type:\n\n**Long-form output — threads (any account) and Premium single posts:** do not auto-produce multiple parallel drafts. Produce one draft whose depth matches the source material, then collaborate to refine it:\n\n- Offer 1–3 other angles you think are worth trying; draft them only if the user asks.\n- And/or name specific parts of the current draft you would improve, and revise after the user agrees.\n- Iterate until the user is satisfied.\n\n**Short output — Non-Premium single posts (≤ 280 chars):** 2–3 parallel variants are cheap and useful, so the multi-draft behavior below applies.\n\nWhen goal, audience, and tone are all unspecified, independently select the 3 best style combinations from the source material. For each combination, state the goal, audience, and tone, then draft the post and include a score summary from the Step 9 rubric. Present all three together so the user can choose.\n\nWhen the user has specified goal, audience, or tone, produce 2 or 3 drafts with distinct angles within those constraints. Label each by strategy, not by quality. Examples:\n\n- **Analytical**\n- **Contrarian**\n- **Founder voice**\n- **Technical thread**\n- **Short punchy version**\n\nIf the user asks for one final post, provide one polished draft instead of options.\n\n### Step 8: Decide Whether An Image Helps\n\nDo not recommend an image by default. Recommend one only when it improves understanding, credibility, or shareability.\n\nAn image is useful for:\n\n- A chart, comparison, framework, checklist, architecture sketch, timeline, or key quote.\n- Dense technical ideas that become clearer visually.\n- Market or product analysis where a concise visual summary helps scanning.\n\nAn image is usually unnecessary for:\n\n- A personal observation, short opinion, joke, simple announcement, or already concise post.\n\nIf an image helps, include an image brief:\n\n```text\nImage recommendation: Yes\nPurpose: [why the image improves the post]\nFormat: [chart / quote card / framework / diagram / comparison]\nAspect ratio: [16:9 / 4:5 / 1:1]\nText on image: [short words only, no crowded paragraphs]\nVisual direction: [style, layout, colors, constraints]\nRender method: [HTML/CSS via render-image.js | image model | real screenshot]\n```\n\nIf no image helps, write: `Image recommendation: No - [brief reason]`.\n\n**Choosing the render method:** for **text- or data-driven** graphics (quote cards, data/metric cards, frameworks, comparisons, checklists, timelines), recommend `HTML/CSS via render-image.js` — see **Rendering Text/Data Graphics** below. For photographic or illustrative needs, recommend an image model; for showing the real product, recommend a real screenshot — never fabricate one.\n\n### Rendering Text/Data Graphics (HTML/CSS + Headless Chrome)\n\nWhen the image is text- or data-driven, you can render it deterministically with HTML/CSS and headless Chrome instead of describing it for a separate tool. This is reproducible and batchable.\n\n**Use this method when** the graphic is layout/typography driven and benefits from precise, repeatable output:\n\n- Quote cards, data/metric cards (real numbers), framework / comparison / checklist / timeline diagrams, code-snippet cards.\n\n**Do not use this method** (use an image model or a real capture instead) when:\n\n- The visual is photographic or illustrative (product photos, lifestyle, hero art), or\n- It must show the real product — take an actual screenshot; never fake one.\n\n**How to render:**\n\n1. Author a self-contained HTML file (inline CSS, no external network assets). Start from `assets/quote-card.html` or `assets/data-card.html`.\n2. Run the helper script:\n\n   ```sh\n   node scripts/render-image.js <input.html> <output.png> [--width=1080] [--height=1080] [--scale=2]\n   ```\n\n3. Attach the PNG to the post.\n\nFirst-time setup, sizes, and fallback behavior are in `render-image-setup.md`. If no browser can launch, the script keeps the HTML and prints manual-render instructions — relay the image brief so the user can render or generate it another way.\n\n### Step 9: Review And Revise\n\nBefore finalizing, score the draft and revise it once if any score is below 8.\n\nUse this rubric:\n\n| Criterion | What To Check |\n| --- | --- |\n| Platform fit | Fits account constraints, reads naturally on X, and has a strong first line. |\n| Hook quality | Gives the reader a clear reason to keep reading. |\n| Accuracy | Does not overclaim, invent facts, or hide uncertainty. |\n| Human voice | Avoids generic AI tone and sounds like a real person. |\n| Density | Delivers enough value without clutter. |\n| Format choice | Single post or thread is appropriate for the material. |\n| Character count | For non-Premium: confirm every post is ≤ 280 characters before finalising. For threads: check each post individually. |\n| Writing principles | Natural voice, subjective perspective, scene grounding, no ornate language, no forced profundity, specific details, no over-explanation. Revise any draft that violates 2 or more. |\n\nIf subagents or independent reviewers are available, use them for the review pass:\n\n1. One reviewer checks hook, clarity, and X fit.\n2. One reviewer checks factual risk and overclaiming.\n3. One reviewer checks human voice and removes AI traces.\n\nIf subagents are not available, perform the same checks yourself.\n\n### Step 10: Save To Vault (Optional)\n\nSaving is **opt-in only**. Generated drafts go to a dedicated subfolder in the user's vault — never into their daily note or any of their own notes.\n\n**Target:** `<base>/X Posts/YYYY-MM-DD.md` — one file per day, the folder created if missing. Always resolve to a concrete **absolute path** before writing.\n\n**Trigger — check at session start:**\n- If the opening message asks to save (e.g. \"save to Obsidian\", \"save to ~/foo\"), saving is enabled for the session.\n- Otherwise, offer it once on the first finalized draft (see below).\n\n**First save — resolve the location once per session:**\n1. If `OBSIDIAN_VAULT_PATH` is set, use it as the base. Announce the resolved absolute target on the first write (e.g. \"Saving to `/Users/x/obsidianVault/X Posts/2026-06-07.md`\") — this announcement confirms the target.\n2. If the opening message named a path, use it the same way (announce, no prompt).\n3. Otherwise ask once:\n   > Save these drafts? Reply with (1) a folder path, (2) `default` to use `~/obsidianVault/X Posts/`, or (3) `no` to skip.\n   - A path → write to `<path>/X Posts/…`.\n   - `default` → write to `~/obsidianVault/X Posts/…` (created if missing).\n   - `no` → do not save, do not output a block, and stop asking for the rest of the session.\n\n**Cadence:** Once a path or the default is chosen (or saving was enabled upfront), auto-save every finalized draft for the rest of the session — do not ask again. The user may skip an individual draft by saying so.\n\n**Who writes the file:**\n1. If a skill that writes to your notes vault (such as an `obsidian` skill) is available, delegate the create/append to it. Pass the **already-resolved absolute path** and the content — never a path containing a shell variable like `$OBSIDIAN_VAULT_PATH`. It handles vault initialization and paths with spaces.\n2. If no `obsidian` skill is available, write the file directly with this platform's file-write capability (for example `Write` in Claude Code, `write_file` in Hermes). Create the `X Posts/` folder if needed.\n3. If the write fails for any reason, **do not lose the content**: paste the finalized markdown block in the chat so the user can copy it manually.\n\n**macOS note:** Only when a write fails **and** the target is under `~/Documents/`, add one line — the cause may be iCloud Drive sync or macOS privacy (TCC) permissions; suggest moving the vault out of `~/Documents` or granting access. Do not show this otherwise.\n\n**File format** — when the day file is new, start it with a title; append one section per save:\n\n```markdown\n# X Posts — 2026-06-07\n\n## 09:14 — [topic or url]\n**Type:** single | thread\n\nVariant 1:\n[post text]\n\nVariant 2:\n[post text — omit this block when there is only one variant]\n```\n\nUse a 24-hour `HH:MM` timestamp (local time). For threads, place the full thread as numbered lines under **Variant 1**; never truncate post text.\n\n---\n\n## Output Format\n\nUse this format unless the user asks for something else:\n\n```text\nDraft:\n[final post or thread]\n\nWhy this works:\n[1-3 concise bullets]\n\nImage recommendation:\n[No with reason, or Yes with brief]\n\nSelf-review:\n[scores and any final adjustment]\n\nSave to vault? (first draft only — reply with a folder path, `default`, or `no`)\n[omit this line once a location is chosen or saving is disabled for the session]\n```\n\nFor threads, number each post and name the template used:\n\n```text\nThread [template name]:\n1/ [hook]\n2/ [next post]\n3/ [next post]\n...\n```\n\n## Key Rules\n\n- Write in the language of the source material unless the user specifies otherwise.\n- For Chinese AI / Agent / LLM / tech-frontier posts, apply `chinese-ai-tech-posts.md` on top of the Writing Principles.\n- Account type and format are required inputs. Do not draft until both are confirmed.\n- Always run all three sub-tasks in Step 2 before drafting — even for long, detailed input.\n- If goal, audience, and tone are all unspecified, select the 3 best style combinations from the source material, draft and score all three, then present them for the user to choose from (short Non-Premium single posts only; for long-form output produce one draft and offer angles conversationally — see Step 7).\n- For long-form output — a thread (any account) or a Premium single post — default to one draft whose depth matches the material; never reflexively produce a short post or multiple parallel variants. After drafting, offer other angles for the user to opt into and/or propose specific improvements, and revise iteratively until the user is satisfied. Parallel multi-variant drafting is reserved for short Non-Premium single posts.\n- Non-Premium single posts must not exceed 280 characters. Compress to fit — do not ask the user to switch to a thread.\n- Keep the final text publishable, not just instructive.\n- Do not make weak material sound more certain than it is.\n- Do not recommend images automatically.\n- Image rendering via `render-image.js` is optional and only for text/data graphics; on failure, degrade gracefully to the image brief. Never fabricate a product screenshot — capture the real one.\n- Do not bury the final draft under long explanations.\n- If the user asks for direct publishing help, remind them to review factual claims before posting.\n- Saving is opt-in only. Never write without explicit user consent or an upfront session-level request, and always save to the `X Posts/` subfolder — never the user's daily note.\n- Always run Step 10 after every draft output. On the first save, resolve the location (env var, named path, or three-option prompt); afterwards auto-save unless the user chose not to save.\n\n## Feedback\n\nIf the user expresses a need this skill does not cover, or is unsatisfied with the result, append this to your response:\n\n> \"This skill may not fully cover your situation. Suggestions for improvement are welcome — [open an issue or PR](https://github.com/archlab-space/open-skill-hub/issues).\"\n\nDo not include this message in normal interactions.\n\nFile v0.14.0:README.md\n\n# X Post Strategist\n\n**Platforms:** Claude · Openclaw · Codex\n**Domain:** Writing\n\n## Purpose\n\nA strategy editor for writing X posts and threads. It turns rough ideas, short prompts, articles, reports, or technical material into clear, engaging, natural posts that fit the user's goal and account constraints.\n\n## When to Use\n\n- When you have an idea and want a stronger X post\n- When you want to turn a long article or technical note into a thread\n- When you need a sharper hook, clearer angle, or more natural voice\n- When you want to know whether a post would benefit from an image\n- When factual or sensitive claims need careful wording before posting\n\n## What It Does\n\n**Phase 1: Research**\n1. Clarifies the goal, audience, tone, account type, format, and optional style samples\n2. When web/search tools are available, researches background context and trending angles using only the topic text you provide — no credentials or personal data are sent\n3. Verifies factual claims and flags risk before writing\n\n**Phase 2: Creation**\n4. Chooses a single post or thread; selects a narrative template (Argument / Story / Tutorial) for threads\n5. Writes strong hooks and publishable drafts\n6. Calibrates voice against user-provided style samples, or infers it from the source material\n7. Produces multiple drafts with distinct angles when goal, audience, or tone is unspecified\n8. Decides whether an image would improve the post and provides a brief when one helps\n9. Scores and revises the draft for X fit, accuracy, quality, and human voice\n\n## Notes\n\nThe skill defaults to English unless another language is requested. It is focused on X only, not LinkedIn, Threads, or general social media.\n\nFor real-time, financial, legal, medical, political, or other high-stakes topics, the agent should verify facts when possible and avoid presenting uncertainty as fact.\n\n## Feedback & Contributions\n\nFound a gap or have a suggestion? [Open an issue or PR](https://github.com/archlab-space/open-skill-hub/issues) — improvements are welcome.\n\nFile v0.14.0:_meta.json\n\n{\n  \"ownerId\": \"kn798vfcxrgjdt230v34k8eqf584vpwv\",\n  \"slug\": \"x-post-strategist\",\n  \"version\": \"0.14.0\",\n  \"publishedAt\": 1782208094784\n}\n\nFile v0.14.0:scripts/package-lock.json\n\n{\n  \"name\": \"x-post-strategist-render-image\",\n  \"version\": \"1.0.0\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"x-post-strategist-render-image\",\n      \"version\": \"1.0.0\",\n      \"dependencies\": {\n        \"puppeteer\": \"^24.15.0\"\n      },\n      \"bin\": {\n        \"render-image\": \"render-image.js\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@babel/code-frame\": {\n      \"version\": \"7.29.7\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz\",\n      \"integrity\": \"sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/helper-validator-identifier\": \"^7.29.7\",\n        \"js-tokens\": \"^4.0.0\",\n        \"picocolors\": \"^1.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/helper-validator-identifier\": {\n      \"version\": \"7.29.7\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz\",\n      \"integrity\": \"sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@puppeteer/browsers\": {\n      \"version\": \"2.13.2\",\n      \"resolved\": \"https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.13.2.tgz\",\n      \"integrity\": \"sha512-5EUZSUIc37H6aIXyWO0Z4y8NlF8NnjgmqeQgOGiswAU7pY0HOo16ho4+alIWmSfdZnjqBRawMsP3I5YqLSn6kw==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"debug\": \"^4.4.3\",\n        \"extract-zip\": \"^2.0.1\",\n        \"progress\": \"^2.0.3\",\n        \"proxy-agent\": \"^6.5.0\",\n        \"semver\": \"^7.7.4\",\n        \"tar-fs\": \"^3.1.1\",\n        \"yargs\": \"^17.7.2\"\n      },\n      \"bin\": {\n        \"browsers\": \"lib/cjs/main-cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@tootallnate/quickjs-emscripten\": {\n      \"version\": \"0.23.0\",\n      \"resolved\": \"https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz\",\n      \"integrity\": \"sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@types/node\": {\n      \"version\": \"25.9.1\",\n      \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-25.9.1.tgz\",\n      \"integrity\": \"sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"undici-types\": \">=7.24.0 <7.24.7\"\n      }\n    },\n    \"node_modules/@types/yauzl\": {\n      \"version\": \"2.10.3\",\n      \"resolved\": \"https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz\",\n      \"integrity\": \"sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/agent-base\": {\n      \"version\": \"7.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz\",\n      \"integrity\": \"sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/ansi-regex\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n      \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/ansi-styles\": {\n      \"version\": \"4.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz\",\n      \"integrity\": \"sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"color-convert\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n      }\n    },\n    \"node_modules/argparse\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz\",\n      \"integrity\": \"sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==\",\n      \"license\": \"Python-2.0\"\n    },\n    \"node_modules/ast-types\": {\n      \"version\": \"0.13.4\",\n      \"resolved\": \"https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz\",\n      \"integrity\": \"sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"tslib\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/b4a\": {\n      \"version\": \"1.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz\",\n      \"integrity\": \"sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==\",\n      \"license\": \"Apache-2.0\",\n      \"peerDependencies\": {\n        \"react-native-b4a\": \"*\"\n      },\n      \"peerDependenciesMeta\": {\n        \"react-native-b4a\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/bare-events\": {\n      \"version\": \"2.9.1\",\n      \"resolved\": \"https://registry.npmjs.org/bare-events/-/bare-events-2.9.1.tgz\",\n      \"integrity\": \"sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg==\",\n      \"license\": \"Apache-2.0\",\n      \"peerDependencies\": {\n        \"bare-abort-controller\": \"*\"\n      },\n      \"peerDependenciesMeta\": {\n        \"bare-abort-controller\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/bare-fs\": {\n      \"version\": \"4.7.2\",\n      \"resolved\": \"https://registry.npmjs.org/bare-fs/-/bare-fs-4.7.2.tgz\",\n      \"integrity\": \"sha512-aTvMFUWkBmjzKtEQMDGGDNF8bkfpD5N1b/FCwt7A3wrU4t1o/e/85Wzkluh6JlODCjqVESYCkQCdTXqZ9G7VFg==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"bare-events\": \"^2.5.4\",\n        \"bare-path\": \"^3.0.0\",\n        \"bare-stream\": \"^2.6.4\",\n        \"bare-url\": \"^2.2.2\",\n        \"fast-fifo\": \"^1.3.2\"\n      },\n      \"engines\": {\n        \"bare\": \">=1.16.0\"\n      },\n      \"peerDependencies\": {\n        \"bare-buffer\": \"*\"\n      },\n      \"peerDependenciesMeta\": {\n        \"bare-buffer\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/bare-os\": {\n      \"version\": \"3.9.1\",\n      \"resolved\": \"https://registry.npmjs.org/bare-os/-/bare-os-3.9.1.tgz\",\n      \"integrity\": \"sha512-6M5XjcnsygQNPMCMPXSK379xrJFiZ/AEMNBmFEmQW8d/789VQATvriyi5r0HYTL9TkQ26rn3kgdTG3aisbrXkQ==\",\n      \"license\": \"Apache-2.0\",\n      \"engines\": {\n        \"bare\": \">=1.14.0\"\n      }\n    },\n    \"node_modules/bare-path\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/bare-path/-/bare-path-3.0.1.tgz\",\n      \"integrity\": \"sha512-ghj2DSK/2e99a1anTVPCV4m4YIYtrbXhfM7V3D7XZLOTsybnYyaJloymGqssQc8l/or0UoDyRtNQkmkEF/ysgQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"bare-os\": \"^3.0.1\"\n      }\n    },\n    \"node_modules/bare-stream\": {\n      \"version\": \"2.13.1\",\n      \"resolved\": \"https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.1.tgz\",\n      \"integrity\": \"sha512-Vp0cnjYyrEC4whYTymQ+YZi6pBpfiICZO3cfRG8sy67ZNWe951urv1x4eW1BKNngw3U+3fPYb5JQvHbCtxH7Ow==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"streamx\": \"^2.25.0\",\n        \"teex\": \"^1.0.1\"\n      },\n      \"peerDependencies\": {\n        \"bare-abort-controller\": \"*\",\n        \"bare-buffer\": \"*\",\n        \"bare-events\": \"*\"\n      },\n      \"peerDependenciesMeta\": {\n        \"bare-abort-controller\": {\n          \"optional\": true\n        },\n        \"bare-buffer\": {\n          \"optional\": true\n        },\n        \"bare-events\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/bare-url\": {\n      \"version\": \"2.4.5\",\n      \"resolved\": \"https://registry.npmjs.org/bare-url/-/bare-url-2.4.5.tgz\",\n      \"integrity\": \"sha512-K+y9xF1tN+CdPu4qWwr0QiK1Al07eFPGYK5M2pDXcmHdMdgC/tT/bpmMe1hrmRHaidKLkXrC+cRNYf3XVDUhSQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"bare-path\": \"^3.0.0\"\n      }\n    },\n    \"node_modules/basic-ftp\": {\n      \"version\": \"5.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.3.1.tgz\",\n      \"integrity\": \"sha512-bopVNp6ugyA150DDuZfPFdt1KZ5a94ZDiwX4hMgZDzF+GttD80lEy8kj98kbyhLXnPvhtIo93mdnLIjpCAeeOw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=10.0.0\"\n      }\n    },\n    \"node_modules/buffer-crc32\": {\n      \"version\": \"0.2.13\",\n      \"resolved\": \"https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz\",\n      \"integrity\": \"sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/callsites\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz\",\n      \"integrity\": \"sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/chromium-bidi\": {\n      \"version\": \"14.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-14.0.0.tgz\",\n      \"integrity\": \"sha512-9gYlLtS6tStdRWzrtXaTMnqcM4dudNegMXJxkR0I/CXObHalYeYcAMPrL19eroNZHtJ8DQmu1E+ZNOYu/IXMXw==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"mitt\": \"^3.0.1\",\n        \"zod\": \"^3.24.1\"\n      },\n      \"peerDependencies\": {\n        \"devtools-protocol\": \"*\"\n      }\n    },\n    \"node_modules/cliui\": {\n      \"version\": \"8.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz\",\n      \"integrity\": \"sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"string-width\": \"^4.2.0\",\n        \"strip-ansi\": \"^6.0.1\",\n        \"wrap-ansi\": \"^7.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/color-convert\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz\",\n      \"integrity\": \"sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"color-name\": \"~1.1.4\"\n      },\n      \"engines\": {\n        \"node\": \">=7.0.0\"\n      }\n    },\n    \"node_modules/color-name\": {\n      \"version\": \"1.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz\",\n      \"integrity\": \"sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/cosmiconfig\": {\n      \"version\": \"9.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz\",\n      \"integrity\": \"sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"env-paths\": \"^2.2.1\",\n        \"import-fresh\": \"^3.3.0\",\n        \"js-yaml\": \"^4.1.0\",\n        \"parse-json\": \"^5.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/d-fischer\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=4.9.5\"\n      },\n      \"peerDependenciesMeta\": {\n        \"typescript\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/data-uri-to-buffer\": {\n      \"version\": \"6.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz\",\n      \"integrity\": \"sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/debug\": {\n      \"version\": \"4.4.3\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.4.3.tgz\",\n      \"integrity\": \"sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ms\": \"^2.1.3\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"supports-color\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/degenerator\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz\",\n      \"integrity\": \"sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ast-types\": \"^0.13.4\",\n        \"escodegen\": \"^2.1.0\",\n        \"esprima\": \"^4.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/devtools-protocol\": {\n      \"version\": \"0.0.1608973\",\n      \"resolved\": \"https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1608973.tgz\",\n      \"integrity\": \"sha512-Tpm17fxYzt+J7VrGdc1k8YdRqS3YV7se/M6KeemEqvUbq/n7At1rWVuXMxQgpWkdwSdIEKYbU//Bve+Shm4YNQ==\",\n      \"license\": \"BSD-3-Clause\"\n    },\n    \"node_modules/emoji-regex\": {\n      \"version\": \"8.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz\",\n      \"integrity\": \"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/end-of-stream\": {\n      \"version\": \"1.4.5\",\n      \"resolved\": \"https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz\",\n      \"integrity\": \"sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"once\": \"^1.4.0\"\n      }\n    },\n    \"node_modules/env-paths\": {\n      \"version\": \"2.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz\",\n      \"integrity\": \"sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/error-ex\": {\n      \"version\": \"1.3.4\",\n      \"resolved\": \"https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz\",\n      \"integrity\": \"sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"is-arrayish\": \"^0.2.1\"\n      }\n    },\n    \"node_modules/escalade\": {\n      \"version\": \"3.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz\",\n      \"integrity\": \"sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/escodegen\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz\",\n      \"integrity\": \"sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==\",\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"esprima\": \"^4.0.1\",\n        \"estraverse\": \"^5.2.0\",\n        \"esutils\": \"^2.0.2\"\n      },\n      \"bin\": {\n        \"escodegen\": \"bin/escodegen.js\",\n        \"esgenerate\": \"bin/esgenerate.js\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0\"\n      },\n      \"optionalDependencies\": {\n        \"source-map\": \"~0.6.1\"\n      }\n    },\n    \"node_modules/esprima\": {\n      \"version\": \"4.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz\",\n      \"integrity\": \"sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==\",\n      \"license\": \"BSD-2-Clause\",\n      \"bin\": {\n        \"esparse\": \"bin/esparse.js\",\n        \"esvalidate\": \"bin/esvalidate.js\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/estraverse\": {\n      \"version\": \"5.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz\",\n      \"integrity\": \"sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==\",\n      \"license\": \"BSD-2-Clause\",\n      \"engines\": {\n        \"node\": \">=4.0\"\n      }\n    },\n    \"node_modules/esutils\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz\",\n      \"integrity\": \"sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==\",\n      \"license\": \"BSD-2-Clause\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/events-universal\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz\",\n      \"integrity\": \"sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"bare-events\": \"^2.7.0\"\n      }\n    },\n    \"node_modules/extract-zip\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz\",\n      \"integrity\": \"sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==\",\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"debug\": \"^4.1.1\",\n        \"get-stream\": \"^5.1.0\",\n        \"yauzl\": \"^2.10.0\"\n      },\n      \"bin\": {\n        \"extract-zip\": \"cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">= 10.17.0\"\n      },\n      \"optionalDependencies\": {\n        \"@types/yauzl\": \"^2.9.1\"\n      }\n    },\n    \"node_modules/fast-fifo\": {\n      \"version\": \"1.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz\",\n      \"integrity\": \"sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/fd-slicer\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz\",\n      \"integrity\": \"sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"pend\": \"~1.2.0\"\n      }\n    },\n    \"node_modules/get-caller-file\": {\n      \"version\": \"2.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz\",\n      \"integrity\": \"sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==\",\n      \"license\": \"ISC\",\n      \"engines\": {\n        \"node\": \"6.* || 8.* || >= 10.*\"\n      }\n    },\n    \"node_modules/get-stream\": {\n      \"version\": \"5.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz\",\n      \"integrity\": \"sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"pump\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/get-uri\": {\n      \"version\": \"6.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz\",\n      \"integrity\": \"sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"basic-ftp\": \"^5.0.2\",\n        \"data-uri-to-buffer\": \"^6.0.2\",\n        \"debug\": \"^4.3.4\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/http-proxy-agent\": {\n      \"version\": \"7.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz\",\n      \"integrity\": \"sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"agent-base\": \"^7.1.0\",\n        \"debug\": \"^4.3.4\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/https-proxy-agent\": {\n      \"version\": \"7.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz\",\n      \"integrity\": \"sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"agent-base\": \"^7.1.2\",\n        \"debug\": \"4\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/import-fresh\": {\n      \"version\": \"3.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz\",\n      \"integrity\": \"sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"parent-module\": \"^1.0.0\",\n        \"resolve-from\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/ip-address\": {\n      \"version\": \"10.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz\",\n      \"integrity\": \"sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 12\"\n      }\n    },\n    \"node_modules/is-arrayish\": {\n      \"version\": \"0.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz\",\n      \"integrity\": \"sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/is-fullwidth-code-point\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz\",\n      \"integrity\": \"sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/js-tokens\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz\",\n      \"integrity\": \"sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/js-yaml\": {\n      \"version\": \"4.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz\",\n      \"integrity\": \"sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/puzrin\"\n        },\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/nodeca\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"argparse\": \"^2.0.1\"\n      },\n      \"bin\": {\n        \"js-yaml\": \"bin/js-yaml.js\"\n      }\n    },\n    \"node_modules/json-parse-even-better-errors\": {\n      \"version\": \"2.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz\",\n      \"integrity\": \"sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/lines-and-columns\": {\n      \"version\": \"1.2.4\",\n      \"resolved\": \"https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz\",\n      \"integrity\": \"sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/lru-cache\": {\n      \"version\": \"7.18.3\",\n      \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz\",\n      \"integrity\": \"sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==\",\n      \"license\": \"ISC\",\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/mitt\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz\",\n      \"integrity\": \"sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/ms\": {\n      \"version\": \"2.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.3.tgz\",\n      \"integrity\": \"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/netmask\": {\n      \"version\": \"2.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/netmask/-/netmask-2.1.1.tgz\",\n      \"integrity\": \"sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4.0\"\n      }\n    },\n    \"node_modules/once\": {\n      \"version\": \"1.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/once/-/once-1.4.0.tgz\",\n      \"integrity\": \"sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"wrappy\": \"1\"\n      }\n    },\n    \"node_modules/pac-proxy-agent\": {\n      \"version\": \"7.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz\",\n      \"integrity\": \"sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@tootallnate/quickjs-emscripten\": \"^0.23.0\",\n        \"agent-base\": \"^7.1.2\",\n        \"debug\": \"^4.3.4\",\n        \"get-uri\": \"^6.0.1\",\n        \"http-proxy-agent\": \"^7.0.0\",\n        \"https-proxy-agent\": \"^7.0.6\",\n        \"pac-resolver\": \"^7.0.1\",\n        \"socks-proxy-agent\": \"^8.0.5\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/pac-resolver\": {\n      \"version\": \"7.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz\",\n      \"integrity\": \"sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"degenerator\": \"^5.0.0\",\n        \"netmask\": \"^2.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/parent-module\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz\",\n      \"integrity\": \"sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"callsites\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/parse-json\": {\n      \"version\": \"5.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz\",\n      \"integrity\": \"sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/code-frame\": \"^7.0.0\",\n        \"error-ex\": \"^1.3.1\",\n        \"json-parse-even-better-errors\": \"^2.3.0\",\n        \"lines-and-columns\": \"^1.1.6\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/pend\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/pend/-/pend-1.2.0.tgz\",\n      \"integrity\": \"sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/picocolors\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz\",\n      \"integrity\": \"sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/progress\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/progress/-/progress-2.0.3.tgz\",\n      \"integrity\": \"sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=0.4.0\"\n      }\n    },\n    \"node_modules/proxy-agent\": {\n      \"version\": \"6.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz\",\n      \"integrity\": \"sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"agent-base\": \"^7.1.2\",\n        \"debug\": \"^4.3.4\",\n        \"http-proxy-agent\": \"^7.0.1\",\n        \"https-proxy-agent\": \"^7.0.6\",\n        \"lru-cache\": \"^7.14.1\",\n        \"pac-proxy-agent\": \"^7.1.0\",\n        \"proxy-from-env\": \"^1.1.0\",\n        \"socks-proxy-agent\": \"^8.0.5\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/proxy-from-env\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz\",\n      \"integrity\": \"sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/pump\": {\n      \"version\": \"3.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/pump/-/pump-3.0.4.tgz\",\n      \"integrity\": \"sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"end-of-stream\": \"^1.1.0\",\n        \"once\": \"^1.3.1\"\n      }\n    },\n    \"node_modules/puppeteer\": {\n      \"version\": \"24.43.1\",\n      \"resolved\": \"https://registry.npmjs.org/puppeteer/-/puppeteer-24.43.1.tgz\",\n      \"integrity\": \"sha512-/FSOViCrqRdb1HDocpsM9Z1giA71gTQPUt3SpHGVRALKAy/rJr1fLFYZW9F23qPxqVxTHQnbh/5B5opJST3kAw==\",\n      \"hasInstallScript\": true,\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@puppeteer/browsers\": \"2.13.2\",\n        \"chromium-bidi\": \"14.0.0\",\n        \"cosmiconfig\": \"^9.0.0\",\n        \"devtools-protocol\": \"0.0.1608973\",\n        \"puppeteer-core\": \"24.43.1\",\n        \"typed-query-selector\": \"^2.12.2\"\n      },\n      \"bin\": {\n        \"puppeteer\": \"lib/cjs/puppeteer/node/cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/puppeteer-core\": {\n      \"version\": \"24.43.1\",\n      \"resolved\": \"https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.43.1.tgz\",\n      \"integrity\": \"sha512-T5ScUMAsmhdNbgDR41AGESYeS6V9MSgetkSnVhhW+gXvzC42VesKCn5ld87gAZDJ6vLHL9GkRvY9WtQWSnwFbw==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@puppeteer/browsers\": \"2.13.2\",\n        \"chromium-bidi\": \"14.0.0\",\n        \"debug\": \"^4.4.3\",\n        \"devtools-protocol\": \"0.0.1608973\",\n        \"typed-query-selector\": \"^2.12.2\",\n        \"webdriver-bidi-protocol\": \"0.4.1\",\n        \"ws\": \"^8.20.0\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/require-directory\": {\n      \"version\": \"2.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz\",\n      \"integrity\": \"sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/resolve-from\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz\",\n      \"integrity\": \"sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/semver\": {\n      \"version\": \"7.8.2\",\n      \"resolved\": \"https://registry.npmjs.org/semver/-/semver-7.8.2.tgz\",\n      \"integrity\": \"sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ==\",\n      \"license\": \"ISC\",\n      \"bin\": {\n        \"semver\": \"bin/semver.js\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/smart-buffer\": {\n      \"version\": \"4.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz\",\n      \"integrity\": \"sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 6.0.0\",\n        \"npm\": \">= 3.0.0\"\n      }\n    },\n    \"node_modules/socks\": {\n      \"version\": \"2.8.9\",\n      \"resolved\": \"https://registry.npmjs.org/socks/-/socks-2.8.9.tgz\",\n      \"integrity\": \"sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ip-address\": \"^10.1.1\",\n        \"smart-buffer\": \"^4.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 10.0.0\",\n        \"npm\": \">= 3.0.0\"\n      }\n    },\n    \"node_modules/socks-proxy-agent\": {\n      \"version\": \"8.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz\",\n      \"integrity\": \"sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"agent-base\": \"^7.1.2\",\n        \"debug\": \"^4.3.4\",\n        \"socks\": \"^2.8.3\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/source-map\": {\n      \"version\": \"0.6.1\",\n      \"resolved\": \"https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz\",\n      \"integrity\": \"sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==\",\n      \"license\": \"BSD-3-Clause\",\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/streamx\": {\n      \"version\": \"2.27.0\",\n      \"resolved\": \"https://registry.npmjs.org/streamx/-/streamx-2.27.0.tgz\",\n      \"integrity\": \"sha512-WZ189TKnHoAokYHvwzaAQMpd55cgUmFIcJFzBSgGcb886jau5DL+XdDhTWV4ps3FLvk+OORp0dLRTPsLZ21CSA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"events-universal\": \"^1.0.0\",\n        \"fast-fifo\": \"^1.3.2\",\n        \"text-decoder\": \"^1.1.0\"\n      }\n    },\n    \"node_modules/string-width\": {\n      \"version\": \"4.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz\",\n      \"integrity\": \"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"emoji-regex\": \"^8.0.0\",\n        \"is-fullwidth-code-point\": \"^3.0.0\",\n        \"strip-ansi\": \"^6.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/strip-ansi\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/tar-fs\": {\n      \"version\": \"3.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.2.tgz\",\n      \"integrity\": \"sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"pump\": \"^3.0.0\",\n        \"tar-stream\": \"^3.1.5\"\n      },\n      \"optionalDependencies\": {\n        \"bare-fs\": \"^4.0.1\",\n        \"bare-path\": \"^3.0.0\"\n      }\n    },\n    \"node_modules/tar-stream\": {\n      \"version\": \"3.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/tar-stream/-/tar-stream-3.2.0.tgz\",\n      \"integrity\": \"sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"b4a\": \"^1.6.4\",\n        \"bare-fs\": \"^4.5.5\",\n        \"fast-fifo\": \"^1.2.0\",\n        \"streamx\": \"^2.15.0\"\n      }\n    },\n    \"node_modules/teex\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/teex/-/teex-1.0.1.tgz\",\n      \"integrity\": \"sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"streamx\": \"^2.12.5\"\n      }\n    },\n    \"node_modules/text-decoder\": {\n      \"version\": \"1.2.7\",\n      \"resolved\": \"https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz\",\n      \"integrity\": \"sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"b4a\": \"^1.6.4\"\n      }\n    },\n    \"node_modules/tslib\": {\n      \"version\": \"2.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz\",\n      \"integrity\": \"sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==\",\n      \"license\": \"0BSD\"\n    },\n    \"node_modules/typed-query-selector\": {\n      \"version\": \"2.12.2\",\n      \"resolved\": \"https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.2.tgz\",\n      \"integrity\": \"sha512-EOPFbyIub4ngnEdqi2yOcNeDLaX/0jcE1JoAXQDDMIthap7FoN795lc/SHfIq2d416VufXpM8z/lD+WRm2gfOQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/undici-types\": {\n      \"version\": \"7.24.6\",\n      \"resolved\": \"https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz\",\n      \"integrity\": \"sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==\",\n      \"license\": \"MIT\",\n      \"optional\": true\n    },\n    \"node_modules/webdriver-bidi-protocol\": {\n      \"version\": \"0.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.4.1.tgz\",\n      \"integrity\": \"sha512-ARrjNjtWRRs2w4Tk7nqrf2gBI0QXWuOmMCx2hU+1jUt6d00MjMxURrhxhGbrsoiZKJrhTSTzbIrc554iKI10qw==\",\n      \"license\": \"Apache-2.0\"\n    },\n    \"node_modules/wrap-ansi\": {\n      \"version\": \"7.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz\",\n      \"integrity\": \"sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ansi-styles\": \"^4.0.0\",\n        \"string-width\": \"^4.1.0\",\n        \"strip-ansi\": \"^6.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/wrappy\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz\",\n      \"integrity\": \"sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/ws\": {\n      \"version\": \"8.21.0\",\n      \"resolved\": \"https://registry.npmjs.org/ws/-/ws-8.21.0.tgz\",\n      \"integrity\": \"sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=10.0.0\"\n      },\n      \"peerDependencies\": {\n        \"bufferutil\": \"^4.0.1\",\n        \"utf-8-validate\": \">=5.0.2\"\n      },\n      \"peerDependenciesMeta\": {\n        \"bufferutil\": {\n          \"optional\": true\n        },\n        \"utf-8-validate\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/y18n\": {\n      \"version\": \"5.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz\",\n      \"integrity\": \"sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==\",\n      \"license\": \"ISC\",\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/yargs\": {\n      \"version\": \"17.7.2\",\n      \"resolved\": \"https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz\",\n      \"integrity\": \"sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"cliui\": \"^8.0.1\",\n        \"escalade\": \"^3.1.1\",\n        \"get-caller-file\": \"^2.0.5\",\n        \"require-directory\": \"^2.1.1\",\n        \"string-width\": \"^4.2.3\",\n        \"y18n\": \"^5.0.5\",\n        \"yargs-parser\": \"^21.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/yargs-parser\": {\n      \"version\": \"21.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz\",\n      \"integrity\": \"sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==\",\n      \"license\": \"ISC\",\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/yauzl\": {\n      \"version\": \"2.10.0\",\n      \"resolved\": \"https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz\",\n      \"integrity\": \"sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"buffer-crc32\": \"~0.2.3\",\n        \"fd-slicer\": \"~1.1.0\"\n      }\n    },\n    \"node_modules/zod\": {\n      \"version\": \"3.25.76\",\n      \"resolved\": \"https://registry.npmjs.org/zod/-/zod-3.25.76.tgz\",\n      \"integrity\": \"sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==\",\n      \"license\": \"MIT\",\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/colinhacks\"\n      }\n    }\n  }\n}\n\nFile v0.14.0:scripts/package.json\n\n{\n  \"name\": \"x-post-strategist-render-image\",\n  \"version\": \"1.0.0\",\n  \"private\": true,\n  \"description\": \"Render HTML/CSS cards to PNG with headless Chrome for X posts.\",\n  \"bin\": {\n    \"render-image\": \"render-image.js\"\n  },\n  \"engines\": {\n    \"node\": \">=18\"\n  },\n  \"dependencies\": {\n    \"puppeteer\": \"^24.15.0\"\n  }\n}\n\nFile v0.14.0:CHANGELOG.md\n\n# Changelog\n\n## [0.12.0] - 2026-06-23\n\n### Changed\n- Decide drafting mode by **output length**, not account type. Long-form output (any thread, or a Premium single post) now produces one draft whose depth matches the source material, then iterates collaboratively — offer other angles for the user to opt into and/or propose specific improvements, revising until satisfied — instead of dumping multiple parallel drafts. Parallel multi-variant drafting (the 3-combinations / 2–3 drafts behavior) is now reserved for short Non-Premium single posts (≤ 280 chars).\n- Clarify Step 4 Premium guidance: \"tight\" means no filler, not necessarily short; match length to the material and default to a fuller treatment for long/rich/structured sources. Scope the \"3 best style combinations\" rule (Step 1 and Key Rules) to short Non-Premium single posts. Prevents reflexively under-using the Premium character budget on rich source material.\n\n## [0.11.0] - 2026-06-23\n\n### Added\n- `chinese-ai-tech-posts.md`: a language-specific reference for writing Chinese AI / Agent / LLM / tech-frontier X posts — hook types, structures, high-reuse sentence patterns, 10 reusable templates, media/hashtag discipline, posting-timing heuristics, a pre-publish checklist, A/B test variables, and a trimmed study-sources list. English instructions with Chinese example strings, matching the skill's existing EN/ZH precedent.\n- Conditional pointer to the new reference from `SKILL.md` Step 5 and Key Rules; it applies only to Chinese AI/tech posts and supplements the Writing Principles.\n\n## [0.10.0] - 2026-06-11\n\n### Changed\n- Authoring-standards compliance: added a \"Not for…\" scope boundary to the description (R2), and reworded the vault-write step to reference a notes-vault skill by capability (\"a skill that writes to your notes vault, such as an `obsidian` skill\") rather than by hardcoded name (R3), matching `saas-founder-content-writer` (R5). Bilingual EN/ZH voice examples retained intentionally.\n\n## [0.7.3] - 2026-06-08\n\n### Changed\n- Rewrite Step 10 saving: drafts now go to a dedicated `X Posts/` subfolder with one file per day (`YYYY-MM-DD.md`) instead of the user's daily note.\n- Add an explicit first-save location flow: use `OBSIDIAN_VAULT_PATH` if set, else a three-option prompt (folder path / `~/obsidianVault/X Posts/` default / skip). Resolve to an absolute path before writing.\n- Define the write mechanism: delegate to an available `obsidian` skill when present, otherwise write the markdown file directly; on any write failure, paste the block in chat so content is never lost.\n- Add a macOS-only hint shown only when a write fails under `~/Documents/` (iCloud sync / TCC permissions).\n- Update the Output Format save prompt and Key Rules to match.\n\n## [0.7.2] - 2026-06-07\n\n### Changed\n- `render-image-setup.md` / `CHANGELOG.md`: remove the literal Chromium sandbox-disabling flag tokens from prose. Docs now use a `<chromium-flags>` placeholder and link to Puppeteer's troubleshooting guide, so static security scanners no longer flag the documentation as a privilege-escalation pattern. No behavior change.\n\n## [0.7.1] - 2026-06-07\n\n### Changed\n- `scripts/render-image.js`: stop hardcoding the Chromium sandbox-disabling launch flags; launch Chromium with the OS sandbox enabled by default and read optional extra flags from the `RENDER_CHROME_ARGS` environment variable. Linux/container users that need a disabled sandbox now opt in explicitly. Behavior is unchanged on macOS and standard desktops.\n- `render-image-setup.md`: document the `RENDER_CHROME_ARGS` env var for sandbox-restricted environments.\n- `README.md` / `SKILL.md`: clarify that Phase 1 research runs only when web/search tools are available and uses only the user-provided topic text, with no credentials or personal data transmitted.\n\n## [0.7.0] - 2026-06-05\n\n### Added\n- HTML/CSS + headless Chrome image rendering for text/data graphics: `scripts/render-image.js` (Puppeteer, with system-Chrome and manual fallback), `scripts/package.json`, `render-image-setup.md`, and example templates `assets/quote-card.html`, `assets/data-card.html`.\n- New \"Rendering Text/Data Graphics\" subsection and a decision rule for when to render via HTML/CSS vs. an image model vs. a real screenshot.\n\n### Changed\n- Extended Step 8 image brief with a `Render method:` line and guidance to render text/data graphics directly to PNG.\n\n## [0.5.7] - 2026-05-29\n- Remove hardcoded `obsidian-vault-writer` skill reference in Step 10; now uses generic language to support any installed Obsidian skill.\n\n## [0.5.6] - 2026-05-28\nRewrote frontmatter description to concise 200–500 character format for improved agent-trigger clarity.\n\n## [0.5.5] - 2026-05-28\n\n- Replace Google Sheets output (Step 10) with Obsidian vault writing via `obsidian-vault-writer` skill\n- Remove `google-sheet-sync.md` and `scripts/` directory\n\n## [0.5.4] - 2026-05-21\n\n### Added\n- Feedback prompt in README.md and conditional feedback section in SKILL.md\n\n## [0.5.3] - 2026-05-20\n- Fix `getCredentials()` in `save_to_sheet.js`: load `client_id`/`client_secret` from `credentials.json` before token cache check so token refresh works correctly\n- Add `normalizeToken()` to handle Python-client token format (`token` → `access_token`, `expiry` → `expiry_date`) so tokens created by other Google OAuth clients are reused without re-auth\n\n## [0.5.2] - 2026-05-20\n- Migrate `scripts/save_to_sheet.py` → `scripts/save_to_sheet.js` (Node.js); identical CLI interface and output; depends only on `googleapis` via `npm install` in the `scripts/` directory; removes Python runtime requirement\n- Add `scripts/package.json`; delete `scripts/save_to_sheet.py`\n- Update `google-sheet-sync.md` and `SKILL.md` to reference `node` / `npm install` instead of `python` / `pip`\n\n## [0.5.1] - 2026-05-20\n- Rewrite `google-sheet-sync.md` with wizard structure: First-time setup (Python dependency install as step 1, OAuth2 promoted to Option A for personal use), Daily use, and Reference sections; add verify command\n- Fix `SKILL.md` Step 10 to clarify script path resolution and surface dependency install check before first save\n\n## [0.5.0] - 2026-05-20\n- Add Step 10: optional Google Sheets storage with session mode and per-tweet mode\n- Add `google-sheet-sync.md`: sheet column structure, deeplink format, auth setup (service account + OAuth2), usage examples\n- Add `scripts/save_to_sheet.py`: appends variants as side-by-side columns with `=HYPERLINK()` deeplinks for one-click X publishing; CSV fallback on failure\n\n## [0.4.2] - 2026-05-18\nAdded Writing Principles section with 7 concrete principles (natural voice, subjective perspective, scene grounding, cut ornate language, no forced profundity, specific beats vague, leave room). Each principle includes before/after examples in English and Chinese. Added Writing Principles row to Step 9 review rubric.\n\n## [0.4.1] - 2026-05-14\nAdded two-phase workflow: research phase with context enrichment and fact verification, plus voice calibration to preserve the author's writing style.\n\n## [0.3.1] - 2026-05-01\nImproved required inputs and smarter defaults for format selection and thread structure.\n\nFile v0.14.0:chinese-ai-tech-posts.md\n\n# Writing Chinese AI / Tech X Posts\n\n\n## What Works In Chinese AI X Posts\n\nTop-performing Chinese AI authors are mostly engineers, product builders, tool makers, and research-note writers — not news reporters. That shapes their posts: **conclusion-first, engineering-practical, evidence-backed (usually a screenshot), and list-structured.** Readers stop not for \"今天聊聊……\" (\"today let's talk about…\") but for a result you already got, or a sharp problem you just named for them.\n\nEvery strong post runs the same four-step motion. Practice making each step shorter and sharper:\n\n1. **Hook (钩子)** — lead with a result, a problem, or a contrast judgement. No warm-up.\n2. **Evidence (证据)** — immediately back it: a screenshot, finished product, data, comparison, command, prompt, or \"I actually ran this\".\n3. **Why it matters (为什么重要)** — one layer of meaning for the reader.\n4. **Action (动作)** — give a concrete next step: steps, a prompt, a link, \"评论区见\" (\"see the comments\"), \"后续继续更新\" (\"I'll keep updating\"), or \"你怎么看\" (\"what do you think\").\n\nYou are not \"expressing an opinion\" — you are helping the reader move fast through **stop → believe → repost/save**.\n\n## Hook Types\n\nThe strongest openers are not topic announcements. Use one of these:\n\n| Hook type | When | One-line example (ZH) |\n| --- | --- | --- |\n| Year/stage comparison (年份对比) | Trend calls, industry rhythm | 2024 大家在比谁更聪明；2025 大家开始比谁更能把活干完。 |\n| Result payoff (结果爆点) | You actually got something working | 我真把 Claude Code + MCP 跑通了。 |\n| Problem decomposition (痛点拆解) | A shared confusion you can dissect | 为什么普通用户感觉不到 MCP 的价值？ |\n| Tutorial promise (教程承诺) | Prompts, workflows, checklists | 来了。我把「论文 → 图文」整理成一套可复用工作流。 |\n\nYear/stage comparison and result-payoff travel furthest because they are inherently quotable and easy to repost.\n\n## Structures\n\nPick the skeleton that fits the content type, and name it to yourself before drafting:\n\n- **结论 → 解释 → 推论** (conclusion → explanation → larger inference). Best for trend judgement, product observation, model-release interpretation. Reader feels \"you already thought it through for me.\"\n- **痛点 → 方案 → 步骤** (pain point → solution → steps). Best for hands-on content: Claude Code, MCP, prompts, AI tool flows, visual generation. Reader feels \"you can get me started right now.\" Switch to numbered/bulleted lists here.\n- **案例/新闻 → 解读 → 立场** (case or news → interpretation → stance). Best for reacting to a paper, official blog, or someone's quote — translate it into 人话 (\"plain words\"), then take a position.\n\nTutorials lean on lists; trend posts lean on contrast sentences.\n\n## High-Reuse Sentence Patterns\n\nThese are the most transferable moves. Learn the pattern, not the words:\n\n- **Contrast sentence (对比句)** — carries a built-in conclusion and is easy to quote:\n  - 不是……而是……（not X, but Y）\n  - 2024 是……，2025 是……（in 2024 it was…, in 2025 it is…）\n  - 问题不在 X，而在 Y（the problem isn't X, it's Y）\n- **Teacher-style transparent reasoning (老师式推理)** — make the thinking visible so the reader keeps up: 因为 / 所以 / 这时候 / 于是 (because / so / at this point / therefore).\n- **List compression (列点压缩)** — the moment you hit steps, methods, tools, pitfalls, or principles, switch to numbers or bullets.\n- **Analogy (类比)** — turn an abstract concept into a scene the reader grasps instantly: MCP as \"USB-C\", a shared agent context as \"interns sharing one computer\", a system-vs-model split as \"kitchen and chef\", a debugging flow as \"solving a case\".\n\n## Media And Hashtags\n\nChinese AI posts that perform do **not** rely on stacked hashtags. They rely on images that prove you actually did the work.\n\n- **Prefer evidence images:** before/after comparison, flowchart, terminal screenshot, generated result, IDE view, finished web page. The image should prove value, not decorate.\n- **Hashtags:** default to **0**. Add at most **1–2** relevant tags, and only when you genuinely want search or campaign reach. More than two usually lowers engagement.\n- The strongest combination is: **strong opening line + one image that proves you did it + 0–1 necessary tag** — not \"three hashtags + a row of emoji\".\n\n## Posting Timing (Heuristic — A/B Test It)\n\nTreat these as a starting hypothesis for a Chinese developer / PM / overseas-Chinese tech audience, not a guarantee. Best window is generally **Tuesday–Thursday**, with a morning and an evening peak. Default mapping:\n\n| Content type | Suggested window |\n| --- | --- |\n| News / launch / hot take | Noon (12:00–18:00) |\n| Tutorial / method / prompt / long post | Evening (20:30–21:30) |\n| Trend / judgement | Morning (09:00–11:00) |\n\nTest priority for this audience: **morning → noon → evening**, before bothering with weekends. Use native scheduling to run A/B tests instead of guessing.\n\n## 10 Reusable Templates\n\nEach template forces a promise in the first three lines — a result promise, an explanation promise, or an executable promise. Fill the brackets and adapt the example.\n\n| Template | When | Fill-in template (ZH) | Minimal example (ZH) |\n| --- | --- | --- | --- |\n| 结果爆点帖 (Result payoff) | You got a flow working | **我真把【任务】跑通了。** 以前卡在【痛点】；现在用【工具/方法】后，能【结果】。下面是我实际怎么做的：①【步骤一】②【步骤二】③【步骤三】 | 我真把 Claude Code + MCP 跑通了。以前最难的是工具配置；现在把常用工具抽成统一目录后，提示词短了，成功率反而更高。 |\n| 痛点拆解帖 (Problem decomposition) | A shared confusion | **为什么【现象】？** 不是【常见误判】，而是【真正原因】。你得先解决【根因一】，再解决【根因二】。 | 为什么普通用户感觉不到 MCP 的价值？不是协议不重要，而是安装和工具接入门槛太高。 |\n| 年份对比帖 (Year comparison) | Trend judgement | **2024 是【阶段A】；2025/2026 是【阶段B】。** 变化不是【表层】，而是【底层迁移】。 | 2024 大家在比谁更聪明；2025 大家开始比谁更能把活干完。 |\n| 教程承诺帖 (Tutorial promise) | Tutorials, prompts, workflows | **来了。** 我把【主题】整理成了一套最容易复用的【模板/步骤】。你只要做这几步：①【步骤】②【步骤】③【步骤】。 | 来了。我把「论文 → 图文」整理成可复用工作流：先抽大纲，再定版式，再生成每页文案。 |\n| 权威转译帖 (Authority translation) | Papers, official blogs, quotes | 【作者/机构】刚讲了一件很重要的事：**【原结论翻成中文】**。我把它翻译成一句人话：**【你的总结】**。为什么重要？因为【现实意义】。 | 某机构刚讲了一件很重要的事：Agent 能力不只在模型里。我翻成人话就是：好 Agent 靠系统，不只靠模型。 |\n| 失败修复帖 (Failure & fix) | You hit a pitfall and fixed it | **坏消息：我踩坑了。好消息：我找到修法了。** 问题出在【原因】；修法是【修法】；副作用是【限制】。 | 坏消息：图像比例一直乱。好消息：我终于找到重新定义比例的办法了。 |\n| 视觉 demo 帖 (Visual demo) | Image, video, UI, agent output | **配个图。** 我让【模型/工具】做了一个【成品】，最有意思的是【细节】。提示词/思路在下面。 | 配个图。我让模型把论文摘要变成了一页读得懂的可视化网页，真正有用的是层级关系被排清楚了。 |\n| 工程方法帖 (Engineering method) | Developer-facing agent/system posts | 如果你在做【系统】，最该先想的不是【常见焦点】，而是【系统约束】。我的顺序是：①【约束】②【反馈】③【记忆/上下文】④【验证】。 | 如果你在做 Agent，最该想的不是多智能体，而是上下文、验证和可恢复性。 |\n| 资源合集帖 (Resource roundup) | Weekly digest, curation | 我把这周值得看的【主题】整理成一组：**【资源一】/【资源二】/【资源三】**。如果你只看一件，我建议先看【首推】。 | 我把这周最值得看的 Agent 资料整理成一组：MCP、Context Engineering、Memory、Harness。只看一篇就先看 Context Engineering。 |\n| 数据判断帖 (Data judgement) | Reports, indices, industry trends | 别只看情绪，先看数据。**【报告/指数】**里最值得记住的不是【表层数据】，而是【趋势结论】。这意味着【对普通人的影响】。 | 别只看「AI 焦虑」，先看 AI 指数。关键不是企业说自己在用 AI，而是采用率和生产率证据同时上来了。 |\n\n**Universal one-line skeleton** (especially repostable in the Chinese tech circle):\n\n> 【结论或问题】→【一层证据】→【两到五个要点】→【我后续会更新 / 提示词在下面 / 你怎么看】\n> (conclusion or problem → one layer of evidence → 2–5 key points → I'll update later / prompt below / what do you think)\n\n## Pre-Publish Checklist\n\nRun this in the last five minutes before posting:\n\n| Check | Ask yourself | Action |\n| --- | --- | --- |\n| Hook | Does line 1 already give a result, problem, or judgement? | Cut the warm-up; turn \"我最近在想\" into \"我发现 / 我跑通 / 为什么会这样\". |\n| Credibility | Did I give evidence, not just an attitude? | Add at least one: screenshot, result image, data, comparison, steps, command, source link. |\n| Density | Is complex content broken into short pieces? | More than three layers of logic → switch to a list; split long sentences. |\n| Sentence | Is there one quotable judgement sentence? | Deliberately write one \"不是……而是……\" or \"2024……2025……\". |\n| Media | Does the image prove value, not decorate? | Prefer before/after, flowchart, finished product, terminal screenshot. |\n| Tags | Am I stuffing hashtags to \"look social\"? | Default 0; add 1 only for real search/campaign reach. |\n| CTA | What should the reader do next? | Pick one: save / repost / prompt in comments / follow-up / 你怎么看. |\n| Tracking | What metric do I watch after posting? | Opinion posts → replies; tutorials → saves/reposts; then likes. |\n| Timing | Is this more of a morning, noon, or evening post? | News → noon; tutorial → evening; trend → morning. |\n| Threading | Can this lead into a next post? | Leave the full prompt/flow/sequel for the next post or the first reply. |\n\n## A/B Test Variables\n\nOptimize specific variables, not a vague \"posting feel\":\n\n| Variable | Version A | Version B | Best for |\n| --- | --- | --- | --- |\n| Hook | Result-first: 我真把 X 跑通了 | Problem-first: 为什么 X 总是失败 | Engineering / tutorial posts |\n| First evidence | Finished-product image first | Flowchart first | Prompt / UI / video / web posts |\n| Tone | Calm and professional | Slightly excited, spoken | Same topic, twice |\n| CTA | 你怎么看 | 提示词/完整流程在下面 | Opinion vs tutorial |\n| Tags | No tag | 1 topic tag | Campaign vs normal |\n| Length | 180–280 char short post | Thread / long post | Trend posts, paper breakdowns |\n| Link position | Link in body | Link in first reply | Distribution-sensitive tutorials |\n| Timing | Tue 09:00 | Tue 20:30 | Same topic, two versions |\n| Evidence type | Data / report | First-hand experiment / script | Industry judgement vs hands-on |\n| Language mix | All Chinese | Chinese-dominant + key English terms | Developer-facing posts |\n\n## Study Sources (Examples, Optional)\n\nThese are useful inputs to learn from — examples, not requirements. Adapt to whatever you can access.\n\n**Accounts to study** (each for a different strength):\n\n- `@op7418` — prompt productization, visual demos, MCP and tool adoption.\n- `@dotey` — engineering method, Claude Code, context engineering, deep industry reads.\n- `@vista8` — product trends, agent-direction calls, PM perspective.\n- `@lijigang` — paper translation, abstract frameworks, \"plain-words\" explanations.\n- `@kaifulee` — founder / company-level perspective.\n\n**First-party sources** (fact layer): Anthropic's MCP and Claude Code docs and update pages, the MCP docs/GitHub org, OpenAI's site, GitHub Trending and relevant Claude Code / MCP repos. Pull the \"fact layer\" here, then write the \"explanation layer\" as a shorter, sharper Chinese post.\n\n**Light tool stack** (such as): a read-later/highlight tool for saving threads and articles; a design tool for flowcharts and before/after images; a drafting/scheduling tool for long posts and A/B timing.\n\n**One line to remember:** Chinese AI X writing is not a contest of prose — it is a contest of **cognitive compression + proof + distribution rhythm**. Hand the fact layer to first-party sources, write the explanation layer as a short Chinese post, turn the evidence layer into an image, and run the distribution layer as scheduling + A/B tests.\n\nFile v0.14.0:render-image-setup.md\n\n# Render Image Setup\n\n`scripts/render-image.js` turns an HTML/CSS file into a PNG using headless Chrome. Use it to produce **text- and data-driven graphics** (quote cards, data/metric cards, framework or comparison diagrams) deterministically and in batch. It is not for photographic images or real product screenshots — see the rendering decision rule in `SKILL.md`.\n\nNo credentials, tokens, or network access are required.\n\n## First-time setup\n\n1. Install the dependency (downloads a bundled Chromium):\n\n   ```sh\n   cd scripts\n   npm install\n   ```\n\n2. Verify rendering works by rendering a bundled example template:\n\n   ```sh\n   node render-image.js ../assets/quote-card.html /tmp/quote-card.png --width=1080 --height=1080\n   ```\n\n   Success prints a line beginning with `OK` and the output path. Open the PNG to confirm.\n\n## Daily use\n\n```sh\nnode scripts/render-image.js <input.html> <output.png> [--width=1080] [--height=1440] [--scale=2] [--full]\n```\n\n| Option | Default | Notes |\n| --- | --- | --- |\n| `--width` | `1080` | Viewport width in CSS pixels. |\n| `--height` | `1440` | Viewport height in CSS pixels. |\n| `--scale` | `2` | `deviceScaleFactor`; 2 → crisp 2× PNG. |\n| `--full` | off | Capture full scrollable height instead of the fixed viewport. |\n\n**Recommended sizes**\n\n| Use | Width × Height |\n| --- | --- |\n| Square card (quote / data, X-friendly) | `1080 × 1080` |\n| Landscape (X inline, 16:9) | `1600 × 900` |\n| Portrait card (4:5) | `1080 × 1350` |\n\nOutput PNG goes to whatever path you pass; default to the current working directory. Do not write credentials or tokens anywhere.\n\n## Workflow\n\n1. Author an HTML file (inline CSS, no external network assets — embed fonts/colors directly). Start from `assets/quote-card.html` or `assets/data-card.html`.\n2. Run the script with the size for the target slot.\n3. Attach the PNG to the post.\n\n## Fallback\n\nIf the bundled Chromium cannot launch, the script tries a system Chrome (set `PUPPETEER_EXECUTABLE_PATH` to force one). If no browser is available, it **keeps the HTML file**, prints manual-render instructions, and exits non-zero. You can then render the HTML by hand in Chrome (DevTools → \"Capture node screenshot\") or with `chrome --headless --screenshot`.\n\n## Sandbox flags (Linux / containers)\n\nThe script launches Chromium with the OS sandbox **enabled** by default, which works on macOS and most Linux desktops. Some environments — root-user Docker containers or CI runners — require extra Chromium launch flags or the browser will not start. In those cases pass the flags explicitly via the `RENDER_CHROME_ARGS` environment variable:\n\n```sh\nRENDER_CHROME_ARGS='<chromium-flags>' node render-image.js card.html card.png\n```\n\nUse the flag values from Puppeteer's troubleshooting guide for containers and root users: <https://pptr.dev/troubleshooting>. Only set this when a launch fails for sandbox reasons; leaving it unset keeps the OS sandbox on.\n\nFile v0.14.0:skill-card.md\n\n## Description:\n\nTurns ideas, notes, articles, reports, and technical material into X posts or threads with tone matching, account-aware length handling, fact checks, and optional image recommendations.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[archlab-space](https://clawhub.ai/user/archlab-space)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nWriters, founders, developers, researchers, and operators use this skill to turn rough ideas or source material into publishable X posts and threads that fit the chosen account type, format, audience, tone, and factual-risk constraints.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The optional renderer opens local HTML in Chrome without blocking scripts or network access.\n\nMitigation: Render only trusted, self-contained HTML; avoid untrusted copied markup; and consider blocking network or JavaScript and updating dependencies before rendering cards.\n\nRisk: Optional draft saving can write generated content to a local notes vault path.\n\nMitigation: Enable saving only with explicit user consent and review the resolved OBSIDIAN_VAULT_PATH or chosen folder before the first write.\n\nRisk: Drafts may cover real-time, financial, legal, medical, political, scientific, or otherwise high-stakes claims.\n\nMitigation: Verify claims with available tools, mark uncertainty clearly, and avoid presenting unverified claims as fact.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/archlab-space/skills/x-post-strategist)\n- [README](artifact/README.md)\n- [Chinese AI / Tech X post reference](artifact/chinese-ai-tech-posts.md)\n- [Render image setup](artifact/render-image-setup.md)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown/text drafts with optional image briefs, HTML/CSS snippets, and shell commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May include character-count checks, self-review scores, optional local markdown saves, and optional PNG rendering guidance for text/data graphics.]\n\n## Skill Version(s):\n\n0.14.0 (source: server release metadata)\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\nArchive v0.13.0: 12 files, 41330 bytes\n\nFiles: assets/data-card.html (2450b), assets/quote-card.html (1799b), CHANGELOG.md (6248b), chinese-ai-tech-posts.md (13278b), README.md (2037b), render-image-setup.md (2944b), scripts/package-lock.json (41495b), scripts/package.json (317b), scripts/render-image.js (5433b), skill-card.md (2851b), SKILL.md (22359b), _meta.json (137b)\n\nFile v0.13.0:SKILL.md\n\n---\nname: x-post-strategist\ndescription: >\n  Use this skill when the user wants to turn ideas, notes, articles, reports, or\n  technical material into compelling X posts or threads. Covers single posts and\n  multi-tweet threads, tone matching, and character-limit handling for Standard\n  and Premium accounts. Not for other platforms (LinkedIn, Reddit, Xiaohongshu),\n  long-form articles, or auto-posting on the user's behalf.\n---\n\n# X Post Strategist\n\nYou are an X content strategist and editor. Your job is to turn raw input into posts or threads that are clear, accurate, engaging, and natural. Optimize for the user's goal, not for generic virality.\n\n**Default language:** Match the language of the source material unless the user specifies otherwise.\n\n## Flow\n\nFollow these steps in order. Ask one question at a time when required information is missing.\n\n---\n\n## Phase 1: Research\n\n### Step 1: Understand The Assignment\n\nIdentify the source material and the publishing goal.\n\nIf the user provides only a vague request, ask for the source material or the intended angle. If the source material is long, summarize the core idea before drafting.\n\n**Required before drafting** — ask the user if not provided. Ask one question at a time and wait for the answer before continuing:\n\n| Input | Options | Why It Matters |\n| --- | --- | --- |\n| Account type | Non-Premium / Premium | Controls the per-post character limit (280 vs 25,000 chars). |\n| Format | Single post / Thread | Determines structure and whether the character limit applies per post or to the whole piece. |\n\nDo not proceed to Step 2 until both are confirmed.\n\n**Optional — infer from source material if not provided:**\n\n| Input | Examples | Why It Matters |\n| --- | --- | --- |\n| Goal | Educate, persuade, react to news, build authority, launch something, drive clicks, start discussion | Shapes hook strategy. |\n| Audience | Developers, investors, founders, operators, researchers, students, general public | Shapes vocabulary and depth. |\n| Desired tone | Analytical, sharp, calm, technical, playful, contrarian, personal, executive, storytelling | Shapes voice. |\n| Style samples | 1–5 past X posts by the user | Lets you extract real voice patterns rather than guessing tone. Used in Step 6. |\n\nIf goal, audience, and tone are all unspecified, read the source material and independently select the **3 best style combinations** (each with a goal, audience, and tone). Draft a post for each combination, score all three using the Step 9 rubric, and present them together for the user to choose from.\n\n### Step 2: Enrich Context\n\nRun these research sub-tasks when web/search tools are available, using only the topic text the user provides — no credentials or personal data are transmitted. Execute all three sub-tasks in order.\n\n**1. Background Search**\nSearch for foundational context on the topic. Summarise to ≤ 3 core facts the user may not have included. If the source material is a well-cited report with clear references, reduce this to a quick gap-fill — but never skip it entirely.\n\n**2. Trending Angle Scan**\nSearch current X / web discourse to find the live conversation: hot takes, common positions, recent developments. Goal: make the post enter an active conversation, not rehash a stale one.\n\n**3. Fact Signal**\nRetrieve source evidence for the core claims in the user's input. Do not render a verdict here — only collect signals for Step 3 to evaluate.\n\nPresent results in this format (internal use; show to user only if asked):\n\n```\n[Context enrichment]\nBackground: ...\nTrending angles: ...\nFact signals: ...\n```\n\n### Step 3: Check Facts And Risk\n\nUse the fact signals from Step 2 to assess whether the input depends on current facts, external claims, or sensitive topics.\n\n- For real-time, market, news, product, legal, medical, political, or scientific claims, verify facts when tools are available. If verification is not available, say what is unverified and avoid presenting uncertain claims as fact.\n- For financial content, avoid guarantees, price predictions stated as certainty, or implied investment advice.\n- For medical, legal, safety, or high-stakes content, keep claims careful and avoid instructions that exceed the user's evidence.\n- Do not invent sources, numbers, quotes, screenshots, charts, or firsthand experience.\n\n---\n\n## Writing Principles\n\n> Read these before drafting. They apply to every post regardless of language, format, or goal.\n\n### 1. Natural Voice\n**Rule:** Write the way a real person talks, not the way an essay is written.\n**Why:** Polished prose creates distance; conversational language creates connection.\n\n**Before (EN):** \"The proliferation of AI tools has fundamentally transformed the landscape of knowledge work.\"\n**After (EN):** \"AI tools changed how I work. I didn't expect it to happen this fast.\"\n\n**Before (ZH):** \"人工智能工具的广泛普及从根本上重塑了知识工作的格局。\"\n**After (ZH):** \"AI 工具真的改变了我的工作方式，快得让自己都没反应过来。\"\n\n### 2. Subjective Perspective\n**Rule:** Include how you feel or what you think — not just what happened.\n**Why:** Facts are searchable; your reaction to them is not.\n\n**Before (EN):** \"OpenAI released a new model today with improved reasoning capabilities.\"\n**After (EN):** \"OpenAI dropped a new model today. Honestly, I didn't expect it to be this good at reasoning.\"\n\n**Before (ZH):** \"OpenAI 今天发布了新模型，推理能力有所提升。\"\n**After (ZH):** \"OpenAI 今天发了新模型。说实话，推理能力比我预期的强很多。\"\n\n### 3. Scene First\n**Rule:** Anchor the post in a specific moment or situation before making the point.\n**Why:** Scenes create immediate context that makes abstract points feel real and lived-in.\n\n**Before (EN):** \"Hiring is harder than people realize.\"\n**After (EN):** \"I read 60 resumes in one afternoon last week. By resume 40, I could barely remember what I was looking for.\"\n\n**Before (ZH):** \"招人比大家想象的难多了。\"\n**After (ZH):** \"上周一个下午我看了 60 份简历。看到第 40 份的时候，我已经忘了自己在找什么了。\"\n\n### 4. Cut Ornate Language\n**Rule:** Use the simplest word that carries the meaning. Ornate phrasing signals effort, not quality.\n**Why:** Complex language makes readers work harder to extract less value.\n\n**Before (EN):** \"This paradigm-shifting innovation will catalyze unprecedented transformations across diverse verticals.\"\n**After (EN):** \"This changes how every industry operates. That's not hype — here's why.\"\n\n**Before (ZH):** \"这一突破性创新将在各领域催生前所未有的深刻变革。\"\n**After (ZH):** \"这东西会改变很多行业的运作方式，不是在夸张，原因在这里。\"\n\n### 5. No Forced Profundity\n**Rule:** End when the point is made. Do not manufacture a philosophical lesson if the post didn't earn one.\n**Why:** Forced takeaways feel preachy and undermine the authenticity of everything before them.\n\n**Before (EN):** \"...and that's why in the end, consistency is the real competitive advantage.\"\n**After (EN):** \"...anyway, that's what I've been thinking about. Curious if anyone else has run into this.\"\n\n**Before (ZH):** \"...所以归根结底，坚持才是真正的竞争优势。\"\n**After (ZH):** \"...就这些，我最近一直在想这个。不知道有没有人也有类似的感受。\"\n\n### 6. Specific Beats Vague\n**Rule:** Replace vague descriptions with numbers, names, or precise observations.\n**Why:** Specificity signals credibility and makes abstract claims feel lived-in.\n\n**Before (EN):** \"I've been reviewing a lot of applications lately.\"\n**After (EN):** \"I've reviewed 200+ applications in the last 3 weeks.\"\n\n**Before (ZH):** \"我最近看了很多简历。\"\n**After (ZH):** \"过去三周我看了超过 200 份简历。\"\n\n### 7. Leave Room\n**Rule:** State your point, then stop. Don't explain what the reader should conclude.\n**Why:** Over-explanation signals distrust of the reader and kills the post's punch.\n\n**Before (EN):** \"This means that if you're a developer, you should start learning AI tools now, because the job market is changing and those who adapt will succeed.\"\n**After (EN):** \"The developers I know who started using AI tools two years ago are now being paid very differently.\"\n\n**Before (ZH):** \"这意味着如果你是开发者，应该立刻开始学习 AI 工具，因为市场在变化，能适应的人才能成功。\"\n**After (ZH):** \"两年前就开始用 AI 工具的开发者，现在的薪资待遇和其他人差了很多。\"\n\n---\n\n## Phase 2: Creation\n\n### Step 4: Choose The Format\n\nChoose the smallest format that can carry the idea well.\n\n- Use a single post when the idea has one clear point, one timely observation, or one concise takeaway.\n- Use a thread when the source material has multiple claims, a process, a technical explanation, a story arc, or several useful examples.\n- For non-Premium accounts, each post must be ≤ **280 characters** (spaces and punctuation included). If the user confirmed \"single post\", compress the content to fit — cut, distil, and sharpen until it fits. Do not ask the user to switch to a thread.\n- For Premium accounts, posts may be up to **25,000 characters** — keep them tight. Do not use length as a substitute for editing.\n\n**Thread narrative templates** — select one based on content type and name it in the output:\n\n**① Argument** (opinions, analysis, predictions)\n```\n1/ Hook — sharpest core claim\n2-3/ Evidence — specific facts or cases\n4/ Counterpoint or qualification — adds credibility\n5/ Insight — useful conclusion for the reader\n6/ CTA — question, discussion invite, or action\n```\n\n**② Story** (experiences, case studies, before/after)\n```\n1/ Hook — most dramatic moment or outcome\n2-3/ Background + conflict\n4/ Turning point\n5/ Result + lesson\n6/ CTA\n```\n\n**③ Tutorial** (technical, process, checklist)\n```\n1/ Hook — what problem this solves\n2-N/ Steps (one point each, parallel structure)\nN+1/ Summary + common mistakes\nN+2/ CTA\n```\n\n### Step 5: Draft With A Strong Hook\n\nWrite for X: clear opening, fast payoff, concrete details, and a reason to keep reading.\n\nUseful hook patterns:\n\n- **Specific claim:** State the sharpest useful takeaway.\n- **Contrarian angle:** Challenge a common assumption only if the evidence supports it.\n- **Before and after:** Show what changed and why it matters.\n- **Mistake or lesson:** Frame the post around a practical insight.\n- **Data or signal:** Lead with the most interesting number, trend, or observation.\n- **Question:** Use only when the answer is genuinely interesting.\n\nAvoid generic AI phrasing such as \"In today's fast-paced world\", \"game changer\", \"delve into\", \"unlock\", \"leverage\", \"it is important to note\", and empty hype.\n\nWhen the post is in Chinese **and** the topic is AI / Agent / LLM / tech-frontier, also consult `chinese-ai-tech-posts.md` for language-specific hooks, sentence patterns, structures, templates, and posting timing. It supplements the Writing Principles for that locale and domain; for any other language or topic, ignore it.\n\n### Step 6: Preserve Human Voice\n\nMake the writing sound like a person with a point of view.\n\n**If style samples were provided in Step 1:**\n1. Before drafting, analyse the samples across three dimensions: **sentence patterns** (length ratio, punctuation style), **vocabulary** (jargon, abbreviations, register), **tone** (direct / humble / sharp / humorous).\n2. After drafting, run a quick check — does the draft match the user's profile on all three dimensions? Adjust if not.\n\n**If no style samples were provided:**\nInfer voice from the source material as before.\n\nIn both cases:\n- Keep the user's meaning, expertise, and level of confidence.\n- Prefer concrete nouns and verbs over abstract claims.\n- Vary sentence length naturally.\n- Remove filler, throat-clearing, and overly balanced phrasing.\n- Use plain transitions instead of polished essay structure.\n- Keep personality, but do not force slang, memes, emojis, or outrage.\n- If the user wrote in a distinctive style, preserve that style unless it hurts clarity.\n\n### Step 7: Produce Options\n\nWhen goal, audience, and tone are all unspecified, independently select the 3 best style combinations from the source material. For each combination, state the goal, audience, and tone, then draft the post and include a score summary from the Step 9 rubric. Present all three together so the user can choose.\n\nWhen the user has specified goal, audience, or tone, produce 2 or 3 drafts with distinct angles within those constraints. Label each by strategy, not by quality. Examples:\n\n- **Analytical**\n- **Contrarian**\n- **Founder voice**\n- **Technical thread**\n- **Short punchy version**\n\nIf the user asks for one final post, provide one polished draft instead of options.\n\n### Step 8: Decide Whether An Image Helps\n\nDo not recommend an image by default. Recommend one only when it improves understanding, credibility, or shareability.\n\nAn image is useful for:\n\n- A chart, comparison, framework, checklist, architecture sketch, timeline, or key quote.\n- Dense technical ideas that become clearer visually.\n- Market or product analysis where a concise visual summary helps scanning.\n\nAn image is usually unnecessary for:\n\n- A personal observation, short opinion, joke, simple announcement, or already concise post.\n\nIf an image helps, include an image brief:\n\n```text\nImage recommendation: Yes\nPurpose: [why the image improves the post]\nFormat: [chart / quote card / framework / diagram / comparison]\nAspect ratio: [16:9 / 4:5 / 1:1]\nText on image: [short words only, no crowded paragraphs]\nVisual direction: [style, layout, colors, constraints]\nRender method: [HTML/CSS via render-image.js | image model | real screenshot]\n```\n\nIf no image helps, write: `Image recommendation: No - [brief reason]`.\n\n**Choosing the render method:** for **text- or data-driven** graphics (quote cards, data/metric cards, frameworks, comparisons, checklists, timelines), recommend `HTML/CSS via render-image.js` — see **Rendering Text/Data Graphics** below. For photographic or illustrative needs, recommend an image model; for showing the real product, recommend a real screenshot — never fabricate one.\n\n### Rendering Text/Data Graphics (HTML/CSS + Headless Chrome)\n\nWhen the image is text- or data-driven, you can render it deterministically with HTML/CSS and headless Chrome instead of describing it for a separate tool. This is reproducible and batchable.\n\n**Use this method when** the graphic is layout/typography driven and benefits from precise, repeatable output:\n\n- Quote cards, data/metric cards (real numbers), framework / comparison / checklist / timeline diagrams, code-snippet cards.\n\n**Do not use this method** (use an image model or a real capture instead) when:\n\n- The visual is photographic or illustrative (product photos, lifestyle, hero art), or\n- It must show the real product — take an actual screenshot; never fake one.\n\n**How to render:**\n\n1. Author a self-contained HTML file (inline CSS, no external network assets). Start from `assets/quote-card.html` or `assets/data-card.html`.\n2. Run the helper script:\n\n   ```sh\n   node scripts/render-image.js <input.html> <output.png> [--width=1080] [--height=1080] [--scale=2]\n   ```\n\n3. Attach the PNG to the post.\n\nFirst-time setup, sizes, and fallback behavior are in `render-image-setup.md`. If no browser can launch, the script keeps the HTML and prints manual-render instructions — relay the image brief so the user can render or generate it another way.\n\n### Step 9: Review And Revise\n\nBefore finalizing, score the draft and revise it once if any score is below 8.\n\nUse this rubric:\n\n| Criterion | What To Check |\n| --- | --- |\n| Platform fit | Fits account constraints, reads naturally on X, and has a strong first line. |\n| Hook quality | Gives the reader a clear reason to keep reading. |\n| Accuracy | Does not overclaim, invent facts, or hide uncertainty. |\n| Human voice | Avoids generic AI tone and sounds like a real person. |\n| Density | Delivers enough value without clutter. |\n| Format choice | Single post or thread is appropriate for the material. |\n| Character count | For non-Premium: confirm every post is ≤ 280 characters before finalising. For threads: check each post individually. |\n| Writing principles | Natural voice, subjective perspective, scene grounding, no ornate language, no forced profundity, specific details, no over-explanation. Revise any draft that violates 2 or more. |\n\nIf subagents or independent reviewers are available, use them for the review pass:\n\n1. One reviewer checks hook, clarity, and X fit.\n2. One reviewer checks factual risk and overclaiming.\n3. One reviewer checks human voice and removes AI traces.\n\nIf subagents are not available, perform the same checks yourself.\n\n### Step 10: Save To Vault (Optional)\n\nSaving is **opt-in only**. Generated drafts go to a dedicated subfolder in the user's vault — never into their daily note or any of their own notes.\n\n**Target:** `<base>/X Posts/YYYY-MM-DD.md` — one file per day, the folder created if missing. Always resolve to a concrete **absolute path** before writing.\n\n**Trigger — check at session start:**\n- If the opening message asks to save (e.g. \"save to Obsidian\", \"save to ~/foo\"), saving is enabled for the session.\n- Otherwise, offer it once on the first finalized draft (see below).\n\n**First save — resolve the location once per session:**\n1. If `OBSIDIAN_VAULT_PATH` is set, use it as the base. Announce the resolved absolute target on the first write (e.g. \"Saving to `/Users/x/obsidianVault/X Posts/2026-06-07.md`\") — this announcement confirms the target.\n2. If the opening message named a path, use it the same way (announce, no prompt).\n3. Otherwise ask once:\n   > Save these drafts? Reply with (1) a folder path, (2) `default` to use `~/obsidianVault/X Posts/`, or (3) `no` to skip.\n   - A path → write to `<path>/X Posts/…`.\n   - `default` → write to `~/obsidianVault/X Posts/…` (created if missing).\n   - `no` → do not save, do not output a block, and stop asking for the rest of the session.\n\n**Cadence:** Once a path or the default is chosen (or saving was enabled upfront), auto-save every finalized draft for the rest of the session — do not ask again. The user may skip an individual draft by saying so.\n\n**Who writes the file:**\n1. If a skill that writes to your notes vault (such as an `obsidian` skill) is available, delegate the create/append to it. Pass the **already-resolved absolute path** and the content — never a path containing a shell variable like `$OBSIDIAN_VAULT_PATH`. It handles vault initialization and paths with spaces.\n2. If no `obsidian` skill is available, write the file directly with this platform's file-write capability (for example `Write` in Claude Code, `write_file` in Hermes). Create the `X Posts/` folder if needed.\n3. If the write fails for any reason, **do not lose the content**: paste the finalized markdown block in the chat so the user can copy it manually.\n\n**macOS note:** Only when a write fails **and** the target is under `~/Documents/`, add one line — the cause may be iCloud Drive sync or macOS privacy (TCC) permissions; suggest moving the vault out of `~/Documents` or granting access. Do not show this otherwise.\n\n**File format** — when the day file is new, start it with a title; append one section per save:\n\n```markdown\n# X Posts — 2026-06-07\n\n## 09:14 — [topic or url]\n**Type:** single | thread\n\nVariant 1:\n[post text]\n\nVariant 2:\n[post text — omit this block when there is only one variant]\n```\n\nUse a 24-hour `HH:MM` timestamp (local time). For threads, place the full thread as numbered lines under **Variant 1**; never truncate post text.\n\n---\n\n## Output Format\n\nUse this format unless the user asks for something else:\n\n```text\nDraft:\n[final post or thread]\n\nWhy this works:\n[1-3 concise bullets]\n\nImage recommendation:\n[No with reason, or Yes with brief]\n\nSelf-review:\n[scores and any final adjustment]\n\nSave to vault? (first draft only — reply with a folder path, `default`, or `no`)\n[omit this line once a location is chosen or saving is disabled for the session]\n```\n\nFor threads, number each post and name the template used:\n\n```text\nThread [template name]:\n1/ [hook]\n2/ [next post]\n3/ [next post]\n...\n```\n\n## Key Rules\n\n- Write in the language of the source material unless the user specifies otherwise.\n- For Chinese AI / Agent / LLM / tech-frontier posts, apply `chinese-ai-tech-posts.md` on top of the Writing Principles.\n- Account type and format are required inputs. Do not draft until both are confirmed.\n- Always run all three sub-tasks in Step 2 before drafting — even for long, detailed input.\n- If goal, audience, and tone are all unspecified, select the 3 best style combinations from the source material, draft and score all three, then present them for the user to choose from.\n- Non-Premium single posts must not exceed 280 characters. Compress to fit — do not ask the user to switch to a thread.\n- Keep the final text publishable, not just instructive.\n- Do not make weak material sound more certain than it is.\n- Do not recommend images automatically.\n- Image rendering via `render-image.js` is optional and only for text/data graphics; on failure, degrade gracefully to the image brief. Never fabricate a product screenshot — capture the real one.\n- Do not bury the final draft under long explanations.\n- If the user asks for direct publishing help, remind them to review factual claims before posting.\n- Saving is opt-in only. Never write without explicit user consent or an upfront session-level request, and always save to the `X Posts/` subfolder — never the user's daily note.\n- Always run Step 10 after every draft output. On the first save, resolve the location (env var, named path, or three-option prompt); afterwards auto-save unless the user chose not to save.\n\n## Feedback\n\nIf the user expresses a need this skill does not cover, or is unsatisfied with the result, append this to your response:\n\n> \"This skill may not fully cover your situation. Suggestions for improvement are welcome — [open an issue or PR](https://github.com/archlab-space/open-skill-hub/issues).\"\n\nDo not include this message in normal interactions.\n\nFile v0.13.0:README.md\n\n# X Post Strategist\n\n**Platforms:** Claude · Openclaw · Codex\n**Domain:** Writing\n\n## Purpose\n\nA strategy editor for writing X posts and threads. It turns rough ideas, short prompts, articles, reports, or technical material into clear, engaging, natural posts that fit the user's goal and account constraints.\n\n## When to Use\n\n- When you have an idea and want a stronger X post\n- When you want to turn a long article or technical note into a thread\n- When you need a sharper hook, clearer angle, or more natural voice\n- When you want to know whether a post would benefit from an image\n- When factual or sensitive claims need careful wording before posting\n\n## What It Does\n\n**Phase 1: Research**\n1. Clarifies the goal, audience, tone, account type, format, and optional style samples\n2. When web/search tools are available, researches background context and trending angles using only the topic text you provide — no credentials or personal data are sent\n3. Verifies factual claims and flags risk before writing\n\n**Phase 2: Creation**\n4. Chooses a single post or thread; selects a narrative template (Argument / Story / Tutorial) for threads\n5. Writes strong hooks and publishable drafts\n6. Calibrates voice against user-provided style samples, or infers it from the source material\n7. Produces multiple drafts with distinct angles when goal, audience, or tone is unspecified\n8. Decides whether an image would improve the post and provides a brief when one helps\n9. Scores and revises the draft for X fit, accuracy, quality, and human voice\n\n## Notes\n\nThe skill defaults to English unless another language is requested. It is focused on X only, not LinkedIn, Threads, or general social media.\n\nFor real-time, financial, legal, medical, political, or other high-stakes topics, the agent should verify facts when possible and avoid presenting uncertainty as fact.\n\n## Feedback & Contributions\n\nFound a gap or have a suggestion? [Open an issue or PR](https://github.com/archlab-space/open-skill-hub/issues) — improvements are welcome.\n\nFile v0.13.0:_meta.json\n\n{\n  \"ownerId\": \"kn798vfcxrgjdt230v34k8eqf584vpwv\",\n  \"slug\": \"x-post-strategist\",\n  \"version\": \"0.13.0\",\n  \"publishedAt\": 1782204153058\n}\n\nFile v0.13.0:scripts/package-lock.json\n\n{\n  \"name\": \"x-post-strategist-render-image\",\n  \"version\": \"1.0.0\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"x-post-strategist-render-image\",\n      \"version\": \"1.0.0\",\n      \"dependencies\": {\n        \"puppeteer\": \"^24.15.0\"\n      },\n      \"bin\": {\n        \"render-image\": \"render-image.js\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@babel/code-frame\": {\n      \"version\": \"7.29.7\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz\",\n      \"integrity\": \"sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/helper-validator-identifier\": \"^7.29.7\",\n        \"js-tokens\": \"^4.0.0\",\n        \"picocolors\": \"^1.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/helper-validator-identifier\": {\n      \"version\": \"7.29.7\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz\",\n      \"integrity\": \"sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@puppeteer/browsers\": {\n      \"version\": \"2.13.2\",\n      \"resolved\": \"https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.13.2.tgz\",\n      \"integrity\": \"sha512-5EUZSUIc37H6aIXyWO0Z4y8NlF8NnjgmqeQgOGiswAU7pY0HOo16ho4+alIWmSfdZnjqBRawMsP3I5YqLSn6kw==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"debug\": \"^4.4.3\",\n        \"extract-zip\": \"^2.0.1\",\n        \"progress\": \"^2.0.3\",\n        \"proxy-agent\": \"^6.5.0\",\n        \"semver\": \"^7.7.4\",\n        \"tar-fs\": \"^3.1.1\",\n        \"yargs\": \"^17.7.2\"\n      },\n      \"bin\": {\n        \"browsers\": \"lib/cjs/main-cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@tootallnate/quickjs-emscripten\": {\n      \"version\": \"0.23.0\",\n      \"resolved\": \"https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz\",\n      \"integrity\": \"sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@types/node\": {\n      \"version\": \"25.9.1\",\n      \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-25.9.1.tgz\",\n      \"integrity\": \"sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"undici-types\": \">=7.24.0 <7.24.7\"\n      }\n    },\n    \"node_modules/@types/yauzl\": {\n      \"version\": \"2.10.3\",\n      \"resolved\": \"https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz\",\n      \"integrity\": \"sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/agent-base\": {\n      \"version\": \"7.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz\",\n      \"integrity\": \"sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/ansi-regex\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n      \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/ansi-styles\": {\n      \"version\": \"4.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz\",\n      \"integrity\": \"sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"color-convert\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n      }\n    },\n    \"node_modules/argparse\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz\",\n      \"integrity\": \"sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==\",\n      \"license\": \"Python-2.0\"\n    },\n    \"node_modules/ast-types\": {\n      \"version\": \"0.13.4\",\n      \"resolved\": \"https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz\",\n      \"integrity\": \"sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"tslib\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/b4a\": {\n      \"version\": \"1.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz\",\n      \"integrity\": \"sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==\",\n      \"license\": \"Apache-2.0\",\n      \"peerDependencies\": {\n        \"react-native-b4a\": \"*\"\n      },\n      \"peerDependenciesMeta\": {\n        \"react-native-b4a\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/bare-events\": {\n      \"version\": \"2.9.1\",\n      \"resolved\": \"https://registry.npmjs.org/bare-events/-/bare-events-2.9.1.tgz\",\n      \"integrity\": \"sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg==\",\n      \"license\": \"Apache-2.0\",\n      \"peerDependencies\": {\n        \"bare-abort-controller\": \"*\"\n      },\n      \"peerDependenciesMeta\": {\n        \"bare-abort-controller\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/bare-fs\": {\n      \"version\": \"4.7.2\",\n      \"resolved\": \"https://registry.npmjs.org/bare-fs/-/bare-fs-4.7.2.tgz\",\n      \"integrity\": \"sha512-aTvMFUWkBmjzKtEQMDGGDNF8bkfpD5N1b/FCwt7A3wrU4t1o/e/85Wzkluh6JlODCjqVESYCkQCdTXqZ9G7VFg==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"bare-events\": \"^2.5.4\",\n        \"bare-path\": \"^3.0.0\",\n        \"bare-stream\": \"^2.6.4\",\n        \"bare-url\": \"^2.2.2\",\n        \"fast-fifo\": \"^1.3.2\"\n      },\n      \"engines\": {\n        \"bare\": \">=1.16.0\"\n      },\n      \"peerDependencies\": {\n        \"bare-buffer\": \"*\"\n      },\n      \"peerDependenciesMeta\": {\n        \"bare-buffer\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/bare-os\": {\n      \"version\": \"3.9.1\",\n      \"resolved\": \"https://registry.npmjs.org/bare-os/-/bare-os-3.9.1.tgz\",\n      \"integrity\": \"sha512-6M5XjcnsygQNPMCMPXSK379xrJFiZ/AEMNBmFEmQW8d/789VQATvriyi5r0HYTL9TkQ26rn3kgdTG3aisbrXkQ==\",\n      \"license\": \"Apache-2.0\",\n      \"engines\": {\n        \"bare\": \">=1.14.0\"\n      }\n    },\n    \"node_modules/bare-path\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/bare-path/-/bare-path-3.0.1.tgz\",\n      \"integrity\": \"sha512-ghj2DSK/2e99a1anTVPCV4m4YIYtrbXhfM7V3D7XZLOTsybnYyaJloymGqssQc8l/or0UoDyRtNQkmkEF/ysgQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"bare-os\": \"^3.0.1\"\n      }\n    },\n    \"node_modules/bare-stream\": {\n      \"version\": \"2.13.1\",\n      \"resolved\": \"https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.1.tgz\",\n      \"integrity\": \"sha512-Vp0cnjYyrEC4whYTymQ+YZi6pBpfiICZO3cfRG8sy67ZNWe951urv1x4eW1BKNngw3U+3fPYb5JQvHbCtxH7Ow==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"streamx\": \"^2.25.0\",\n        \"teex\": \"^1.0.1\"\n      },\n      \"peerDependencies\": {\n        \"bare-abort-controller\": \"*\",\n        \"bare-buffer\": \"*\",\n        \"bare-events\": \"*\"\n      },\n      \"peerDependenciesMeta\": {\n        \"bare-abort-controller\": {\n          \"optional\": true\n        },\n        \"bare-buffer\": {\n          \"optional\": true\n        },\n        \"bare-events\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/bare-url\": {\n      \"version\": \"2.4.5\",\n      \"resolved\": \"https://registry.npmjs.org/bare-url/-/bare-url-2.4.5.tgz\",\n      \"integrity\": \"sha512-K+y9xF1tN+CdPu4qWwr0QiK1Al07eFPGYK5M2pDXcmHdMdgC/tT/bpmMe1hrmRHaidKLkXrC+cRNYf3XVDUhSQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"bare-path\": \"^3.0.0\"\n      }\n    },\n    \"node_modules/basic-ftp\": {\n      \"version\": \"5.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.3.1.tgz\",\n      \"integrity\": \"sha512-bopVNp6ugyA150DDuZfPFdt1KZ5a94ZDiwX4hMgZDzF+GttD80lEy8kj98kbyhLXnPvhtIo93mdnLIjpCAeeOw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=10.0.0\"\n      }\n    },\n    \"node_modules/buffer-crc32\": {\n      \"version\": \"0.2.13\",\n      \"resolved\": \"https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz\",\n      \"integrity\": \"sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/callsites\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz\",\n      \"integrity\": \"sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/chromium-bidi\": {\n      \"version\": \"14.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-14.0.0.tgz\",\n      \"integrity\": \"sha512-9gYlLtS6tStdRWzrtXaTMnqcM4dudNegMXJxkR0I/CXObHalYeYcAMPrL19eroNZHtJ8DQmu1E+ZNOYu/IXMXw==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"mitt\": \"^3.0.1\",\n        \"zod\": \"^3.24.1\"\n      },\n      \"peerDependencies\": {\n        \"devtools-protocol\": \"*\"\n      }\n    },\n    \"node_modules/cliui\": {\n      \"version\": \"8.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz\",\n      \"integrity\": \"sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"string-width\": \"^4.2.0\",\n        \"strip-ansi\": \"^6.0.1\",\n        \"wrap-ansi\": \"^7.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/color-convert\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz\",\n      \"integrity\": \"sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"color-name\": \"~1.1.4\"\n      },\n      \"engines\": {\n        \"node\": \">=7.0.0\"\n      }\n    },\n    \"node_modules/color-name\": {\n      \"version\": \"1.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz\",\n      \"integrity\": \"sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/cosmiconfig\": {\n      \"version\": \"9.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz\",\n      \"integrity\": \"sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"env-paths\": \"^2.2.1\",\n        \"import-fresh\": \"^3.3.0\",\n        \"js-yaml\": \"^4.1.0\",\n        \"parse-json\": \"^5.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/d-fischer\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=4.9.5\"\n      },\n      \"peerDependenciesMeta\": {\n        \"typescript\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/data-uri-to-buffer\": {\n      \"version\": \"6.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz\",\n      \"integrity\": \"sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/debug\": {\n      \"version\": \"4.4.3\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.4.3.tgz\",\n      \"integrity\": \"sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ms\": \"^2.1.3\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"supports-color\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/degenerator\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz\",\n      \"integrity\": \"sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ast-types\": \"^0.13.4\",\n        \"escodegen\": \"^2.1.0\",\n        \"esprima\": \"^4.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/devtools-protocol\": {\n      \"version\": \"0.0.1608973\",\n      \"resolved\": \"https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1608973.tgz\",\n      \"integrity\": \"sha512-Tpm17fxYzt+J7VrGdc1k8YdRqS3YV7se/M6KeemEqvUbq/n7At1rWVuXMxQgpWkdwSdIEKYbU//Bve+Shm4YNQ==\",\n      \"license\": \"BSD-3-Clause\"\n    },\n    \"node_modules/emoji-regex\": {\n      \"version\": \"8.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz\",\n      \"integrity\": \"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/end-of-stream\": {\n      \"version\": \"1.4.5\",\n      \"resolved\": \"https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz\",\n      \"integrity\": \"sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"once\": \"^1.4.0\"\n      }\n    },\n    \"node_modules/env-paths\": {\n      \"version\": \"2.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz\",\n      \"integrity\": \"sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/error-ex\": {\n      \"version\": \"1.3.4\",\n      \"resolved\": \"https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz\",\n      \"integrity\": \"sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"is-arrayish\": \"^0.2.1\"\n      }\n    },\n    \"node_modules/escalade\": {\n      \"version\": \"3.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz\",\n      \"integrity\": \"sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/escodegen\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz\",\n      \"integrity\": \"sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==\",\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"esprima\": \"^4.0.1\",\n        \"estraverse\": \"^5.2.0\",\n        \"esutils\": \"^2.0.2\"\n      },\n      \"bin\": {\n        \"escodegen\": \"bin/escodegen.js\",\n        \"esgenerate\": \"bin/esgenerate.js\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0\"\n      },\n      \"optionalDependencies\": {\n        \"source-map\": \"~0.6.1\"\n      }\n    },\n    \"node_modules/esprima\": {\n      \"version\": \"4.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz\",\n      \"integrity\": \"sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==\",\n      \"license\": \"BSD-2-Clause\",\n      \"bin\": {\n        \"esparse\": \"bin/esparse.js\",\n        \"esvalidate\": \"bin/esvalidate.js\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/estraverse\": {\n      \"version\": \"5.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz\",\n      \"integrity\": \"sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==\",\n      \"license\": \"BSD-2-Clause\",\n      \"engines\": {\n        \"node\": \">=4.0\"\n      }\n    },\n    \"node_modules/esutils\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz\",\n      \"integrity\": \"sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==\",\n      \"license\": \"BSD-2-Clause\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/events-universal\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz\",\n      \"integrity\": \"sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"bare-events\": \"^2.7.0\"\n      }\n    },\n    \"node_modules/extract-zip\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz\",\n      \"integrity\": \"sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==\",\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"debug\": \"^4.1.1\",\n        \"get-stream\": \"^5.1.0\",\n        \"yauzl\": \"^2.10.0\"\n      },\n      \"bin\": {\n        \"extract-zip\": \"cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">= 10.17.0\"\n      },\n      \"optionalDependencies\": {\n        \"@types/yauzl\": \"^2.9.1\"\n      }\n    },\n    \"node_modules/fast-fifo\": {\n      \"version\": \"1.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz\",\n      \"integrity\": \"sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/fd-slicer\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz\",\n      \"integrity\": \"sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"pend\": \"~1.2.0\"\n      }\n    },\n    \"node_modules/get-caller-file\": {\n      \"version\": \"2.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz\",\n      \"integrity\": \"sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==\",\n      \"license\": \"ISC\",\n      \"engines\": {\n        \"node\": \"6.* || 8.* || >= 10.*\"\n      }\n    },\n    \"node_modules/get-stream\": {\n      \"version\": \"5.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz\",\n      \"integrity\": \"sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"pump\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/get-uri\": {\n      \"version\": \"6.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz\",\n      \"integrity\": \"sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"basic-ftp\": \"^5.0.2\",\n        \"data-uri-to-buffer\": \"^6.0.2\",\n        \"debug\": \"^4.3.4\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/http-proxy-agent\": {\n      \"version\": \"7.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz\",\n      \"integrity\": \"sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"agent-base\": \"^7.1.0\",\n        \"debug\": \"^4.3.4\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/https-proxy-agent\": {\n      \"version\": \"7.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz\",\n      \"integrity\": \"sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"agent-base\": \"^7.1.2\",\n        \"debug\": \"4\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/import-fresh\": {\n      \"version\": \"3.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz\",\n      \"integrity\": \"sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"parent-module\": \"^1.0.0\",\n        \"resolve-from\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/ip-address\": {\n      \"version\": \"10.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz\",\n      \"integrity\": \"sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 12\"\n      }\n    },\n    \"node_modules/is-arrayish\": {\n      \"version\": \"0.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz\",\n      \"integrity\": \"sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/is-fullwidth-code-point\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz\",\n      \"integrity\": \"sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/js-tokens\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz\",\n      \"integrity\": \"sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/js-yaml\": {\n      \"version\": \"4.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz\",\n      \"integrity\": \"sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/puzrin\"\n        },\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/nodeca\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"argparse\": \"^2.0.1\"\n      },\n      \"bin\": {\n        \"js-yaml\": \"bin/js-yaml.js\"\n      }\n    },\n    \"node_modules/json-parse-even-better-errors\": {\n      \"version\": \"2.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz\",\n      \"integrity\": \"sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/lines-and-columns\": {\n      \"version\": \"1.2.4\",\n      \"resolved\": \"https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz\",\n      \"integrity\": \"sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/lru-cache\": {\n      \"version\": \"7.18.3\",\n      \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz\",\n      \"integrity\": \"sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==\",\n      \"license\": \"ISC\",\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/mitt\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz\",\n      \"integrity\": \"sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/ms\": {\n      \"version\": \"2.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.3.tgz\",\n      \"integrity\": \"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/netmask\": {\n      \"version\": \"2.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/netmask/-/netmask-2.1.1.tgz\",\n      \"integrity\": \"sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4.0\"\n      }\n    },\n    \"node_modules/once\": {\n      \"version\": \"1.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/once/-/once-1.4.0.tgz\",\n      \"integrity\": \"sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"wrappy\": \"1\"\n      }\n    },\n    \"node_modules/pac-proxy-agent\": {\n      \"version\": \"7.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz\",\n      \"integrity\": \"sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@tootallnate/q\n\nArchive v0.7.3: 11 files, 33913 bytes\n\nFiles: assets/data-card.html (2450b), assets/quote-card.html (1799b), CHANGELOG.md (5193b), README.md (2037b), render-image-setup.md (2944b), scripts/package-lock.json (41495b), scripts/package.json (317b), scripts/render-image.js (5433b), skill-card.md (2872b), SKILL.md (21766b), _meta.json (136b)\n\nArchive v0.7.2: 11 files, 32582 bytes\n\nFiles: assets/data-card.html (2450b), assets/quote-card.html (1799b), CHANGELOG.md (4424b), README.md (2037b), render-image-setup.md (2944b), scripts/package-lock.json (41495b), scripts/package.json (317b), scripts/render-image.js (5433b), skill-card.md (2757b), SKILL.md (19654b), _meta.json (136b)\n\nArchive v0.7.1: 11 files, 32407 bytes\n\nFiles: assets/data-card.html (2450b), assets/quote-card.html (1799b), CHANGELOG.md (4063b), README.md (2037b), render-image-setup.md (2827b), scripts/package-lock.json (41495b), scripts/package.json (317b), scripts/render-image.js (5433b), skill-card.md (2943b), SKILL.md (19654b), _meta.json (136b)\n\nArchive v0.7.0: 11 files, 31488 bytes\n\nFiles: assets/data-card.html (2450b), assets/quote-card.html (1799b), CHANGELOG.md (3352b), README.md (1969b), render-image-setup.md (2245b), scripts/package-lock.json (41495b), scripts/package.json (317b), scripts/render-image.js (5202b), skill-card.md (2602b), SKILL.md (19553b), _meta.json (136b)\n\nArchive v0.5.7: 5 files, 12377 bytes\n\nFiles: CHANGELOG.md (2773b), README.md (1969b), skill-card.md (2388b), SKILL.md (17556b), _meta.json (136b)\n\nArchive v0.5.6: 5 files, 12270 bytes\n\nFiles: CHANGELOG.md (2610b), README.md (1969b), skill-card.md (2322b), SKILL.md (17561b), _meta.json (136b)\n\nArchive v0.5.5: 5 files, 12050 bytes\n\nFiles: CHANGELOG.md (2479b), README.md (1969b), skill-card.md (2104b), SKILL.md (17416b), _meta.json (136b)\n\nArchive v0.5.3: 8 files, 17414 bytes\n\nFiles: CHANGELOG.md (2181b), google-sheet-sync.md (4501b), README.md (1798b), scripts/package.json (137b), scripts/save_to_sheet.js (7751b), skill-card.md (2466b), SKILL.md (17319b), _meta.json (136b)","readmeExcerpt":"Skill: X Post Strategist Owner: archlab-space Summary: Use this skill when the user wants to turn ideas, notes, articles, reports, or technical material into compelling X posts or threads. Covers single posts and... Tags: latest:0.14.0 Version history: v0.14.0 | 2026-06-23T09:48:14.784Z | user Version 0.14.0 v0.13.0 | 2026-06-23T08:42:33.058Z | user Version 0.13.0 v0.7.3 | 2026-06-08T00:45:18.057Z | user Changed - Re","codeSnippets":[],"executableExamples":[{"language":"text","snippet":"[Context enrichment]\nBackground: ...\nTrending angles: ...\nFact signals: ..."},{"language":"text","snippet":"1/ Hook — sharpest core claim\n2-3/ Evidence — specific facts or cases\n4/ Counterpoint or qualification — adds credibility\n5/ Insight — useful conclusion for the reader\n6/ CTA — question, discussion invite, or action"},{"language":"text","snippet":"1/ Hook — most dramatic moment or outcome\n2-3/ Background + conflict\n4/ Turning point\n5/ Result + lesson\n6/ CTA"},{"language":"text","snippet":"1/ Hook — what problem this solves\n2-N/ Steps (one point each, parallel structure)\nN+1/ Summary + common mistakes\nN+2/ CTA"},{"language":"text","snippet":"Image recommendation: Yes\nPurpose: [why the image improves the post]\nFormat: [chart / quote card / framework / diagram / comparison]\nAspect ratio: [16:9 / 4:5 / 1:1]\nText on image: [short words only, no crowded paragraphs]\nVisual direction: [style, layout, colors, constraints]\nRender method: [HTML/CSS via render-image.js | image model | real screenshot]"},{"language":"sh","snippet":"node scripts/render-image.js <input.html> <output.png> [--width=1080] [--height=1080] [--scale=2]"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: x-post-strategist\ndescription: >\n  Use this skill when the user wants to turn ideas, notes, articles, reports, or\n  technical material into compelling X posts or threads. Covers single posts and\n  multi-tweet threads, tone matching, and character-limit handling for Standard\n  and Premium accounts. Not for other platforms (LinkedIn, Reddit, Xiaohongshu),\n  long-form articles, or auto-posting on the user's behalf.\n---\n\n# X Post Strategist\n\nYou are an X content strategist and editor. Your job is to turn raw input into posts or threads that are clear, accurate, engaging, and natural. Optimize for the user's goal, not for generic virality.\n\n**Default language:** Match the language of the source material unless the user specifies otherwise.\n\n## Flow\n\nFollow these steps in order. Ask one question at a time when required information is missing.\n\n---\n\n## Phase 1: Research\n\n### Step 1: Understand The Assignment\n\nIdentify the source material and the publishing goal.\n\nIf the user provides only a vague request, ask for the source material or the intended angle. If the source material is long, summarize the core idea before drafting.\n\n**Required before drafting** — ask the user if not provided. Ask one question at a time and wait for the answer before continuing:\n\n| Input | Options | Why It Matters |\n| --- | --- | --- |\n| Account type | Non-Premium / Premium | Controls the per-post character limit (280 vs 25,000 chars). |\n| Format | Single post / Thread | Determines structure and whether the character limit applies per post or to the whole piece. |\n\nDo not proceed to Step 2 until both are confirmed.\n\n**Optional — infer from source material if not provided:**\n\n| Input | Examples | Why It Matters |\n| --- | --- | --- |\n| Goal | Educate, persuade, react to news, build authority, launch something, drive clicks, start discussion | Shapes hook strategy. |\n| Audience | Developers, investors, founders, operators, researchers, students, general public | Shapes vocabulary and depth. |\n| Desired tone | Analytical, sharp, calm, technical, playful, contrarian, personal, executive, storytelling | Shapes voice. |\n| Style samples | 1–5 past X posts by the user | Lets you extract real voice patterns rather than guessing tone. Used in Step 6. |\n\nIf goal, audience, and tone are all unspecified, read the source material and independently select the **3 best style combinations** (each with a goal, audience, and tone). Draft a post for each combination, score all three using the Step 9 rubric, and present them together for the user to choose from. This applies to short Non-Premium single posts only; for long-form output (any thread or a Premium single post) produce one draft and offer other angles conversationally instead — see Step 7.\n\n### Step 2: Enrich Context\n\nRun these research sub-tasks when web/search tools are available, using only the topic text the user provides — no credentials or personal data are transmitted. Execute all three sub-tasks in order.\n\n**1. Backgro"},{"path":"README.md","content":"# X Post Strategist\n\n**Platforms:** Claude · Openclaw · Codex\n**Domain:** Writing\n\n## Purpose\n\nA strategy editor for writing X posts and threads. It turns rough ideas, short prompts, articles, reports, or technical material into clear, engaging, natural posts that fit the user's goal and account constraints.\n\n## When to Use\n\n- When you have an idea and want a stronger X post\n- When you want to turn a long article or technical note into a thread\n- When you need a sharper hook, clearer angle, or more natural voice\n- When you want to know whether a post would benefit from an image\n- When factual or sensitive claims need careful wording before posting\n\n## What It Does\n\n**Phase 1: Research**\n1. Clarifies the goal, audience, tone, account type, format, and optional style samples\n2. When web/search tools are available, researches background context and trending angles using only the topic text you provide — no credentials or personal data are sent\n3. Verifies factual claims and flags risk before writing\n\n**Phase 2: Creation**\n4. Chooses a single post or thread; selects a narrative template (Argument / Story / Tutorial) for threads\n5. Writes strong hooks and publishable drafts\n6. Calibrates voice against user-provided style samples, or infers it from the source material\n7. Produces multiple drafts with distinct angles when goal, audience, or tone is unspecified\n8. Decides whether an image would improve the post and provides a brief when one helps\n9. Scores and revises the draft for X fit, accuracy, quality, and human voice\n\n## Notes\n\nThe skill defaults to English unless another language is requested. It is focused on X only, not LinkedIn, Threads, or general social media.\n\nFor real-time, financial, legal, medical, political, or other high-stakes topics, the agent should verify facts when possible and avoid presenting uncertainty as fact.\n\n## Feedback & Contributions\n\nFound a gap or have a suggestion? [Open an issue or PR](https://github.com/archlab-space/open-skill-hub/issues) — improvements are welcome."},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn798vfcxrgjdt230v34k8eqf584vpwv\",\n  \"slug\": \"x-post-strategist\",\n  \"version\": \"0.14.0\",\n  \"publishedAt\": 1782208094784\n}"},{"path":"scripts/package-lock.json","content":"{\n  \"name\": \"x-post-strategist-render-image\",\n  \"version\": \"1.0.0\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"x-post-strategist-render-image\",\n      \"version\": \"1.0.0\",\n      \"dependencies\": {\n        \"puppeteer\": \"^24.15.0\"\n      },\n      \"bin\": {\n        \"render-image\": \"render-image.js\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@babel/code-frame\": {\n      \"version\": \"7.29.7\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz\",\n      \"integrity\": \"sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/helper-validator-identifier\": \"^7.29.7\",\n        \"js-tokens\": \"^4.0.0\",\n        \"picocolors\": \"^1.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/helper-validator-identifier\": {\n      \"version\": \"7.29.7\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz\",\n      \"integrity\": \"sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@puppeteer/browsers\": {\n      \"version\": \"2.13.2\",\n      \"resolved\": \"https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.13.2.tgz\",\n      \"integrity\": \"sha512-5EUZSUIc37H6aIXyWO0Z4y8NlF8NnjgmqeQgOGiswAU7pY0HOo16ho4+alIWmSfdZnjqBRawMsP3I5YqLSn6kw==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"debug\": \"^4.4.3\",\n        \"extract-zip\": \"^2.0.1\",\n        \"progress\": \"^2.0.3\",\n        \"proxy-agent\": \"^6.5.0\",\n        \"semver\": \"^7.7.4\",\n        \"tar-fs\": \"^3.1.1\",\n        \"yargs\": \"^17.7.2\"\n      },\n      \"bin\": {\n        \"browsers\": \"lib/cjs/main-cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@tootallnate/quickjs-emscripten\": {\n      \"version\": \"0.23.0\",\n      \"resolved\": \"https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz\",\n      \"integrity\": \"sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@types/node\": {\n      \"version\": \"25.9.1\",\n      \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-25.9.1.tgz\",\n      \"integrity\": \"sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"undici-types\": \">=7.24.0 <7.24.7\"\n      }\n    },\n    \"node_modules/@types/yauzl\": {\n      \"version\": \"2.10.3\",\n      \"resolved\": \"https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz\",\n      \"integrity\": \"sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==\",\n      \"license\": \"MIT"},{"path":"scripts/package.json","content":"{\n  \"name\": \"x-post-strategist-render-image\",\n  \"version\": \"1.0.0\",\n  \"private\": true,\n  \"description\": \"Render HTML/CSS cards to PNG with headless Chrome for X posts.\",\n  \"bin\": {\n    \"render-image\": \"render-image.js\"\n  },\n  \"engines\": {\n    \"node\": \">=18\"\n  },\n  \"dependencies\": {\n    \"puppeteer\": \"^24.15.0\"\n  }\n}"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Use this skill when the user wants to turn ideas, notes, articles, reports, or technical material into compelling X posts or threads. Covers single posts and... Skill: X Post Strategist Owner: archlab-space Summary: Use this skill when the user wants to turn ideas, notes, articles, reports, or technical material into compelling X posts or threads. Covers single posts and... Tags: latest:0.14.0 Version history: v0.14.0 | 2026-06-23T09:48:14.784Z | user Version 0.14.0 v0.13.0 | 2026-06-23T08:42:33.058Z | user Version 0.13.0 v0.7.3 | 2026-06-08T00:45:18.057Z | user Changed - Re","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1793,"uniquenessScore":49,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T18:16:34.322Z","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-10T18:16:34.322Z","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-10T21:48:24.970Z","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"}]}}}