{"id":"3bf1e449-59d0-4383-b4d9-ee0b847054d1","entityType":"agent","slug":"clawhub-catrefuse-cocoloop-skill-factory","name":"CocoLoop Skill Factory","canonicalUrl":"https://www.xpersona.co/agent/clawhub-catrefuse-cocoloop-skill-factory","canonicalPath":"/agent/clawhub-catrefuse-cocoloop-skill-factory","generatedAt":"2026-10-11T14:13:36.846Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T09:49:14.163Z","emptyReason":null},"description":"引导需求、检索参考、装配多平台 Skill 产物的工厂 Skill: CocoLoop Skill Factory Owner: catrefuse Summary: 引导需求、检索参考、装配多平台 Skill 产物的工厂 Tags: latest:0.3.5, meta-skill:0.3.5, skill-factory:0.3.5 Version history: v0.3.5 | 2026-04-27T11:45:22.174Z | user Extend factory task domains, shared schema validation, and business presets. v0.3.4 | 2026-04-21T12:24:26.567Z | user Release 0.3.4 v0.3.3 | 2026-04-21T11:53:53.312Z | user Harden factory generation and visual storytelli","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.1K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s1768eg87kddn8jfvabsrdrnz184h1q1:cocoloop-skill-factory","sourceUrl":"https://clawhub.ai/catrefuse/cocoloop-skill-factory","homepage":"https://clawhub.ai/catrefuse/skills/cocoloop-skill-factory","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/catrefuse/cocoloop-skill-factory","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/catrefuse/skills/cocoloop-skill-factory","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":61,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"引导需求、检索参考、装配多平台 Skill 产物的工厂 Skill: CocoLoop Skill Factory Owner: catrefuse Summary: 引导需求、检索参考、装配多平台 Skill 产物的工厂 Tags: latest:0.3.5, meta-skill:0.3.5, skill-fact"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T09:49:14.163Z","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-11T09:49:14.163Z","emptyReason":null},"stars":null,"forks":null,"downloads":1096,"packageName":null,"latestVersion":"0.3.5","tractionLabel":"1.1K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T09:49:14.144Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T09:49:14.163Z","lastCrawledAt":"2026-10-11T09:49:14.144Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T09:49:14.144Z","lastVerifiedAt":null,"highlights":[{"version":"0.3.5","createdAt":"2026-04-27T11:45:22.174Z","changelog":"Extend factory task domains, shared schema validation, and business presets.","fileCount":263,"zipByteSize":430860},{"version":"0.3.4","createdAt":"2026-04-21T12:24:26.567Z","changelog":"Release 0.3.4","fileCount":228,"zipByteSize":388190},{"version":"0.3.3","createdAt":"2026-04-21T11:53:53.312Z","changelog":"Harden factory generation and visual storytelling","fileCount":227,"zipByteSize":385889},{"version":"0.3.2","createdAt":"2026-04-20T10:35:59.526Z","changelog":"Add skill identity and visual output gates","fileCount":226,"zipByteSize":384127},{"version":"0.3.1","createdAt":"2026-04-17T10:46:24.761Z","changelog":"Add hard gates for target environment and execution plane","fileCount":220,"zipByteSize":374715},{"version":"0.3.0","createdAt":"2026-04-17T09:52:42.779Z","changelog":"Release 0.3.0","fileCount":220,"zipByteSize":367193},{"version":"0.2.0","createdAt":"2026-04-17T05:19:09.195Z","changelog":"Major upgrade: adds task-domain routing, preset system, atomic-capability routing, spec-driven factory build chain, platform support matrix, independent factory builder, and publish-ready validation/package flow.","fileCount":163,"zipByteSize":291677},{"version":"0.1.0","createdAt":"2026-04-16T09:03:03.778Z","changelog":"Initial public release","fileCount":39,"zipByteSize":68943}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s1768eg87kddn8jfvabsrdrnz184h1q1:cocoloop-skill-factory","setupComplexity":"low","setupSteps":["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-catrefuse-cocoloop-skill-factory/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-catrefuse-cocoloop-skill-factory/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-catrefuse-cocoloop-skill-factory/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-catrefuse-cocoloop-skill-factory/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-catrefuse-cocoloop-skill-factory/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-catrefuse-cocoloop-skill-factory/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-11T14:13:36.842Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-catrefuse-cocoloop-skill-factory/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-catrefuse-cocoloop-skill-factory/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-catrefuse-cocoloop-skill-factory/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-catrefuse-cocoloop-skill-factory/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-11T09:49:14.163Z","emptyReason":null},"readme":"Skill: CocoLoop Skill Factory\n\nOwner: catrefuse\n\nSummary: 引导需求、检索参考、装配多平台 Skill 产物的工厂\n\nTags: latest:0.3.5, meta-skill:0.3.5, skill-factory:0.3.5\n\nVersion history:\n\nv0.3.5 | 2026-04-27T11:45:22.174Z | user\n\nExtend factory task domains, shared schema validation, and business presets.\n\nv0.3.4 | 2026-04-21T12:24:26.567Z | user\n\nRelease 0.3.4\n\nv0.3.3 | 2026-04-21T11:53:53.312Z | user\n\nHarden factory generation and visual storytelling\n\nv0.3.2 | 2026-04-20T10:35:59.526Z | user\n\nAdd skill identity and visual output gates\n\nv0.3.1 | 2026-04-17T10:46:24.761Z | user\n\nAdd hard gates for target environment and execution plane\n\nv0.3.0 | 2026-04-17T09:52:42.779Z | user\n\nRelease 0.3.0\n\nv0.2.0 | 2026-04-17T05:19:09.195Z | user\n\nMajor upgrade: adds task-domain routing, preset system, atomic-capability routing, spec-driven factory build chain, platform support matrix, independent factory builder, and publish-ready validation/package flow.\n\nv0.1.0 | 2026-04-16T09:03:03.778Z | user\n\nInitial public release\n\nArchive index:\n\nArchive v0.3.5: 263 files, 430860 bytes\n\nFiles: agents/openai.yaml (264b), atomic-capability/browser-access/index.md (5272b), atomic-capability/browser-access/opencli-browser-bridge.md (1983b), atomic-capability/data-parse-transform/index.md (1059b), atomic-capability/document-generation/index.md (1033b), atomic-capability/external-service/index.md (2082b), atomic-capability/file-ops/index.md (1034b), atomic-capability/index.md (5036b), atomic-capability/infographic-generation/index.md (8049b), atomic-capability/presentation-generation/index.md (9839b), atomic-capability/search-and-info/index.md (1243b), atomic-capability/structured-visual-storytelling/examples/graduate-defense.md (660b), atomic-capability/structured-visual-storytelling/index.md (3373b), atomic-capability/structured-visual-storytelling/output-adapters.md (1289b), atomic-capability/structured-visual-storytelling/shared-rules.md (1954b), atomic-capability/subskill-invocation/index.md (1042b), atomic-capability/template-mapping/index.md (986b), factory-skill-builder/package-lock.json (740b), factory-skill-builder/package.json (326b), factory-skill-builder/README.md (1546b), factory-skill-builder/scripts/_spec_common.cjs (4754b), factory-skill-builder/scripts/build_skill_from_spec.cjs (2619b), factory-skill-builder/scripts/ensure_generated_by_cocoloop.cjs (3888b), factory-skill-builder/scripts/package_skill.cjs (4360b), factory-skill-builder/scripts/render_skill_from_spec.cjs (25314b), factory-skill-builder/scripts/schema_rules.cjs (12597b), factory-skill-builder/scripts/validate_platform_skill.cjs (12302b), factory-skill-builder/scripts/validate_skill.cjs (3310b), factory-skill-builder/tests/regression.cjs (1875b), factory-skill-builder/tests/schema_rules.test.cjs (2943b), output/browser-automation-routing/build-plan.md (1132b), output/browser-automation-routing/design-summary.md (1369b), output/browser-automation-routing/reference-skill-analysis.md (2385b), output/browser-automation-routing/research-summary.md (2368b), output/browser-automation-routing/spec.md (1539b), output/business-horizontal-expansion-2/build-plan.md (766b), output/business-horizontal-expansion-2/design-summary.md (781b), output/business-horizontal-expansion-2/reference-skill-analysis.md (1158b), output/business-horizontal-expansion-2/research-summary.md (950b), output/business-horizontal-expansion-2/spec.md (980b), output/business-horizontal-expansion/build-plan.md (736b), output/business-horizontal-expansion/design-summary.md (717b), output/business-horizontal-expansion/reference-skill-analysis.md (950b), output/business-horizontal-expansion/research-summary.md (770b), output/business-horizontal-expansion/spec.md (954b), output/clawhub-infographic-ppt-deep-dive/build-plan.md (1244b), output/clawhub-infographic-ppt-deep-dive/design-summary.md (3590b), output/clawhub-infographic-ppt-deep-dive/reference-skill-analysis.md (9820b), output/clawhub-infographic-ppt-deep-dive/research-summary.md (5218b), output/clawhub-infographic-ppt-deep-dive/source-skills/ai-presentation-maker/_meta.json (140b), output/clawhub-infographic-ppt-deep-dive/source-skills/ai-presentation-maker/assets/presentation-helper.sh (13644b), output/clawhub-infographic-ppt-deep-dive/source-skills/ai-presentation-maker/references/export-gamma.sh (2882b), output/clawhub-infographic-ppt-deep-dive/source-skills/ai-presentation-maker/references/export-html-slides.py (16960b), output/clawhub-infographic-ppt-deep-dive/source-skills/ai-presentation-maker/references/export-pptx.py (6047b), output/clawhub-infographic-ppt-deep-dive/source-skills/ai-presentation-maker/references/slide-templates.py (30732b), output/clawhub-infographic-ppt-deep-dive/source-skills/ai-presentation-maker/SKILL.md (40551b), output/clawhub-infographic-ppt-deep-dive/source-skills/article-to-infographic/_meta.json (141b), output/clawhub-infographic-ppt-deep-dive/source-skills/article-to-infographic/references/illustrations-guide.md (8072b), output/clawhub-infographic-ppt-deep-dive/source-skills/article-to-infographic/references/style-presets.md (8787b), output/clawhub-infographic-ppt-deep-dive/source-skills/article-to-infographic/scripts/html_to_png.py (4469b), output/clawhub-infographic-ppt-deep-dive/source-skills/article-to-infographic/skill.json (1717b), output/clawhub-infographic-ppt-deep-dive/source-skills/article-to-infographic/SKILL.md (17884b), output/clawhub-infographic-ppt-deep-dive/source-skills/article-to-infographic/Skills/article-to-infographic-README.md (892b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/_meta.json (138b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/analysis-framework.md (7490b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/base-prompt.md (1082b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/bento-grid.md (851b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/binary-comparison.md (1278b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/bridge.md (907b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/circular-flow.md (759b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/comic-strip.md (847b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/comparison-matrix.md (893b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/dashboard.md (776b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/dense-modules.md (3673b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/funnel.md (821b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/hierarchical-layers.md (1180b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/hub-spoke.md (865b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/iceberg.md (884b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/isometric-map.md (833b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/jigsaw.md (844b)\n\nFile v0.3.5:output/clawhub-infographic-ppt-deep-dive/source-skills/ai-presentation-maker/SKILL.md\n\n---\nname: ai-presentation-maker\nversion: 1.0.0\ndescription: \"AI Presentation Maker — the interview-driven pitch deck generator for your OpenClaw agent. Tell it what you built, who you're presenting to, and pick an angle — it generates a complete slide deck with speaker notes, factual validation, and real cost breakdowns. No made-up ROI. No speculative projections. Just compelling presentations built from actual work. Exports to Markdown, PPTX, and PDF. Works standalone or alongside AI Persona OS. Built by Jeff J Hunter.\"\ntags: [presentation, slides, pitch-deck, keynote, speaker, deck, export, pptx, pdf, markdown, factual]\nauthor: Jeff J Hunter\nhomepage: https://jeffjhunter.com\nmetadata: {\"openclaw\":{\"emoji\":\"🎤\",\"requires\":{\"bins\":[\"bash\",\"sed\",\"find\",\"grep\",\"date\",\"wc\"],\"optionalBins\":[\"openclaw\",\"jq\",\"pandoc\",\"python3\"],\"env\":[],\"optionalEnv\":[]},\"stateDirs\":[\"~/workspace/presentations\",\"~/workspace/presentations/decks\",\"~/workspace/presentations/exports\"],\"persistence\":\"Presentation data stored as JSON + Markdown under ~/workspace/presentations/. All file operations routed through assets/presentation-helper.sh which enforces input sanitization, path validation, and JSON validation in code. No network activity required. Export to PPTX requires python3 + python-pptx. Export to PDF requires pandoc.\",\"cliUsage\":\"The openclaw CLI is OPTIONAL. Core presentation creation works entirely with standard Unix tools and the bundled helper script.\"}}\n---\n\n# 🎤 AI Presentation Maker\n\n**The interview-driven pitch deck generator for your OpenClaw agent.**\n\nTell it what you built. Tell it who's in the room. Pick an angle. Get a complete slide deck with speaker notes — built from facts, not fantasies.\n\n---\n\n## ⛔ AGENT RULES — READ BEFORE DOING ANYTHING\n\n> 1. **Use EXACT text from this file.** Do not paraphrase menus, slide type names, or instructions. Copy them verbatim.\n> 2. **NEVER tell the user to open a terminal or run commands.** You have the exec tool. USE IT. Run every command yourself via exec.\n> 3. **One step at a time.** Interview questions go 1-2 at a time. Never dump the full questionnaire.\n> 4. **NEVER overwrite existing presentation files without asking.** If the file exists, ask before replacing.\n> 5. **FACTUAL VALIDATION IS MANDATORY.** Before generating any slide, check for speculative language. Flag it. The user decides what stays.\n> 6. **Scope: ~/workspace/presentations/ only.** All file operations stay under this directory.\n> 7. **USE THE HELPER SCRIPT FOR ALL FILE OPERATIONS.** Never construct raw shell commands with user input. Always route through `assets/presentation-helper.sh`.\n> 8. **Speaker notes are required.** Every slide gets \"What to say\" and \"What NOT to say\" notes. No exceptions.\n> 9. **No made-up numbers.** If the user hasn't provided a specific stat, don't invent one. Use \"[INSERT ACTUAL NUMBER]\" as placeholder and flag it.\n> 10. **Respect the user's voice.** If they talk casually, the deck should feel casual. If they're formal, match it. The interview captures this.\n\n---\n\n## 🛡️ Helper Script — Security Layer\n\nAll file operations go through `assets/presentation-helper.sh`. This script enforces sanitization in **code**, not in prompt instructions.\n\n**First-run:** Copy the helper to the workspace:\n```bash\ncp assets/presentation-helper.sh ~/workspace/presentations/helper.sh\nchmod +x ~/workspace/presentations/helper.sh\n```\n\n**Usage:**\n```bash\n# Create workspace\n~/workspace/presentations/helper.sh init\n\n# Save presentation metadata (JSON from stdin)\n~/workspace/presentations/helper.sh save-meta < /tmp/pres_meta.json\n\n# Save slide deck (Markdown from stdin)\n~/workspace/presentations/helper.sh save-deck <pres_id>\n\n# List presentations\n~/workspace/presentations/helper.sh list\n\n# Get presentation metadata\n~/workspace/presentations/helper.sh get-meta <pres_id>\n\n# Get slide deck\n~/workspace/presentations/helper.sh get-deck <pres_id>\n\n# Delete presentation\n~/workspace/presentations/helper.sh delete <pres_id>\n\n# Sanitize a string\n~/workspace/presentations/helper.sh sanitize-string \"user input\"\n```\n\n---\n\n## 🔍 Post-Install Check\n\n> **🚨 AGENT: Run this FIRST before showing any menu.**\n\n```bash\n# Check for existing workspace\nls ~/workspace/presentations/config.yaml 2>/dev/null\n\n# Check for AI Persona OS\nls ~/workspace/SOUL.md ~/workspace/AGENTS.md 2>/dev/null | wc -l\n\n# Check export dependencies\nwhich python3 2>/dev/null && echo \"HTML export: ✅ (recommended)\" || echo \"HTML export: ❌ (needs python3)\"\necho \"Gamma export: ✅ (always available)\"\nwhich pandoc 2>/dev/null && echo \"PDF export: ✅\" || echo \"PDF export: ❌ (install pandoc — or use HTML print)\"\nwhich python3 2>/dev/null && python3 -c \"import pptx; print('PPTX export: ✅')\" 2>/dev/null || echo \"PPTX export: ❌ (install python3 + python-pptx)\"\n```\n\n**If config.yaml exists → workspace is set up.** Show:\n> \"🎤 Presentation Maker is ready. You have X decks saved. Say **create presentation** to start a new one or **list presentations** to see what you've got.\"\n\n**If config.yaml is missing → fresh install.** Show the welcome message:\n\n> **🚨 AGENT: OUTPUT THE EXACT TEXT BELOW VERBATIM.**\n\n```\n🎤 Welcome to AI Presentation Maker!\n\nI build slide decks from your actual work — not templates\nstuffed with placeholder text.\n\nHere's how it works:\n\n1. 🎯 I interview you (5 min)\n   What you built, who's in the room, what matters\n\n2. 🧭 I suggest angles (pick one)\n   3-5 ways to frame your story\n\n3. 📊 I generate your deck\n   Slides + speaker notes + factual validation\n\n4. ✏️ You refine\n   Add details, change tone, cut slides\n\n5. 📦 Export\n   Markdown (default), PPTX, or PDF\n\nEvery number in your deck comes from YOU.\nNo made-up ROI. No fake projections.\n\nReady? Say \"create presentation\" to start.\n```\n\nWait for explicit confirmation before proceeding.\n\n---\n---\n\n# Setup (First Run Only)\n\n## Create Workspace\n\n> **AGENT: Run on first use.**\n\n```bash\nmkdir -p ~/workspace/presentations/{decks,exports,archive}\ncp assets/presentation-helper.sh ~/workspace/presentations/helper.sh\nchmod +x ~/workspace/presentations/helper.sh\n```\n\n## Default Config\n\nWrite `~/workspace/presentations/config.yaml`:\n\n```yaml\n# AI Presentation Maker — Configuration\n# Edit directly or say \"edit config\" in chat\n\ndefaults:\n  tone: \"conversational\"  # professional | conversational | humorous | technical\n  max_slides: 20\n  include_speaker_notes: true\n  factual_validation: true     # Flag speculative language\n  include_mistakes_slide: true  # Authenticity builder\n  include_costs_slide: true     # Real investment breakdown\n\nexport:\n  default_format: \"html\"\n  html_theme: \"spark\"   # terminal | executive | spark | clean\n  per_slide_html: false  # true = individual HTML files per slide (keynote quality)\n  formats_available:\n    markdown: true\n    html: true        # Zero dependencies — recommended\n    gamma: true       # Zero dependencies — for Gamma.app users\n    pptx: false       # Set true after installing python-pptx\n    pdf: false        # Set true after installing pandoc (or use HTML print)\n\nspeaker:\n  name: \"\"           # Set during first presentation or say \"edit config\"\n  title: \"\"\n  company: \"\"\n  bio: \"\"\n\nbranding:\n  cta_links: []\n  training_links: []\n  coupon_codes: []\n```\n\n> **AGENT: If AI Persona OS is detected**, pull speaker info from SOUL.md or AGENTS.md if available. Ask user to confirm.\n\n---\n---\n\n# Creating a Presentation\n\n## The Interview\n\nWhen user says \"create presentation\", \"new deck\", \"build slides\", \"make a pitch deck\", or similar:\n\n> **AGENT: Follow this interview flow. Ask 1-2 questions per message. Be conversational. Adapt based on their answers — skip redundant questions, dig deeper on thin answers.**\n\n### Phase 1: The Subject (1 message)\n\n> \"What's this presentation about? Give me the short version — what did you build, do, or accomplish?\"\n\n**Capture:** Core subject. This seeds everything.\n\n**If they give a thin answer** (e.g., \"my AI project\"), follow up:\n> \"Tell me more — what specifically did you build? What does it do? How long did it take?\"\n\n---\n\n### Phase 2: The Audience (1 message)\n\n> \"Who's in the room?\n> - How many people?\n> - What do they do? (founders, developers, executives, students...)\n> - What are they hoping to learn or get from this?\"\n\n**Capture:** Audience profile. Drives tone, depth, and angle selection.\n\n---\n\n### Phase 3: The Speaker (1 message)\n\n> \"Quick — your name, title, and one sentence of credibility. What makes you the person to give this talk?\"\n>\n> *(If I already have your speaker info from config, I'll use that — just confirm.)*\n\n**Capture:** Speaker identity. Goes on title slide and shapes authority framing.\n\n**If config already has speaker info:** Show it and ask to confirm or update.\n\n---\n\n### Phase 4: The Work (1-2 messages)\n\nThis is the most important phase. Get SPECIFICS.\n\n> \"Now the meat — what did you actually do? I need real details:\n> - What was built or created?\n> - How long did it take?\n> - What results do you have so far? (actual numbers only)\n> - What did it cost? (hardware, software, time)\n> - What went wrong? (mistakes are gold for presentations)\"\n\n**Capture:** Factual foundation. Every claim in the deck traces back to this.\n\n**If they skip costs:** Ask specifically:\n> \"What about costs? Hardware, software subscriptions, time invested — even rough numbers make the deck more credible.\"\n\n**If they skip mistakes:** Ask specifically:\n> \"Any mistakes or things that didn't work the first time? Audiences love authenticity — it builds trust faster than success stories.\"\n\n---\n\n### Phase 5: The Angle (1 message)\n\nBased on everything gathered, generate 3-5 presentation angles.\n\n> **AGENT — Angle generation rules:**\n> 1. Each angle is a distinct FRAMING of the same content — not different topics\n> 2. Each angle implies a different audience takeaway\n> 3. Name each angle with a punchy title (3-6 words)\n> 4. Add one sentence explaining the angle's focus\n> 5. Consider these angle categories:\n>    - **Cost/Time Savings** — \"We did X for $Y in Z hours\"\n>    - **Capability Expansion** — \"Now we can do things we couldn't before\"\n>    - **New Business Model** — \"This changes how we make money\"\n>    - **Competitive Advantage** — \"While others are still doing X, we're doing Y\"\n>    - **Personal Transformation** — \"How this changed my approach to everything\"\n>    - **Democratization** — \"Anyone can do this now, here's how\"\n>    - **Behind the Scenes** — \"Here's exactly how we built it, warts and all\"\n\n**Present like this:**\n\n```\n🧭 Here are 5 angles for your deck:\n\n1. [Punchy Title]\n   [One sentence explaining the focus]\n\n2. [Punchy Title]\n   [One sentence explaining the focus]\n\n3. [Punchy Title]\n   [One sentence explaining the focus]\n\n4. [Punchy Title]\n   [One sentence explaining the focus]\n\n5. [Punchy Title]\n   [One sentence explaining the focus]\n\nWhich one resonates? (pick a number or describe your own)\n```\n\n**Capture:** Selected angle. This determines the narrative arc of the entire deck.\n\n---\n\n### Phase 6: Resources & CTA (1 message)\n\n> \"Last thing — any resources to include?\n> - Links to share? (tools, courses, websites)\n> - Coupon codes or special offers?\n> - What's the ONE thing you want people to do after this talk? (sign up, book a call, visit a URL, join a community)\"\n\n**Capture:** CTA and resources. Goes on closing slides.\n\n**If they say \"nothing\":** That's fine. Not every deck needs a hard CTA.\n\n---\n\n## Interview Complete → Generate Deck\n\nAfter all 6 phases, confirm the brief:\n\n```\n🎤 PRESENTATION BRIEF\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n📌 Subject: [subject]\n👥 Audience: [size] [roles] — [what they want]\n🎙️ Speaker: [name], [title]\n🧭 Angle: [selected angle]\n💰 Costs: [summary]\n📊 Results: [summary]\n❌ Mistakes: [summary]\n🎯 CTA: [what they should do after]\n\nGenerating your deck now...\n```\n\nThen proceed to **Deck Generation**.\n\n---\n---\n\n# Deck Generation\n\n## Slide Structure\n\nThe agent generates slides based on the selected angle and gathered data. Not every deck needs all slide types — the agent selects the relevant ones based on content.\n\n### Core Slides (always included)\n\n**SLIDE 1: Title Slide**\n- Presentation title (from the selected angle)\n- Speaker name + title\n- Event/date (if provided)\n\n**SLIDE 2: The Hook**\n- ONE fact-based statement that grabs attention\n- Must be verifiable from the interview data\n- No speculation. Example: \"Yesterday, I built a lead gen system in 5 hours for $40/month. It sent 20 emails and got a reply by midnight.\"\n\n**SLIDE 3: The Problem**\n- The verified pain point the audience has\n- Must connect to what was built\n- Draw from audience profile (Phase 2)\n\n**SLIDE 4: What We Built**\n- Concrete description of the work\n- Timeline\n- Screenshots/evidence descriptions (agent notes where visuals should go)\n\n**SLIDE 5: What It Does**\n- Capabilities as a list or table\n- Each capability must be real (no \"coming soon\" features unless flagged)\n\n**SLIDE 6: Real Results**\n- Actual numbers from the interview\n- No rounding up. No \"approximately.\" Use exact figures.\n- If results are early/limited: \"Early results from [timeframe]:\" — frame as an experiment, not a case study\n\n### Situational Slides (included when relevant data exists)\n\n**SLIDE: Investment / Real Costs**\n- Hardware, software, time — actual numbers\n- Include if: user provided cost data\n- Format as a simple breakdown table\n\n**SLIDE: Mistakes & What We Learned**\n- Real failures from the interview\n- What went wrong → what was fixed → what was learned\n- Include if: user shared mistakes AND `config.include_mistakes_slide: true`\n\n**SLIDE: Why Now**\n- What changed that made this possible/easier\n- Historical context — \"You could have done this before, but...\"\n- Include if: the work involves new technology or methodology\n\n**SLIDE: DIY Path**\n- How the audience could replicate this themselves\n- Tools, steps, approximate time/cost\n- Include if: audience profile suggests they want to do it themselves\n\n**SLIDE: What We're Testing**\n- Experiments in progress, framed honestly\n- \"We're currently testing...\" not \"This will...\"\n- Include if: user mentioned ongoing experiments\n\n**SLIDE: Potential (WITH CAVEATS)**\n- Conservative projections ONLY\n- MUST include caveat language: \"Based on early results, IF current trends hold...\"\n- Include if: user explicitly wants projections\n- **⚠️ Flag this slide for factual review**\n\n**SLIDE: What You Could Build**\n- Framework for the audience to apply to their own context\n- Not prescriptive — suggestive. \"Here's a framework for thinking about this.\"\n- Include if: audience is builders/doers\n\n### Closing Slides (always included)\n\n**SLIDE: The Offer / CTA**\n- Clear single action for the audience\n- Include links, codes, URLs from Phase 6\n- If no CTA was provided → make this a \"Where to Learn More\" slide\n\n**SLIDE: Q&A**\n- Simple closer\n- Include speaker contact info\n- Include resource links\n\n---\n\n## Speaker Notes Format\n\nEvery slide MUST include speaker notes in this format:\n\n```markdown\n### Speaker Notes — [Slide Title]\n\n**What to say:**\n[2-4 bullet points of what the speaker should communicate]\n[Include specific numbers to reference]\n[Include transitions to the next slide]\n\n**What NOT to say:**\n[1-2 things to avoid]\n[Common traps: overpromising, speculation, competitor bashing]\n\n**Timing:** ~[X] minutes\n\n**Visual aids:** [Screenshots, demos, or props to reference]\n```\n\n> **AGENT: \"What NOT to say\" is critical.** Common entries:\n> - \"Don't promise specific ROI numbers you haven't verified\"\n> - \"Don't compare to competitors by name\"\n> - \"Don't say 'this will definitely...' — say 'based on what we've seen...'\"\n> - \"Don't skip the costs slide — transparency builds trust\"\n> - \"Don't apologize for early results — frame as experiments\"\n\n---\n\n## Factual Validation\n\n> **🚨 MANDATORY: Run this check before showing the generated deck to the user.**\n\nScan every slide for:\n\n| Flag | Pattern | Action |\n|------|---------|--------|\n| 🔴 **Speculative** | \"could save\", \"might generate\", \"potential to\", \"up to\", \"estimated\" | Flag and suggest rewording to factual language |\n| 🔴 **Unverified number** | Any number not from the interview data | Replace with `[INSERT ACTUAL NUMBER]` placeholder |\n| 🟡 **Projection** | Future tense claims about results | Add caveat: \"Based on early results, IF trends hold...\" |\n| 🟡 **Superlative** | \"best\", \"fastest\", \"only\", \"first\" | Flag — user must confirm or remove |\n| 🟢 **Hedged OK** | \"We're testing\", \"Early results suggest\", \"In our experience\" | No action — these are honest framings |\n\nAfter generation, show a validation summary:\n\n```\n📋 FACTUAL VALIDATION\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n🔴 Speculative claims found: [X]\n🟡 Projections needing caveats: [X]\n🟢 Factual claims verified: [X]\n\n[List each flag with slide number and the flagged text]\n\nFix these? (yes / show me / leave as-is)\n```\n\n---\n\n## Tone Profiles\n\nThe deck's language adapts to the selected tone:\n\n**Professional**\n- Formal language, no contractions\n- Data-forward, minimal storytelling\n- \"The system processed 20 outreach emails within the first 6 hours of deployment.\"\n\n**Conversational (DEFAULT)**\n- Contractions, natural language\n- Story-driven with data supporting\n- \"We built this thing yesterday. Sent 20 emails. Got a reply by midnight.\"\n\n**Humorous**\n- Self-deprecating, light\n- Mistakes slide is emphasized\n- \"So naturally, the first thing it did was email the wrong person. We fixed that.\"\n\n**Technical**\n- Jargon-appropriate, architecture-focused\n- Include system diagrams, stack details\n- \"The pipeline uses JSON-based lead storage with cron-triggered sequence management.\"\n\n---\n---\n\n# Asset Planning (Before Generation)\n\nAfter the interview and outline are complete, but BEFORE generating slides, plan all visual assets.\n\n> **AGENT: Run this checklist before generating any slides:**\n\n## Asset Checklist\n\n1. **Image needs** — Which slides need images? (screenshots, product photos, diagrams)\n   - Map each image to a specific slide in the outline\n   - If user mentioned a demo → screenshot slide\n   - If user mentioned data → plan a big_number or comparison slide\n   - If user has a logo → title and closing slides\n\n2. **QR codes** — Does the CTA include a URL?\n   - Generate QR codes BEFORE slide generation (not during)\n   - Save to `~/workspace/presentations/assets/{pres_id}/`\n\n3. **Data visualization** — Any numbers that need charts or infographics?\n   - Plan the visualization type (comparison table, big number, timeline)\n   - Match to a slide type from the template gallery\n\n4. **Missing assets** — What's missing?\n   - Use `[IMAGE: description of what's needed]` placeholder\n   - Tell user: \"I need a screenshot of [X] to complete slide [N]. Can you provide one?\"\n\n> **AGENT: Never generate slides with broken image paths.** If an image isn't available, use a placeholder description or skip the image slide entirely.\n\n## Custom Style Instruction\n\nIf the user wants a custom look beyond the 4 built-in themes, build a `style_instruction` object:\n\n```json\n{\n  \"aesthetic_direction\": \"A stark, high-contrast design for maximum stage presence.\",\n  \"color_palette\": \"Background: #1A1A1A, Title: #FFFFFF, Body: #B3B3B3, Accent: #00E676\",\n  \"typography\": \"Font Family: Roboto. Headline: 64px, Body: 32px, Caption: 18px.\"\n}\n```\n\nPass this to the template engine:\n\n```bash\npython3 references/slide-templates.py \\\n  --style-instruction '{\"aesthetic_direction\":\"...\",\"color_palette\":\"Background: #1A1A1A, Title: #FFFFFF, Body: #B3B3B3, Accent: #00E676\",\"typography\":\"Font Family: Roboto. Headline: 64px, Body: 32px.\"}' \\\n  --theme custom --type title --title \"My Talk\" --output slide_01.html\n```\n\n> **AGENT: When user asks for custom colors/fonts:**\n> 1. Ask for their brand colors (background, text, accent)\n> 2. Ask for font preference (or default to Inter)\n> 3. Build the style_instruction JSON\n> 4. Generate all slides using `--theme custom --style-instruction '{...}'`\n\n---\n---\n\n# Quality Checklist (Post-Generation)\n\nAfter generating all slides, run this QA check BEFORE showing to user.\n\n> **AGENT: Run this checklist after EVERY deck generation. Report any issues found.**\n\n## Automated Checks\n\n| Check | What To Verify | Action If Failed |\n|-------|---------------|-----------------|\n| **Style consistency** | All slides use same theme colors/fonts | Re-generate with correct theme |\n| **Content integrity** | Every interview fact appears in slides | Add missing content |\n| **One idea per slide** | No slide has more than 2-3 bullet points | Split into multiple slides |\n| **Overflow prevention** | No text exceeds 6 lines per slide body | Split or trim |\n| **Image validation** | All `src=` paths exist or are placeholders | Replace with `[IMAGE: description]` |\n| **Accessibility** | All `<img>` tags have `alt` attributes | Add descriptive alt text |\n| **Link validation** | All URLs in CTA/closing are reachable | Flag broken links |\n| **Speaker notes** | Every slide has \"What to say\" notes | Add notes for bare slides |\n| **Factual validation** | No speculative language (already handled) | Run validation engine |\n\n## Text Length Rules\n\n| Element | Maximum | If Exceeded |\n|---------|---------|-------------|\n| Slide title | 8 words | Shorten or split into title + subtitle |\n| Bullet point | 15 words | Rewrite more concisely |\n| Bullets per slide | 5 items | Split into 2 slides |\n| Body paragraph | 3 sentences | Convert to bullets or split |\n| Speaker note | 4 sentences per section | Trim to essentials |\n\n> **AGENT: After QA, report:**\n> \"✅ Quality check complete: [N] slides, [N] issues found.\"\n> Then list any issues with slide numbers.\n\n---\n---\n\n# Edge Case Handling\n\n## Long Text Auto-Split\n\nIf a slide's content exceeds the maximum (5 bullets or 3 paragraphs), automatically split:\n\n1. Keep the original title for the first slide\n2. Add \"(cont'd)\" to the title for subsequent slides\n3. Split content at natural break points (paragraph breaks, after 3rd bullet)\n4. Each resulting slide must pass the text length rules\n\n> **AGENT: When interview data produces too much content for one slide:**\n> \"That's a lot of great content. I'm splitting it across 2 slides to keep each one clean and readable.\"\n\n## Missing Sections\n\nIf the interview is incomplete (e.g., user skipped the costs question):\n\n- **Do NOT** generate a costs slide with made-up numbers\n- **Do NOT** silently skip the slide\n- **DO** tell the user: \"I notice we didn't cover costs. Want me to add a costs slide? I'll need the real numbers.\"\n- **DO** generate remaining slides normally\n\n## Missing Images\n\nIf a slide references an image that doesn't exist:\n\n- For screenshots: Replace with a styled placeholder box saying `[Screenshot: description]`\n- For QR codes: Skip the QR element, keep the link text visible\n- For logos: Use text-only version of the name\n- **Never** leave a broken `<img>` tag in the output\n\n## Unusual Content\n\n- **All numbers**: If interview only provided one or two data points, use `big_number` slides instead of tables\n- **No mistakes**: If user says \"we didn't make mistakes\" → skip mistakes slide entirely, don't force it\n- **No CTA**: If user has no links/offers → use a simple closing slide with contact info only\n- **Very short talk**: If user wants 3-5 slides, use only: title, one content, closing\n\n---\n---\n\n# In-Chat Commands\n\n| Command | What It Does |\n|---------|-------------|\n| `create presentation` | Start the interview → generate a new deck |\n| `list presentations` | Show all saved decks with dates and slide counts |\n| `show [name]` | Display a saved deck in chat |\n| `edit [name]` | Re-open a deck for changes |\n| `add slide [name]` | Add a new slide to an existing deck |\n| `remove slide [name] [#]` | Remove a slide by number |\n| `reorder [name]` | Show slides and let user drag/reorder |\n| `change tone [name] [tone]` | Rewrite deck in a different tone |\n| `export [name] [format]` | Export to markdown/html/gamma/pptx/pdf |\n| `speaker notes [name]` | Show just the speaker notes |\n| `validate [name]` | Re-run factual validation |\n| `duplicate [name]` | Copy a deck for a different audience/angle |\n| `archive [name]` | Move to archive |\n| `delete [name]` | Delete permanently (asks to confirm) |\n| `presentation help` | Show all commands |\n\n> **AGENT: Recognize natural language.** \"Make me a pitch deck\" = `create presentation`. \"Show me my slides\" = `list presentations`. \"Export it as PowerPoint\" = `export [last deck] pptx`. Be flexible.\n\n---\n---\n\n# Editing & Refinement\n\nWhen user says \"edit [name]\" or asks to change a deck:\n\n## Quick Edits\n\nThe agent should handle these naturally:\n\n| User Says | Agent Does |\n|-----------|-----------|\n| \"Add real costs\" | Asks for cost details, adds/updates Investment slide |\n| \"Remove projections\" | Strips all projection language, removes Potential slide if needed |\n| \"Add [specific detail]\" | Adds to the relevant slide or creates a new one |\n| \"Make it shorter\" | Suggests slides to cut, asks for approval |\n| \"Make it longer\" | Suggests slides to add based on interview data |\n| \"Change the tone to [X]\" | Rewrites all slides in the new tone |\n| \"Add a mistake\" | Asks what went wrong, adds to Mistakes slide |\n| \"Update the results\" | Asks for new numbers, updates Results slide |\n| \"Change the angle\" | Re-generates deck with new angle (keeps all data) |\n| \"Add speaker notes\" | Generates notes for any slides missing them |\n| \"Move slide X to position Y\" | Reorders slides |\n\n## Major Revisions\n\nIf the user wants a fundamentally different deck:\n> \"That's a big change. Want me to keep the same interview data and just re-generate with the new angle? Or start fresh?\"\n\n---\n---\n\n# Export\n\n## Markdown (Default)\n\nEvery presentation is stored as Markdown at `~/workspace/presentations/decks/{pres_id}.md`.\n\n**Markdown format:**\n\n```markdown\n# [Presentation Title]\n*[Speaker Name] — [Title]*\n*[Date]*\n\n---\n\n## Slide 1: [Slide Title]\n\n[Slide content]\n\n> **Speaker Notes:**\n> **Say:** [what to say]\n> **Don't say:** [what not to say]\n> **Timing:** ~X min\n\n---\n\n## Slide 2: [Slide Title]\n\n[Slide content]\n\n...\n\n---\n\n## Resources\n\n- [Link 1]\n- [Link 2]\n\n---\n\n*Generated by AI Presentation Maker — Facts, not fantasies.*\n```\n\n---\n---\n\n# 🎨 Template Gallery\n\nWhen generating HTML slides, the user picks a **theme** and the agent selects **slide types** from the gallery. The agent can also generate per-slide HTML files for maximum control.\n\n## Choosing a Theme\n\n> **AGENT: Ask the user to pick a theme BEFORE generating HTML slides. Show this menu:**\n\n```\n🎨 Pick a visual theme for your slides:\n\n1. 🖥️  Terminal    — Dark + green, terminal window frames. Hacker/tech vibe.\n2. 🏢  Executive   — Navy + gold, clean serif headings. Boardroom ready.\n3. ⚡  Spark       — Purple/teal gradient, modern sans-serif. Startup energy.\n4. ✨  Clean       — White + charcoal, Swiss minimal. Universal and professional.\n5. 🎨  Custom      — Tell me your brand colors and I'll build a custom theme.\n\nWhich one? (pick a number or describe what you want)\n```\n\n**If the user describes something custom** (e.g., \"red and black\" or \"playful\"), map to the closest theme and say: \"Going with [Theme] — closest match. I can tweak colors after.\"\n\n## Slide Type Gallery\n\nThe agent selects from these **11 premade slide layouts**. Each is a distinct HTML template optimized for stage readability (1280×720, 64-96px headlines).\n\n| Type | Name | What It's For | Key Fields |\n|------|------|---------------|------------|\n| `title` | Title Slide | Hero opener — name, subtitle, speaker | title, subtitle, speaker |\n| `section` | Section Divider | Break between major sections | title, subtitle |\n| `text` | Simple Text | Bullet points or paragraphs | title, body |\n| `text_and_image` | Text + Image | Split layout — text left, image right | title, body, image_path |\n| `big_number` | Big Number | ONE massive stat as hero element | number, label, context |\n| `comparison` | Comparison | Side-by-side (before/after, old/new) | title, left/right columns |\n| `screenshot` | Screenshot | Full-width image with caption overlay | title, image_path, caption |\n| `quote` | Quote | Large pull quote with attribution | quote_text, attribution |\n| `timeline` | Timeline | Step-by-step process or chronology | title, steps[] |\n| `qr_code` | QR Code | QR hero + CTA link + scan prompt | title, qr_image_path, link_text |\n| `closing` | Closing / CTA | Final slide with links and contact | title, cta_text, links[], speaker |\n\n> **AGENT: When generating a deck, select slide types based on the interview data.**\n>\n> **Mapping guide:**\n> - Hook fact → `big_number` or `title`\n> - Problem statement → `text`\n> - What we built → `text` or `text_and_image` (with screenshot)\n> - Results → `big_number` (for hero stat) + `text` (for detail)\n> - Costs → `comparison` (old way vs new way)\n> - Mistakes → `text` (with bullets)\n> - Quote from user or testimonial → `quote`\n> - Process/timeline → `timeline`\n> - CTA with link/QR → `qr_code`\n> - Closing → `closing`\n\n## Generating Per-Slide HTML\n\nFor maximum visual control, generate each slide as its own HTML file:\n\n```bash\npython3 references/slide-templates.py \\\n  --theme terminal \\\n  --type big_number \\\n  --number \"71\" \\\n  --label \"Leads Imported\" \\\n  --context \"In under 5 minutes\" \\\n  --output ~/workspace/presentations/exports/slide_04.html\n```\n\n> **AGENT: When user asks for \"beautiful slides\" or \"stage-ready slides\" or \"keynote quality\":**\n> 1. Ask which theme (show the menu above)\n> 2. Generate the markdown deck first (for content)\n> 3. Then generate per-slide HTML files using `slide-templates.py`\n> 4. Each slide gets its own `.html` file in the exports folder\n> 5. Tell user: \"Your slides are individual HTML files in exports/. Open each in a browser — they're stage-ready at 1280×720.\"\n\n## Combined Deck vs Per-Slide Files\n\n| Approach | Best For | How |\n|----------|----------|-----|\n| **Combined deck** (`export-html-slides.py`) | Presenting from one file, quick sharing | Arrow keys navigate between slides |\n| **Per-slide files** (`slide-templates.py`) | Maximum visual control, custom layouts per slide | Each slide is a standalone HTML file |\n| **Both** | Best of both worlds | Generate per-slide for design, combined for presenting |\n\n> **AGENT: Default to the combined deck for most users.** Only use per-slide when the user specifically wants individual files or asks for \"beautiful\" / \"stage-ready\" / \"keynote-quality\" slides.\n\n---\n\n## 🌐 HTML Slides (Recommended)\n\n> **Zero dependencies** beyond Python 3 standard library. No pip installs.\n\nBeautiful, self-contained HTML presentation you can:\n- **Present directly** in any browser (full-screen, arrow key navigation)\n- **Print to PDF** with pixel-perfect slide-per-page layout (Ctrl+P)\n- **Share as a single file** — no server, no internet required\n- **Toggle speaker notes** live during presentation (press N)\n\n**3 built-in themes:**\n\n| Theme | Vibe | Best For |\n|-------|------|----------|\n| `gradient` | Deep purple/teal, modern | Founder/startup audiences (DEFAULT) |\n| `dark` | Navy/red, dramatic | Stage presentations, evening events |\n| `light` | Clean white/blue | Corporate, enterprise audiences |\n\nWhen user says \"export as html\", \"make beautiful slides\", \"export for presenting\", or similar:\n\n```bash\n~/workspace/presentations/helper.sh export-html {pres_id} gradient\n```\n\n> **AGENT: Ask about theme:**\n> \"Which vibe? **Gradient** (modern, default), **Dark** (dramatic stage look), or **Light** (clean corporate)?\"\n\n**HTML slide features:**\n- ⌨️ Arrow keys / space to navigate slides\n- 📱 Touch/swipe on mobile\n- 🎙️ Press **N** to toggle speaker notes panel\n- 🖨️ Print button — each slide = one page, notes hidden\n- 📊 Progress bar at bottom\n- 📐 Responsive — works on any screen size\n\n> **After export:** \"Your slides are at `exports/{name}.html`. Open in any browser to present. Press N for speaker notes. Print (Ctrl+P) for a beautiful PDF.\"\n\n## 🟣 Gamma.app Export\n\n> **Zero dependencies.** Pure shell script.\n\nExports clean markdown optimized for [Gamma.app](https://gamma.app) import. Gamma auto-designs your slides — you just provide the content.\n\n**What the Gamma export does:**\n- Strips all speaker notes (Gamma doesn't import them)\n- Removes note-style blockquotes and metadata lines\n- Cleans \"Slide N:\" prefixes from headings\n- Each `##` heading becomes a Gamma \"card\"\n- Pure content — Gamma auto-styles everything\n\nWhen user says \"export for gamma\", \"gamma export\", \"I want to use gamma\":\n\n```bash\n~/workspace/presentations/helper.sh export-gamma {pres_id}\n```\n\n> **AGENT: After Gamma export, show these instructions:**\n> \"Your Gamma-ready file is at `exports/{name}_gamma.md`.\n>\n> To import into Gamma:\n> 1. Go to **gamma.app** → **New** → **Paste text**\n> 2. Paste the markdown content or upload the .md file\n> 3. Gamma turns each heading into a designed card\n> 4. Pick a theme and click **Generate**\"\n\n## PPTX Export\n\n> **Requires:** `python3` + `python-pptx` (`pip install python-pptx`)\n\nWhen user says \"export as powerpoint\" or \"export pptx\":\n\n1. Check: `python3 -c \"import pptx\" 2>/dev/null`\n2. If missing → \"Install with: `pip install python-pptx`. Want me to try?\"\n3. If available → run `references/export-pptx.py`\n4. Save to `~/workspace/presentations/exports/{pres_id}.pptx`\n\n## PDF Export\n\n> **Requires:** `pandoc` — OR use the HTML Print button (recommended)\n\nWhen user says \"export as pdf\":\n\n1. **Recommend HTML route first:** \"The HTML slides have a built-in Print button that creates a beautiful PDF. Want to try that instead?\"\n2. If user wants pandoc: check `which pandoc`, run export\n3. Save to `~/workspace/presentations/exports/{pres_id}.pdf`\n\n## Export Comparison\n\n| Format | Dependencies | Visual Quality | Best For |\n|--------|-------------|---------------|----------|\n| **Markdown** | None | Content only | Editing, version control, sharing |\n| **HTML Slides** | Python 3 only | ⭐⭐⭐⭐⭐ | Presenting, printing, sharing as file |\n| **Gamma** | None | Gamma designs it | Users who want AI-designed slides |\n| **PPTX** | python-pptx | ⭐⭐⭐ | PowerPoint users, corporate |\n| **PDF** | pandoc | ⭐⭐ | Static distribution |\n\n---\n---\n\n# Data Structure\n\n## Presentation Metadata (JSON)\n\nStored at `~/workspace/presentations/decks/{pres_id}.json`:\n\n```json\n{\n  \"presentation_id\": \"[generated 8-char hex]\",\n  \"name\": \"[user-friendly name]\",\n  \"created\": \"[ISO timestamp]\",\n  \"updated\": \"[ISO timestamp]\",\n  \"speaker\": {\n    \"name\": \"[from interview]\",\n    \"title\": \"[from interview]\",\n    \"company\": \"[from interview]\"\n  },\n  \"audience\": {\n    \"size\": 0,\n    \"roles\": [],\n    \"interests\": [],\n    \"description\": \"[from interview]\"\n  },\n  \"angle\": {\n    \"title\": \"[selected angle title]\",\n    \"description\": \"[angle description]\"\n  },\n  \"tone\": \"conversational\",\n  \"work\": {\n    \"subject\": \"[what was built/done]\",\n    \"timeline\": \"[how long it took]\",\n    \"results\": {},\n    \"costs\": {},\n    \"mistakes\": []\n  },\n  \"resources\": {\n    \"cta\": \"[primary call to action]\",\n    \"links\": [],\n    \"coupon_codes\": []\n  },\n  \"slides\": [\n    {\n      \"slide_number\": 1,\n      \"slide_type\": \"title\",\n      \"title\": \"[slide title]\"\n    }\n  ],\n  \"validation\": {\n    \"speculative_flags\": 0,\n    \"projection_flags\": 0,\n    \"verified_claims\": 0,\n    \"last_validated\": \"[timestamp]\"\n  }\n}\n```\n\n---\n---\n\n# Duplicate for Different Audiences\n\nWhen user says \"duplicate [name]\" or \"I need this for a different audience\":\n\n1. Copy the metadata JSON\n2. Generate new `presentation_id`\n3. Ask: \"Same content, different audience? Tell me about the new audience.\"\n4. Re-run Phase 2 (Audience) and Phase 5 (Angle) only\n5. Re-generate the deck with new angle/tone\n6. Save as a new presentation\n\nThis lets users create multiple versions of the same talk for different events.\n\n---\n---\n\n# Configuration Reference\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `defaults.tone` | string | conversational | professional / conversational / humorous / technical |\n| `defaults.max_slides` | number | 20 | Maximum slides per deck |\n| `defaults.include_speaker_notes` | boolean | true | Auto-generate speaker notes |\n| `defaults.factual_validation` | boolean | true | Flag speculative language |\n| `defaults.include_mistakes_slide` | boolean | true | Include authenticity slide |\n| `defaults.include_costs_slide` | boolean | true | Include investment breakdown |\n| `export.default_format` | string | html | Default export format |\n| `export.html_theme` | string | spark | terminal / executive / spark / clean |\n| `export.per_slide_html` | boolean | false | Generate individual HTML files per slide |\n| `export.formats_available.*` | boolean | varies | Which export formats are ready |\n| `speaker.*` | string | \"\" | Default speaker info (reused across decks) |\n| `branding.cta_links` | array | [] | Default CTA links for all decks |\n| `branding.training_links` | array | [] | Default training resource links |\n| `branding.coupon_codes` | array | [] | Default coupon codes |\n\n---\n---\n\n# Input Sanitization Rules\n\n**⚠️ PRIMARY DEFENSE: The helper script (`~/workspace/presentations/helper.sh`) enforces sanitization in code.**\n\nSecondary rules for edge cases:\n1. **Strip shell metacharacters** from all user input before exec\n2. **JSON writes** go through the helper's `save-meta` command with validation\n3. **Heredocs** use quoted delimiters (`<< 'EOF'`) to prevent expansion\n4. **Length limits:** Presentation name ≤ 100 chars, slide content ≤ 5000 chars per slide\n5. **Never pass unsanitized user input to exec.** No exceptions.\n\n---\n---\n\n# What This Skill Does NOT Do\n\n- **Does NOT use external slide APIs.** References to `slide_initialize`, `slide_edit`, and `slide_present` in some OpenClaw guides are Manus-specific tools not available here. This skill generates HTML/Markdown files directly.\n- **Does NOT make up numbers.** Every stat comes from your interview answers. Missing data gets a `[INSERT]` placeholder.\n- **Does NOT predict the future.** Projections are conservative, caveated, and flagged for your review.\n- **Does NOT replace practice.** A great deck with a bad delivery is still a bad presentation. Use the speaker notes.\n- **Does NOT access files outside `~/workspace/presentations/`** without explicit permission.\n- **Does NOT require internet for presenting.** HTML slides are self-contained (fonts are loaded from Google Fonts CDN but slides degrade gracefully without them).\n\n---\n---\n\n## Why This Exists\n\nMost presentations are built backwards. People open a template, fill in slides, and try to find a story. The result is generic decks with made-up projections and no soul.\n\nAI Presentation Maker works forwards. You tell it what actually happened. It finds the story. Every number is real. Every claim is verified. Every mistake is included because authenticity sells better than perfection.\n\nThe interview takes 5 minutes. The deck takes 30 seconds. The refinement takes however long you want. And when you stand up to present, you know every word is true.\n\n---\n\n## Who Built This\n\n**Jeff J Hunter** is the creator of the AI Persona Method and founder of the world's first AI Certified Consultant program.\n\nHe runs the largest AI community (3.6M+ members) and has been featured in Entrepreneur, Forbes, ABC, and CBS. As founder of VA Staffer (150+ virtual assistants), Jeff has spent a decade building systems that let humans and AI work together effectively.\n\nAI Presentation Maker is part of the AI Persona ecosystem — the same system Jeff uses to build his own keynotes.\n\n---\n\n## Want to Make Money with AI?\n\nMost people burn API credits with nothing to show for it.\n\nThis skill gives you the pitch deck. But if you want to turn AI into actual income, you need the complete playbook.\n\n**→ Join AI Money Group:** https://aimoneygroup.com\n\nLearn how to build AI systems that pay for themselves.\n\n---\n\n## Connect\n\n- **Website:** https://jeffjhunter.com\n- **AI Persona Method:** https://aipersonamethod.com\n- **AI Money Group:** https://aimoneygroup.com\n- **LinkedIn:** /in/jeffjhunter\n\n---\n\n## License\n\nMIT — Use freely, modify, distribute. Attribution appreciated.\n\n---\n\n*AI Presentation Maker — Facts, not fantasies.* 🎤\n\nFile v0.3.5:output/clawhub-infographic-ppt-deep-dive/source-skills/article-to-infographic/SKILL.md\n\n---\nname: article-to-infographic\ndescription: Transform articles, blog posts, reports, or any text content into visually stunning, self-contained HTML infographics. Use when the user wants to convert text into an infographic, create a visual summary of an article, make a data visualization from written content, or generate an infographic from a URL, file, or pasted text. Supports multiple infographic styles (timeline, statistics, comparison, process flow, listicle) with distinctive, non-generic aesthetics.\n---\n\n# Article to Infographic\n\nTransform any article or text content into a visually compelling, self-contained HTML infographic. Output is a single HTML file with inline CSS/JS -- zero dependencies, opens in any browser, print-ready for PDF export.\n\n## Core Philosophy\n\n1. **Content-First** -- Analyze the article before choosing layout.\n2. **Smart Layout** -- Match infographic type to content type automatically.\n3. **Distinctive Design** -- No generic AI aesthetics. Every infographic feels custom-crafted.\n4. **Zero Dependencies** -- Single HTML file with inline CSS/JS.\n5. **Print-Ready** -- Include print media queries for clean PDF export.\n\n---\n\n## Workflow Overview\n\n**Strict 3-Step Confirmation Process:**\n\n```\nStep 1: Outline Confirmation (BLOCKING)\n   ↓ User must confirm\nStep 2a: Layout Selection (BLOCKING)\n   ↓ User must confirm\nStep 2b: Style Selection (BLOCKING)\n   ↓ User must confirm\nStep 2c: Illustrations (BLOCKING)\n   ↓ User must confirm\nStep 3: Output Format (BLOCKING)\n   ↓ User must confirm\nGeneration Phase (automatic)\n```\n\n**CRITICAL RULE**: Each step requires explicit user confirmation before proceeding. Do NOT batch confirmations. Do NOT proceed to next step until current step is confirmed.\n\n---\n\n## Detailed Workflow\n\n1. Acquire and analyze article content\n2. Extract key information and classify content type\n3. **Step 1: Present outline → Get explicit confirmation**\n4. **Step 2a: Present layout options → Get explicit confirmation**\n5. **Step 2b: Present style options → Get explicit confirmation**\n6. **Step 2c: Present illustration options → Get explicit confirmation**\n7. **Step 3: Present output format options → Get explicit confirmation**\n8. Generate the HTML infographic (only after all confirmations)\n9. Export to PNG if selected in Step 3\n10. Deliver the final output\n\n## Confirmation Flow Summary (For AI Reference)\n\nWhen executing this skill, follow this EXACT sequence:\n\n| Phase | Step | Action | User Confirmation Required |\n|-------|------|--------|---------------------------|\n| 1 | Content Acquisition | Get article URL/file/text | ❌ No |\n| 2 | Content Analysis | Extract info, classify type | ❌ No |\n| 2.5 | **Step 1** | Present outline table | ✅ **MUST CONFIRM** |\n| 3a | **Step 2a** | Present layout options | ✅ **MUST CONFIRM** |\n| 3b | **Step 2b** | Present style options | ✅ **MUST CONFIRM** |\n| 3c | **Step 2c** | Present illustration options | ✅ **MUST CONFIRM** |\n| 4 | **Step 3** | Present output format options | ✅ **MUST CONFIRM** |\n| 5 | Generation | Create HTML | ❌ Automatic |\n| 6 | Delivery | Present results | ❌ Automatic |\n| 7 | PNG Export | If selected in Step 3 | ❌ Automatic |\n\n**FORBIDDEN ACTIONS:**\n- ❌ Never combine Step 1 + Step 2 confirmations\n- ❌ Never combine Step 2a + 2b + 2c into one question\n- ❌ Never combine Step 2 + Step 3 confirmations\n- ❌ Never proceed to generation without all 3 steps confirmed\n\n---\n\n## Phase 1: Content Acquisition\n\nDetermine the content source:\n\n- **URL** -- Use WebFetch to retrieve article content\n- **File** -- Read the file directly\n- **Pasted text** -- Use as-is\n\nIf content is ambiguous or too short, ask for clarification.\n\n---\n\n## Phase 2: Content Analysis\n\nExtract from the article:\n\n1. **Title and subtitle** -- Main topic and secondary context\n2. **Key statistics** -- Numbers, percentages, data points\n3. **Key points** -- 4-8 most important takeaways\n4. **Quotes** -- Notable statements\n5. **Comparisons** -- Before/after, pros/cons, A vs B\n6. **Sequential steps** -- Process flows, timelines, chronological events\n7. **Categories** -- Natural groupings\n8. **Entities** -- People, organizations, places\n\nClassify the best infographic type:\n\n| Content Signal | Infographic Type |\n|---|---|\n| Dates, milestones, chronological events | **Timeline** |\n| Numbers, percentages, survey data | **Statistics Dashboard** |\n| A vs B, pros/cons, before/after | **Comparison** |\n| Step-by-step, how-to, tutorial | **Process Flow** |\n| Multiple independent tips/facts | **Listicle / Card Grid** |\n| Mixed content types | **Magazine / Editorial** |\n\n---\n\n## Phase 2.5: Step 1 - Outline Confirmation (BLOCKING)\n\n**⚠️ CRITICAL: Must get explicit user confirmation before proceeding to Phase 3.**\n\nAfter content analysis, present the user with a structured outline in table form:\n\n```\n| Block | Content | Notes |\n|---|---|---|\n| Header | Title + subtitle | Top section |\n| Hero Stats (3) | [stat1] / [stat2] / [stat3] | Key data highlights |\n| ... | ... | ... |\n```\n\n**DO NOT proceed until user explicitly confirms.**\n\nUsing AskUserQuestion:\n- Header: \"Step 1/3: Outline Confirmation\"\n- Question: \"Please review the outline above with [N] blocks. Confirm to proceed or request changes:\"\n- Options:\n  - \"✅ Outline confirmed - proceed to style selection\" -- ONLY THEN go to Phase 3\n  - \"📝 Need adjustments\" -- User specifies changes (add/remove/modify blocks), then RE-CONFIRM\n  - \"🔄 Simplify to core blocks\" -- Auto-trim to core blocks only, then RE-CONFIRM\n\n**Hard rule**: If user chooses adjustments, update the outline and return to this same confirmation step. Do NOT proceed to Phase 3 until \"✅ Outline confirmed\" is selected.\n\n---\n\n## Phase 3: Step 2 - Style Selection (BLOCKING)\n\n**⚠️ CRITICAL: Must get explicit user confirmation for BOTH layout AND style before proceeding to Phase 4.**\n\nThis phase requires **TWO separate confirmations**:\n\n### Step 2a: Layout Selection (BLOCKING)\n\nUsing AskUserQuestion:\n- Header: \"Step 2a/3: Layout Selection\"\n- Question: \"Based on your article, I recommend a **[detected type]** layout. Confirm your choice:\"\n- Options: \n  - \"✅ [detected type] - recommended\" \n  - \"📊 Statistics Dashboard\"\n  - \"📅 Timeline\"\n  - \"⚖️ Comparison\"\n  - \"🔄 Process Flow\"\n  - \"📝 Listicle / Card Grid\"\n  - \"📖 Magazine / Editorial\"\n\n**STOP HERE**. Wait for user selection. Do NOT show style options yet.\n\n### Step 2b: Style Selection (BLOCKING)\n\nONLY after layout is confirmed, present style options:\n\nUsing AskUserQuestion:\n- Header: \"Step 2b/3: Visual Style Selection\"\n- Question: \"What visual style for the **[confirmed layout]** infographic?\"\n- Options (show 4-5 most relevant):\n\n  **Standard Styles:**\n  - \"🎨 Bold & Vibrant\" -- High contrast, saturated colors, strong visual impact\n  - \"🌿 Clean & Minimal\" -- Whitespace, subtle colors, elegant typography\n  - \"🌃 Dark & Techy\" -- Dark backgrounds, neon accents, modern feel\n  - \"📰 Warm & Editorial\" -- Magazine-style, warm tones, serif typography\n\n  **Premium Styles:**\n  - \"🚀 Sci-fi HUD\" -- Cyberpunk terminal, particle network, neon glow\n  - \"💎 Premium Magazine\" -- Luxury editorial, massive serif typography\n  - \"🔮 Glassmorphism Aurora\" -- Frosted glass, animated aurora blobs\n\n**STOP HERE**. Wait for user selection.\n\n### Step 2c: Illustrations (optional, but ASK)\n\nUsing AskUserQuestion:\n- Header: \"Step 2c/3: Illustrations (Optional)\"\n- Question: \"Add illustrations to the **[confirmed style]** infographic?\"\n- Options:\n  - \"🚫 No illustrations - text and data only\" \n  - \"🔹 Decorative icons - small SVG icons next to headings\"\n  - \"👤 Character illustrations - full SVG characters from open-source libraries\"\n\n**ONLY after all 2a→2b→2c are confirmed, proceed to Phase 4.**\n\nFor detailed color palettes and font pairings per style, see [references/style-presets.md](references/style-presets.md).\n\n---\n\n## Phase 4: Step 3 - Output Format Confirmation (BLOCKING)\n\n**⚠️ CRITICAL: Must get explicit user confirmation for output format BEFORE generating anything.**\n\nUsing AskUserQuestion:\n- Header: \"Step 3/3: Output Format\"\n- Question: \"How would you like to receive the **[confirmed style]** infographic?\"\n- Options:\n  - \"📄 HTML only - single file, opens in browser\" \n  - \"🖼️ HTML + PNG - include high-res image export\"\n  - \"📦 Both formats - explicit delivery of both files\"\n\n**ONLY after output format is confirmed, proceed to Phase 5 (Generation).**\n\n---\n\n## Phase 5: Generate Infographic\n\n### HTML Architecture\n\nSingle self-contained HTML file:\n\n```html\n<!DOCTYPE html>\n<html lang=\"[content language]\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>[Infographic Title]</title>\n    <link rel=\"stylesheet\" href=\"[Google Fonts / Fontshare URL]\">\n    <style>\n        :root {\n            --bg-primary: ...; --bg-secondary: ...;\n            --text-primary: ...; --text-secondary: ...;\n            --accent-1: ...; --accent-2: ...;\n            --font-display: ...; --font-body: ...;\n        }\n        /* Layout, components, animations */\n        @media print { /* linearize, remove animations */ }\n        @media (prefers-reduced-motion: reduce) { /* disable animations */ }\n    </style>\n</head>\n<body>\n    <article class=\"infographic\">\n        <header class=\"infographic-header\">...</header>\n        <main class=\"infographic-body\">...</main>\n        <footer class=\"infographic-footer\">...</footer>\n    </article>\n    <script>/* Intersection Observer animations, counter effects */</script>\n</body>\n</html>\n```\n\n### Design Rules\n\n**Typography:**\n- Distinctive Google Fonts or Fontshare fonts -- NEVER Inter, Roboto, Arial, or system fonts\n- Display font for headings, clean font for body\n- Responsive sizing with `clamp()`\n\n**Color:**\n- CSS custom properties for entire palette\n- Max 3-4 colors: one dominant, one accent, one-two neutrals\n- WCAG AA contrast for readability\n\n**Layout:**\n- CSS Grid for overall structure, Flexbox for components\n- Max-width 1200px, centered\n- **Compact spacing**: Use `2-3rem` between sections, NOT 5rem+. Infographics should feel dense and information-rich, not stretched out. Header padding: 2-2.5rem. Section padding: 2-3rem. Grid gaps: 2-2.5rem.\n- Responsive: stack on mobile, multi-column on desktop\n\n**Data Visualization:**\n- Pure CSS for simple charts (bar via width%, pie via conic-gradient)\n- Inline SVG for complex shapes\n- Animate numbers with counter effect (Intersection Observer)\n- Always label data clearly\n\n**Animations:**\n- Intersection Observer triggers `.visible` class\n- Stagger children with animation-delay\n- Subtle fade + translateY baseline\n- `prefers-reduced-motion` media query required\n\n**Print:**\n- `@media print` rules: linearize layout, remove animations, ensure readability\n- Appropriate page breaks between sections\n\n### Layout Patterns\n\n**Timeline:**\n- Vertical center line, alternating left/right entries\n- Date badges on line, content cards offset\n- Mobile: single-column stack\n\n**Statistics Dashboard:**\n- Hero stat at top (large number + context)\n- Grid of stat cards (2-3 columns)\n- CSS bar/pie charts where appropriate\n- Counter animation on scroll\n\n**Comparison:**\n- Side-by-side columns with central divider\n- Matching rows, color-coded sides\n- Mobile: vertical stack with labels\n\n**Process Flow:**\n- Numbered steps with connecting lines/arrows\n- Icon + title + description per step\n- Progress indicator\n\n**Listicle / Card Grid:**\n- Numbered/icon cards in responsive grid (2-3 cols desktop, 1 mobile)\n- Each card: icon/number + title + description\n- Hover effects\n\n**Magazine / Editorial:**\n- Mix of full-width, card grids, pull quotes, stat highlights\n- Alternate dense and spacious sections\n- Strong typographic hierarchy\n\n### Anti-Patterns -- NEVER\n\n- Purple gradient on white background\n- Generic card layouts with no visual character\n- Font Awesome or emoji spam as decoration\n- Flat, lifeless color schemes\n- Walls of small text (defeats infographic purpose)\n- Charts without labels\n- Cookie-cutter layouts\n\n---\n\n## Phase 6: Delivery\n\n**All 3 confirmation steps completed. Generating final output...**\n\nWrite the HTML file and present a summary:\n\n```\n✅ Infographic generated!\n\n📄 File: [filename].html\n📐 Layout: [confirmed layout]\n🎨 Style: [confirmed style]\n🖼️ Illustrations: [confirmed option]\n📦 Output: [confirmed format]\n📊 Sections: [count]\n\nOpen in browser to view. Ctrl+P / Cmd+P to save as PDF.\n```\n\n**Generation is complete. No further confirmations needed.**\n\n---\n\n## Edge Cases\n\n**Short articles (< 200 words):** Compact single-section, 3-5 key points as cards.\n\n**Long articles (> 3000 words):** Summarize to 6-10 key sections max. Prioritize data and takeaways.\n\n**No statistics:** Focus on quotes, process flows, or listicle. Use icons instead of charts.\n\n**Technical/code-heavy:** Code snippet sections, architecture diagrams with CSS shapes, conceptual flow.\n\n**Non-English content:** Set `lang` attribute correctly on `<html>`. Use appropriate fonts for CJK, RTL, etc.\n\n---\n\n## Phase 7: PNG Export (if selected in Step 3)\n\nAfter generating the HTML, if PNG was selected in Step 3, proceed with export:\n\n### Method A: Browser tool (preferred in Claude Code / HappyCapy)\n\nIf a `browser` CLI tool is available:\n\n1. Start a local HTTP server serving the HTML file\n2. Navigate browser to the page\n3. Force all `.reveal` elements to visible state (skip scroll animations)\n4. Force all bar fills and counters to final values\n5. Take a full-page screenshot\n6. Close browser\n\n```javascript\n// JS to inject before screenshot:\ndocument.querySelectorAll('.reveal').forEach(el => {\n    el.classList.add('visible');\n    el.style.opacity = '1';\n    el.style.transform = 'none';\n});\ndocument.querySelectorAll('.ba-fill, .bar-fill').forEach(bar => {\n    const w = bar.dataset.width;\n    if (w) bar.style.width = w + '%';\n});\ndocument.querySelectorAll('[data-counter]').forEach(el => {\n    const target = el.dataset.counter;\n    const suffix = el.dataset.suffix || '';\n    el.textContent = parseInt(target).toLocaleString() + suffix;\n});\n```\n\n### Method B: Playwright script (standalone environments)\n\nRun the bundled script:\n\n```bash\npython3 scripts/html_to_png.py infographic.html output.png --width 1200 --scale 2\n```\n\nThe script uses headless Chromium via Playwright. It auto-installs dependencies if needed.\n\nArguments:\n- `--width` : viewport width in px (default 1200)\n- `--scale` : HiDPI scale factor (default 2, produces 2400px wide image)\n\n### When to export PNG\n\nAsk the user after HTML delivery:\n\n- Header: \"Export\"\n- Question: \"Want a PNG image export as well?\"\n- Options:\n  - \"Yes, export PNG\" -- Run export\n  - \"HTML only is fine\" -- Skip\n\n---\n\n## OpenClaw / Non-Interactive Adaptation\n\nWhen deploying to environments without interactive question-answer support (e.g., OpenClaw, API-only setups), the skill operates in **parameterized mode** where ALL options must be specified upfront.\n\n**⚠️ CRITICAL**: In parameterized mode, you MUST provide ALL confirmations in a single prompt because the system cannot ask follow-up questions.\n\n### Parameterized Invocation (Single Prompt)\n\nUsers must specify ALL 3 confirmation steps in one prompt:\n\n```\nGenerate an infographic from [article source].\n\nSTEP 1 - OUTLINE:\n[Provide your preferred outline structure, or \"use auto-generated outline\"]\n\nSTEP 2 - STYLE:\nLayout: [timeline|statistics|comparison|process|listicle|magazine]\nStyle: [bold-vibrant|clean-minimal|dark-techy|warm-editorial|scifi-hud|premium-magazine|glassmorphism]\nIllustrations: [none|icons|characters]\n\nSTEP 3 - OUTPUT:\nFormat: [html|png|both]\n```\n\n**Example complete prompt:**\n```\nGenerate an infographic from https://example.com/article.\n\nSTEP 1: Use auto-generated outline\n\nSTEP 2: \nLayout: timeline\nStyle: dark-techy\nIllustrations: icons\n\nSTEP 3:\nFormat: both\n```\n\n### Parameter Reference\n\n**Style options:**\n- `bold-vibrant` -- High contrast, saturated colors\n- `clean-minimal` -- Whitespace, subtle colors, serif typography\n- `dark-techy` -- Dark background, neon accents\n- `warm-editorial` -- Magazine-style, warm tones\n- `scifi-hud` -- Cyberpunk terminal, particle network, neon glow (premium)\n- `premium-magazine` -- Luxury editorial, massive serif, cream/charcoal/vermillion (premium)\n- `glassmorphism` -- Frosted glass, aurora blobs, Apple-inspired depth (premium)\n\n**Layout options:**\n- `timeline` -- Chronological events\n- `statistics` -- Data dashboard\n- `comparison` -- Side-by-side\n- `process` -- Step-by-step flow\n- `listicle` -- Card grid\n- `magazine` -- Mixed editorial (default for complex articles)\n- `auto` -- Let the skill decide based on content analysis\n\n**Outline adjustments** (natural language):\n- \"remove [block name]\"\n- \"add [block description]\"\n- \"replace [block] with [new content]\"\n- \"simplify\" / \"expand\"\n\n**Export options:**\n- `html` -- HTML only (default)\n- `png` -- HTML + PNG export\n- `both` -- Explicitly output both\n\n### Fallback Behavior\n\nIf no style/layout is specified and AskUserQuestion is not available, use these defaults:\n- **Layout**: `auto` (detect from content)\n- **Style**: `dark-techy` for technical content, `warm-editorial` for narrative content, `bold-vibrant` for data-heavy content\n- **Export**: `html` only\n\n### Font CDN for China Deployment\n\nWhen deployed behind the GFW, replace Google Fonts CDN:\n\n```html\n<!-- Instead of: -->\n<link href=\"https://fonts.googleapis.com/css2?family=...\" rel=\"stylesheet\">\n\n<!-- Use mirror: -->\n<link href=\"https://fonts.loli.net/css2?family=...\" rel=\"stylesheet\">\n<!-- Or use: -->\n<link href=\"https://fonts.font.im/css2?family=...\" rel=\"stylesheet\">\n```\n\nAlternatively, for CJK-heavy content, use system fonts as fallback:\n\n```css\n--font-heading: 'Noto Serif SC', 'STSong', 'SimSun', serif;\n--font-body: 'Noto Sans SC', 'PingFang SC', 'Microsoft YaHei', sans-serif;\n```\n\nFile v0.3.5:output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/SKILL.md\n\n---\nname: baoyu-infographic\ndescription: Generates professional infographics with 21 layout types and 21 visual styles. Analyzes content, recommends layout×style combinations, and generates publication-ready infographics. Use when user asks to create \"infographic\", \"信息图\", \"visual summary\", \"可视化\", or \"高密度信息大图\".\nversion: 1.56.1\nmetadata:\n  openclaw:\n    homepage: https://github.com/JimLiu/baoyu-skills#baoyu-infographic\n---\n\n# Infographic Generator\n\nTwo dimensions: **layout** (information structure) × **style** (visual aesthetics). Freely combine any layout with any style.\n\n## Usage\n\n```bash\n/baoyu-infographic path/to/content.md\n/baoyu-infographic path/to/content.md --layout hierarchical-layers --style technical-schematic\n/baoyu-infographic path/to/content.md --aspect portrait --lang zh\n/baoyu-infographic path/to/content.md --aspect 3:4\n/baoyu-infographic  # then paste content\n```\n\n## Options\n\n| Option | Values |\n|--------|--------|\n| `--layout` | 21 options (see Layout Gallery), default: bento-grid |\n| `--style` | 21 options (see Style Gallery), default: craft-handmade |\n| `--aspect` | Named: landscape (16:9), portrait (9:16), square (1:1). Custom: any W:H ratio (e.g., 3:4, 4:3, 2.35:1) |\n| `--lang` | en, zh, ja, etc. |\n\n## Layout Gallery\n\n| Layout | Best For |\n|--------|----------|\n| `linear-progression` | Timelines, processes, tutorials |\n| `binary-comparison` | A vs B, before-after, pros-cons |\n| `comparison-matrix` | Multi-factor comparisons |\n| `hierarchical-layers` | Pyramids, priority levels |\n| `tree-branching` | Categories, taxonomies |\n| `hub-spoke` | Central concept with related items |\n| `structural-breakdown` | Exploded views, cross-sections |\n| `bento-grid` | Multiple topics, overview (default) |\n| `iceberg` | Surface vs hidden aspects |\n| `bridge` | Problem-solution |\n| `funnel` | Conversion, filtering |\n| `isometric-map` | Spatial relationships |\n| `dashboard` | Metrics, KPIs |\n| `periodic-table` | Categorized collections |\n| `comic-strip` | Narratives, sequences |\n| `story-mountain` | Plot structure, tension arcs |\n| `jigsaw` | Interconnected parts |\n| `venn-diagram` | Overlapping concepts |\n| `winding-roadmap` | Journey, milestones |\n| `circular-flow` | Cycles, recurring processes |\n| `dense-modules` | High-density modules, data-rich guides |\n\nFull definitions: `references/layouts/<layout>.md`\n\n## Style Gallery\n\n| Style | Description |\n|-------|-------------|\n| `craft-handmade` | Hand-drawn, paper craft (default) |\n| `claymation` | 3D clay figures, stop-motion |\n| `kawaii` | Japanese cute, pastels |\n| `storybook-watercolor` | Soft painted, whimsical |\n| `chalkboard` | Chalk on black board |\n| `cyberpunk-neon` | Neon glow, futuristic |\n| `bold-graphic` | Comic style, halftone |\n| `aged-academia` | Vintage science, sepia |\n| `corporate-memphis` | Flat vector, vibrant |\n| `technical-schematic` | Blueprint, engineering |\n| `origami` | Folded paper, geometric |\n| `pixel-art` | Retro 8-bit |\n| `ui-wireframe` | Grayscale interface mockup |\n| `subway-map` | Transit diagram |\n| `ikea-manual` | Minimal line art |\n| `knolling` | Organized flat-lay |\n| `lego-brick` | Toy brick construction |\n| `pop-laboratory` | Blueprint grid, coordinate markers, lab precision |\n| `morandi-journal` | Hand-drawn doodle, warm Morandi tones |\n| `retro-pop-grid` | 1970s retro pop art, Swiss grid, thick outlines |\n| `hand-drawn-edu` | Macaron pastels, hand-drawn wobble, stick figures |\n\nFull definitions: `references/styles/<style>.md`\n\n## Recommended Combinations\n\n| Content Type | Layout + Style |\n|--------------|----------------|\n| Timeline/History | `linear-progression` + `craft-handmade` |\n| Step-by-step | `linear-progression` + `ikea-manual` |\n| A vs B | `binary-comparison` + `corporate-memphis` |\n| Hierarchy | `hierarchical-layers` + `craft-handmade` |\n| Overlap | `venn-diagram` + `craft-handmade` |\n| Conversion | `funnel` + `corporate-memphis` |\n| Cycles | `circular-flow` + `craft-handmade` |\n| Technical | `structural-breakdown` + `technical-schematic` |\n| Metrics | `dashboard` + `corporate-memphis` |\n| Educational | `bento-grid` + `chalkboard` |\n| Journey | `winding-roadmap` + `storybook-watercolor` |\n| Categories | `periodic-table` + `bold-graphic` |\n| Product Guide | `dense-modules` + `morandi-journal` |\n| Technical Guide | `dense-modules` + `pop-laboratory` |\n| Trendy Guide | `dense-modules` + `retro-pop-grid` |\n| Educational Diagram | `hub-spoke` + `hand-drawn-edu` |\n| Process Tutorial | `linear-progression` + `hand-drawn-edu` |\n\nDefault: `bento-grid` + `craft-handmade`\n\n## Keyword Shortcuts\n\nWhen user input contains these keywords, **auto-select** the associated layout and offer associated styles as top recommendations in Step 3. Skip content-based layout inference for matched keywords.\n\nIf a shortcut has **Prompt Notes**, append them to the generated prompt (Step 5) as additional style instructions.\n\n| User Keyword | Layout | Recommended Styles | Default Aspect | Prompt Notes |\n|--------------|--------|--------------------|----------------|--------------|\n| 高密度信息大图 / high-density-info | `dense-modules` | `morandi-journal`, `pop-laboratory`, `retro-pop-grid` | portrait | — |\n| 信息图 / infographic | `bento-grid` | `craft-handmade` | landscape | Minimalist: clean canvas, ample whitespace, no complex background textures. Simple cartoon elements and icons only. |\n\n## Output Structure\n\n```\ninfographic/{topic-slug}/\n├── source-{slug}.{ext}\n├── analysis.md\n├── structured-content.md\n├── prompts/infographic.md\n└── infographic.png\n```\n\nSlug: 2-4 words kebab-case from topic. Conflict: append `-YYYYMMDD-HHMMSS`.\n\n## Core Principles\n\n- Preserve source data faithfully—no summarization or rephrasing (but **strip any credentials, API keys, tokens, or secrets** before including in outputs)\n- Define learning objectives before structuring content\n- Structure for visual communication (headlines, labels, visual elements)\n\n## Workflow\n\n### Step 1: Setup & Analyze\n\n**1.1 Load Preferences (EXTEND.md)**\n\nCheck EXTEND.md existence (priority order):\n\n```bash\n# macOS, Linux, WSL, Git Bash\ntest -f .baoyu-skills/baoyu-infographic/EXTEND.md && echo \"project\"\ntest -f \"${XDG_CONFIG_HOME:-$HOME/.config}/baoyu-skills/baoyu-infographic/EXTEND.md\" && echo \"xdg\"\ntest -f \"$HOME/.baoyu-skills/baoyu-infographic/EXTEND.md\" && echo \"user\"\n```\n\n```powershell\n# PowerShell (Windows)\nif (Test-Path .baoyu-skills/baoyu-infographic/EXTEND.md) { \"project\" }\n$xdg = if ($env:XDG_CONFIG_HOME) { $env:XDG_CONFIG_HOME } else { \"$HOME/.config\" }\nif (Test-Path \"$xdg/baoyu-skills/baoyu-infographic/EXTEND.md\") { \"xdg\" }\nif (Test-Path \"$HOME/.baoyu-skills/baoyu-infographic/EXTEND.md\") { \"user\" }\n```\n\n┌────────────────────────────────────────────────────┬───────────────────┐\n│                        Path                        │     Location      │\n├────────────────────────────────────────────────────┼───────────────────┤\n│ .baoyu-skills/baoyu-infographic/EXTEND.md          │ Project directory │\n├────────────────────────────────────────────────────┼───────────────────┤\n│ $HOME/.baoyu-skills/baoyu-infographic/EXTEND.md    │ User home         │\n└────────────────────────────────────────────────────┴───────────────────┘\n\n┌───────────┬───────────────────────────────────────────────────────────────────────────┐\n│  Result   │                                  Action                                   │\n├───────────┼───────────────────────────────────────────────────────────────────────────┤\n│ Found     │ Read, parse, display summary                                              │\n├───────────┼───────────────────────────────────────────────────────────────────────────┤\n│ Not found │ Ask user with AskUserQuestion (see references/config/first-time-setup.md) │\n└───────────┴───────────────────────────────────────────────────────────────────────────┘\n\n**EXTEND.md Supports**: Preferred layout/style | Default aspect ratio | Custom style definitions | Language preference\n\nSchema: `references/config/preferences-schema.md`\n\n**1.2 Analyze Content → `analysis.md`**\n\n1. Save source content (file path or paste → `source.md`)\n   - **Backup rule**: If `source.md` exists, rename to `source-backup-YYYYMMDD-HHMMSS.md`\n2. Analyze: topic, data type, complexity, tone, audience\n3. Detect source language and user language\n4. Extract design instructions from user input\n5. Save analysis\n   - **Backup rule**: If `analysis.md` exists, rename to `analysis-backup-YYYYMMDD-HHMMSS.md`\n\nSee `references/analysis-framework.md` for detailed format.\n\n### Step 2: Generate Structured Content → `structured-content.md`\n\nTransform content into infographic structure:\n1. Title and learning objectives\n2. Sections with: key concept, content (verbatim), visual element, text labels\n3. Data points (all statistics/quotes copied exactly)\n4. Design instructions from user\n\n**Rules**: Markdown only. No new information. Preserve data faithfully. Strip any credentials or secrets from output.\n\nSee `references/structured-content-template.md` for detailed format.\n\n### Step 3: Recommend Combinations\n\n**3.1 Check Keyword Shortcuts first**: If user input matches a keyword from the **Keyword Shortcuts** table, auto-select the associated layout and prioritize associated styles as top recommendations. Skip content-based layout inference.\n\n**3.2 Otherwise**, recommend 3-5 layout×style combinations based on:\n- Data structure → matching layout\n- Content tone → matching style\n- Audience expectations\n- User design instructions\n\n### Step 4: Confirm Options\n\nUse **single AskUserQuestion call** with multiple questions to confirm all options together:\n\n| Question | When | Options |\n|----------|------|---------|\n| **Combination** | Always | 3+ layout×style combos with rationale |\n| **Aspect** | Always | Named presets (landscape/portrait/square) or custom W:H ratio (e.g., 3:4, 4:3, 2.35:1) |\n| **Language** | Only if source ≠ user language | Language for text content |\n\n**Important**: Do NOT split into separate AskUserQuestion calls. Combine all applicable questions into one call.\n\n### Step 5: Generate Prompt → `prompts/infographic.md`\n\n**Backup rule**: If `prompts/infographic.md` exists, rename to `prompts/infographic-backup-YYYYMMDD-HHMMSS.md`\n\nCombine:\n1. Layout definition from `references/layouts/<layout>.md`\n2. Style definition from `references/styles/<style>.md`\n3. Base template from `references/base-prompt.md`\n4. Structured content from Step 2\n5. All text in confirmed language\n\n**Aspect ratio resolution** for `{{ASPECT_RATIO}}`:\n- Named presets → ratio string: landscape→`16:9`, portrait→`9:16`, square→`1:1`\n- Custom W:H ratios → use as-is (e.g., `3:4`, `4:3`, `2.35:1`)\n\n### Step 6: Generate Image\n\n1. Select available image generation skill (ask user if multiple)\n2. **Check for existing file**: Before generating, check if `infographic.png` exists\n   - If exists: Rename to `infographic-backup-YYYYMMDD-HHMMSS.png`\n3. Call with prompt file and output path\n4. On failure, auto-retry once\n\n### Step 7: Output Summary\n\nReport: topic, layout, style, aspect, language, output path, files created.\n\n## References\n\n- `references/analysis-framework.md` - Analysis methodology\n- `references/structured-content-template.md` - Content format\n- `references/base-prompt.md` - Prompt template\n- `references/layouts/<layout>.md` - 21 layout definitions\n- `references/styles/<style>.md` - 21 style definitions\n\n## Extension Support\n\nCustom configurations via EXTEND.md. See **Step 1.1** for paths and supported options.\n\nFile v0.3.5:output/clawhub-infographic-ppt-deep-dive/source-skills/ppt-maker/SKILL.md\n\n---\nname: ppt-maker\ndescription: \"专业级PPT一键生成。Markdown创建幻灯片，支持自动图表（饼图/柱状图/折线图）、多主题、有序/无序列表、引用块、代码块、表格、感谢页自动识别。\"\n---\n\n# PPT Maker - 专业级PPT生成工具\n\n使用 Markdown 自动创建精美 PPT，**表格数据自动转为图表**，支持多种主题和智能布局。\n\n## 快速开始\n\n```bash\nnode ~/.openclaw/workspace/skills/ppt-maker/scripts/ppt-maker.js -i input.md -o output.pptx -t ocean\n```\n\n## 命令参数\n\n| 参数 | 说明 | 必填 |\n|------|------|------|\n| `-i, --input` | 输入 Markdown 文件路径 | ✅ |\n| `-o, --output` | 输出 PPTX 文件路径（自动补 .pptx 后缀） | ✅ |\n| `-t, --theme` | 主题名称，默认 ocean | ❌ |\n| `-l, --list` | 列出所有可用主题 | ❌ |\n| `-h, --help` | 显示帮助信息 | ❌ |\n\n## 支持的主题\n\n| 主题 | 风格 | 适用场景 |\n|------|------|----------|\n| ocean | 蓝色海洋 | 科技/专业 |\n| sunset | 橙红日落 | 温暖/创意 |\n| purple | 紫罗兰 | 创意/设计 |\n| luxury | 黑金奢华 | 高端/奢侈 |\n| midnight | 深夜暗色 | 演示/震撼 |\n| classic | 经典绿 | 商务/正式 |\n\n## Markdown 语法对照\n\n### 页面类型\n\n```markdown\n# 大标题           → 封面页（第一张幻灯片）\n副标题文字          → 封面副标题\n\n## 章节标题         → 内容页\n## 感谢聆听         → 结束页（自动居中大字布局）\n```\n\n**结束页自动识别关键字：** 感谢、谢谢、thank、thanks、Q&A、问答、结束、The End、再见、联系方式\n\n### 内容元素\n\n```markdown\n### 小标题           → 页内加粗小标题\n\n- 无序列表项1        → 带圆点的无序列表\n- 无序列表项2\n\n1. 有序列表项1       → 带编号圆圈的有序列表\n2. 有序列表项2\n\n> 引用文字           → 带左侧竖条的引用块\n\n普通文字             → 正文段落\n```\n\n### 表格\n\n```markdown\n| 列1 | 列2 | 列3 |\n|-----|-----|-----|\n| 内容 | 内容 | 内容 |\n```\n\n表格含数值列时**自动检测**是否转为图表（见下方图表规则）。不含数值或未匹配图表规则时，保持表格原样显示（含交替行底色）。\n\n### 代码块\n\n````markdown\n```python\nprint(\"Hello World\")\n```\n````\n\n深色背景 + 等宽字体 + 圆角边框显示。\n\n## ⭐ 自动图表生成\n\n**核心功能：** 在 `##` 标题、`###` 小标题或表格前的正文中包含特定关键字，其下方的表格自动转为对应图表。\n\n### 图表类型与关键字\n\n| 图表类型 | 触发关键字 |\n|----------|-----------|\n| 🥧 饼图 | 饼图、饼状图、占比、比例、份额、构成、组成、百分比、比重、pie |\n| 📊 柱状图 | 柱状、柱状图、柱形、排名、top、对比、比较、分布、销售额、金额、数量、业绩、产量、营收、bar |\n| 📈 折线图 | 折线、折线图、趋势、增长、变化、走势、曲线、时间、月度、季度、年度、line、trend |\n\n### 智能推断（无关键字时）\n\n- 数值列总和在 80~120 之间 → 自动识别为**饼图**（占比数据）\n- 有 ≥2 个数值点 → 默认生成**柱状图**\n- 支持多列数值 → 自动生成**多系列**图表\n\n### 数值解析\n\n自动清理单元格中的干扰字符，以下写法均可正确识别：\n- `100万` `¥250` `$1,200` `30%` `85元` `1200亿`\n\n### 图表示例\n\n#### 饼图示例\n\n```markdown\n## 销售占比分析\n### 各产品销售占比饼图\n| 产品 | 占比(%) |\n|------|---------|\n| 大米 | 30 |\n| 高粱 | 50 |\n| 小麦 | 20 |\n```\n\n#### 柱状图示例\n\n```markdown\n## 各产品销售额对比\n### 年度销售额柱状图\n| 产品 | 销售额(万元) |\n|------|-------------|\n| 大米 | 100 |\n| 高粱 | 250 |\n| 小麦 | 130 |\n```\n\n#### 折线图示例\n\n```markdown\n## 月度销售趋势\n### 销售额变化趋势折线图\n| 月份 | 销售额(万元) |\n|------|-------------|\n| 1月 | 35 |\n| 2月 | 42 |\n| 3月 | 58 |\n| 4月 | 72 |\n```\n\n#### 不转图表的表格（无数值列或非图表场景）\n\n```markdown\n## 工作计划\n| 季度 | 目标 | 负责人 |\n|------|------|--------|\n| Q1 | 完成招聘 | 张经理 |\n| Q2 | 市场拓展 | 李经理 |\n```\n\n## 使用示例\n\n提供markdown文件，比如input.md，然后通过指令生成\n```bash\nnode ~/.openclaw/workspace/skills/ppt-maker/scripts/ppt-maker.js -i input.md -o output.pptx -t ocean\n```\n### markdown提示词示例\n```markdown\n# 2026年度总结报告\n北灵聊AI · 年度工作汇报\n\n## 销售占比分析\n### 各产品占比饼图\n| 产品 | 占比(%) |\n|------|---------|\n| 大米 | 30 |\n| 高粱 | 40 |\n| 小麦 | 20 |\n| 玉米 | 10 |\n\n## 销售额对比\n### 各产品销售额柱状图\n| 产品 | 销售额(万元) |\n|------|-------------|\n| 大米 | 100 |\n| 高粱 | 250 |\n| 小麦 | 130 |\n\n## 月度趋势\n### 全年销售额变化趋势折线图\n| 月份 | 销售额(万元) |\n|------|-------------|\n| 1月 | 35 |\n| 6月 | 72 |\n| 12月 | 102 |\n\n## 核心成果\n### 业务拓展\n- 新增客户 126 家，同比增长 35%\n- 开拓西南市场，覆盖 4 个新省份\n\n### 团队建设\n1. 团队扩充至 28 人\n2. 组织培训 12 场\n3. 员工满意度达 92%\n\n> 全年目标超额完成，总销售额突破 560 万元\n\n## 感谢聆听\n北灵聊AI\n期待2027再创佳绩！\n```\n\n\n### 自然语言提示词示例\n```\n请使用 ppt-maker 技能，为我生成一份“2026生成式AI行业发展与企业落地趋势”的汇报型幻灯片，整体风格专业、简洁、科技感强，讲解人是北灵聊AI。\n\n封面是2026生成式AI行业发展与企业落地趋势，副标题写“模型能力升级、企业应用加速与商业化观察”，并显示讲解人“北灵聊AI”。\n\n第一页是企业采用生成式AI的主要应用场景分布，用饼状图展示，其中知识助手占比32，智能客服占比24，内容生成占比18，研发提效占比16，数据分析占比10。\n\n第二页是企业AI项目预算投入对比，用柱状图展示，其中大模型平台建设预算380万，AI代码助手预算300万，AI办公助手预算260万，AI智能客服预算220万，AI营销内容生成预算180万。\n\n第三页是2026年企业生成式AI项目推进热度趋势，用折线图展示，其中Q1热度指数48，Q2热度指数63，Q3热度指数78，Q4热度指数92。\n\n最后一页是感谢，标题写“感谢聆听”，副标题写“欢迎交流生成式AI与企业应用实践”。\n```\n\n## 支持的命令行\n\n```bash\n# 查看帮助\nnode ~/.openclaw/workspace/skills/ppt-maker/scripts/ppt-maker.js -h\n\n# 列出所有主题\nnode ~/.openclaw/workspace/skills/ppt-maker/scripts/ppt-maker.js -l\n\n# 海洋蓝主题（默认）\nnode ~/.openclaw/workspace/skills/ppt-maker/scripts/ppt-maker.js -i slides.md -o demo.pptx\n\n# 深夜科技主题\nnode ~/.openclaw/workspace/skills/ppt-maker/scripts/ppt-maker.js -i slides.md -o demo.pptx -t midnight\n\n# 黑金奢华主题\nnode ~/.openclaw/workspace/skills/ppt-maker/scripts/ppt-maker.js -i slides.md -o demo.pptx -t luxury\n```\n\n\n## 布局特点\n\n### 页面类型\n\n- **封面页** — 大标题 + 副标题 + 左侧装饰竖条\n- **内容页** — 标题栏背景 + 正文区域 + 页码\n- **结束页** — 居中大字 + 装饰色块 + 上下装饰线\n\n### 装饰元素\n\n- 顶部主题色强调条\n- 左侧边栏装饰线\n- 标题栏浅色背景\n- 封面竖线装饰 + 底部横线\n\n### 内容渲染\n\n- 无序列表：主题色圆点\n- 有序列表：主题色编号圆圈\n- 引用块：左侧竖条 + 浅色背景 + 斜体\n- 代码块：深色背景 + 等宽字体 + 圆角\n- 表格：表头底色 + 交替行着色\n- 图表与剩余内容并排显示（饼图右侧/柱状折线收窄后右侧）\n\n## 注意事项\n\n1. **Markdown格式要求：** 必须用 `#` 开头作为封面页，`##` 开头分页\n2. **图表触发：** 关键字写在 `##` 标题或 `###` 小标题中最可靠\n3. **表格格式：** 第一行为表头，第二行为分隔行 `|---|---|`，第三行起为数据\n4. **数值列：** 表格第二列起含可解析数字才会触发图表\n5. **输出格式：** 自动补 `.pptx` 后缀\n6. **行内格式：** `**粗体**` `*斜体*` `~~删除线~~` 等会自动清理为纯文本\n\n## 文件位置\n\n- 脚本：`~/.openclaw/workspace/skills/ppt-maker/scripts/ppt-maker.js`\n- 依赖：`pptxgenjs`（已安装）\n\nFile v0.3.5:output/clawhub-infographic-ppt-deep-dive/source-skills/text-to-ppt/SKILL.md\n\n---\nname: text-to-ppt\ndescription: Convert any text input (research reports, summaries, proposals, plans, etc.) into a beautiful HTML-based presentation. Use when the user asks to create a PPT, slides, presentation, deck, or convert text/documents into slides. Also triggers on phrases like \"做成PPT\", \"生成幻灯片\", \"做个演示文稿\", \"转成slides\", \"create presentation\", \"make slides\", \"text to presentation\". Supports data visualization with Chart.js, Font Awesome icons, and modern design themes.\n---\n\n# Text-to-PPT — 文本转 HTML 演示文稿\n\nConvert any text input into a visually stunning, single-file HTML presentation.\n\n## CRITICAL: Two-Phase Generation\n\n**ALWAYS use the two-phase approach. NEVER generate the full HTML in one shot.**\n\n### Phase 1: Plan (fast, single call)\n\nRead the input text, then produce a **slide-by-slide outline** in JSON format:\n\n```json\n{\n  \"title\": \"Presentation Title\",\n  \"language\": \"zh-CN\",\n  \"density\": \"detailed\",\n  \"theme\": \"dark\",\n  \"slides\": [\n    {\n      \"number\": 1,\n      \"type\": \"title\",\n      \"heading\": \"Main Title\",\n      \"content\": \"Subtitle or tagline\",\n      \"layout\": \"centered\",\n      \"notes\": \"Visual: large title with accent underline\"\n    },\n    {\n      \"number\": 2,\n      \"type\": \"content\",\n      \"heading\": \"Section Title\",\n      \"points\": [\"Point 1\", \"Point 2\", \"Point 3\"],\n      \"layout\": \"bullets\",\n      \"hasData\": false,\n      \"notes\": \"Use numbered badges for each point\"\n    },\n    {\n      \"number\": 3,\n      \"type\": \"chart\",\n      \"heading\": \"Key Metrics\",\n      \"chartType\": \"bar\",\n      \"chartData\": {\n        \"labels\": [\"A\", \"B\", \"C\"],\n        \"datasets\": [{\"label\": \"Sales\", \"data\": [100, 200, 150]}]\n      },\n      \"points\": [\"Insight 1\", \"Insight 2\"],\n      \"layout\": \"split\",\n      \"hasData\": true,\n      \"notes\": \"Left: chart, Right: insights as stat cards\"\n    }\n  ]\n}\n```\n\n**Rules for Phase 1:**\n- Output ONLY the JSON plan. No HTML. No explanation.\n- Identify data points → mark `hasData: true` and provide `chartType` + `chartData`\n- Choose layout: `centered`, `bullets`, `split`, `grid`, `timeline`, `cards`, `fullchart`, `quote`\n- Target 8-15 slides. Never exceed 20.\n- This should take <10 seconds.\n\n### Phase 2: Generate (parallel, page-by-page)\n\n**Read `references/design-system.md`** — this is where the full design spec lives.\n\nThen generate HTML for each slide **independently**. Each slide is a self-contained `<div class=\"slide\">` block.\n\n**For each slide, the agent should:**\n1. Take ONE slide from the plan (by number)\n2. Read only the design system reference if not already loaded\n3. Generate ONLY that one slide's HTML `<div class=\"slide\">...</div>`\n4. No `<html>`, no `<head>`, no `<body>` — just the slide div\n\n**BATCHING: Generate slides in parallel using sub-agents.** Spawn up to 5 sub-agents simultaneously, each generating 1-2 slides.\n\n### Phase 3: Assemble\n\nAfter all slides are generated:\n1. Read the shell template from `references/shell-template.html`\n2. Insert all slide divs into the shell\n3. Ensure chart canvas IDs are unique across all slides\n4. Save to Obsidian vault: `~/Documents/longhai/Longhai/`\n5. Tell user the file path\n\n## Execution Strategy\n\n### When running as the main agent:\n1. Phase 1 yourself (fast, just JSON)\n2. Write the plan to a temp file\n3. Spawn sub-agents for Phase 2 (parallel slide generation)\n4. Collect results and assemble in Phase 3\n\n### Sub-agent task format (for Phase 2):\n```\nGenerate HTML for slide {N} of a presentation.\n\nSLIDE PLAN:\n{JSON for this specific slide}\n\nDESIGN SYSTEM: Read references/design-system.md for theme colors, components, and rules.\n\nOUTPUT: Return ONLY a single <div class=\"slide\" style=\"background-color: #0f172a;\">...</div> block.\nNo <html>, <head>, or <body> tags. Use inline styles. Include <script> for Chart.js if this slide has charts.\nUse unique canvas ID: chart-slide{N}-{random}.\n```\n\n## Input Sources\n\n- Directly pasted text\n- A file path — read it first with `read`\n- A URL — fetch it first with `web_fetch`\n- An Obsidian note path — read it first\n\n## Output\n\n- Single self-contained HTML file\n- File naming: `{topic-slug}.presentation.html`\n- Default save location: `~/Documents/longhai/Longhai/`\n- Tell the user the file path\n\n## Theme Options\n\n| Theme | Background | Text | Cards | Accent |\n|-------|-----------|------|-------|--------|\n| dark (default) | slate-900 | slate-50 | slate-800 | blue-500/amber-500 |\n| light | slate-50 | slate-900 | white | blue-600/amber-600 |\n| tech | gray-950 | emerald-50 | gray-900 | cyan-500/violet-500 |\n| warm | stone-900 | amber-50 | stone-800 | orange-500/rose-500 |\n\nUser can specify a theme. Default: dark.\n\nFile v0.3.5:output/clawhub-infographic-ppt-deep-dive/source-skills/visual-note-card/SKILL.md\n\n---\r\nname: visual-note-card\r\ndescription: Generate professional Chinese visual note cards (视觉笔记卡片/信息图) as single-page HTML infographics with automatic PNG export. Use this skill whenever the user asks to create a visual note, knowledge card, infographic, one-pager summary, visual summary, 知识卡片, 视觉笔记, 信息图, 一页纸总结, or any poster-style knowledge visualization. Also trigger when the user wants to summarize an article, blog post, book chapter, or concept into a structured visual card format, or when they reference an existing visual note and ask to create one in the same style. This skill produces both a self-contained HTML file and a high-quality PNG image, ready for sharing on social media or printing.\r\n---\r\n\r\n# Visual Note Card Generator\r\n\r\nCreate professional, information-dense visual note cards (视觉笔记/信息图) as self-contained HTML files with automatic PNG export via Playwright. The output is a structured, poster-style infographic with modular card layout, suitable for social media sharing or printing.\r\n\r\n## Design System\r\n\r\nBefore writing any code, read the reference template at `assets/template.html` for the canonical HTML/CSS structure. Then adapt the content to the user's topic.\r\n\r\n### Core Visual Identity\r\n\r\nThe design follows an **editorial knowledge card** aesthetic — high information density with clear visual hierarchy, inspired by premium magazine layouts and structured note-taking.\r\n\r\n**Color Palette (CSS Variables):**\r\n- `--primary`: Deep teal `#1a7a6d` — headers, badges, accent elements\r\n- `--primary-dark`: `#145f54` — bottom highlight bar\r\n- `--primary-deep`: `#0d3d36` — deep accent\r\n- `--accent`: Orange `#e8713a` — emphasis, secondary badges, important labels\r\n- `--bg`: Warm gray `#f0ebe4` — page background\r\n- `--bg-light`: `#f5f1ec` — light panel background\r\n- `--bg-card`: `#e8e3dc` — framework card background\r\n- `--black`: `#1a1a1a` — dark panel, primary text\r\n- `--white`: `#ffffff`\r\n\r\nUsers may request alternate color schemes. If so, maintain the same structural contrast ratios: one warm neutral background, one strong primary color, one accent color, and black for dark panels.\r\n\r\n**Typography:**\r\n- English display: `Playfair Display` (serif, 700/900) — main title\r\n- Chinese body: `Noto Sans SC` (400/500/700/900) — all Chinese text\r\n- Monospace: `JetBrains Mono` (500/700) — labels, URLs, tags\r\n- Import via Google Fonts in the `<style>` block\r\n\r\n**Layout — Fixed Poster Dimensions:**\r\n- Container width: `1200px`\r\n- Padding: `36px 40px 28px`\r\n- Background: `var(--bg)`\r\n\r\n### Mandatory Layout Sections (Top to Bottom)\r\n\r\nEvery visual note card MUST include these sections in order:\r\n\r\n#### 1. Top Bar\r\nA single-line flex row with:\r\n- Left: Topic label in uppercase monospace (e.g., `AI PRODUCT ARCHITECTURE · SYSTEM DESIGN`)\r\n- Right: Source label (e.g., `OPENAI ENGINEERING BLOG`)\r\n\r\n#### 2. Main Title Area\r\nTwo-column flex layout:\r\n- Left: Large bilingual title — English line in `Playfair Display 38px`, Chinese line in `Noto Sans SC 40px` colored with `var(--primary)`\r\n- Right: A 2–3 line **thesis statement** (核心观点) summarizing the card's argument, with the key phrase in `<strong>`. Optionally include a source URL below.\r\n\r\n#### 3. Framework Row (Flexible Grid, Recommended 4 Columns)\r\n\r\nA row of equal-width cards representing the core framework/model of the topic. The number of columns is flexible — choose based on the actual content:\r\n\r\n- **2 columns** — binary concepts, comparisons (e.g., Before vs After, Input vs Output)\r\n- **3 columns** — triads, triangular models (e.g., People-Process-Technology)\r\n- **4 columns** — **recommended default**, most common for frameworks (e.g., E-K-C-F, M-P-D-G)\r\n- **5 columns** — five-element models (e.g., HEART metrics, Five Forces)\r\n- **6 columns** — extended taxonomies (use sparingly, keep descriptions very short)\r\n\r\nAnalyze the topic and choose the column count that best fits the natural structure. Don't force 4 columns if the concept has 3 or 5 natural parts.\r\n\r\n**CSS implementation:** Use `grid-template-columns: repeat(N, 1fr)` where N is the chosen column count.\r\n\r\n**Card structure (same regardless of column count):**\r\n- Each card has a colored square **letter badge** (first letter of the concept) + Chinese name\r\n- Below the badge: 1–2 lines of description with one `<strong>` keyword\r\n- For 5–6 columns, keep descriptions to 1 line to avoid overflow\r\n\r\n**Badge color rotation** (cycles through these in order):\r\n1. `--primary` (teal)\r\n2. `--primary` (teal)\r\n3. `--accent` (orange)\r\n4. `--primary-deep` (deep teal)\r\n5. `--accent` (orange) — if 5th column exists\r\n6. `--primary` (teal) — if 6th column exists\r\n\r\nThe framework should be a **memorable acronym** (e.g., E-K-C-F, M-P-D-G). Invent one if the source doesn't provide it.\r\n\r\n#### 4. Two-Column Content Area\r\nA `grid-template-columns: 1fr 1fr` layout:\r\n\r\n**Left: Dark Panel** (`background: var(--black)`, white text)\r\n- Section title with emoji icon (⚡, 🔥, 🛠, etc.)\r\n- 2 sub-blocks, each with an orange title (`var(--accent)`) and a bulleted list (custom `■` bullets in teal)\r\n- List items use `<strong>` for key phrases (white color)\r\n- A bottom \"conclusion\" block with a divider line and a memorable quote/insight (key phrase in `#5ee6d0` mint color)\r\n\r\n**Right: Light Panel** (`background: var(--bg-light)`)\r\n- Section title with star icon (★)\r\n- 3–4 numbered insight items, each with:\r\n  - A large serif number (`Playfair Display 36px`, teal)\r\n  - Bold title line\r\n  - 1–2 lines of description with `<strong>` keywords\r\n\r\n#### 5. Bottom Highlight Bar\r\nFull-width bar with `background: var(--primary-dark)`:\r\n- Left: The framework formula (e.g., `Architecture = M × P × D × G`) in mint highlight color `#5ee6d0`\r\n- Right: A closing thought in lighter text\r\n\r\n#### 6. Footer\r\nFlex row:\r\n- Left: Framework label in monospace\r\n- Right: Brand / framework name with a small teal dot separator\r\n\r\n## Content Strategy\r\n\r\nWhen the user provides a topic (or an article URL/text):\r\n\r\n1. **Extract or synthesize a 4-part framework** — find the core structural model. If one doesn't exist, create a meaningful decomposition with a memorable acronym.\r\n2. **Write a provocative thesis** — the right-side subtitle should be a strong, opinionated claim, not a bland description.\r\n3. **Dark panel = \"Story + Transformation\"** — use this for narrative content: problems, transitions, role changes, paradigm shifts.\r\n4. **Light panel = \"Pitfalls or Insights\"** — use this for actionable numbered takeaways.\r\n5. **Bottom formula** — distill the entire card into one equation-style summary.\r\n6. **All text is Chinese** except for: the main English title line, technical terms, framework acronyms, and footer labels.\r\n\r\n## Output\r\n\r\n### Default: HTML + PNG\r\n\r\nBy default, generate **both** an HTML file and a PNG image:\r\n\r\n1. **Generate the HTML** — single self-contained `.html` file with all CSS inline. No external dependencies except Google Fonts and html2canvas CDN. Save to `/mnt/user-data/outputs/`.\r\n2. **Generate the PNG** — run the bundled `scripts/html2png.py` script to render the HTML into a high-quality PNG image.\r\n\r\n```bash\r\npython <skill-path>/scripts/html2png.py /mnt/user-data/outputs/card.html /mnt/user-data/outputs/card.png --scale=1.5\r\n```\r\n\r\nPresent **both** files to the user (PNG first, then HTML). The PNG is the primary deliverable for sharing; the HTML enables further browser-based export or editing.\r\n\r\nIf the user explicitly asks for \"只要 HTML\" or \"HTML only\", skip the PNG step.\r\n\r\n### PNG Generation Script: `scripts/html2png.py`\r\n\r\nA Playwright-based headless renderer. It opens the HTML in Chromium, waits for Google Fonts to load, hides the FAB button, then screenshots the `.poster` element.\r\n\r\n**Usage:**\r\n```bash\r\npython html2png.py <input.html> [output.png] [--scale=N]\r\n```\r\n\r\n**Scale options:**\r\n- `--scale=1` — standard (1200px wide), smallest file\r\n- `--scale=1.5` — **default**, recommended for social media (1800px wide)\r\n- `--scale=2` — print quality (2400px wide)\r\n\r\n**Dependencies:** `playwright` (pip install playwright && playwright install chromium). Pre-installed on Claude's compute environment.\r\n\r\n### Download Button (Mandatory in HTML)\r\n\r\nEvery generated HTML card MUST include a **floating action button (FAB)** in the bottom-right corner with a dropdown menu for export options:\r\n\r\n- **标准 PNG** — 1× scale, quick sharing\r\n- **高清 PNG** — 1.5× scale, social media recommended\r\n- **超清 PNG** — 2× scale, for printing\r\n- **JPEG** — 1.5× scale, smaller file size\r\n\r\nImplementation:\r\n1. Add `<script src=\"https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js\"></script>` before `</body>`\r\n2. The FAB (`div.fab-wrap`) is placed OUTSIDE `.poster` so it won't appear in the exported image\r\n3. Clicking the FAB toggles a dropdown menu upward; clicking outside closes it\r\n4. During capture, the FAB is hidden and a toast spinner (\"正在导出…\") is shown\r\n5. The FAB icon toggles between a download arrow and a close ×\r\n6. The exported filename is derived from `document.title` + scale suffix\r\n\r\nSee `assets/template.html` for the complete FAB HTML, CSS, and JS.\r\n\r\n\r\n```\r\n\r\n## Example Prompts → Expected Behavior\r\n\r\n| User Says | Action |\r\n|-----------|--------|\r\n| \"帮我做一张关于 RAG 架构的视觉笔记\" | Generate HTML + PNG about RAG architecture |\r\n| \"把这篇文章做成信息图\" + article text | Extract key ideas, synthesize framework, generate HTML + PNG |\r\n| \"生成一张同风格的卡片，主题是微服务\" | Generate HTML + PNG about microservices |\r\n| \"Create a visual note about product-market fit\" | Generate bilingual HTML + PNG about PMF |\r\n| \"只要 HTML，不要图片\" | Generate HTML only, skip PNG |\r\n| \"生成一张 2x 高清的 PNG\" | Generate HTML + PNG with `--scale=2` |\n\nFile v0.3.5:output/design-md-hardening/test-graduate-defense/cocoloop-graduate-defense-ppt/SKILL.md\n\n---\n\"name\": \"cocoloop-graduate-defense-ppt\"\n\"description\": \"帮助用户制作研究生毕业答辩 PPT，并提供稳定的设计背景与页级内容结构\"\n\"version\": \"0.1.0\"\n\"author\": \"tanshow\"\n\"generated_by_cocoloop\": true\n\"when_to_use\": \"帮助用户制作研究生毕业答辩 PPT，并提供稳定的设计背景与页级内容结构. Typical scenarios: 生成毕业答辩 PPT 结构; 确定答辩页面视觉方向; 整理答辩讲稿与实验结果\"\n\"user-invocable\": true\n---\n# Graduate Defense PPT\n\n## Overview\n\n帮助用户制作研究生毕业答辩 PPT，并提供稳定的设计背景与页级内容结构\n\n## Use Cases\n\n- 生成毕业答辩 PPT 结构\n- 确定答辩页面视觉方向\n- 整理答辩讲稿与实验结果\n\n## Inputs\n\n- `thesis_topic`: 论文题目或答辩主题\n- `research_materials`: 实验结果、图表、结论与摘要材料\n\n## Outputs\n\n- `defense_outline` (markdown): 答辩 PPT 大纲\n- `visual_design_input` (markdown): 默认设计背景\n- `infographic_slide_set` (pptx_or_markdown): 包含流程、对比和指标卡的答辩版式结果\n\n## Research Gates\n\n- Skill identity status: `ready`\n- Cocoloop slug check complete: yes\n- ClawHub slug check complete: yes\n- Slug available: yes\n- Target environment status: `ready`\n- Current environment: codex authoring workspace on macOS\n- Target environment: codex authoring workspace on macOS\n- Current environment is target: yes\n- Implementation approach status: `ready`\n- Selected execution plane: `Skill + CLI`\n\n## Output Profile\n\n- Has visual output: yes\n- Visual output types: `ppt`\n\n## Interaction Rules\n\n- Plan the question budget before asking anything.\n- The full interaction should normally stay within 10 total questions, including confirmation questions.\n- Ask only one key question per turn and use defaults, existing context, environment detection, or confirmations to reduce follow-up questions.\n- Detect the current environment early and use that result to narrow the platform and runtime discussion.\n- Confirm the target runtime environment before writing any skill content, scaffold, implementation path, or build instructions.\n- If the current environment might be the target environment, ask the user to confirm that explicitly after environment detection.\n- If the target environment is still unclear, stop at clarification and do not start drafting the skill body or execution steps.\n- If the task is already clear, skip redundant questions and move to execution or summary.\n- If open gaps remain near the question limit, apply `write_open_gaps_then_continue` instead of extending the interview.\n\n## Design Input\n- For webpage, infographic, PPT, and other visual output tasks, read `references/design.md` before high-fidelity design.\n- Users can keep the default official preset, switch to another preset in `references/design-md/`, or replace it with their own `DESIGN.md`.\n- Current source mode: `preset`\n- Current preset: `apple`\n## Visual Storytelling\n\n- Artifact family: `visual_narrative_artifact`\n- Output adapters: `ppt`\n- Story units: `cover`, `agenda`, `problem`, `contribution`, `method`, `experiment`, `result`, `analysis`, `closing`\n- Text hierarchy: `kicker`, `headline`, `summary`, `body`, `metric`, `annotation`\n- Infographic required: yes\n\n## Must Have\n\n- 答辩大纲建议\n- 页级内容结构\n- 默认 DESIGN.md 预设\n- 示例 slides 结果\n- 明确的文字层级\n- 方法流程图、结果对比图和指标卡\n\n## Excluded\n\n- 不负责自动搜集论文原始数据\n\n## Target Platforms\n\n- `codex` (supported_public): 测试渲染平台\n- `claude_code` (supported_public): 兼容渲染平台\n\n## Dependencies\n\n- `slides` (reference): 如环境允许，可进一步导出可编辑演示稿\n\n## Fallback Policy\n\n- Allowed: yes\n- Summary: 缺少可编辑 PPT 依赖时，先交付结构化 slides 结果\n\nFile v0.3.5:SKILL.md\n\n---\nname: cocoloop-skill-factory\ndescription: 用于创建或升级多平台 Agent Skill 的 Meta Skill。适用于用户想把模糊想法收敛成可生成最终 Skill 的稳定方案、需要结合 Cocoloop 与 ClawHub 搜索参考、选择平台模板、组织原子能力、补齐脚本化规划，并明确平台兼容与发布边界时。\nversion: 0.3.5\nauthor: tanshow\n---\n\n# CocoLoop Skill Factory\n\n## Overview\n\n`cocoloop-skill-factory` 是一个面向 `codex`、`claude code`、`openclaw`、`copaw`、`molili`、`hermes agent` 的 Meta Skill。\n它负责把用户的想法推进成一份稳定 spec，并把构建方向、模板选择、原子能力、脚本化策略和平台兼容边界整理清楚，最终服务于 Skill 生成与交付。\n\n当用户出现这些诉求时使用本 Skill：\n\n- 想从零创建一个新 Skill\n- 想升级、改造、移植一个已有 Skill\n- 想先找现成 Skill，再判断复用、改造还是新做\n- 想把平台差异、脚本化能力、模板选择和 benchmark 规划统一起来\n\n## Factory Rules\n\n整个流程都围绕这几条规则执行：\n\n1. 先判定任务域，再继续调研平台、依赖和执行面。\n2. 先形成 spec，再进入构建与交付判断。\n3. 调研和设计都保持双钻节奏，先发散，再收敛。\n4. **分步询问：对话每次只推进一个关键问题，严禁一次性列出所有问题等待用户回答。必须等用户回答后再问下一个问题。**\n5. **问题预算：进入调研后要先规划整轮交互的问题预算，默认总问题数不得超过 10 个。能用默认值、环境检测、已有上下文或确认题解决的，不再追加开放式追问。**\n6. **环境 gate：在目标运行环境没有确认前，不得开始写 Skill 正文、模板、脚手架、实现步骤或构建命令。必须先拿到环境检测结果，再确认“当前环境是否就是目标环境”；如果不是，要同时写清当前环境和目标环境。**\n7. `cocoloop`、`clawhub` 与 `github` 搜索在正常环境下默认进入流程；通用社区检索按需补充；不可用时允许降级，但要记录缺口。\n8. 平台兼容声明必须以公开标准或已核实的本地协议为依据，不能凭经验口头承诺。\n9. 推荐外部方案时，要同时给出接入方式、依赖门槛、风险和替代路径。\n10. `benchmark` 是可选阶段，只在适合比较的任务里进入，并且默认按任务域判断是否适合进入。\n\n## Workflow\n\n命令运行约定：\n\n- 如果当前目录是 `cocoloop-skill-factory/`，使用 `python3 utils/cli/<script>.py ...`\n- 如果当前目录是工作区根目录，使用 `python3 cocoloop-skill-factory/utils/cli/<script>.py ...`\n- CLI 文件带有 shebang，也可以直接执行，但默认优先推荐 `python3 ...` 的写法\n\n关键 CLI：\n\n- `detect-environment.py`\n- `search-registry.py`\n- `reference-skill.py`\n\n当前 CLI 边界：\n\n- `detect-environment.py` 用于环境检测\n- `search-registry.py` 用于统一承载 `cocoloop`、`clawhub` 与 `github` 搜索\n- `reference-skill.py` 用于把本地或 GitHub 候选 Skill 拉取到证据目录，并生成 JSON / Markdown 分析摘要\n- 当前版本不提供完整的自动生成与发布 CLI，但必须在文档层明确生成、校验和发布所缺的环节\n\n其中 `search-registry.py` 是对 PRD 中 `cocoloop-search`、`clawhub-search` 与 GitHub 检索的合并实现，只覆盖搜索能力本身，不新增额外流程能力。\n其中 `reference-skill.py` 只负责候选方案证据化和目录分析，不替代设计判断。\n\n### Step 1: Initialize\n\n先快速建立当前任务边界。\n\n执行动作：\n\n1. 判断用户要创建新 Skill，还是升级已有 Skill。\n2. 检查当前仓库、工作区或现有文件里是否已经有相关上下文。\n3. 运行 `python3 utils/cli/detect-environment.py`，获取平台、系统、Shell、浏览器与本地工具线索。\n4. 先确认当前环境是否就是目标运行环境；如果不是，继续让用户明确目标平台、目标系统和关键运行前提。\n5. 在环境结论没有确认前，不进入 Skill 正文、模板、脚手架或构建步骤的撰写。\n6. 先判断当前需求属于哪个任务域；如果 `presets/` 里已有对应预设，立即读取。\n7. 如果用户说“目标平台就是当前环境”，用检测结果提供候选线索，再请用户确认。\n8. 判断当前环境里是否已有成熟 `brainstorming` 能力；如没有，再回退到 `sub-skills/brainstorm/SKILL.md`。\n\n### Step 2: Research\n\n进入需求调研阶段时，阅读 `ref/research.md`。\n\n**调研阶段先做任务域路由**\n\n- 先判定 `primary_domain`\n- 如果需求明显跨域，再补 `peer_domains`\n- 如果 `presets/` 中已有对应预设，优先按预设问题包继续追问\n- 如果没有完全匹配的预设，也要先给出最接近的主域判断，再把剩余部分写入研究缺口\n\n**调研阶段核心原则：分步询问，一次一个问题**\n\n- 每一轮对话只问一个关键问题，严禁一次性列出多个问题\n- 必须得到用户回答后，才能决定并询问下一个问题\n- 如果用户给出的信息涉及多个维度，拆分成连续轮次推进\n- 维持对话的连续性，避免信息过载\n\n**调研阶段核心原则：先规划问题预算，总量不超过 10 个**\n\n- 进入调研后，先根据当前任务域和缺口列出最小问题集，再开始追问\n- 整轮需求调研默认总问题数不得超过 10 个，包含确认题\n- 如果用户初始信息已经较完整，要主动合并或跳过冗余问题，而不是把预算问满\n- 当预计会超过 10 个问题时，优先改成选项题、确认题、默认值和环境检测，不继续扩张访谈\n- 在第 6 到第 8 个问题时，优先开始收口，整理已确认项、未确认项和默认假设\n- 如果还有缺口但继续追问收益不高，明确记录到 `open_gaps`，再进入设计，不要无限延长调研\n\n**调研阶段核心原则：先确认运行环境，再开始写**\n\n- 优先用环境检测拿到当前环境线索，再确认目标环境\n- 如果用户说“就在当前环境里跑”，必须把当前环境和目标环境做一次显式确认\n- 如果目标环境与当前环境不同，必须同时记录两者差异，不能只写当前环境\n- 在环境未确认前，只允许继续做澄清，不允许开始写 Skill 正文、模板、脚手架、实现步骤或构建命令\n\n**调研阶段核心原则：先确认实现方式，再开始写**\n\n- 必须先确认当前任务的实现方式，也就是选定 `Skill-only`、`Skill + CLI`、`Skill + API/MCP` 或 `Skill + CLI + API/MCP`\n- 如果主任务域已有推荐执行面，需要让用户确认是接受该默认执行面，还是切换到替代路径\n- 在实现方式没有确认前，不开始写脚本方案、adapter、manifest、依赖安装步骤或构建命令\n\n**提问交互格式：**\n\n1. **选项类问题**：提供 3-5 个有序选项（1-5），便于用户直接回复数字\n   - 示例：目标平台选择、交付预期选择\n   - 必须标注推荐答案\n\n2. **路径选择类问题**：提供 2-3 个实现路径\n   - 示例：复用现成 / 改造 / 从零设计\n   - 必须说明各路径的适用场景、优势和风险\n   - 明确标注推荐路径及理由\n\n3. **开放式问题**：提供提示和示例，引导用户描述\n   - 示例：「请描述核心问题是什么？提示：从谁在什么场景下遇到什么痛点来描述」\n\n4. **确认类问题**：汇总已确认信息，提供继续/暂停/修改选项\n   - 示例：「当前已确认：... 是否继续？1. ✅ 确认 2. ⏸️ 暂停 3. 📝 修改」\n\n调研阶段必须拿到这些信息（分步采集）：\n\n- 主任务域、并列补充域，以及是否跨域\n- 用户想解决的问题与使用场景\n- 正式名称与展示名称\n- 目标平台与运行环境\n- 当前环境是否就是目标运行环境，以及两者差异\n- 实现方式，也就是最终采用哪种执行面\n- 目标平台对应的支持等级、公开标准来源，以及用户是否接受当前等级边界\n- 正式名称是否已完成 `cocoloop` 和 `clawhub` 双源去重\n- 偏好脚本语言、不可接受的脚本语言，以及运行时限制\n- 依赖偏好与权限限制\n- 如果涉及网页、图片、Figma 或其他视觉输出，要收集风格偏好，并判断是否需要引入风格约束型 Skill\n- 如果已经明显包含可视化输出，要隐式把这个判断写入 `output_profile.has_visual_output`\n- 如果涉及创作写作类输出，要收集受众、语气、篇幅、参考边界和禁忌表达\n- 如果涉及网站自动化、登录态操作、批量发布或抓取，要先醒目声明账号、频率限制、验证码、反爬和平台规则风险，再继续调研\n- 如果涉及强需求浏览器自动化，要比较可用执行面，并明确用户接受的安装与维护成本\n- 交付预期\n- 哪些能力应脚本化，哪些保持文档或模板表达\n- 成功标准与是否需要 benchmark\n\n视觉输出场景的默认推荐顺序：\n\n- 网页、落地页、应用 UI：优先判断是否需要 `frontend-skill`\n- 单张信息图、视觉说明图、传播型图卡：优先判断是否需要 `imagegen`\n- 用户明确要求 `Nothing` 风格：再引入 `nothing-design`\n- 图片生成或图片编辑：判断是否需要 `imagegen` 或 `gemini-image`\n- 如果最终交付物是 `.pptx`，优先判断是否需要 `slides`\n- 如果当前环境没有合适的风格约束 Skill，仍然要把风格偏好写入 spec，而不是跳过\n\n视觉优先任务的强制规则：\n\n- 如果任务涉及网站视觉、视觉优先页面、信息图、视觉卡片或演示稿视觉，在进入具体设计前，必须先确认风格来源\n- 风格来源只允许这四类：用户指定风格、用户提供 `DESIGN.md`、用户详细描述、从 `ref/design-md/` 本地参考库中选择\n- 如果这四类输入都没有，只继续追问风格来源，不进入具体版式和视觉方案\n- 如果需求进入正式视觉方案，继续把风格结论写入 `design_md`，让最终 Skill 自带 `references/design.md`\n- 只要任务包含任何可视化输出，统一 spec 中就必须写出 `output_profile.has_visual_output: true`\n- 如果目标产物属于 PPT、网页信息图、展示图、报告页等视觉叙事型产物，优先读取 `atomic-capability/structured-visual-storytelling/`\n\n名称收口的强制规则：\n\n- 正式名称对标最终 slug，必须使用短横线连接的小写英文与数字\n- 展示名称对标最终 display name，长度不得超过 20 个字符\n- 在进入设计或生成前，必须完成 `cocoloop` 和 `clawhub` 双源去重\n- 双源去重结果要写进 `research_gate.skill_identity`\n\n创作写作类场景的处理原则：\n\n- 先确认写作对象、发布场景、语气、篇幅和参考边界\n- 如果当前环境里有合适的写作或风格类 Skill，再进入推荐\n- 如果没有现成 Skill，也要把风格约束明确写进需求结果与后续 spec\n\n强需求浏览器自动化场景的处理原则：\n\n- 先判断任务能否被文本接口、公开 API 或轻量抓取替代，能替代时不要默认上浏览器自动化\n- 如果必须上浏览器自动化，至少向用户比较 2 条方向，常用候选是 `opencli`、`agent-browser`、`playwright-interactive`\n- 比较时至少说明这几个维度：是否复用现有登录态、安装门槛、调试深度、稳定性、维护成本、失败后的替代路径\n- 如果用户接受额外安装，且任务已落在 `OpenCLI` 已有站点命令、`opencli browser` 或适配器流程可覆盖的范围内，优先推荐 `OpenCLI`\n- 选择 `OpenCLI` 时，补充 `atomic-capability/browser-access/opencli-browser-bridge.md` 中的扩展安装与 `opencli doctor` 验证步骤\n- 如果任务更偏本地页面验证、结构化截图、表单回归或独立浏览器流程，优先把 `agent-browser` 作为候选\n- 如果任务更偏本地 Web 或 Electron 调试、持久会话 QA、反复迭代验证，再把 `playwright-interactive` 纳入候选\n\n如果用户一开始就已经给出很清楚的 spec，可缩短调研轮数，但不能跳过收口确认。\n\n### Step 3: Search And Reference\n\n当需求轮廓已经稳定，就进入搜索判断。\n\n默认顺序：\n\n1. 先根据主任务域和预设整理默认搜索关键词\n2. 运行 `python3 utils/cli/search-registry.py --source cocoloop --query '...' --exact-slug '<slug>'`\n3. 运行 `python3 utils/cli/search-registry.py --source clawhub --query '...' --exact-slug '<slug>'`\n4. 运行 `python3 utils/cli/search-registry.py --source github --query '...'`\n5. 对进入正式比较范围的本地或 GitHub 候选，运行 `python3 utils/cli/reference-skill.py fetch ...` 拉取并生成 `_reference-analysis.md`\n6. 如仍有明显缺口，再补通用社区或网页搜索\n7. 把结果整理成“直接复用 / 参考改造 / 仅供借鉴 / 放弃”四种结论\n\n判断时至少回答这些问题：\n\n- 候选 Skill 与当前需求的重合度有多高\n- 是否覆盖当前主任务域的核心高频任务\n- 是否覆盖目标平台\n- 是否有明显依赖门槛或安全风险\n- 如果采用它，用户得到的是安装、二次设计，还是只拿它的能力结构\n- 如果它属于浏览器自动化候选，当前覆盖面是否已经足够支撑任务，还是只能作为备选路径\n\n如果搜索不可用，保留降级记录，再继续设计流程。\n\n### Step 4: Design\n\n进入设计阶段时，阅读 `ref/design.md`。\n\n设计阶段的硬规则：\n\n- 优先读取当前主任务域对应的预设，再展开方案比较\n- 如果任务涉及排版、视觉设计、网站风格、信息图或演示稿视觉，先确认风格来源，再进入具体设计\n- 如果任务属于更广义的视觉叙事型产物，先走 `structured-visual-storytelling` 的共享主线，再选 `ppt`、`web_infographic` 或 `showcase_graphic` adapter\n- 只要搜索结果里有需要深入判断的候选 Skill，就**必须**先把候选 Skill 全量拉取到本地再分析，不能只依据搜索摘要做设计决策\n- 本地分析时，要完整查看 `SKILL.md`、子目录结构、脚本、参考文档、模板、依赖声明和关键资源\n- 需要复用或借鉴的能力、设计要点、功能最佳实践和限制条件，必须详细写入设计文档，而不是只保留在临时分析里\n- 如果当前设计在比较浏览器自动化方向，需要把 `opencli`、`agent-browser`、`playwright-interactive` 的安装方式、运行前置动作、适用边界和推荐顺序一起写进设计文档\n\n视觉风格参考默认读取顺序：\n\n1. 用户自己的品牌规范或 `DESIGN.md`\n2. 用户明确点名的风格\n3. `ref/design-md/` 本地风格参考库\n4. 用户的自然语言风格描述\n\n当前官方预设优先级：\n\n1. IBM\n2. Stripe\n3. Notion\n4. Framer\n5. Figma\n6. Nothing\n7. Apple\n\n设计阶段必须先展开两到三条路线，再帮助用户收敛。常见路线：\n\n- 直接复用现成 Skill\n- 基于现成 Skill 做二次设计\n- 从零构建新 Skill\n\n设计收口时，要明确这些结论：\n\n- 当前版本的目标与边界\n- 目标平台集合\n- 主流程结构\n- 内置原子能力与外部依赖的取舍\n- 平台模板选择\n- benchmark 是否进入，以及为什么\n\n### Step 5: Construction Planning\n\n进入构建准备时，阅读 `ref/construction.md`。\n\n此阶段的核心动作：\n\n1. 把研究与设计结论整理成统一 spec 和构建说明。\n   先形成一份结构化 `spec.yaml`，再继续整理研究摘要、设计摘要和构建计划。\n   如果没有 `primary_domain`、`coverage_status` 或 `open_gaps` 的收口结果，不得进入下一步。\n   如果任务涉及视觉排版产物，还需要继续补齐 `output_profile` 与 `design_md`。\n2. 阅读 `atomic-capability/index.md`，为关键能力选择可复用模块。\n3. 阅读 `presets/index.md` 和当前主任务域预设，确认默认输出、风险门槛和执行面。\n4. 阅读 `utils/template/` 下的目标平台模板，明确输出骨架、元数据差异和脚本策略。\n5. 调用 `sub-skills/skill-creator/SKILL.md`，把 spec 转成可执行的构建计划。\n6. 如果任务适合比较验证，再阅读 `utils/benchmark.md`，只规划 benchmark 的进入条件、样本和判定标准。\n7. 如果目标平台属于任意 `supported_*`，继续补平台安装、校验和发布边界；`supported_public` 可进入打包准备，`supported_authoring_only` 与 `supported_local_only` 只能停在作者规范或本地激活边界。\n8. 条件满足时，先在 `factory-skill-builder/` 执行 `npm install`，再使用 `factory-skill-builder/scripts/build_skill_from_spec.cjs` 生成最小 Skill 骨架，并用平台校验脚本确认结果；生成链要把模板选择结果一并写入产物。\n   如果 `output_profile.has_visual_output` 为真，生成链还要继续输出 `references/design.md` 与 `references/design-md/`。\n\n建议在这一阶段保留的文档产物：\n\n- `spec.yaml`\n- `brainstorming-notes.md`\n- `research-summary.md`\n- `reference-skill-analysis.md`\n- `design-summary.md`\n- `spec.md`\n- `build-plan.md`\n- `benchmark-plan.md`（仅在进入 benchmark 时）\n- `platform-support-notes.md`（平台声明有特殊边界时）\n\n### Step 6: Deliver\n\n默认交付物包括：\n\n- 一份收口后的统一 spec\n- 一份设计决策摘要\n- 一份构建计划或构建说明\n- 外部依赖的接入说明\n- 一份平台兼容与发布边界说明\n- 按需生成的 benchmark 计划\n\n如果用户只想得到设计方案，不想立即落地产物，可以在 spec 和设计决策确认后结束。\n\n## Fast Paths\n\n### 用户已经带着参考 Skill 来了\n\n先检测环境，再直接做差异分析：\n\n1. 当前参考 Skill 覆盖了哪些能力\n2. 哪些地方要保留\n3. 哪些地方要替换\n4. 哪些平台适配要重写\n\n### 用户只想找现成 Skill\n\n仍然要先补齐最小需求轮廓，再搜索。\n不要在问题尚未收敛时直接把一串候选列表甩给用户。\n\n### 用户只想做平台迁移\n\n优先保留原 Skill 的目标、触发方式和能力边界，再聚焦模板映射、依赖表达和目录结构变化。\n\n## Local Resources\n\n按下面的顺序读取资源，避免一次加载过多内容：\n\n- `ref/research.md`\n  需求调研阶段的对话骨架、必填信息和阶段出口\n- `ref/design.md`\n  方案展开、比较和收口方式\n- `ref/platform-support-matrix.md`\n  子仓内的本地平台支持矩阵与声明边界\n- `factory-skill-builder/scripts/`\n  `factory` 内部的 `spec -> skill` 渲染、平台校验与打包入口\n- `ref/construction.md`\n  如何把统一 spec 收口为构建计划与产物边界\n- `sub-skills/brainstorm/SKILL.md`\n  没有外部 brainstorming 时的兜底调研子 Skill\n- `sub-skills/skill-creator/SKILL.md`\n  进入构建准备阶段时的规划子 Skill\n- `presets/index.md`\n  任务域预设目录和对应问题包、执行面建议\n- `atomic-capability/index.md`\n  原子能力索引与组合建议\n- `utils/template/spec-template.yaml`\n  统一结构化协议模板\n- `utils/template/*.md`\n  平台模板、结构差异和选择条件\n- `output/README.md`\n  `output/` 目录契约和每类产物职责\n- `utils/cli/*.py`\n  环境检测与搜索标准化\n- `utils/benchmark.md`\n  benchmark 进入条件与输出格式\n\n## Output Contract\n\n产出构建计划或 Skill 方案文档时，至少检查这些项目：\n\n1. `SKILL.md` 是否能独立说明触发场景、流程和资源读取顺序\n2. 目标平台模板是否与最终目录结构一致\n3. 外部依赖是否都有接入说明和降级路径\n4. 当前阶段允许脚本化的动作是否已经覆盖环境检测、搜索、最小渲染与平台校验\n5. `molili` 是否按独立平台处理，没有被并入 `copaw`\n6. 是否已经明确目标平台对应的目录和元数据要求\n7. benchmark 若被启用，是否明确了 `0 skill` 与目标 Skill 方案效果的比较对象\n\n## Boundaries\n\n本 Skill 负责 spec 驱动、方案组织、参考检索和构建规划。\n它不会把搜索命中当作唯一前提，也不会默认替用户跳过需求收口。\n\n如果当前任务只适合出文档，不适合进入下一阶段实现，可以在说明原因后收口到文档阶段。\n\nFile v0.3.5:sub-skills/brainstorm/SKILL.md\n\n---\nname: brainstorm\ndescription: 面向 cocoloop-skill-factory 的蒸馏版需求调研与方案澄清子 skill。用于上下文探索、一次一个问题、双钻式发散/收敛、2-3 方案比较与分段确认，作为外部 brainstorming 不可用时的稳定兜底。\n---\n\n# 蒸馏版 Brainstorm\n\n当 `skill-factory` 需要把模糊想法推进到可设计需求时，使用这个子 skill。\n\n它只保留稳定的调研骨架，不追求上游 `brainstorming` 的完整能力集。\n\n## 硬门槛\n\n在当前结论还没有被用户确认前，不要提前进入设计、模板、构建或 benchmark 相关内容。\n在目标运行环境没有确认前，也不要开始写 Skill 正文、模板、脚手架、实现步骤或构建命令。\n这个子 skill 只负责把需求问清楚、把范围收住、把下一步交回主 skill。\n\n## 适用场景\n\n- 需要先把需求说清楚，再进入设计\n- 外部 `brainstorming` 未安装、不可用，或当前场景不适合复用它\n- 需要在调研阶段控制节奏，避免一次推进太多问题\n\n## 核心原则\n\n- 先看上下文，再问问题\n- 先判任务域，再继续追问通用字段\n- **分步询问：一次只推进一个关键问题，严禁一次性列出所有问题**\n- **问题预算：在开问前先规划问题数量，默认总问题数不得超过 10 个**\n- **环境 gate：先确认当前环境与目标环境，再开始写具体方案**\n- **实现方式 gate：先确认执行面，再开始写具体方案**\n- 先发散，再收敛\n- 始终给出 2-3 个可选方向\n- 每推进一段就确认一次，不在未确认时直接跳步\n\n## 上下文探索\n\n先读当前仓库内与目标相关的内容，至少包括：\n\n- `../SKILL.md`\n- `../ref/research.md`\n- `../ref/design.md`\n- `../ref/platform-support-matrix.md`\n- 当前任务要求\n- 目标目录是否已经有相关产物\n- 如果 `presets/` 中已有对应任务域预设，也要读取\n\n如果你处在完整工作区中，再按需补充根级 `prd.md` 和 `codex-prd`；如果你只拿着 `cocoloop-skill-factory` 子仓，这一步不是必需前置。\n\n探索时只做一件事：把当前问题放到正确的范围里。\n\n如果发现需求其实分成多个独立子问题，先拆开，再选一个最先推进的部分。\n\n## 任务域优先\n\n进入具体追问前，先判断当前需求更接近哪个任务域。\n优先使用：\n\n- `engineering_delivery`\n- `frontend_design`\n- `browser_ui_testing`\n- `document_artifacts`\n- `docs_research`\n\n如果当前仓库的 `presets/` 中有对应预设，后续追问优先沿着该预设的问题包推进，而不是继续走纯通用问题流。\n\n## 对话节奏与交互方式\n\n### 严禁一次性抛出多个问题\n\n每一轮只做一种动作：\n\n- 如果信息不足，**只问一个关键问题**，等待用户回答后再问下一个\n- 如果信息已经够用，就给 2-3 个方案让用户选\n- 如果阶段已经清楚，就做一段简短收束并等待确认\n\n**禁止行为：**\n- 在同一轮里同时问多个问题\n- 把解释、追问和方案一起堆出来\n- 假设用户会回答某个问题而提前问后续问题\n\n### 先规划问题预算\n\n进入调研后，先在心里排出最小问题集，再开始问。\n\n- 默认总问题数不得超过 10 个，确认题也算在内\n- 优先问最影响路线判断的字段，不按模板机械补齐所有栏位\n- 能从环境、上下文、预设或用户原始描述里拿到的信息，不再重复提问\n- 到第 6 到第 8 个问题时，默认开始收口，准备总结和确认\n- 如果还存在边角缺口，写进 `open_gaps` 或设计待确认项，不继续无限追问\n\n### 先确认运行环境\n\n进入调研后，环境确认属于硬门槛，不是可选补充。\n\n- 优先拿到当前环境线索，再确认目标环境\n- 如果用户说“就在当前环境里跑”，也要显式确认一次\n- 如果目标环境不同，必须把两者差异写清\n- 在环境未确认前，只继续做澄清，不开始写 Skill 正文、模板、脚手架或实现步骤\n\n### 先确认实现方式\n\n实现方式确认同样属于硬门槛。\n\n- 必须先确认最终采用哪种执行面\n- 当前只用这四种标准选项：`Skill-only`、`Skill + CLI`、`Skill + API/MCP`、`Skill + CLI + API/MCP`\n- 如果任务域已有默认执行面，要先确认用户是否接受\n- 在实现方式未确认前，不开始写脚本方案、adapter、manifest 或安装步骤\n\n### 先确认名称身份\n\n名称身份确认同样属于硬门槛。\n\n- 必须拿到正式名称，也就是最终 slug\n- 必须拿到展示名称，也就是最终 display name\n- slug 必须是短横线连接的小写英文与数字\n- 在进入设计前，必须完成 `cocoloop` 和 `clawhub` 双源去重\n- 在名称身份未确认前，不开始写 manifest、安装路径或发布命令\n\n### 标准提问格式\n\n当需要用户提供信息时，使用以下格式：\n\n#### 1. 选项类问题（3-5个选项）\n\n使用有序列表编码，便于用户直接回复数字：\n\n```\n请选择您的目标平台：\n\n1. **claude code** - 适合日常开发任务和文件操作\n2. **codex** - 适合大规模代码生成和重构\n3. **openclaw** - 适合浏览器自动化和网页抓取\n4. **copaw** - 适合企业级工作流自动化\n5. **其他** - 请说明具体平台\n\n推荐：**claude code**（当前环境匹配，可直接复用本地工具）\n\n请回复选项编号（1-5），或输入自定义答案：\n```\n\n#### 2. 路径选择类问题（2-3个方向）\n\n```\n基于您的需求，有以下实现路径可选：\n\n1. **复用现成 Skill** → 推荐\n   - 适合：需求与现有 Skill 高度重合\n   - 优势：快速交付，经过验证\n   - 风险：可能需要微调\n\n2. **基于现成 Skill 改造**  \n   - 适合：需求有70%以上重合，但需要定制\n   - 优势：节省基础工作量\n   - 风险：改造复杂度不确定\n\n3. **从零设计**\n   - 适合：需求独特，无现成参考\n   - 优势：完全贴合需求\n   - 风险：开发周期较长\n\n推荐：**复用现成 Skill**（已找到匹配度高的现成方案）\n\n请回复 1、2 或 3，或描述您的偏好：\n```\n\n#### 3. 开放式问题\n\n```\n请描述您希望这个 Skill 解决的核心问题是什么？\n\n💡 提示：可以从「谁在什么场景下遇到什么痛点」来描述\n       例如：\"开发者在写 Python 时需要自动格式化代码\"\n\n请直接输入您的回答：\n```\n\n#### 4. 确认类问题\n\n```\n当前已确认的信息：\n- 目标平台：claude code\n- 核心问题：自动化代码格式化\n- 交付预期：完整 Skill 包\n\n是否继续进入下一步（平台环境检测）？\n\n1. ✅ 确认并继续\n2. ⏸️ 暂停，我需要再想想\n3. 📝 修改某项信息（请说明）\n\n请回复 1、2 或 3：\n```\n\n### 交互规则总结\n\n| 场景 | 选项数量 | 推荐答案 | 自定义回答 |\n|------|----------|----------|------------|\n| 单选题 | 3-5个 | 提供 | 支持 |\n| 路径选择 | 2-3个 | 必须提供 | 支持 |\n| 确认题 | 2-3个 | 默认第一项 | 支持说明修改 |\n| 开放式 | 无 | 提供提示示例 | 自由输入 |\n\n**推荐答案标注方式：**\n- 在选项说明中标注 `→ 推荐` 或 `推荐：XXX`\n- 用一句话说明推荐理由\n- 推荐基于：当前环境匹配度、需求重合度、实现成本\n\n## 发散阶段\n\n发散阶段的目标，是把可能性和边界说开。\n\n可以从这些维度展开：\n\n- 当前更接近哪个任务域\n- 目标用户是谁\n- 要解决什么问题\n- 使用场景是什么\n- 目标平台有哪些\n- 正式名称和展示名称是什么\n- 当前环境是不是目标环境\n- 实现方式是什么\n- 环境和权限有哪些限制\n- 偏好什么脚本语言，哪些脚本语言不能用\n- 外部依赖偏好是什么\n- 如果涉及视觉输出，风格偏好是什么，是否需要推荐 `frontend-skill`、`nothing-design`、`imagegen` 或 `gemini-image`\n- 如果涉及视觉输出，先确认风格来源，只能是：用户指定风格、用户提供 `DESIGN.md`、用户详细描述、或从 `../ref/design-md/` 本地参考库中选一个起点\n- 如果已经明显属于视觉任务，隐式把“包含可视化输出”写入 `output_profile.has_visual_output`\n- 如果涉及创作写作，目标读者、语气、篇幅和禁忌表达是什么\n- 如果涉及网站自动化，先提示账号、频率限制、验证码、反爬和平台规则风险，再继续\n- 如果涉及强需求浏览器自动化，比较 `opencli`、`agent-browser`、`playwright-interactive` 等方向，再让用户选择\n- 是否接受现成 Skill\n- 哪些能力更适合脚本化\n- 是否需要 benchmark\n\n如果用户给的信息很少，优先问最影响下一步的那一个点。\n\n如果当前任务明显是视觉优先、网站视觉、信息图或演示稿视觉，默认先问风格来源。\n在风格来源没有被确认前，不进入具体页面结构或视觉方案比较。\n\n如果用户已经给得很清楚，直接进入收敛，不要为了提问而提问。\n如果问题预算已经接近上限，也直接进入收敛，不要为了补齐模板字段继续追问。\n\n## 收敛阶段\n\n收敛阶段的目标，是把发散结果压成可执行的选择。\n\n收敛时要做三件事：\n\n1. 把已确认的信息压成一句清楚的当前结论\n2. 给出 2-3 条可行路径，并说明差别\n3. 让用户确认当前结论是否继续前进\n\n路径比较只保留对决策有用的差异，不展开无关细节。\n\n## 方案比较\n\n当需要比较方案时，优先给这三类方向：\n\n- 复用现成能力\n- 在现成能力上改造\n- 从零设计\n\n每个方向都要说明它更适合什么情况、代价是什么、有什么风险。\n默认给出一条推荐路线，并用一句话说明为什么优先推荐它。\n\n如果只有 2 个方向更合理，也可以只给 2 个。\n\n## 分段确认\n\n每推进完一段，就确认一次。\n\n确认点优先放在这些位置：\n\n- 需求目标是否对齐\n- 平台范围是否对齐\n- 环境和依赖是否对齐\n- 方案方向是否对齐\n\n确认时不要把下一段内容一并推进。\n\n## 输出要求\n\n输出要短、清楚、可继续接。\n\n建议结构是：\n\n1. 当前已知\n2. 一个关键问题，或 2-3 个方案\n3. 下一步会做什么\n\n如果用户确认了，就把结果压成一段可进入设计阶段的需求摘要。\n这个摘要至少要包含：\n\n- 当前要解决的问题\n- 目标平台\n- 环境与依赖边界\n- 脚本偏好\n- 风格偏好或写作风格约束\n- 自动化风险提示结论\n- 浏览器自动化路线比较结论\n- 当前推荐路线\n- 进入设计阶段前已确认的范围\n\n## 调研完成标志\n\n当以下信息已经稳定时，就可以结束这个子 skill：\n\n- 要解决的问题已经清楚\n- 目标平台已经明确，或已收敛到可接受范围\n- 环境和依赖边界已经明确\n- 是否需要搜索参考已经有结果\n- 方案比较已经做过，且用户已确认方向\n\n## 终止规则\n\n一旦进入需要细化方案、模板、构建或 benchmark 的阶段，就不要继续重复发散。\n\n该阶段只负责把问题问清楚，把范围收住，把下一步交出去。\n交接时明确返回主 skill，并进入 `ref/design.md` 对应的设计阶段。\n\nFile v0.3.5:sub-skills/skill-creator/SKILL.md\n\n---\nname: cocoloop-sub-skill-creator\ndescription: Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an existing skill) that extends Gemini CLI's capabilities with specialized knowledge, workflows, or tool integrations.\n---\n\n# Skill Creator\n\nThis skill provides guidance for creating effective skills.\n\n## About Skills\n\nSkills are modular, self-contained packages that extend Gemini CLI's capabilities by providing specialized knowledge, workflows, and tools. Think of them as \"onboarding guides\" for specific domains or tasks—they transform Gemini CLI from a general-purpose agent into a specialized agent equipped with procedural knowledge that no model can fully possess.\n\n### What Skills Provide\n\n1. Specialized workflows - Multi-step procedures for specific domains\n2. Tool integrations - Instructions for working with specific file formats or APIs\n3. Domain expertise - Company-specific knowledge, schemas, business logic\n4. Bundled resources - Scripts, references, and assets for complex and repetitive tasks\n\n## Factory Integration\n\n当这个子 skill 被 `cocoloop-skill-factory` 调用时，先继承主流程已经确认的结果，而不是重新发明一套结构。\n\n优先使用这些输入：\n\n- 当前的 `primary_domain`\n- 当前的 `peer_domains`\n- 当前任务域对应的预设文档\n- 已经收口的 `spec.yaml`\n\n在工厂场景里，建议按下面顺序组织内容：\n\n1. 先用任务域预设确定 references 和 assets 的最小集合\n2. 如果目标产物属于视觉叙事型产物，先读取 `atomic-capability/structured-visual-storytelling/`，确定共享规则和 adapter\n2. 再根据平台模板决定目录结构\n3. 再把脚本、references、assets 放进最小可维护范围\n\n补充规则：\n\n- 如果已经确认 `visual_storytelling.enabled`，不要只按单一产物模板写 Skill\n- 先保留共享的文字层级、信息图元素和 `design_md` 规则\n- 再在 `references/` 中补具体 adapter 的落地细则\n\n如果一个 Skill 明显跨多个任务域，优先把主任务域写进 `SKILL.md` 主体，把补充域内容拆到 `references/`，避免主文件继续膨胀。\n\n## Core Principles\n\n### Concise is Key\n\nThe context window is a public good. Skills share the context window with everything else Gemini CLI needs: system prompt, conversation history, other Skills' metadata, and the actual user request.\n\n**Default assumption: Gemini CLI is already very smart.** Only add context Gemini CLI doesn't already have. Challenge each piece of information: \"Does Gemini CLI really need this explanation?\" and \"Does this paragraph justify its token cost?\"\n\nPrefer concise examples over verbose explanations.\n\n### Set Appropriate Degrees of Freedom\n\nMatch the level of specificity to the task's fragility and variability:\n\n**High freedom (text-based instructions)**: Use when multiple approaches are valid, decisions depend on context, or heuristics guide the approach.\n\n**Medium freedom (pseudocode or scripts with parameters)**: Use when a preferred pattern exists, some variation is acceptable, or configuration affects behavior.\n\n**Low freedom (specific scripts, few parameters)**: Use when operations are fragile and error-prone, consistency is critical, or a specific sequence must be followed.\n\nThink of Gemini CLI as exploring a path: a narrow bridge with cliffs needs specific guardrails (low freedom), while an open field allows many routes (high freedom).\n\n### Anatomy of a Skill\n\nEvery skill consists of a required SKILL.md file and optional bundled resources:\n\n```\nskill-name/\n├── SKILL.md (required)\n│   ├── YAML frontmatter metadata (required)\n│   │   ├── name: (required)\n│   │   └── description: (required)\n│   └── Markdown instructions (required)\n└── Bundled Resources (optional)\n    ├── scripts/          - Executable code (Node.js/Python/Bash/etc.)\n    ├── references/       - Documentation intended to be loaded into context as needed\n    └── assets/           - Files used in output (templates, icons, fonts, etc.)\n```\n\n#### SKILL.md (required)\n\nEvery SKILL.md consists of:\n\n- **Frontmatter** (YAML): Contains `name` and `description` fields. These are the only fields that Gemini CLI reads to determine when the skill gets used, thus it is very important to be clear and comprehensive in describing what the skill is, and when it should be used.\n- **Body** (Markdown): Instructions and guidance for using the skill. Only loaded AFTER the skill triggers (if at all).\n\n#### Bundled Resources (optional)\n\n##### Scripts (`scripts/`)\n\nExecutable code (Node.js/Python/Bash/etc.) for tasks that require deterministic reliability or are repeatedly rewritten.\n\n- **When to include**: When the same code is being rewritten repeatedly or deterministic reliability is needed\n- **Example**: `scripts/rotate_pdf.cjs` for PDF rotation tasks\n- **Benefits**: Token efficient, deterministic, may be executed without loading into context\n- **Agentic Ergonomics**: Scripts must output LLM-friendly stdout. Suppress standard tracebacks. Output clear, concise success/failure messages, and paginate or truncate outputs (e.g., \"Success: First 50 lines of processed file...\") to prevent context window overflow.\n- **Note**: Scripts may still need to be read by Gemini CLI for patching or environment-specific adjustments\n\n##### References (`references/`)\n\nDocumentation and reference material intended to be loaded as needed into context to inform Gemini CLI's process and thinking.\n\n- **When to include**: For documentation that Gemini CLI should reference while working\n- **Examples**: `references/finance.md` for financial schemas, `references/mnda.md` for company NDA template, `references/policies.md` for company policies, `references/api_docs.md` for API specifications\n- **Use cases**: Database schemas, API documentation, domain knowledge, company policies, detailed workflow guides\n- **Benefits**: Keeps SKILL.md lean, loaded only when Gemini CLI determines it's needed\n- **Best practice**: If files are large (>10k words), include grep search patterns in SKILL.md\n- **Avoid duplication**: Information should live in either SKILL.md or\n  references files, not both. Prefer references files for detailed information unless it's truly core to the skill—this keeps SKILL.md lean while making information discoverable without hogging the context window. Keep only essential procedural instructions and workflow guidance in SKILL.md; move detailed reference material, schemas, and examples to references files.\n\n##### Assets (`assets/`)\n\nFiles not intended to be loaded into context, but rather used within the output Gemini CLI produces.\n\n- **When to include**: When the skill needs files that will be used in the final output\n- **Examples**: `assets/logo.png` for brand assets, `assets/slides.pptx` for PowerPoint templates, `assets/frontend-template/` for HTML/React boilerplate, `assets/font.ttf` for typography\n- **Use cases**: Templates, images, icons, boilerplate code, fonts, sample documents that get copied or modified\n- **Benefits**: Separates output resources from documentation, enables Gemini CLI to use files without loading them into context\n\n#### What to Not Include in a Skill\n\nA skill should only contain essential files that directly support its functionality. Do NOT create extraneous documentation or auxiliary files, including:\n\n- README.md\n- INSTALLATION_GUIDE.md\n- QUICK_REFERENCE.md\n- CHANGELOG.md\n- etc.\n\nThe skill should only contain the information needed for an AI agent to do the job at hand. It should not contain auxiliary context about the process that went into creating it, setup and testing procedures, user-facing documentation, etc. Creating additional documentation files just adds clutter and confusion.\n\n### Progressive Disclosure Design Principle\n\nSkills use a three-level loading system to manage context efficiently:\n\n1. **Metadata (name + description)** - Always in context (~100 words)\n2. **SKILL.md body** - When skill triggers (<5k words)\n3. **Bundled resources** - As needed by Gemini CLI (Unlimited because scripts can be executed without reading into context window)\n\n#### Progressive Disclosure Patterns\n\nKeep SKILL.md body to the essentials and under 500 lines to minimize context bloat. Split content into separate files when approaching this limit. When splitting out content into other files, it is very important to reference them from SKILL.md and describe clearly when to read them, to ensure the reader of the skill knows they exist and when to use them.\n\n**Key principle:** When a skill supports multiple variations, frameworks, or options, keep only the core workflow and selection guidance in SKILL.md. Move variant-specific details (patterns, examples, configuration) into separate reference files.\n\n**Pattern 1: High-level guide with references**\n\n```markdown\n# PDF Processing\n\n## Quick start\n\nExtract text with pdfplumber: [code example]\n\n## Advanced features\n\n- **Form filling**: See [FORMS.md](FORMS.md) for complete guide\n- **API reference**: See [REFERENCE.md](REFERENCE.md) for all methods\n- **Examples**: See [EXAMPLES.md](EXAMPLES.md) for common patterns\n```\n\nGemini CLI loads FORMS.md, REFERENCE.md, or EXAMPLES.md only when needed.\n\n**Pattern 2: Domain-specific organization**\n\nFor Skills with multiple domains, organize content by domain to avoid loading irrelevant context:\n\n```\nbigquery-skill/\n├── SKILL.md (overview and navigation)\n└── reference/\n    ├── finance.md (revenue, billing metrics)\n    ├── sales.md (opportunities, pipeline)\n    ├── product.md (API usage, features)\n    └── marketing.md (campaigns, attribution)\n```\n\nWhen a user asks about sales metrics, Gemini CLI only reads sales.md.\n\nSimilarly, for skills supporting multiple frameworks or variants, organize by variant:\n\n```\ncloud-deploy/\n├── SKILL.md (workflow + provider selection)\n└── references/\n    ├── aws.md (AWS deployment patterns)\n    ├── gcp.md (GCP deployment patterns)\n    └── azure.md (Azure deployment patterns)\n```\n\nWhen the user chooses AWS, Gemini CLI only reads aws.md.\n\n**Pattern 3: Conditional details**\n\nShow basic content, link to advanced content:\n\n```markdown\n# CSV Processing\n\n## Basic Analysis\n\nUse pandas for loading and basic queries. See [PANDAS.md](PANDAS.md).\n\n## Advanced Operations\n\nFor massive files that exceed memory, see [STREAMING.md](STREAMING.md). For timestamp normalization, see [TIMESTAMPS.md](TIMESTAMPS.md).\n\nGemini CLI reads REDLINING.md or OOXML.md only when the user needs those features.\n```\n\n**Important guidelines:**\n\n- **Avoid deeply nested references** - Keep references one level deep from SKILL.md. All reference files should link directly from SKILL.md.\n- **Structure longer reference files** - For files longer than 100 lines, include a table of contents at the top so Gemini CLI can see the full scope when previewing.\n\n## Skill Creation Process\n\nSkill creation involves these steps:\n\nWhen this sub skill is used inside `cocoloop-skill-factory` and a settled `spec.yaml` already exists, the default entry is the factory-owned builder chain, not the generic packager:\n\n- `factory-skill-builder/scripts/render_skill_from_spec.cjs`\n- `factory-skill-builder/scripts/validate_platform_skill.cjs`\n- `factory-skill-builder/scripts/build_skill_from_spec.cjs`\n\nIf the current task already has a settled `spec.yaml`, do not follow the generic sequence below. Use the factory-owned builder chain and stop routing through the standalone packager.\n\n1. Understand the skill with concrete examples\n2. Plan reusable skill contents (scripts, references, assets)\n3. Initialize the skill (run node init_skill.cjs)\n4. Edit the skill (implement resources and write SKILL.md)\n5. If this is a standalone skill with no settled `spec.yaml`, package it with `package_skill.cjs`\n6. Install and reload the skill\n7. Iterate based on real usage\n\nKeep the boundary clear:\n\n- Generic standalone packaging uses `package_skill.cjs`\n- Factory-owned `spec.yaml -> skill` rendering and platform-aware packaging must go through `factory-skill-builder/scripts/`\n\nFollow these steps in order, skipping only if there is a clear reason why they are not applicable.\n\n### Skill Naming\n\n- Use lowercase letters, digits, and hyphens only; normalize user-provided titles to hyphen-case (e.g., \"Plan Mode\" -> `plan-mode`).\n- When generating names, generate a name under 64 characters (letters, digits, hyphens).\n- Prefer short, verb-led phrases that describe the action.\n- Namespace by tool when it improves clarity or triggering (e.g., `gh-address-comments`, `linear-address-issue`).\n- Name the skill folder exactly after the skill name.\n\n### Step 1: Understanding the Skill with Concrete Examples\n\nSkip this step only when the skill's usage patterns are already clearly understood. It remains valuable even when working with an existing skill.\n\nTo create an effective skill, clearly understand concrete examples of how the skill will be used. This understanding can come from either direct user examples or generated examples that are validated with user feedback.\n\nFor example, when building an image-editor skill, relevant questions include:\n\n- \"What functionality should the image-editor skill support? Editing, rotating, anything else?\"\n- \"Can you give some examples of how this skill would be used?\"\n- \"I can imagine users asking for things like 'Remove the red-eye from this image' or 'Rotate this image'. Are there other ways you imagine this skill being used?\"\n- \"What would a user say that should trigger this skill?\"\n\n**Avoid interrogation loops:** Do not ask more than one or two clarifying questions at a time. Bias toward action: propose a concrete list of features or examples based on your initial understanding, and ask the user to refine them.\n\nConclude this step when there is a clear sense of the functionality the skill should support.\n\n### Step 2: Planning the Reusable Skill Contents\n\nTo turn concrete examples into an effective skill, analyze each example by:\n\n1. Considering how to execute on the example from scratch\n2. Identifying what scripts, references, and assets would be helpful when executing these workflows repeatedly\n\nExample: When building a `pdf-editor` skill to handle queries like \"Help me rotate this PDF,\" the analysis shows:\n\n1. Rotating a PDF requires re-writing the same code each time\n2. A `scripts/rotate_pdf.cjs` script would be helpful to store in the skill\n\nExample: When designing a `frontend-webapp-builder` skill for queries like \"Build me a todo app\" or \"Build me a dashboard to track my steps,\" the analysis shows:\n\n1. Writing a frontend webapp requires the same boilerplate HTML/React each time\n2. An `assets/hello-world/` template containing the boilerplate HTML/React project files would be helpful to store in the skill\n\nExample: When building a `big-query` skill to handle queries like \"How many users have logged in today?\" the analysis shows:\n\n1. Querying BigQuery requires re-discovering the table schemas and relationships each time\n2. A `references/schema.md` file documenting the table schemas would be helpful to store in the skill\n\nTo establish the skill's contents, analyze each concrete example to create a list of the reusable resources to include: scripts, references, and assets.\n\n### Step 3: Initializing the Skill\n\nAt this point, it is time to actually create the skill.\n\nSkip this step only if the skill being developed already exists, and iteration or packaging is needed. In this case, continue to the next step.\n\nWhen creating a new skill from scratch, always run the `init_skill.cjs` script. The script conveniently generates a new template skill directory that automatically includes everything a skill requires, making the skill creation process much more efficient and reliable.\n\n**Note:** Use the absolute path to the script as provided in the `available_resources` section.\n\nUsage:\n\n```bash\nnode <path-to-skill-creator>/scripts/init_skill.cjs <skill-name> --path <output-directory>\n```\n\nThe script:\n\n- Creates the skill directory at the specified path\n- Generates a SKILL.md template with proper frontmatter and TODO placeholders\n- Creates example resource directories: `scripts/`, `references/`, and `assets/`\n- Adds example files (`scripts/example_script.cjs`, `references/example_reference.md`, `assets/example_asset.txt`) that can be customized or deleted\n\nAfter initialization, customize or remove the generated SKILL.md and example files as needed.\n\n### Step 4: Edit the Skill\n\nWhen editing the (newly-generated or existing) skill, remember that the skill is being created for another instance of Gemini CLI to use. Include information that would be beneficial and non-obvious to Gemini CLI. Consider what procedural knowledge, domain-specific details, or reusable assets would help another Gemini CLI instance execute these tasks more effectively.\n\n#### Learn Proven Design Patterns\n\nConsult these helpful guides based on your skill's needs:\n\n- **Multi-step processes**: See references/workflows.md for sequential workflows and conditional logic\n- **Specific output formats or quality standards**: See references/output-patterns.md for template and example patterns\n\nThese files contain established best practices for effective skill design.\n\n#### Start with Reusable Skill Contents\n\nTo begin implementation, start with the reusable resources identified above: `scripts/`, `references/`, and `assets/` files. Note that this step may require user input. For example, when implementing a `brand-guidelines` skill, the user may need to provide brand assets or templates to store in `assets/`, or documentation to store in `references/`.\n\nAdded scripts must be tested by actually running them to ensure there are no bugs and that the output matches what is expected. If there are many similar scripts, only a representative sample needs to be tested to ensure confidence that they all work while balancing time to completion.\n\nAny example files and directories not needed for the skill should be deleted. The initialization script creates example files in `scripts/`, `references/`, and `assets/` to demonstrate structure, but most skills won't need all of them.\n\n#### Update SKILL.md\n\n**Writing Guidelines:** Always use imperative/infinitive form.\n\n##### Frontmatter\n\nWrite the YAML frontmatter with `name` and `description`:\n\n- `name`: The skill name\n- `description`: This is the primary triggering mechanism for your skill, and helps Gemini CLI understand when to use the skill.\n  - Include both what the Skill does and specific triggers/contexts for when to use it.\n  - **Must be a single-line string** (e.g., `description: Data ingestion...`). Quotes are optional.\n  - Include all \"when to use\" information here - Not in the body. The body is only loaded after triggering, so \"When to Use This Skill\" sections in the body are not helpful to Gemini CLI.\n  - Example: `description: Data ingestion, cleaning, and transformation for tabular data. Use when Gemini CLI needs to work with CSV/TSV files to analyze large datasets, normalize schemas, or merge sources.`\n\nDo not include any other fields in YAML frontmatter.\n\n##### Body\n\nWrite instructions for using the skill and its bundled resources.\n\n### Step 5: Packaging a Standalone Skill\n\nOnce development of the skill is complete, it must be packaged into a distributable .skill file that gets shared with the user. The packaging process automatically validates the skill first (checking YAML and ensuring no TODOs remain) to ensure it meets all requirements.\n\n**Note:** Use the absolute path to the script as provided in the `available_resources` section.\n\nIf the current task is inside `cocoloop-skill-factory` and already has a settled `spec.yaml`, stop here and use the factory-owned builder under `factory-skill-builder/scripts/`. The generic command below is only for standalone Skill packaging outside the factory chain and must not be used as a substitute for the factory path.\n\nFactory path first:\n\n```bash\nnode factory-skill-builder/scripts/build_skill_from_spec.cjs <spec.yaml> --out <output-dir> --package\n```\n\nStandalone path only:\n\n```bash\nnode <path-to-skill-creator>/scripts/package_skill.cjs <path/to/skill-folder>\n```\n\nOptional output directory specification:\n\n```bash\nnode <path-to-skill-creator>/scripts/package_skill.cjs <path/to/skill-folder> ./dist\n```\n\nThe packaging script will:\n\n1. **Validate** the skill automatically, checking:\n   - YAML frontmatter format and required fields\n   - Skill naming conventions and directory structure\n   - Description completeness and quality\n   - File organization and resource references\n\n2. **Package** the skill if validation passes, creating a .skill file named after the skill (e.g., `my-skill.skill`) that includes all files and maintains the proper directory structure for distribution. The .skill file is a zip file with a .skill extension.\n\nIf validation fails, the script will report the errors and exit without creating a package. Fix any validation errors and run the packaging command again.\n\n### Step 6: Installing and Reloading a Skill\n\nOnce the skill is packaged into a `.skill` file, offer to install it for the user. Ask whether they would like to install it locally in the current folder (workspace scope) or at the user level (user scope).\n\nIf the user agrees to an installation, perform it immediately using the `run_shell_command` tool:\n\n- **Locally (workspace scope)**:\n  ```bash\n  gemini skills install <path/to/skill-name.skill> --scope workspace\n  ```\n- **User level (user scope)**:\n  ```bash\n  gemini skills install <path/to/skill-name.skill> --scope user\n  ```\n\n**Important:** After the installation is complete, notify the user that they MUST manually execute the `/skills reload` command in their interactive Gemini CLI session to enable the new skill. They can then verify the installation by running `/skills list`.\n\nNote: You (the agent) cannot execute the `/skills reload` command yourself; it must be done by the user in an interactive instance of Gemini CLI. Do not attempt to run it on their behalf.\n\n### Step 7: Iterate\n\nAfter testing the skill, users may request improvements. Often this happens right after using the skill, with fresh context of how the skill performed.\n\n**Iteration workflow:**\n\n1. Use the skill on real tasks\n2. Notice struggles or inefficiencies\n3. Identify how SKILL.md or bundled resources should be updated\n4. Implement changes and test again\n\nFile v0.3.5:factory-skill-builder/README.md\n\n# Factory Skill Builder\n\n这个目录属于 `cocoloop-skill-factory` 内部实现。\n\n它只负责 `spec.yaml -> skill` 的生成链：\n\n- 渲染最小 Skill 骨架\n- 固化模板选择结果\n- 做平台校验\n- 在满足公开条件时执行平台打包\n\n这里不是仓库根级通用脚手架，也不是最终生成出来的 Skill 目录。\n\n## 依赖准备\n\n运行这里的脚本前，先在当前目录准备 Node 依赖：\n\n```bash\ncd cocoloop-skill-factory/factory-skill-builder\nnpm install\n```\n\n当前最小依赖是 `yaml`，供 `spec.yaml` 解析与 frontmatter 生成使用。\n打包阶段还要求系统中至少可用 `zip` 或 `tar` 其中一个命令。\n\n## 元数据约束\n\n所有由这条生成链产出的 `SKILL.md`，frontmatter 都会强制带上：\n\n```yaml\ngenerated_by_cocoloop: true\n```\n\n如需巡检或补写历史产物，可以单独运行：\n\n```bash\nnode scripts/ensure_generated_by_cocoloop.cjs <skill-or-directory> --check\nnode scripts/ensure_generated_by_cocoloop.cjs <skill-or-directory> --fix\n```\n\n当目标是目录时，这个巡检只会处理同时包含 `SKILL.md` 和 `spec.yaml` 的生成产物目录，不会把手写主 Skill、子 Skill 或引用型 source skill 误判进去。\n\n## 最小命令\n\n```bash\nnode scripts/build_skill_from_spec.cjs ../output/preset-system-hardening/spec.yaml --out /tmp/cocoloop-build --platform codex --package\n```\n\n只拿着 `cocoloop-skill-factory` 子仓时，也可以只依赖当前目录下这条生成链完成 `spec.yaml -> skill` 的渲染、校验和打包。\n\nFile v0.3.5:output/clawhub-infographic-ppt-deep-dive/source-skills/visual-note-card/README.md\n\n# Visual Note Card Generator\r\n\r\nA custom skill for [Claude Code](https://docs.anthropic.com/en/docs/claude-code) and [OpenClaw](https://openclaw.ai/) that generates professional Chinese visual note cards (视觉笔记卡片/信息图) as single-page HTML infographics.\r\n\r\n![Claude Code Skill](https://img.shields.io/badge/Claude_Code-Skill-blue)\r\n![OpenClaw Compatible](https://img.shields.io/badge/OpenClaw-Compatible-purple)\r\n![License](https://img.shields.io/badge/License-MIT-green)\r\n\r\n## Overview\r\n\r\nThis skill turns any topic, article, or concept into a beautifully structured visual note card — a poster-style infographic optimized for social media sharing or printing. All output is a single self-contained HTML file with no external dependencies (except Google Fonts and html2canvas CDN).\r\n\r\n### Features\r\n\r\n- **Single HTML output** — no build tools, no frameworks, fully self-contained\r\n- **Bilingual support** — Chinese body text with English display titles\r\n- **Built-in export** — floating action button with PNG/JPEG export at multiple resolutions (1×, 1.5×, 2×)\r\n- **Structured layout** — editorial knowledge card aesthetic with framework grid, dark/light panels, and highlight bar\r\n- **Customizable palette** — default teal/orange theme with support for user-requested color schemes\r\n\r\n### Example Output\r\n\r\n![Demo](demo.png)\r\n\r\nThe card follows a fixed layout structure:\r\n\r\n```\r\n┌──────────────────────────────────────────┐\r\n│ TOPIC LABEL              SOURCE LABEL    │  ← Top Bar\r\n├────────────────────┬─────────────────────┤\r\n│ English Title      │ Thesis statement    │  ← Title Area\r\n│ 中文标题            │ with key insight    │\r\n├─────┬─────┬─────┬──┴──────────────────────┤\r\n│  M  │  P  │  D  │  G  │                  │  ← Framework Row (4 cards)\r\n├─────┴─────┴─────┴─────┴──────────────────┤\r\n│ ⚡ Dark Panel      │ ★ Light Panel        │  ← Two-Column Content\r\n│ (narrative/story)  │ (numbered insights)  │\r\n├──────────────────────────────────────────┤\r\n│ Formula = M × P × D × G    Closing note  │  ← Highlight Bar\r\n├──────────────────────────────────────────┤\r\n│ FRAMEWORK LABEL              BRAND NAME   │  ← Footer\r\n└──────────────────────────────────────────┘\r\n```\r\n\r\n## Installation\r\n\r\n### Prerequisites\r\n\r\n- [Claude Code](https://docs.anthropic.com/en/docs/claude-code) or [OpenClaw](https://openclaw.ai/) installed and configured\r\n\r\n### Install\r\n\r\nClone this repository into your skills directory:\r\n\r\n**Claude Code:**\r\n\r\n```bash\r\ngit clone https://github.com/beilunyang/visual-note-card-skills.git ~/.claude/skills/visual-note-card\r\n```\r\n\r\n**OpenClaw:**\r\n\r\n```bash\r\ngit clone https://github.com/beilunyang/visual-note-card-skills.git ~/.openclaw/skills/visual-note-card\r\n```\r\n\r\nBoth tools will automatically detect the skill and use it when you ask for visual notes or knowledge cards.\r\n\r\n### Uninstall\r\n\r\n**Claude Code:**\r\n\r\n```bash\r\nrm -rf ~/.claude/skills/visual-note-card\r\n```\r\n\r\n**OpenClaw:**\r\n\r\n```bash\r\nrm -rf ~/.openclaw/skills/visual-note-card\r\n```\r\n\r\n## Usage\r\n\r\nSimply ask Claude Code or OpenClaw to create a visual note card:\r\n\r\n```\r\n# Chinese prompts\r\n帮我做一张关于 RAG 架构的视觉笔记\r\n把这篇文章做成信息图\r\n生成一张知识卡片，主题是微服务\r\n\r\n# English prompts\r\nCreate a visual note about product-market fit\r\nMake a knowledge card summarizing this article\r\n```\r\n\r\n### What triggers this skill\r\n\r\nThe skill activates when you mention:\r\n- 视觉笔记 / 知识卡片 / 信息图 / 一页纸总结\r\n- visual note / knowledge card / infographic / one-pager summary\r\n- Any request to summarize content into a structured visual card format\r\n\r\n## Project Structure\r\n\r\n```\r\n.\r\n├── SKILL.md              # Skill definition and design system specification\r\n├── assets/\r\n│   └── template.html     # Canonical HTML/CSS reference template\r\n├── LICENSE\r\n├── CONTRIBUTING.md\r\n└── README.md\r\n```\r\n\r\n## Customization\r\n\r\n### Color Palette\r\n\r\nThe default palette uses CSS variables defined in the template:\r\n\r\n| Variable | Default | Usage |\r\n|----------|---------|-------|\r\n| `--primary` | `#1a7a6d` (teal) | Headers, badges, accents |\r\n| `--accent` | `#e8713a` (orange) | Emphasis, secondary badges |\r\n| `--bg` | `#f0ebe4` (warm gray) | Page background |\r\n| `--black` | `#1a1a1a` | Dark panel, primary text |\r\n\r\nYou can request alternate color schemes when generating cards. The skill will maintain the same structural contrast ratios with your chosen colors.\r\n\r\n### Typography\r\n\r\n- **English display**: Playfair Display (serif)\r\n- **Chinese body**: Noto Sans SC\r\n- **Monospace/labels**: JetBrains Mono\r\n\r\nAll fonts are loaded via Google Fonts CDN.\r\n\r\n## Contributing\r\n\r\nContributions are welcome! Please read [CONTRIBUTING.md](CONTRIBUTING.md) for details.\r\n\r\n## License\r\n\r\nThis project is licensed under the MIT License — see the [LICENSE](LICENSE) file for details.\n\nArchive v0.3.4: 228 files, 388190 bytes\n\nFiles: agents/openai.yaml (264b), atomic-capability/browser-access/index.md (5272b), atomic-capability/browser-access/opencli-browser-bridge.md (1983b), atomic-capability/data-parse-transform/index.md (1059b), atomic-capability/document-generation/index.md (1033b), atomic-capability/external-service/index.md (2082b), atomic-capability/file-ops/index.md (1034b), atomic-capability/index.md (5036b), atomic-capability/infographic-generation/index.md (8049b), atomic-capability/presentation-generation/index.md (9839b), atomic-capability/search-and-info/index.md (1243b), atomic-capability/structured-visual-storytelling/examples/graduate-defense.md (660b), atomic-capability/structured-visual-storytelling/index.md (3373b), atomic-capability/structured-visual-storytelling/output-adapters.md (1289b), atomic-capability/structured-visual-storytelling/shared-rules.md (1954b), atomic-capability/subskill-invocation/index.md (1042b), atomic-capability/template-mapping/index.md (986b), factory-skill-builder/package-lock.json (740b), factory-skill-builder/package.json (216b), factory-skill-builder/README.md (1546b), factory-skill-builder/scripts/_spec_common.cjs (4754b), factory-skill-builder/scripts/build_skill_from_spec.cjs (2619b), factory-skill-builder/scripts/ensure_generated_by_cocoloop.cjs (3888b), factory-skill-builder/scripts/package_skill.cjs (4360b), factory-skill-builder/scripts/render_skill_from_spec.cjs (34818b), factory-skill-builder/scripts/validate_platform_skill.cjs (22230b), factory-skill-builder/scripts/validate_skill.cjs (3310b), output/browser-automation-routing/build-plan.md (1132b), output/browser-automation-routing/design-summary.md (1369b), output/browser-automation-routing/reference-skill-analysis.md (2385b), output/browser-automation-routing/research-summary.md (2368b), output/browser-automation-routing/spec.md (1539b), output/clawhub-infographic-ppt-deep-dive/build-plan.md (1244b), output/clawhub-infographic-ppt-deep-dive/design-summary.md (3590b), output/clawhub-infographic-ppt-deep-dive/reference-skill-analysis.md (9820b), output/clawhub-infographic-ppt-deep-dive/research-summary.md (5218b), output/clawhub-infographic-ppt-deep-dive/source-skills/ai-presentation-maker/_meta.json (140b), output/clawhub-infographic-ppt-deep-dive/source-skills/ai-presentation-maker/assets/presentation-helper.sh (13644b), output/clawhub-infographic-ppt-deep-dive/source-skills/ai-presentation-maker/references/export-gamma.sh (2882b), output/clawhub-infographic-ppt-deep-dive/source-skills/ai-presentation-maker/references/export-html-slides.py (16960b), output/clawhub-infographic-ppt-deep-dive/source-skills/ai-presentation-maker/references/export-pptx.py (6047b), output/clawhub-infographic-ppt-deep-dive/source-skills/ai-presentation-maker/references/slide-templates.py (30732b), output/clawhub-infographic-ppt-deep-dive/source-skills/ai-presentation-maker/SKILL.md (40551b), output/clawhub-infographic-ppt-deep-dive/source-skills/article-to-infographic/_meta.json (141b), output/clawhub-infographic-ppt-deep-dive/source-skills/article-to-infographic/references/illustrations-guide.md (8072b), output/clawhub-infographic-ppt-deep-dive/source-skills/article-to-infographic/references/style-presets.md (8787b), output/clawhub-infographic-ppt-deep-dive/source-skills/article-to-infographic/scripts/html_to_png.py (4469b), output/clawhub-infographic-ppt-deep-dive/source-skills/article-to-infographic/skill.json (1717b), output/clawhub-infographic-ppt-deep-dive/source-skills/article-to-infographic/SKILL.md (17884b), output/clawhub-infographic-ppt-deep-dive/source-skills/article-to-infographic/Skills/article-to-infographic-README.md (892b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/_meta.json (138b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/analysis-framework.md (7490b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/base-prompt.md (1082b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/bento-grid.md (851b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/binary-comparison.md (1278b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/bridge.md (907b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/circular-flow.md (759b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/comic-strip.md (847b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/comparison-matrix.md (893b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/dashboard.md (776b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/dense-modules.md (3673b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/funnel.md (821b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/hierarchical-layers.md (1180b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/hub-spoke.md (865b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/iceberg.md (884b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/isometric-map.md (833b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/jigsaw.md (844b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/linear-progression.md (1238b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/periodic-table.md (774b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/story-mountain.md (815b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/structural-breakdown.md (1118b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/tree-branching.md (913b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/venn-diagram.md (825b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/winding-roadmap.md (799b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/structured-content-template.md (5515b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/styles/aged-academia.md (990b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/styles/bold-graphic.md (920b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/styles/chalkboard.md (2204b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/styles/claymation.md (654b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/styles/corporate-memphis.md (612b)\n\nFile v0.3.4:output/clawhub-infographic-ppt-deep-dive/source-skills/ai-presentation-maker/SKILL.md\n\n---\nname: ai-presentation-maker\nversion: 1.0.0\ndescription: \"AI Presentation Maker — the interview-driven pitch deck generator for your OpenClaw agent. Tell it what you built, who you're presenting to, and pick an angle — it generates a complete slide deck with speaker notes, factual validation, and real cost breakdowns. No made-up ROI. No speculative projections. Just compelling presentations built from actual work. Exports to Markdown, PPTX, and PDF. Works standalone or alongside AI Persona OS. Built by Jeff J Hunter.\"\ntags: [presentation, slides, pitch-deck, keynote, speaker, deck, export, pptx, pdf, markdown, factual]\nauthor: Jeff J Hunter\nhomepage: https://jeffjhunter.com\nmetadata: {\"openclaw\":{\"emoji\":\"🎤\",\"requires\":{\"bins\":[\"bash\",\"sed\",\"find\",\"grep\",\"date\",\"wc\"],\"optionalBins\":[\"openclaw\",\"jq\",\"pandoc\",\"python3\"],\"env\":[],\"optionalEnv\":[]},\"stateDirs\":[\"~/workspace/presentations\",\"~/workspace/presentations/decks\",\"~/workspace/presentations/exports\"],\"persistence\":\"Presentation data stored as JSON + Markdown under ~/workspace/presentations/. All file operations routed through assets/presentation-helper.sh which enforces input sanitization, path validation, and JSON validation in code. No network activity required. Export to PPTX requires python3 + python-pptx. Export to PDF requires pandoc.\",\"cliUsage\":\"The openclaw CLI is OPTIONAL. Core presentation creation works entirely with standard Unix tools and the bundled helper script.\"}}\n---\n\n# 🎤 AI Presentation Maker\n\n**The interview-driven pitch deck generator for your OpenClaw agent.**\n\nTell it what you built. Tell it who's in the room. Pick an angle. Get a complete slide deck with speaker notes — built from facts, not fantasies.\n\n---\n\n## ⛔ AGENT RULES — READ BEFORE DOING ANYTHING\n\n> 1. **Use EXACT text from this file.** Do not paraphrase menus, slide type names, or instructions. Copy them verbatim.\n> 2. **NEVER tell the user to open a terminal or run commands.** You have the exec tool. USE IT. Run every command yourself via exec.\n> 3. **One step at a time.** Interview questions go 1-2 at a time. Never dump the full questionnaire.\n> 4. **NEVER overwrite existing presentation files without asking.** If the file exists, ask before replacing.\n> 5. **FACTUAL VALIDATION IS MANDATORY.** Before generating any slide, check for speculative language. Flag it. The user decides what stays.\n> 6. **Scope: ~/workspace/presentations/ only.** All file operations stay under this directory.\n> 7. **USE THE HELPER SCRIPT FOR ALL FILE OPERATIONS.** Never construct raw shell commands with user input. Always route through `assets/presentation-helper.sh`.\n> 8. **Speaker notes are required.** Every slide gets \"What to say\" and \"What NOT to say\" notes. No exceptions.\n> 9. **No made-up numbers.** If the user hasn't provided a specific stat, don't invent one. Use \"[INSERT ACTUAL NUMBER]\" as placeholder and flag it.\n> 10. **Respect the user's voice.** If they talk casually, the deck should feel casual. If they're formal, match it. The interview captures this.\n\n---\n\n## 🛡️ Helper Script — Security Layer\n\nAll file operations go through `assets/presentation-helper.sh`. This script enforces sanitization in **code**, not in prompt instructions.\n\n**First-run:** Copy the helper to the workspace:\n```bash\ncp assets/presentation-helper.sh ~/workspace/presentations/helper.sh\nchmod +x ~/workspace/presentations/helper.sh\n```\n\n**Usage:**\n```bash\n# Create workspace\n~/workspace/presentations/helper.sh init\n\n# Save presentation metadata (JSON from stdin)\n~/workspace/presentations/helper.sh save-meta < /tmp/pres_meta.json\n\n# Save slide deck (Markdown from stdin)\n~/workspace/presentations/helper.sh save-deck <pres_id>\n\n# List presentations\n~/workspace/presentations/helper.sh list\n\n# Get presentation metadata\n~/workspace/presentations/helper.sh get-meta <pres_id>\n\n# Get slide deck\n~/workspace/presentations/helper.sh get-deck <pres_id>\n\n# Delete presentation\n~/workspace/presentations/helper.sh delete <pres_id>\n\n# Sanitize a string\n~/workspace/presentations/helper.sh sanitize-string \"user input\"\n```\n\n---\n\n## 🔍 Post-Install Check\n\n> **🚨 AGENT: Run this FIRST before showing any menu.**\n\n```bash\n# Check for existing workspace\nls ~/workspace/presentations/config.yaml 2>/dev/null\n\n# Check for AI Persona OS\nls ~/workspace/SOUL.md ~/workspace/AGENTS.md 2>/dev/null | wc -l\n\n# Check export dependencies\nwhich python3 2>/dev/null && echo \"HTML export: ✅ (recommended)\" || echo \"HTML export: ❌ (needs python3)\"\necho \"Gamma export: ✅ (always available)\"\nwhich pandoc 2>/dev/null && echo \"PDF export: ✅\" || echo \"PDF export: ❌ (install pandoc — or use HTML print)\"\nwhich python3 2>/dev/null && python3 -c \"import pptx; print('PPTX export: ✅')\" 2>/dev/null || echo \"PPTX export: ❌ (install python3 + python-pptx)\"\n```\n\n**If config.yaml exists → workspace is set up.** Show:\n> \"🎤 Presentation Maker is ready. You have X decks saved. Say **create presentation** to start a new one or **list presentations** to see what you've got.\"\n\n**If config.yaml is missing → fresh install.** Show the welcome message:\n\n> **🚨 AGENT: OUTPUT THE EXACT TEXT BELOW VERBATIM.**\n\n```\n🎤 Welcome to AI Presentation Maker!\n\nI build slide decks from your actual work — not templates\nstuffed with placeholder text.\n\nHere's how it works:\n\n1. 🎯 I interview you (5 min)\n   What you built, who's in the room, what matters\n\n2. 🧭 I suggest angles (pick one)\n   3-5 ways to frame your story\n\n3. 📊 I generate your deck\n   Slides + speaker notes + factual validation\n\n4. ✏️ You refine\n   Add details, change tone, cut slides\n\n5. 📦 Export\n   Markdown (default), PPTX, or PDF\n\nEvery number in your deck comes from YOU.\nNo made-up ROI. No fake projections.\n\nReady? Say \"create presentation\" to start.\n```\n\nWait for explicit confirmation before proceeding.\n\n---\n---\n\n#\n\nArchive v0.3.3: 227 files, 385889 bytes\n\nFiles: agents/openai.yaml (264b), atomic-capability/browser-access/index.md (5272b), atomic-capability/browser-access/opencli-browser-bridge.md (1983b), atomic-capability/data-parse-transform/index.md (1059b), atomic-capability/document-generation/index.md (1033b), atomic-capability/external-service/index.md (2082b), atomic-capability/file-ops/index.md (1034b), atomic-capability/index.md (5036b), atomic-capability/infographic-generation/index.md (8049b), atomic-capability/presentation-generation/index.md (9839b), atomic-capability/search-and-info/index.md (1243b), atomic-capability/structured-visual-storytelling/examples/graduate-defense.md (660b), atomic-capability/structured-visual-storytelling/index.md (3373b), atomic-capability/structured-visual-storytelling/output-adapters.md (1289b), atomic-capability/structured-visual-storytelling/shared-rules.md (1954b), atomic-capability/subskill-invocation/index.md (1042b), atomic-capability/template-mapping/index.md (986b), factory-skill-builder/package-lock.json (740b), factory-skill-builder/package.json (216b), factory-skill-builder/README.md (1354b), factory-skill-builder/scripts/_spec_common.cjs (4754b), factory-skill-builder/scripts/build_skill_from_spec.cjs (2619b), factory-skill-builder/scripts/ensure_generated_by_cocoloop.cjs (3673b), factory-skill-builder/scripts/package_skill.cjs (4360b), factory-skill-builder/scripts/render_skill_from_spec.cjs (34818b), factory-skill-builder/scripts/validate_platform_skill.cjs (22230b), factory-skill-builder/scripts/validate_skill.cjs (3310b), output/browser-automation-routing/build-plan.md (1132b), output/browser-automation-routing/design-summary.md (1369b), output/browser-automation-routing/reference-skill-analysis.md (2385b), output/browser-automation-routing/research-summary.md (2368b), output/browser-automation-routing/spec.md (1539b), output/clawhub-infographic-ppt-deep-dive/build-plan.md (1244b), output/clawhub-infographic-ppt-deep-dive/design-summary.md (3590b), output/clawhub-infographic-ppt-deep-dive/reference-skill-analysis.md (9820b), output/clawhub-infographic-ppt-deep-dive/research-summary.md (5218b), output/clawhub-infographic-ppt-deep-dive/source-skills/ai-presentation-maker/_meta.json (140b), output/clawhub-infographic-ppt-deep-dive/source-skills/ai-presentation-maker/assets/presentation-helper.sh (13644b), output/clawhub-infographic-ppt-deep-dive/source-skills/ai-presentation-maker/references/export-gamma.sh (2882b), output/clawhub-infographic-ppt-deep-dive/source-skills/ai-presentation-maker/references/export-html-slides.py (16960b), output/clawhub-infographic-ppt-deep-dive/source-skills/ai-presentation-maker/references/export-pptx.py (6047b), output/clawhub-infographic-ppt-deep-dive/source-skills/ai-presentation-maker/references/slide-templates.py (30732b), output/clawhub-infographic-ppt-deep-dive/source-skills/ai-presentation-maker/SKILL.md (40551b), output/clawhub-infographic-ppt-deep-dive/source-skills/article-to-infographic/_meta.json (141b), output/clawhub-infographic-ppt-deep-dive/source-skills/article-to-infographic/references/illustrations-guide.md (8072b), output/clawhub-infographic-ppt-deep-dive/source-skills/article-to-infographic/references/style-presets.md (8787b), output/clawhub-infographic-ppt-deep-dive/source-skills/article-to-infographic/scripts/html_to_png.py (4469b), output/clawhub-infographic-ppt-deep-dive/source-skills/article-to-infographic/skill.json (1717b), output/clawhub-infographic-ppt-deep-dive/source-skills/article-to-infographic/SKILL.md (17884b), output/clawhub-infographic-ppt-deep-dive/source-skills/article-to-infographic/Skills/article-to-infographic-README.md (892b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/_meta.json (138b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/analysis-framework.md (7490b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/base-prompt.md (1082b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/bento-grid.md (851b), output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/references/layouts/binary-comparison.md (1278b), output/clawhub-infographic-ppt-d...","readmeExcerpt":"Skill: CocoLoop Skill Factory Owner: catrefuse Summary: 引导需求、检索参考、装配多平台 Skill 产物的工厂 Tags: latest:0.3.5, meta-skill:0.3.5, skill-factory:0.3.5 Version history: v0.3.5 | 2026-04-27T11:45:22.174Z | user Extend factory task domains, shared schema validation, and business presets. v0.3.4 | 2026-04-21T12:24:26.567Z | user Release 0.3.4 v0.3.3 | 2026-04-21T11:53:53.312Z | user Harden factory generation and visual storytelli","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"cp assets/presentation-helper.sh ~/workspace/presentations/helper.sh\nchmod +x ~/workspace/presentations/helper.sh"},{"language":"bash","snippet":"# Create workspace\n~/workspace/presentations/helper.sh init\n\n# Save presentation metadata (JSON from stdin)\n~/workspace/presentations/helper.sh save-meta < /tmp/pres_meta.json\n\n# Save slide deck (Markdown from stdin)\n~/workspace/presentations/helper.sh save-deck <pres_id>\n\n# List presentations\n~/workspace/presentations/helper.sh list\n\n# Get presentation metadata\n~/workspace/presentations/helper.sh get-meta <pres_id>\n\n# Get slide deck\n~/workspace/presentations/helper.sh get-deck <pres_id>\n\n# Delete presentation\n~/workspace/presentations/helper.sh delete <pres_id>\n\n# Sanitize a string\n~/workspace/presentations/helper.sh sanitize-string \"user input\""},{"language":"bash","snippet":"# Check for existing workspace\nls ~/workspace/presentations/config.yaml 2>/dev/null\n\n# Check for AI Persona OS\nls ~/workspace/SOUL.md ~/workspace/AGENTS.md 2>/dev/null | wc -l\n\n# Check export dependencies\nwhich python3 2>/dev/null && echo \"HTML export: ✅ (recommended)\" || echo \"HTML export: ❌ (needs python3)\"\necho \"Gamma export: ✅ (always available)\"\nwhich pandoc 2>/dev/null && echo \"PDF export: ✅\" || echo \"PDF export: ❌ (install pandoc — or use HTML print)\"\nwhich python3 2>/dev/null && python3 -c \"import pptx; print('PPTX export: ✅')\" 2>/dev/null || echo \"PPTX export: ❌ (install python3 + python-pptx)\""},{"language":"text","snippet":"🎤 Welcome to AI Presentation Maker!\n\nI build slide decks from your actual work — not templates\nstuffed with placeholder text.\n\nHere's how it works:\n\n1. 🎯 I interview you (5 min)\n   What you built, who's in the room, what matters\n\n2. 🧭 I suggest angles (pick one)\n   3-5 ways to frame your story\n\n3. 📊 I generate your deck\n   Slides + speaker notes + factual validation\n\n4. ✏️ You refine\n   Add details, change tone, cut slides\n\n5. 📦 Export\n   Markdown (default), PPTX, or PDF\n\nEvery number in your deck comes from YOU.\nNo made-up ROI. No fake projections.\n\nReady? Say \"create presentation\" to start."},{"language":"bash","snippet":"mkdir -p ~/workspace/presentations/{decks,exports,archive}\ncp assets/presentation-helper.sh ~/workspace/presentations/helper.sh\nchmod +x ~/workspace/presentations/helper.sh"},{"language":"yaml","snippet":"# AI Presentation Maker — Configuration\n# Edit directly or say \"edit config\" in chat\n\ndefaults:\n  tone: \"conversational\"  # professional | conversational | humorous | technical\n  max_slides: 20\n  include_speaker_notes: true\n  factual_validation: true     # Flag speculative language\n  include_mistakes_slide: true  # Authenticity builder\n  include_costs_slide: true     # Real investment breakdown\n\nexport:\n  default_format: \"html\"\n  html_theme: \"spark\"   # terminal | executive | spark | clean\n  per_slide_html: false  # true = individual HTML files per slide (keynote quality)\n  formats_available:\n    markdown: true\n    html: true        # Zero dependencies — recommended\n    gamma: true       # Zero dependencies — for Gamma.app users\n    pptx: false       # Set true after installing python-pptx\n    pdf: false        # Set true after installing pandoc (or use HTML print)\n\nspeaker:\n  name: \"\"           # Set during first presentation or say \"edit config\"\n  title: \"\"\n  company: \"\"\n  bio: \"\"\n\nbranding:\n  cta_links: []\n  training_links: []\n  coupon_codes: []"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"output/clawhub-infographic-ppt-deep-dive/source-skills/ai-presentation-maker/SKILL.md","content":"---\nname: ai-presentation-maker\nversion: 1.0.0\ndescription: \"AI Presentation Maker — the interview-driven pitch deck generator for your OpenClaw agent. Tell it what you built, who you're presenting to, and pick an angle — it generates a complete slide deck with speaker notes, factual validation, and real cost breakdowns. No made-up ROI. No speculative projections. Just compelling presentations built from actual work. Exports to Markdown, PPTX, and PDF. Works standalone or alongside AI Persona OS. Built by Jeff J Hunter.\"\ntags: [presentation, slides, pitch-deck, keynote, speaker, deck, export, pptx, pdf, markdown, factual]\nauthor: Jeff J Hunter\nhomepage: https://jeffjhunter.com\nmetadata: {\"openclaw\":{\"emoji\":\"🎤\",\"requires\":{\"bins\":[\"bash\",\"sed\",\"find\",\"grep\",\"date\",\"wc\"],\"optionalBins\":[\"openclaw\",\"jq\",\"pandoc\",\"python3\"],\"env\":[],\"optionalEnv\":[]},\"stateDirs\":[\"~/workspace/presentations\",\"~/workspace/presentations/decks\",\"~/workspace/presentations/exports\"],\"persistence\":\"Presentation data stored as JSON + Markdown under ~/workspace/presentations/. All file operations routed through assets/presentation-helper.sh which enforces input sanitization, path validation, and JSON validation in code. No network activity required. Export to PPTX requires python3 + python-pptx. Export to PDF requires pandoc.\",\"cliUsage\":\"The openclaw CLI is OPTIONAL. Core presentation creation works entirely with standard Unix tools and the bundled helper script.\"}}\n---\n\n# 🎤 AI Presentation Maker\n\n**The interview-driven pitch deck generator for your OpenClaw agent.**\n\nTell it what you built. Tell it who's in the room. Pick an angle. Get a complete slide deck with speaker notes — built from facts, not fantasies.\n\n---\n\n## ⛔ AGENT RULES — READ BEFORE DOING ANYTHING\n\n> 1. **Use EXACT text from this file.** Do not paraphrase menus, slide type names, or instructions. Copy them verbatim.\n> 2. **NEVER tell the user to open a terminal or run commands.** You have the exec tool. USE IT. Run every command yourself via exec.\n> 3. **One step at a time.** Interview questions go 1-2 at a time. Never dump the full questionnaire.\n> 4. **NEVER overwrite existing presentation files without asking.** If the file exists, ask before replacing.\n> 5. **FACTUAL VALIDATION IS MANDATORY.** Before generating any slide, check for speculative language. Flag it. The user decides what stays.\n> 6. **Scope: ~/workspace/presentations/ only.** All file operations stay under this directory.\n> 7. **USE THE HELPER SCRIPT FOR ALL FILE OPERATIONS.** Never construct raw shell commands with user input. Always route through `assets/presentation-helper.sh`.\n> 8. **Speaker notes are required.** Every slide gets \"What to say\" and \"What NOT to say\" notes. No exceptions.\n> 9. **No made-up numbers.** If the user hasn't provided a specific stat, don't invent one. Use \"[INSERT ACTUAL NUMBER]\" as placeholder and flag it.\n> 10. **Respect the user's voice.** If they talk casually, the deck should feel casual. If they're formal"},{"path":"output/clawhub-infographic-ppt-deep-dive/source-skills/article-to-infographic/SKILL.md","content":"---\nname: article-to-infographic\ndescription: Transform articles, blog posts, reports, or any text content into visually stunning, self-contained HTML infographics. Use when the user wants to convert text into an infographic, create a visual summary of an article, make a data visualization from written content, or generate an infographic from a URL, file, or pasted text. Supports multiple infographic styles (timeline, statistics, comparison, process flow, listicle) with distinctive, non-generic aesthetics.\n---\n\n# Article to Infographic\n\nTransform any article or text content into a visually compelling, self-contained HTML infographic. Output is a single HTML file with inline CSS/JS -- zero dependencies, opens in any browser, print-ready for PDF export.\n\n## Core Philosophy\n\n1. **Content-First** -- Analyze the article before choosing layout.\n2. **Smart Layout** -- Match infographic type to content type automatically.\n3. **Distinctive Design** -- No generic AI aesthetics. Every infographic feels custom-crafted.\n4. **Zero Dependencies** -- Single HTML file with inline CSS/JS.\n5. **Print-Ready** -- Include print media queries for clean PDF export.\n\n---\n\n## Workflow Overview\n\n**Strict 3-Step Confirmation Process:**\n\n```\nStep 1: Outline Confirmation (BLOCKING)\n   ↓ User must confirm\nStep 2a: Layout Selection (BLOCKING)\n   ↓ User must confirm\nStep 2b: Style Selection (BLOCKING)\n   ↓ User must confirm\nStep 2c: Illustrations (BLOCKING)\n   ↓ User must confirm\nStep 3: Output Format (BLOCKING)\n   ↓ User must confirm\nGeneration Phase (automatic)\n```\n\n**CRITICAL RULE**: Each step requires explicit user confirmation before proceeding. Do NOT batch confirmations. Do NOT proceed to next step until current step is confirmed.\n\n---\n\n## Detailed Workflow\n\n1. Acquire and analyze article content\n2. Extract key information and classify content type\n3. **Step 1: Present outline → Get explicit confirmation**\n4. **Step 2a: Present layout options → Get explicit confirmation**\n5. **Step 2b: Present style options → Get explicit confirmation**\n6. **Step 2c: Present illustration options → Get explicit confirmation**\n7. **Step 3: Present output format options → Get explicit confirmation**\n8. Generate the HTML infographic (only after all confirmations)\n9. Export to PNG if selected in Step 3\n10. Deliver the final output\n\n## Confirmation Flow Summary (For AI Reference)\n\nWhen executing this skill, follow this EXACT sequence:\n\n| Phase | Step | Action | User Confirmation Required |\n|-------|------|--------|---------------------------|\n| 1 | Content Acquisition | Get article URL/file/text | ❌ No |\n| 2 | Content Analysis | Extract info, classify type | ❌ No |\n| 2.5 | **Step 1** | Present outline table | ✅ **MUST CONFIRM** |\n| 3a | **Step 2a** | Present layout options | ✅ **MUST CONFIRM** |\n| 3b | **Step 2b** | Present style options | ✅ **MUST CONFIRM** |\n| 3c | **Step 2c** | Present illustration options | ✅ **MUST CONFIRM** |\n| 4 | **Step 3** | Present output format options | ✅ **MUST CON"},{"path":"output/clawhub-infographic-ppt-deep-dive/source-skills/baoyu-infographic/SKILL.md","content":"---\nname: baoyu-infographic\ndescription: Generates professional infographics with 21 layout types and 21 visual styles. Analyzes content, recommends layout×style combinations, and generates publication-ready infographics. Use when user asks to create \"infographic\", \"信息图\", \"visual summary\", \"可视化\", or \"高密度信息大图\".\nversion: 1.56.1\nmetadata:\n  openclaw:\n    homepage: https://github.com/JimLiu/baoyu-skills#baoyu-infographic\n---\n\n# Infographic Generator\n\nTwo dimensions: **layout** (information structure) × **style** (visual aesthetics). Freely combine any layout with any style.\n\n## Usage\n\n```bash\n/baoyu-infographic path/to/content.md\n/baoyu-infographic path/to/content.md --layout hierarchical-layers --style technical-schematic\n/baoyu-infographic path/to/content.md --aspect portrait --lang zh\n/baoyu-infographic path/to/content.md --aspect 3:4\n/baoyu-infographic  # then paste content\n```\n\n## Options\n\n| Option | Values |\n|--------|--------|\n| `--layout` | 21 options (see Layout Gallery), default: bento-grid |\n| `--style` | 21 options (see Style Gallery), default: craft-handmade |\n| `--aspect` | Named: landscape (16:9), portrait (9:16), square (1:1). Custom: any W:H ratio (e.g., 3:4, 4:3, 2.35:1) |\n| `--lang` | en, zh, ja, etc. |\n\n## Layout Gallery\n\n| Layout | Best For |\n|--------|----------|\n| `linear-progression` | Timelines, processes, tutorials |\n| `binary-comparison` | A vs B, before-after, pros-cons |\n| `comparison-matrix` | Multi-factor comparisons |\n| `hierarchical-layers` | Pyramids, priority levels |\n| `tree-branching` | Categories, taxonomies |\n| `hub-spoke` | Central concept with related items |\n| `structural-breakdown` | Exploded views, cross-sections |\n| `bento-grid` | Multiple topics, overview (default) |\n| `iceberg` | Surface vs hidden aspects |\n| `bridge` | Problem-solution |\n| `funnel` | Conversion, filtering |\n| `isometric-map` | Spatial relationships |\n| `dashboard` | Metrics, KPIs |\n| `periodic-table` | Categorized collections |\n| `comic-strip` | Narratives, sequences |\n| `story-mountain` | Plot structure, tension arcs |\n| `jigsaw` | Interconnected parts |\n| `venn-diagram` | Overlapping concepts |\n| `winding-roadmap` | Journey, milestones |\n| `circular-flow` | Cycles, recurring processes |\n| `dense-modules` | High-density modules, data-rich guides |\n\nFull definitions: `references/layouts/<layout>.md`\n\n## Style Gallery\n\n| Style | Description |\n|-------|-------------|\n| `craft-handmade` | Hand-drawn, paper craft (default) |\n| `claymation` | 3D clay figures, stop-motion |\n| `kawaii` | Japanese cute, pastels |\n| `storybook-watercolor` | Soft painted, whimsical |\n| `chalkboard` | Chalk on black board |\n| `cyberpunk-neon` | Neon glow, futuristic |\n| `bold-graphic` | Comic style, halftone |\n| `aged-academia` | Vintage science, sepia |\n| `corporate-memphis` | Flat vector, vibrant |\n| `technical-schematic` | Blueprint, engineering |\n| `origami` | Folded paper, geometric |\n| `pixel-art` | Retro 8-bit |\n| `ui-wireframe` | Grayscale interface mockup"},{"path":"output/clawhub-infographic-ppt-deep-dive/source-skills/ppt-maker/SKILL.md","content":"---\nname: ppt-maker\ndescription: \"专业级PPT一键生成。Markdown创建幻灯片，支持自动图表（饼图/柱状图/折线图）、多主题、有序/无序列表、引用块、代码块、表格、感谢页自动识别。\"\n---\n\n# PPT Maker - 专业级PPT生成工具\n\n使用 Markdown 自动创建精美 PPT，**表格数据自动转为图表**，支持多种主题和智能布局。\n\n## 快速开始\n\n```bash\nnode ~/.openclaw/workspace/skills/ppt-maker/scripts/ppt-maker.js -i input.md -o output.pptx -t ocean\n```\n\n## 命令参数\n\n| 参数 | 说明 | 必填 |\n|------|------|------|\n| `-i, --input` | 输入 Markdown 文件路径 | ✅ |\n| `-o, --output` | 输出 PPTX 文件路径（自动补 .pptx 后缀） | ✅ |\n| `-t, --theme` | 主题名称，默认 ocean | ❌ |\n| `-l, --list` | 列出所有可用主题 | ❌ |\n| `-h, --help` | 显示帮助信息 | ❌ |\n\n## 支持的主题\n\n| 主题 | 风格 | 适用场景 |\n|------|------|----------|\n| ocean | 蓝色海洋 | 科技/专业 |\n| sunset | 橙红日落 | 温暖/创意 |\n| purple | 紫罗兰 | 创意/设计 |\n| luxury | 黑金奢华 | 高端/奢侈 |\n| midnight | 深夜暗色 | 演示/震撼 |\n| classic | 经典绿 | 商务/正式 |\n\n## Markdown 语法对照\n\n### 页面类型\n\n```markdown\n# 大标题           → 封面页（第一张幻灯片）\n副标题文字          → 封面副标题\n\n## 章节标题         → 内容页\n## 感谢聆听         → 结束页（自动居中大字布局）\n```\n\n**结束页自动识别关键字：** 感谢、谢谢、thank、thanks、Q&A、问答、结束、The End、再见、联系方式\n\n### 内容元素\n\n```markdown\n### 小标题           → 页内加粗小标题\n\n- 无序列表项1        → 带圆点的无序列表\n- 无序列表项2\n\n1. 有序列表项1       → 带编号圆圈的有序列表\n2. 有序列表项2\n\n> 引用文字           → 带左侧竖条的引用块\n\n普通文字             → 正文段落\n```\n\n### 表格\n\n```markdown\n| 列1 | 列2 | 列3 |\n|-----|-----|-----|\n| 内容 | 内容 | 内容 |\n```\n\n表格含数值列时**自动检测**是否转为图表（见下方图表规则）。不含数值或未匹配图表规则时，保持表格原样显示（含交替行底色）。\n\n### 代码块\n\n````markdown\n```python\nprint(\"Hello World\")\n```\n````\n\n深色背景 + 等宽字体 + 圆角边框显示。\n\n## ⭐ 自动图表生成\n\n**核心功能：** 在 `##` 标题、`###` 小标题或表格前的正文中包含特定关键字，其下方的表格自动转为对应图表。\n\n### 图表类型与关键字\n\n| 图表类型 | 触发关键字 |\n|----------|-----------|\n| 🥧 饼图 | 饼图、饼状图、占比、比例、份额、构成、组成、百分比、比重、pie |\n| 📊 柱状图 | 柱状、柱状图、柱形、排名、top、对比、比较、分布、销售额、金额、数量、业绩、产量、营收、bar |\n| 📈 折线图 | 折线、折线图、趋势、增长、变化、走势、曲线、时间、月度、季度、年度、line、trend |\n\n### 智能推断（无关键字时）\n\n- 数值列总和在 80~120 之间 → 自动识别为**饼图**（占比数据）\n- 有 ≥2 个数值点 → 默认生成**柱状图**\n- 支持多列数值 → 自动生成**多系列**图表\n\n### 数值解析\n\n自动清理单元格中的干扰字符，以下写法均可正确识别：\n- `100万` `¥250` `$1,200` `30%` `85元` `1200亿`\n\n### 图表示例\n\n#### 饼图示例\n\n```markdown\n## 销售占比分析\n### 各产品销售占比饼图\n| 产品 | 占比(%) |\n|------|---------|\n| 大米 | 30 |\n| 高粱 | 50 |\n| 小麦 | 20 |\n```\n\n#### 柱状图示例\n\n```markdown\n## 各产品销售额对比\n### 年度销售额柱状图\n| 产品 | 销售额(万元) |\n|------|-------------|\n| 大米 | 100 |\n| 高粱 | 250 |\n| 小麦 | 130 |\n```\n\n#### 折线图示例\n\n```markdown\n## 月度销售趋势\n### 销售额变化趋势折线图\n| 月份 | 销售额(万元) |\n|------|-------------|\n| 1月 | 35 |\n| 2月 | 42 |\n| 3月 | 58 |\n| 4月 | 72 |\n```\n\n#### 不转图表的表格（无数值列或非图表场景）\n\n```markdown\n## 工作计划\n| 季度 | 目标 | 负责人 |\n|------|------|--------|\n| Q1 | 完成招聘 | 张经理 |\n| Q2 | 市场拓展 | 李经理 |\n```\n\n## 使用示例\n\n提供markdown文件，比如input.md，然后通过指令生成\n```bash\nnode ~/.openclaw/workspace/skills/ppt-maker/scripts/ppt-maker.js -i input.md -o output.pptx -t ocean\n```\n### markdown提示词示例\n```markdown\n# 2026年度总结报告\n北灵聊AI · 年度工作汇报\n\n## 销售占比分析\n### 各产品占比饼图\n| 产品 | 占比(%) |\n|------|---------|\n| 大米 | 30 |\n| 高粱 | 40 |\n| 小麦 | 20 |\n| 玉米 | 10 |\n\n## 销售额对比\n### 各产品销售额柱状图\n| 产品 | 销售额(万元) |\n|------|-------------|\n| 大米 | 100 |\n| 高粱 | 250 |\n| 小麦 | 130 |\n\n## 月度趋势\n### 全年销售额变化趋势折线图\n| 月份 | 销售额(万元) |\n|------|-------------|\n| 1月 | 35 |\n| 6月 | 72 |\n| 12月 | 102 |\n\n## 核心成果\n### 业务拓展\n- 新增客户 126 家，同比增长 35%\n- 开"},{"path":"output/clawhub-infographic-ppt-deep-dive/source-skills/text-to-ppt/SKILL.md","content":"---\nname: text-to-ppt\ndescription: Convert any text input (research reports, summaries, proposals, plans, etc.) into a beautiful HTML-based presentation. Use when the user asks to create a PPT, slides, presentation, deck, or convert text/documents into slides. Also triggers on phrases like \"做成PPT\", \"生成幻灯片\", \"做个演示文稿\", \"转成slides\", \"create presentation\", \"make slides\", \"text to presentation\". Supports data visualization with Chart.js, Font Awesome icons, and modern design themes.\n---\n\n# Text-to-PPT — 文本转 HTML 演示文稿\n\nConvert any text input into a visually stunning, single-file HTML presentation.\n\n## CRITICAL: Two-Phase Generation\n\n**ALWAYS use the two-phase approach. NEVER generate the full HTML in one shot.**\n\n### Phase 1: Plan (fast, single call)\n\nRead the input text, then produce a **slide-by-slide outline** in JSON format:\n\n```json\n{\n  \"title\": \"Presentation Title\",\n  \"language\": \"zh-CN\",\n  \"density\": \"detailed\",\n  \"theme\": \"dark\",\n  \"slides\": [\n    {\n      \"number\": 1,\n      \"type\": \"title\",\n      \"heading\": \"Main Title\",\n      \"content\": \"Subtitle or tagline\",\n      \"layout\": \"centered\",\n      \"notes\": \"Visual: large title with accent underline\"\n    },\n    {\n      \"number\": 2,\n      \"type\": \"content\",\n      \"heading\": \"Section Title\",\n      \"points\": [\"Point 1\", \"Point 2\", \"Point 3\"],\n      \"layout\": \"bullets\",\n      \"hasData\": false,\n      \"notes\": \"Use numbered badges for each point\"\n    },\n    {\n      \"number\": 3,\n      \"type\": \"chart\",\n      \"heading\": \"Key Metrics\",\n      \"chartType\": \"bar\",\n      \"chartData\": {\n        \"labels\": [\"A\", \"B\", \"C\"],\n        \"datasets\": [{\"label\": \"Sales\", \"data\": [100, 200, 150]}]\n      },\n      \"points\": [\"Insight 1\", \"Insight 2\"],\n      \"layout\": \"split\",\n      \"hasData\": true,\n      \"notes\": \"Left: chart, Right: insights as stat cards\"\n    }\n  ]\n}\n```\n\n**Rules for Phase 1:**\n- Output ONLY the JSON plan. No HTML. No explanation.\n- Identify data points → mark `hasData: true` and provide `chartType` + `chartData`\n- Choose layout: `centered`, `bullets`, `split`, `grid`, `timeline`, `cards`, `fullchart`, `quote`\n- Target 8-15 slides. Never exceed 20.\n- This should take <10 seconds.\n\n### Phase 2: Generate (parallel, page-by-page)\n\n**Read `references/design-system.md`** — this is where the full design spec lives.\n\nThen generate HTML for each slide **independently**. Each slide is a self-contained `<div class=\"slide\">` block.\n\n**For each slide, the agent should:**\n1. Take ONE slide from the plan (by number)\n2. Read only the design system reference if not already loaded\n3. Generate ONLY that one slide's HTML `<div class=\"slide\">...</div>`\n4. No `<html>`, no `<head>`, no `<body>` — just the slide div\n\n**BATCHING: Generate slides in parallel using sub-agents.** Spawn up to 5 sub-agents simultaneously, each generating 1-2 slides.\n\n### Phase 3: Assemble\n\nAfter all slides are generated:\n1. Read the shell template from `references/shell-template.html`\n2. Insert all slide divs into the shell\n3. Ensure chart canvas IDs are "}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"引导需求、检索参考、装配多平台 Skill 产物的工厂 Skill: CocoLoop Skill Factory Owner: catrefuse Summary: 引导需求、检索参考、装配多平台 Skill 产物的工厂 Tags: latest:0.3.5, meta-skill:0.3.5, skill-factory:0.3.5 Version history: v0.3.5 | 2026-04-27T11:45:22.174Z | user Extend factory task domains, shared schema validation, and business presets. v0.3.4 | 2026-04-21T12:24:26.567Z | user Release 0.3.4 v0.3.3 | 2026-04-21T11:53:53.312Z | user Harden factory generation and visual storytelli","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1779,"uniquenessScore":55,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T09:49:14.163Z","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-11T09:49:14.163Z","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-11T14:13:36.846Z","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"}]}}}