{"id":"78d1978c-ff68-440e-bda0-f2224ab06097","shortId":"dLpsyk","kind":"skill","title":"lovstudio:skill-creator","tagline":"Create new skills for the lovstudio ecosystem. Each skill is its own independent GitHub repo at lovstudio/{name}-skill, scaffolded locally at ~/lovstudio/coding/skills/{name}-skill/, symlinked to ~/.claude/skills/ for immediate use, and registered in the central index at ~/lovstu","description":"# lovstudio:skill-creator\n\nScaffold a new lovstudio skill as an **independent GitHub repo** under\n`lovstudio/{name}-skill`. The lovstudio ecosystem is no longer a monorepo —\neach skill is its own repo, and a central index at\n`~/lovstudio/coding/skills/index/` tracks them.\n\n## Architecture\n\n```\n~/lovstudio/coding/skills/\n├── index/                     ← central catalog (lovstudio/skills repo)\n│   ├── skills.yaml            ← machine-readable manifest (paid flag lives here)\n│   └── README.md              ← human-readable catalog\n├── {name}-skill/              ← each skill is an independent repo\n│   ├── SKILL.md\n│   ├── README.md\n│   ├── CHANGELOG.md           ← managed by skill-optimizer\n│   ├── scripts/               ← standalone Python CLI scripts\n│   └── references/            ← optional progressive-disclosure docs\n└── ...\n\n~/.claude/skills/lovstudio-{name}  ← symlink → ~/.agents/skills/lovstudio-{name}\n                                                 → ~/lovstudio/coding/skills/{name}-skill/\n```\n\nKey facts:\n- GitHub repo name: `lovstudio/{name}-skill` (with `-skill` suffix)\n- Local source path: `~/lovstudio/coding/skills/{name}-skill/` (no `lovstudio-` prefix)\n- Claude Code reads: `~/.claude/skills/lovstudio-{name}/` (with `lovstudio-` prefix, via symlink)\n- Frontmatter `name`: `lovstudio:{name}` (with `:` separator)\n- `paid: true/false` lives **only** in `index/skills.yaml`, never in SKILL.md\n\n## Skill Creation Process\n\n### Step 1: Understand the Skill\n\nAsk the user what the skill should do. Start with the most important question\nvia `AskUserQuestion` — don't dump everything at once.\n\nKey questions:\n- What problem does it solve? What's the input → output?\n- 2-3 concrete usage examples?\n- What user phrases should trigger this skill (中文 + English)?\n- Pure-instruction skill, or does it need a Python script?\n- Free (public repo) or paid (private repo)?\n\n### Step 2: Plan Contents\n\nAnalyze the examples and identify:\n\n1. **Scripts** — deterministic operations → `scripts/`\n2. **References** — domain knowledge Claude needs while working → `references/`\n3. **Assets** — files used in output (templates, fonts, etc.) → `assets/`\n\nRules:\n- Python scripts must be **standalone single-file CLIs** with `argparse`\n- No package structure, no `setup.py`, no `__init__.py`\n- CJK text handling is a core concern if the skill deals with documents\n\n### Step 3: Initialize\n\nRun the init script (it auto-detects the target directory):\n\n```bash\npython3 ~/.claude/skills/lovstudio-skill-creator/scripts/init_skill.py <name>\n```\n\nThis creates `~/lovstudio/coding/skills/{name}-skill/` with:\n\n```\n{name}-skill/\n├── SKILL.md          ← frontmatter + TODO workflow\n├── README.md         ← human-readable docs with version badge\n└── scripts/          ← empty, ready for implementation\n```\n\nPass `--paid` if this is a paid skill (adjusts README + metadata hints).\n\n### Step 4: Implement\n\n1. **Write scripts** in `scripts/` — test by running directly\n2. **Write SKILL.md** — instructions for AI assistants:\n   - Frontmatter `description` is the trigger mechanism — cover what + when +\n     concrete trigger phrases (中文 + English)\n   - Body contains workflow steps, CLI reference, field mappings\n   - Use `AskUserQuestion` for interactive prompts before running scripts\n   - Keep SKILL.md under 500 lines; split to `references/` if longer\n3. **Write README.md** — docs for humans on GitHub:\n   - Version badge (source of truth for version)\n   - Install command: `git clone https://github.com/lovstudio/{name}-skill ~/.claude/skills/lovstudio-{name}`\n   - Dependencies\n   - Usage examples, options table\n   - ASCII diagrams if useful\n\nSee `references/templates.md` for SKILL.md / README.md templates.\n\n### Step 5: Publish\n\n#### 5a. Initialize & push the skill's own repo\n\n```bash\ncd ~/lovstudio/coding/skills/<name>-skill\ngit init\ngit add -A\ngit commit -m \"feat: initial release of <name> skill\"\n\n# Free skill (public):\ngh repo create lovstudio/<name>-skill --public --source=. --push\n\n# Paid skill (private):\ngh repo create lovstudio/<name>-skill --private --source=. --push\n```\n\n#### 5b. Register in the central index\n\nEdit `~/lovstudio/coding/skills/index/skills.yaml` — append under the right\ncategory (category order in the yaml determines display order on the website):\n\n```yaml\n  - name: <name>\n    repo: lovstudio/<name>-skill\n    paid: false                         # or true for paid skills\n    category: \"<Category>\"              # must match an existing category heading\n    version: \"0.1.0\"\n    description: \"<One-line description matching SKILL.md tagline>\"\n```\n\nAlso add a row to `~/lovstudio/coding/skills/index/README.md` under the matching\ncategory section. Then PR against `lovstudio/skills`:\n\n```bash\ncd ~/lovstudio/coding/skills/index\ngit checkout -b add/<name>\ngit add skills.yaml README.md\ngit commit -m \"add: <name> skill\"\ngit push -u origin HEAD\ngh pr create --fill\n```\n\n#### 5c. Symlink for local availability\n\nMake the skill immediately usable in Claude Code:\n\n```bash\n# Layer 1: source → .agents\nln -s ~/lovstudio/coding/skills/<name>-skill \\\n      ~/.agents/skills/lovstudio-<name>\n\n# Layer 2: .agents → .claude/skills (where Claude Code reads)\nln -s ../../.agents/skills/lovstudio-<name> \\\n      ~/.claude/skills/lovstudio-<name>\n```\n\nVerify: `ls ~/.claude/skills/lovstudio-<name>/SKILL.md` resolves.\n\n#### 5d. Trigger lovstudio.ai cache refresh (optional)\n\nAfter the skill is indexed in `skills.yaml`, the lovstudio.ai `/agent` page caches\nthe index for 1 hour (Next.js ISR). Trigger on-demand revalidation so the new\nskill appears immediately:\n\n```bash\nif [ -n \"$LOVSTUDIO_REVALIDATE_SECRET\" ]; then\n  curl -sfX POST https://lovstudio.ai/api/revalidate \\\n    -H \"x-revalidate-secret: $LOVSTUDIO_REVALIDATE_SECRET\" \\\n    -H \"content-type: application/json\" \\\n    -d '{\"tags\":[\"skills-index\"]}' \\\n    && echo \"✓ cache refreshed\" \\\n    || echo \"⚠ revalidate failed (will appear within 1h)\"\nfi\n```\n\nKnown tags (see `lovstudio/web:src/data/skills.ts`):\n- `skills-index` — the yaml index (invalidates all list pages)\n- `skill:<id>` — detail for a single skill\n- `skill-cases:<id>` — cases.json for a skill\n\n### Step 6: Test & Iterate\n\n1. In a new conversation, invoke `/lovstudio:<name>` — confirm it triggers\n2. Notice struggles → edit SKILL.md / scripts in the source repo\n3. Commit & push (the symlink chain means no local copy to sync)\n\n## Design Patterns\n\n### Interactive Pre-Execution (MANDATORY for generation/conversion skills)\n\n```markdown\n**IMPORTANT: Use `AskUserQuestion` to collect options BEFORE running.**\n\nUse `AskUserQuestion` with the following template:\n[options list]\n\n### Mapping User Choices to CLI Args\n[table mapping choices to --flags]\n```\n\n### Progressive Disclosure\n\nKeep SKILL.md lean. Split to references when:\n- Multiple themes/variants → `references/themes.md`\n- Complex API docs → `references/api.md`\n- Large examples → `references/examples.md`\n\nReference from SKILL.md: \"For theme details, see `references/themes.md`\"\n\n### Context-Aware Pre-Fill\n\nFor skills that fill or generate content:\n1. Check user memory and conversation context first\n2. Pre-fill what you can\n3. Only ask for fields you truly don't know\n\n## What NOT to Include\n\n- `INSTALLATION_GUIDE.md` — clutter; install instructions go in README.md\n- Test files — scripts are tested by running, not with test frameworks\n- `__pycache__/`, `*.pyc`, `.DS_Store` — add to `.gitignore`\n- `paid` field in frontmatter — it lives only in `index/skills.yaml`\n\n## Migration Note (2026-04)\n\nThe ecosystem was refactored from a monorepo (`lovstudio/skills` containing\n`skills/lovstudio-<name>/`) + mirror (`lovstudio/pro-skills`) into independent\nper-skill repos + central index. The old `lovstudio/pro-skills` was archived.\nIf working on a legacy skill still in the old structure, migrate it first:\n\n```bash\n# 1. Extract from monorepo subdirectory\ncp -r ~/projects/lovstudio-skills/skills/lovstudio-<name> \\\n      ~/lovstudio/coding/skills/<name>-skill\ncd ~/lovstudio/coding/skills/<name>-skill\n# (remove the lovstudio- prefix from the directory by creating fresh)\n\n# 2. Fresh git history\nrm -rf .git\ngit init && git add -A && git commit -m \"import: <name> from monorepo\"\n\n# 3. Create independent repo\ngh repo create lovstudio/<name>-skill --public --source=. --push\n```","tags":["skill","creator","skills","lovstudio","agent-skills","ai-coding-assistant","cjk","claude-code","cursor","gemini-cli","markdown-to-docx","markdown-to-pdf"],"capabilities":["skill","source-lovstudio","skill-skill-creator","topic-agent-skills","topic-ai-coding-assistant","topic-cjk","topic-claude-code","topic-cursor","topic-gemini-cli","topic-markdown-to-docx","topic-markdown-to-pdf"],"categories":["skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/lovstudio/skills/skill-creator","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add lovstudio/skills","source_repo":"https://github.com/lovstudio/skills","install_from":"skills.sh"}},"qualityScore":"0.469","qualityRationale":"deterministic score 0.47 from registry signals: · indexed on github topic:agent-skills · 39 github stars · SKILL.md body (8,283 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-21T01:36:51.804Z","embedding":null,"createdAt":"2026-04-18T22:19:07.767Z","updatedAt":"2026-04-21T01:36:51.804Z","lastSeenAt":"2026-04-21T01:36:51.804Z","tsv":"'-04':941 '-3':228 '/../.agents/skills/lovstudio-':648 '/.agents/skills/lovstudio-':135,637 '/.claude/skills':32 '/.claude/skills/lovstudio-':132,163,462,649,652 '/.claude/skills/lovstudio-skill-creator/scripts/init_skill.py':341 '/agent':670 '/api/revalidate':703 '/lovstu':43 '/lovstudio':771 '/lovstudio/':459 '/lovstudio/coding/skills':27,85,137,154,344,492,635,990,993 '/lovstudio/coding/skills/index':81,592 '/lovstudio/coding/skills/index/readme.md':580 '/lovstudio/coding/skills/index/skills.yaml':536 '/projects/lovstudio-skills/skills/lovstudio-':989 '/skill.md':653 '0.1.0':573 '1':189,268,382,630,676,765,875,982 '1h':731 '2':227,260,273,391,639,775,883,1005 '2026':940 '3':282,326,438,785,890,1023 '4':380 '5':480 '500':431 '5a':482 '5b':529 '5c':615 '5d':655 '6':762 'add':497,576,596,598,604,926,1015 'adjust':375 'agent':632,640 'ai':396 'also':575 'analyz':263 'api':848 'appear':689,729 'append':537 'application/json':716 'architectur':84 'archiv':966 'arg':829 'argpars':303 'ascii':469 'ask':193,892 'askuserquest':208,421,810,817 'asset':283,291 'assist':397 'auto':334 'auto-detect':333 'avail':619 'awar':864 'b':595 'badg':361,447 'bash':339,490,590,628,691,981 'bodi':412 'cach':658,672,723 'case':756 'cases.json':757 'catalog':88,104 'categori':541,542,565,570,584 'cd':491,591,992 'central':40,78,87,533,960 'chain':790 'changelog.md':115 'check':876 'checkout':594 'choic':826,832 'cjk':312 'claud':160,277,626,643 'claude/skills':641 'cli':124,416,828 'clis':301 'clone':456 'clutter':905 'code':161,627,644 'collect':812 'command':454 'commit':500,602,786,1018 'complex':847 'concern':318 'concret':229,407 'confirm':772 'contain':413,950 'content':262,714,874 'content-typ':713 'context':863,881 'context-awar':862 'convers':769,880 'copi':794 'core':317 'cover':404 'cp':987 'creat':5,343,512,523,613,1003,1024,1029 'creation':186 'creator':4,47 'curl':698 'd':717 'deal':322 'demand':683 'depend':464 'descript':399,574 'design':797 'detail':749,859 'detect':335 'determin':547 'determinist':270 'diagram':470 'direct':390 'directori':338,1001 'disclosur':130,836 'display':548 'doc':131,358,441,849 'document':324 'domain':275 'ds':924 'dump':211 'echo':722,725 'ecosystem':11,64,943 'edit':535,778 'empti':363 'english':240,411 'etc':290 'everyth':212 'exampl':231,265,466,852 'execut':802 'exist':569 'extract':983 'fact':141 'fail':727 'fals':559 'feat':502 'fi':732 'field':418,894,930 'file':284,300,912 'fill':614,867,871,886 'first':882,980 'flag':97,834 'follow':820 'font':289 'framework':921 'free':252,507 'fresh':1004,1006 'frontmatt':170,351,398,932 'generat':873 'generation/conversion':805 'gh':510,521,611,1027 'git':455,494,496,499,593,597,601,606,1007,1011,1012,1014,1017 'github':18,56,142,445 'github.com':458 'github.com/lovstudio/':457 'gitignor':928 'go':908 'h':704,712 'handl':314 'head':571,610 'hint':378 'histori':1008 'hour':677 'human':102,356,443 'human-read':101,355 'identifi':267 'immedi':34,623,690 'implement':366,381 'import':205,808,1020 'includ':903 'independ':17,55,111,955,1025 'index':41,79,86,534,665,674,721,740,743,961 'index/skills.yaml':181,937 'init':310,330,495,1013 'initi':327,483,503 'input':225 'instal':453,906 'installation_guide.md':904 'instruct':243,394,907 'interact':423,799 'invalid':744 'invok':770 'isr':679 'iter':764 'keep':428,837 'key':140,215 'know':899 'knowledg':276 'known':733 'larg':851 'layer':629,638 'lean':839 'legaci':971 'line':432 'list':746,823 'live':98,178,934 'ln':633,646 'local':25,151,618,793 'longer':67,437 'lovstudio':1,10,21,44,51,59,63,145,158,166,172,513,524,556,694,709,997,1030 'lovstudio.ai':657,669,702 'lovstudio.ai/api/revalidate':701 'lovstudio/pro-skills':953,964 'lovstudio/skills':89,589,949 'lovstudio/web':736 'ls':651 'm':501,603,1019 'machin':93 'machine-read':92 'make':620 'manag':116 'mandatori':803 'manifest':95 'map':419,824,831 'markdown':807 'match':567,583 'mean':791 'mechan':403 'memori':878 'metadata':377 'migrat':938,978 'mirror':952 'monorepo':69,948,985,1022 'multipl':844 'must':295,566 'n':693 'name':22,28,60,105,133,136,138,144,146,155,164,171,173,345,348,460,463,554 'need':248,278 'never':182 'new':6,50,687,768 'next.js':678 'note':939 'notic':776 'old':963,976 'on-demand':681 'oper':271 'optim':120 'option':127,467,660,813,822 'order':543,549 'origin':609 'output':226,287 'packag':305 'page':671,747 'paid':96,176,256,368,373,518,558,563,929 'pass':367 'path':153 'pattern':798 'per':957 'per-skil':956 'phrase':234,409 'plan':261 'post':700 'pr':587,612 'pre':801,866,885 'pre-execut':800 'pre-fil':865,884 'prefix':159,167,998 'privat':257,520,526 'problem':218 'process':187 'progress':129,835 'progressive-disclosur':128 'prompt':424 'public':253,509,515,1032 'publish':481 'pure':242 'pure-instruct':241 'push':484,517,528,607,787,1034 'py':311 'pyc':923 'pycach':922 'python':123,250,293 'python3':340 'question':206,216 'r':988 'read':162,645 'readabl':94,103,357 'readi':364 'readm':376 'readme.md':100,114,354,440,477,600,910 'refactor':945 'refer':126,274,281,417,435,842,854 'references/api.md':850 'references/examples.md':853 'references/templates.md':474 'references/themes.md':846,861 'refresh':659,724 'regist':37,530 'releas':504 'remov':995 'repo':19,57,75,90,112,143,254,258,489,511,522,555,784,959,1026,1028 'resolv':654 'revalid':684,695,707,710,726 'rf':1010 'right':540 'rm':1009 'row':578 'rule':292 'run':328,389,426,815,917 'scaffold':24,48 'script':121,125,251,269,272,294,331,362,384,386,427,780,913 'secret':696,708,711 'section':585 'see':473,735,860 'separ':175 'setup.py':308 'sfx':699 'singl':299,752 'single-fil':298 'skill':3,7,13,23,29,46,52,61,71,106,108,119,139,147,149,156,185,192,198,238,244,321,346,349,374,461,486,493,506,508,514,519,525,557,564,605,622,636,663,688,720,739,748,753,755,760,806,869,958,972,991,994,1031 'skill-cas':754 'skill-creat':2,45 'skill-optim':118 'skill-skill-creator' 'skill.md':113,184,350,393,429,476,779,838,856 'skills-index':719,738 'skills.yaml':91,599,667 'skills/lovstudio-':951 'solv':221 'sourc':152,448,516,527,631,783,1033 'source-lovstudio' 'split':433,840 'src/data/skills.ts':737 'standalon':122,297 'start':201 'step':188,259,325,379,415,479,761 'still':973 'store':925 'structur':306,977 'struggl':777 'subdirectori':986 'suffix':150 'symlink':30,134,169,616,789 'sync':796 'tabl':468,830 'tag':718,734 'target':337 'templat':288,478,821 'test':387,763,911,915,920 'text':313 'theme':858 'themes/variants':845 'todo':352 'topic-agent-skills' 'topic-ai-coding-assistant' 'topic-cjk' 'topic-claude-code' 'topic-cursor' 'topic-gemini-cli' 'topic-markdown-to-docx' 'topic-markdown-to-pdf' 'track':82 'trigger':236,402,408,656,680,774 'true':561 'true/false':177 'truli':896 'truth':450 'type':715 'u':608 'understand':190 'usabl':624 'usag':230,465 'use':35,285,420,472,809,816 'user':195,233,825,877 'verifi':650 'version':360,446,452,572 'via':168,207 'websit':552 'within':730 'work':280,968 'workflow':353,414 'write':383,392,439 'x':706 'x-revalidate-secret':705 'yaml':546,553,742 '中文':239,410","prices":[{"id":"21cf7e30-1830-43e5-a80c-79dd90b2ff07","listingId":"78d1978c-ff68-440e-bda0-f2224ab06097","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"lovstudio","category":"skills","install_from":"skills.sh"},"createdAt":"2026-04-18T22:19:07.767Z"}],"sources":[{"listingId":"78d1978c-ff68-440e-bda0-f2224ab06097","source":"github","sourceId":"lovstudio/skills/skill-creator","sourceUrl":"https://github.com/lovstudio/skills/tree/main/skills/skill-creator","isPrimary":false,"firstSeenAt":"2026-04-18T22:19:07.767Z","lastSeenAt":"2026-04-21T01:36:51.804Z"}],"details":{"listingId":"78d1978c-ff68-440e-bda0-f2224ab06097","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"lovstudio","slug":"skill-creator","github":{"repo":"lovstudio/skills","stars":39,"topics":["agent-skills","ai-coding-assistant","cjk","claude-code","cursor","gemini-cli","markdown-to-docx","markdown-to-pdf"],"license":"mit","html_url":"https://github.com/lovstudio/skills","pushed_at":"2026-04-20T21:40:57Z","description":"Agent skills for AI coding assistants — Markdown to PDF/DOCX with 14 themes, CJK support","skill_md_sha":"8e5e0aa5c27308956bf1fc8da7c2d7ad0e214849","skill_md_path":"skills/skill-creator/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/lovstudio/skills/tree/main/skills/skill-creator"},"layout":"multi","source":"github","category":"skills","frontmatter":{"name":"lovstudio:skill-creator","license":"MIT","description":"Create new skills for the lovstudio ecosystem. Each skill is its own independent GitHub repo at lovstudio/{name}-skill, scaffolded locally at ~/lovstudio/coding/skills/{name}-skill/, symlinked to ~/.claude/skills/ for immediate use, and registered in the central index at ~/lovstudio/coding/skills/index/ (skills.yaml + README.md). Lovstudio conventions: `lovstudio:{name}` frontmatter, mandatory README.md per skill, AskUserQuestion interactive flow, standalone Python CLI scripts with argparse, CJK text handling. Use when the user wants to create a new skill, add a skill to the lovstudio ecosystem, scaffold a skill, or mentions \"新建skill\", \"创建skill\", \"封装成skill\", \"new skill\", \"add skill\", \"scaffold skill\", \"生成skill\".","compatibility":"Scaffolds into ~/lovstudio/coding/skills/. Requires Python 3.8+, git, and gh CLI."},"skills_sh_url":"https://skills.sh/lovstudio/skills/skill-creator"},"updatedAt":"2026-04-21T01:36:51.804Z"}}