From viralman
Provides shared sub-routines for project-promotion skills: captures intent from GitHub URLs/text via CLI fetches (repo view, README), builds project structs, picks output language (Korean/English/Chinese/Japanese). Referenced by gitmail/viral.
npx claudepluginhub art8engine/viralman --plugin viralmanThis skill uses the workspace's default tool permissions.
Not user-invokable. Channel skills cite a section here when they need the shared sub-routine, so they don't each redefine the same option lists / prompts.
Provides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
Explores codebases via GitNexus: discover repos, query execution flows, trace processes, inspect symbol callers/callees, and review architecture.
Share bugs, ideas, or general feedback.
Not user-invokable. Channel skills cite a section here when they need the shared sub-routine, so they don't each redefine the same option lists / prompts.
When another skill says "follow §Foo from skills/copy-prep/SKILL.md", read this file and apply the named section.
Goal: turn $ARGUMENTS (URL and/or free text) into a stable struct the caller can use:
{
url: "<github URL or empty>",
name: "<owner/repo or user-supplied name>",
description: "<free-text description fed into analyse>",
keyword: "<first-pass keyword for search>",
}
Rules:
https://github.com/ → treat as URL. Do call gh repo view <slug> --json description,homepageUrl to pull the project's GitHub description, and do read the README's first ~2KB (e.g. gh api repos/<slug>/readme --jq .content | base64 -d | head -c 2000). Combine into description so the analyse step sees the project's actual identity, not just the repo slug. Without this, description defaults to the slug and analyse mis-classifies projects (e.g. a JVM monitoring tool with a GC analyser sub-feature gets pitched as "GC tuner"). The 1-2 GitHub API calls cost is dwarfed by the per-recipient GraphQL/REST budget gitmail will spend later.description directly.Print 2–3 lines back to the user before the batch question so they have shared context:
Project: <name> (<url>)
What I understood: <one-line summary — based on user description + URL slug>
If this is right, please answer the questions below. If wrong, correct me
and I'll redo it.
Used wherever the caller needs to pick the user-facing language of the output.
| option | description |
|---|---|
| Korean (default) | 기본값. Korean audience. |
| English | English output. For global outreach. |
| Chinese | 中文. |
| Japanese | 日本語. |
Caller maps the picked value into its own arg shape (e.g. gitmail prefixes --tone "in English, …"; viral sets --lang ko/en). For Korean, the prefix is omitted.
Don't confuse the two:
growth-story | casual-hype | show-and-tell | contrarian-take (post-appropriate).The language picker IS shared via this file; the register picker is NOT — keep it in the channel skill.
Used only by callers that produce a subject line (gitmail; LinkedIn announcement posts; Reddit titles when user wants help). Skip in channels with no subject (X posts; Reddit body-only flow when the title is user-supplied).
| key | pattern | example (Argus, English) |
|---|---|---|
auto | LLM picks freely. May vary per recipient. | (LLM-decided) |
headline | "Hi, now you can easily <benefit> too." | Hi, now you can easily watch your JVM in production too. |
tag | [Label] product — one-line value | [New Tool] Argus — JVM monitoring without the heavy agent. |
simple | Under 30 chars, no marketing tone | Argus — JVM monitoring |
manual (직접 입력하기) | User provides the exact subject AND body. Skips the LLM entirely — placeholder substitution per recipient is supported by callers that have per-recipient placeholders (e.g. gitmail). | (waiting for your input) |
Pass each option's example text into the preview field of AskUserQuestion so the user can compare side-by-side. The manual option must be placed last so the LLM-driven choices stay grouped.
Common pattern: when the user picks manual (subject) or otherwise signals "I'll write it myself", do NOT proceed to the next pipeline step. Ask one follow-up prompt that requests:
{login}, {starred_repo}, {project_name}, {project_url}).The caller routes user-provided content through its channel's "no-LLM" path:
| channel | no-LLM path |
|---|---|
| gitmail | --prewritten-subject "<subject>" --prewritten-body /tmp/gitmail_user_body.txt (skips compose step entirely; placeholders substitute per recipient). |
| viral / X / Reddit / LinkedIn | Skip the viral-writer agent. Pass the user-provided body directly to the matching scripts/post_*.py. Run the ai-tell-sniffer once for safety; if the user explicitly says "post as-is", honor that and skip sniffer. |
Always preview what will be sent before the live action — even on the no-LLM path. The preview proves placeholder substitution worked.
~/.viralman/.env, never calls scripts on its own. Channel skills do that./copy-prep slash command. Trigger phrases are intentionally absent.