@opendirectory.dev/skills 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/skills/claude-md-generator/.env.example +7 -0
- package/.claude/skills/claude-md-generator/README.md +78 -0
- package/.claude/skills/claude-md-generator/SKILL.md +248 -0
- package/.claude/skills/claude-md-generator/evals/evals.json +35 -0
- package/.claude/skills/claude-md-generator/references/section-guide.md +175 -0
- package/dist/e2e.test.d.ts +1 -0
- package/dist/e2e.test.js +62 -0
- package/dist/fs-adapters.d.ts +4 -0
- package/dist/fs-adapters.js +101 -0
- package/dist/fs-adapters.test.d.ts +1 -0
- package/dist/fs-adapters.test.js +108 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +211 -0
- package/dist/transformers.d.ts +6 -0
- package/dist/transformers.js +2 -0
- package/package.json +25 -0
- package/registry.json +226 -0
- package/skills/blog-cover-image-cli/.github/workflows/publish.yml +19 -0
- package/skills/blog-cover-image-cli/LICENSE +15 -0
- package/skills/blog-cover-image-cli/README.md +126 -0
- package/skills/blog-cover-image-cli/SKILL.md +7 -0
- package/skills/blog-cover-image-cli/agent-skill/blog-cover-generator/README.md +30 -0
- package/skills/blog-cover-image-cli/agent-skill/blog-cover-generator/SKILL.md +72 -0
- package/skills/blog-cover-image-cli/bin/cli.js +226 -0
- package/skills/blog-cover-image-cli/examples/100x_UX_Research_AI_Agent.png +0 -0
- package/skills/blog-cover-image-cli/examples/Firecrawl-supabase-bolt.png +0 -0
- package/skills/blog-cover-image-cli/examples/Git-City_Case_study_Cover_Image.jpg +0 -0
- package/skills/blog-cover-image-cli/examples/THE DISTRIBUTION LAYER (2).png +0 -0
- package/skills/blog-cover-image-cli/examples/canva-perplexity-duolingo-cover-image.png +0 -0
- package/skills/blog-cover-image-cli/examples/gamma-mistral-veed.png +0 -0
- package/skills/blog-cover-image-cli/examples/server-survival-case-study-cover-image(1).png +0 -0
- package/skills/blog-cover-image-cli/examples/viral-meme-automation.png +0 -0
- package/skills/blog-cover-image-cli/index.js +2 -0
- package/skills/blog-cover-image-cli/package-lock.json +2238 -0
- package/skills/blog-cover-image-cli/package.json +37 -0
- package/skills/blog-cover-image-cli/src/geminiGenerator.js +126 -0
- package/skills/blog-cover-image-cli/src/imageValidator.js +54 -0
- package/skills/blog-cover-image-cli/src/logoFetcher.js +86 -0
- package/skills/claude-md-generator/.env.example +7 -0
- package/skills/claude-md-generator/README.md +78 -0
- package/skills/claude-md-generator/SKILL.md +254 -0
- package/skills/claude-md-generator/evals/evals.json +35 -0
- package/skills/claude-md-generator/references/section-guide.md +175 -0
- package/skills/cook-the-blog/README.md +86 -0
- package/skills/cook-the-blog/SKILL.md +130 -0
- package/skills/dependency-update-bot/.env.example +13 -0
- package/skills/dependency-update-bot/README.md +101 -0
- package/skills/dependency-update-bot/SKILL.md +376 -0
- package/skills/dependency-update-bot/evals/evals.json +45 -0
- package/skills/dependency-update-bot/references/changelog-patterns.md +201 -0
- package/skills/docs-from-code/.env.example +13 -0
- package/skills/docs-from-code/README.md +97 -0
- package/skills/docs-from-code/SKILL.md +160 -0
- package/skills/docs-from-code/evals/evals.json +29 -0
- package/skills/docs-from-code/references/extraction-guide.md +174 -0
- package/skills/docs-from-code/references/output-template.md +135 -0
- package/skills/docs-from-code/scripts/extract_py.py +238 -0
- package/skills/docs-from-code/scripts/extract_ts.ts +284 -0
- package/skills/docs-from-code/scripts/package.json +18 -0
- package/skills/explain-this-pr/README.md +74 -0
- package/skills/explain-this-pr/SKILL.md +130 -0
- package/skills/explain-this-pr/evals/evals.json +35 -0
- package/skills/google-trends-api-skills/README.md +78 -0
- package/skills/google-trends-api-skills/SKILL.md +7 -0
- package/skills/google-trends-api-skills/google-trends-api/SKILL.md +163 -0
- package/skills/google-trends-api-skills/google-trends-api/references/api-responses.md +188 -0
- package/skills/google-trends-api-skills/google-trends-api/scripts/discover_keywords.py +344 -0
- package/skills/google-trends-api-skills/seo-keyword-research/SKILL.md +205 -0
- package/skills/google-trends-api-skills/seo-keyword-research/references/keyword-placement-guide.md +89 -0
- package/skills/google-trends-api-skills/seo-keyword-research/references/tech-blog-examples.md +207 -0
- package/skills/google-trends-api-skills/seo-keyword-research/scripts/blog_seo_research.py +373 -0
- package/skills/hackernews-intel/.env.example +33 -0
- package/skills/hackernews-intel/README.md +161 -0
- package/skills/hackernews-intel/SKILL.md +156 -0
- package/skills/hackernews-intel/evals/evals.json +35 -0
- package/skills/hackernews-intel/package.json +15 -0
- package/skills/hackernews-intel/scripts/monitor-hn.js +258 -0
- package/skills/kill-the-standup/.env.example +22 -0
- package/skills/kill-the-standup/README.md +84 -0
- package/skills/kill-the-standup/SKILL.md +169 -0
- package/skills/kill-the-standup/evals/evals.json +35 -0
- package/skills/kill-the-standup/references/standup-format.md +102 -0
- package/skills/linkedin-post-generator/.env.example +14 -0
- package/skills/linkedin-post-generator/README.md +107 -0
- package/skills/linkedin-post-generator/SKILL.md +228 -0
- package/skills/linkedin-post-generator/evals/evals.json +35 -0
- package/skills/linkedin-post-generator/references/linkedin-format.md +216 -0
- package/skills/linkedin-post-generator/references/output-template.md +154 -0
- package/skills/llms-txt-generator/.env.example +18 -0
- package/skills/llms-txt-generator/README.md +142 -0
- package/skills/llms-txt-generator/SKILL.md +176 -0
- package/skills/llms-txt-generator/evals/evals.json +35 -0
- package/skills/llms-txt-generator/references/llms-txt-spec.md +88 -0
- package/skills/llms-txt-generator/references/output-template.md +76 -0
- package/skills/llms-txt-generator/test-output/genzcareer.in/llms.txt +31 -0
- package/skills/luma-attendees-scraper/README.md +170 -0
- package/skills/luma-attendees-scraper/SKILL.md +7 -0
- package/skills/luma-attendees-scraper/luma_attendees_export.js +223 -0
- package/skills/meeting-brief-generator/.env.example +21 -0
- package/skills/meeting-brief-generator/README.md +90 -0
- package/skills/meeting-brief-generator/SKILL.md +275 -0
- package/skills/meeting-brief-generator/evals/evals.json +35 -0
- package/skills/meeting-brief-generator/references/brief-format.md +114 -0
- package/skills/meeting-brief-generator/references/output-template.md +150 -0
- package/skills/meta-ads-skill/README.md +100 -0
- package/skills/meta-ads-skill/SKILL.md +7 -0
- package/skills/meta-ads-skill/meta-ads-skill/SKILL.md +41 -0
- package/skills/meta-ads-skill/meta-ads-skill/references/report_templates.md +47 -0
- package/skills/meta-ads-skill/meta-ads-skill/references/workflows.md +51 -0
- package/skills/meta-ads-skill/meta-ads-skill/scripts/auth_check.py +22 -0
- package/skills/meta-ads-skill/meta-ads-skill/scripts/formatters.py +46 -0
- package/skills/newsletter-digest/.env.example +20 -0
- package/skills/newsletter-digest/README.md +147 -0
- package/skills/newsletter-digest/SKILL.md +221 -0
- package/skills/newsletter-digest/evals/evals.json +35 -0
- package/skills/newsletter-digest/feeds.json +7 -0
- package/skills/newsletter-digest/package.json +15 -0
- package/skills/newsletter-digest/references/digest-format.md +123 -0
- package/skills/newsletter-digest/references/output-template.md +136 -0
- package/skills/newsletter-digest/scripts/fetch-feeds.js +141 -0
- package/skills/newsletter-digest/scripts/ghost-publish.js +147 -0
- package/skills/noise2blog/.env.example +16 -0
- package/skills/noise2blog/README.md +107 -0
- package/skills/noise2blog/SKILL.md +229 -0
- package/skills/noise2blog/evals/evals.json +35 -0
- package/skills/noise2blog/references/blog-format.md +188 -0
- package/skills/noise2blog/references/output-template.md +184 -0
- package/skills/outreach-sequence-builder/.env.example +12 -0
- package/skills/outreach-sequence-builder/README.md +108 -0
- package/skills/outreach-sequence-builder/SKILL.md +248 -0
- package/skills/outreach-sequence-builder/evals/evals.json +36 -0
- package/skills/outreach-sequence-builder/references/output-template.md +171 -0
- package/skills/outreach-sequence-builder/references/sequence-format.md +167 -0
- package/skills/outreach-sequence-builder/references/signal-playbook.md +117 -0
- package/skills/position-me/README.md +71 -0
- package/skills/position-me/SKILL.md +7 -0
- package/skills/position-me/position-me/SKILL.md +50 -0
- package/skills/position-me/position-me/references/EVALUATION_SOP.md +40 -0
- package/skills/position-me/position-me/references/REPORT_TEMPLATE.md +58 -0
- package/skills/position-me/position-me/scripts/extract_links.py +49 -0
- package/skills/pr-description-writer/README.md +81 -0
- package/skills/pr-description-writer/SKILL.md +141 -0
- package/skills/pr-description-writer/evals/evals.json +35 -0
- package/skills/pr-description-writer/references/pr-format-guide.md +145 -0
- package/skills/producthunt-launch-kit/.env.example +7 -0
- package/skills/producthunt-launch-kit/README.md +95 -0
- package/skills/producthunt-launch-kit/SKILL.md +380 -0
- package/skills/producthunt-launch-kit/evals/evals.json +35 -0
- package/skills/producthunt-launch-kit/references/copy-rules.md +124 -0
- package/skills/reddit-icp-monitor/.env.example +16 -0
- package/skills/reddit-icp-monitor/README.md +117 -0
- package/skills/reddit-icp-monitor/SKILL.md +271 -0
- package/skills/reddit-icp-monitor/evals/evals.json +40 -0
- package/skills/reddit-icp-monitor/references/icp-format.md +131 -0
- package/skills/reddit-icp-monitor/references/reply-rules.md +110 -0
- package/skills/reddit-post-engine/.env.example +13 -0
- package/skills/reddit-post-engine/README.md +103 -0
- package/skills/reddit-post-engine/SKILL.md +303 -0
- package/skills/reddit-post-engine/evals/evals.json +35 -0
- package/skills/reddit-post-engine/references/subreddit-playbook.md +156 -0
- package/skills/schema-markup-generator/.env.example +19 -0
- package/skills/schema-markup-generator/README.md +114 -0
- package/skills/schema-markup-generator/SKILL.md +192 -0
- package/skills/schema-markup-generator/evals/evals.json +35 -0
- package/skills/schema-markup-generator/references/json-ld-spec.md +263 -0
- package/skills/schema-markup-generator/references/output-template.md +556 -0
- package/skills/show-hn-writer/.env.example +14 -0
- package/skills/show-hn-writer/README.md +88 -0
- package/skills/show-hn-writer/SKILL.md +303 -0
- package/skills/show-hn-writer/evals/evals.json +35 -0
- package/skills/show-hn-writer/references/hn-rules.md +74 -0
- package/skills/show-hn-writer/references/title-formulas.md +93 -0
- package/skills/stargazer/README.md +79 -0
- package/skills/stargazer/SKILL.md +7 -0
- package/skills/stargazer/stargazer-skill/SKILL.md +58 -0
- package/skills/stargazer/stargazer-skill/assets/.env.example +18 -0
- package/skills/stargazer/stargazer-skill/scripts/convert_to_csv.py +63 -0
- package/skills/stargazer/stargazer-skill/scripts/count_emails.py +52 -0
- package/skills/stargazer/stargazer-skill/scripts/stargazer_deep_extractor.py +450 -0
- package/skills/tweet-thread-from-blog/.env.example +14 -0
- package/skills/tweet-thread-from-blog/README.md +109 -0
- package/skills/tweet-thread-from-blog/SKILL.md +177 -0
- package/skills/tweet-thread-from-blog/evals/evals.json +35 -0
- package/skills/tweet-thread-from-blog/references/output-template.md +193 -0
- package/skills/tweet-thread-from-blog/references/thread-format.md +107 -0
- package/skills/twitter-GTM-find-skill/README.md +43 -0
- package/skills/twitter-GTM-find-skill/SKILL.md +7 -0
- package/skills/twitter-GTM-find-skill/twitter-GTM-find/SKILL.md +37 -0
- package/skills/twitter-GTM-find-skill/twitter-GTM-find/references/icp-checklist.md +35 -0
- package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/package.json +23 -0
- package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/run_pipeline.sh +8 -0
- package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/src/debug.ts +23 -0
- package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/src/extractor.ts +79 -0
- package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/src/icp-filter.ts +87 -0
- package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/src/index.ts +94 -0
- package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/src/scraper.ts +41 -0
- package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/tsconfig.json +13 -0
- package/skills/yc-intent-radar-skill/README.md +39 -0
- package/skills/yc-intent-radar-skill/SKILL.md +7 -0
- package/skills/yc-intent-radar-skill/yc-jobs-scraper/SKILL.md +59 -0
- package/skills/yc-intent-radar-skill/yc-jobs-scraper/scripts/auth.js +29 -0
- package/skills/yc-intent-radar-skill/yc-jobs-scraper/scripts/db.js +62 -0
- package/skills/yc-intent-radar-skill/yc-jobs-scraper/scripts/export_radar_candidates.js +40 -0
- package/skills/yc-intent-radar-skill/yc-jobs-scraper/scripts/package-lock.json +1525 -0
- package/skills/yc-intent-radar-skill/yc-jobs-scraper/scripts/package.json +12 -0
- package/skills/yc-intent-radar-skill/yc-jobs-scraper/scripts/scraper.js +217 -0
- package/src/e2e.test.ts +35 -0
- package/src/fs-adapters.test.ts +91 -0
- package/src/fs-adapters.ts +65 -0
- package/src/index.ts +182 -0
- package/src/transformers.ts +6 -0
- package/tsconfig.json +8 -0
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: reddit-post-engine
|
|
3
|
+
description: Writes and optionally posts a Reddit post for any subreddit, following that subreddit's specific culture and rules. Drafts a title, body, and first comment using the 90/10 rule. Uses Composio Reddit MCP for optional direct posting. Use when asked to post on Reddit, draft a Reddit post, share a project on Reddit, write a subreddit post, or launch something on Reddit. Trigger when a user says "post this on Reddit", "write a Reddit post for r/...", "help me launch on Reddit", "draft something for Reddit", or "how do I share this on Reddit without getting banned".
|
|
4
|
+
compatibility: [claude-code, gemini-cli, github-copilot]
|
|
5
|
+
author: OpenDirectory
|
|
6
|
+
version: 1.0.0
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Reddit Post Engine
|
|
10
|
+
|
|
11
|
+
Draft a Reddit post that fits the subreddit's culture. Optionally post it via Composio.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
**Critical rule:** Never post without confirming subreddit rules. Never include product links in the body: put them in the first comment only if appropriate. Follow the 90/10 rule: your post should add value independent of any product mention.
|
|
16
|
+
|
|
17
|
+
**Anti-spam rule:** Posts that are primarily promotional will be removed and may get the account banned. The goal is to contribute to the community first. Product mentions go in the first comment, and only if the subreddit allows self-promotion.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Step 1: Setup Check
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
echo "GEMINI_API_KEY: ${GEMINI_API_KEY:+set}"
|
|
25
|
+
# Check if Composio Reddit MCP is connected
|
|
26
|
+
claude mcp list 2>/dev/null | grep -i reddit || echo "Composio Reddit MCP: not connected"
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
**If GEMINI_API_KEY is missing:**
|
|
30
|
+
Stop. Tell the user: "GEMINI_API_KEY is required. Get it at aistudio.google.com. Add it to your .env file."
|
|
31
|
+
|
|
32
|
+
**If Composio Reddit MCP is not connected:**
|
|
33
|
+
Continue. The skill will draft posts but skip the posting step. Inform the user: "Composio Reddit MCP not connected: I'll draft your post for manual submission. To enable direct posting, see the setup instructions in README.md."
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Step 2: Gather Context
|
|
38
|
+
|
|
39
|
+
You need:
|
|
40
|
+
- Target subreddit (e.g., r/devops, r/startups, r/SideProject)
|
|
41
|
+
- What you are sharing (project, article, question, discussion, tool)
|
|
42
|
+
- One-sentence description of what it does
|
|
43
|
+
- Why it's relevant to this specific subreddit's community
|
|
44
|
+
- Whether you want a self-post (text) or link post
|
|
45
|
+
|
|
46
|
+
If any of these are missing, ask in one message:
|
|
47
|
+
|
|
48
|
+
"To draft your Reddit post, I need:
|
|
49
|
+
1. Which subreddit? (e.g., r/devops, r/startups)
|
|
50
|
+
2. What are you sharing? (project, article, tool, question)
|
|
51
|
+
3. What does it do? (one sentence, technical)
|
|
52
|
+
4. Why does this subreddit care about it specifically?"
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Step 3: Fetch Subreddit Rules and Culture
|
|
57
|
+
|
|
58
|
+
**Fetch the subreddit's rules:**
|
|
59
|
+
```bash
|
|
60
|
+
curl -s \
|
|
61
|
+
-H "User-Agent: varnan-skills/1.0" \
|
|
62
|
+
"https://www.reddit.com/r/{SUBREDDIT}/about/rules.json" \
|
|
63
|
+
| python3 -c "
|
|
64
|
+
import sys, json
|
|
65
|
+
d = json.load(sys.stdin)
|
|
66
|
+
rules = d.get('rules', [])
|
|
67
|
+
for r in rules:
|
|
68
|
+
print(f'Rule: {r.get(\"short_name\", \"\")}')
|
|
69
|
+
print(f'Detail: {r.get(\"description\", \"\")[:200]}')
|
|
70
|
+
print()
|
|
71
|
+
"
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**Fetch recent top posts to understand tone and style:**
|
|
75
|
+
```bash
|
|
76
|
+
curl -s \
|
|
77
|
+
-H "User-Agent: varnan-skills/1.0" \
|
|
78
|
+
"https://www.reddit.com/r/{SUBREDDIT}/top.json?t=week&limit=10" \
|
|
79
|
+
| python3 -c "
|
|
80
|
+
import sys, json
|
|
81
|
+
d = json.load(sys.stdin)
|
|
82
|
+
for p in d['data']['children'][:10]:
|
|
83
|
+
pd = p['data']
|
|
84
|
+
print(f'Score: {pd[\"score\"]} | Title: {pd[\"title\"][:100]}')
|
|
85
|
+
"
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Note patterns in the top posts:
|
|
89
|
+
- Are titles questions or statements?
|
|
90
|
+
- Do they lead with the technology or the outcome?
|
|
91
|
+
- Are they personal ("I built...") or impersonal ("Tool for...")?
|
|
92
|
+
- What format gets the most engagement in this subreddit?
|
|
93
|
+
|
|
94
|
+
**Check subreddit sidebar for posting rules:**
|
|
95
|
+
```bash
|
|
96
|
+
curl -s \
|
|
97
|
+
-H "User-Agent: varnan-skills/1.0" \
|
|
98
|
+
"https://www.reddit.com/r/{SUBREDDIT}/about.json" \
|
|
99
|
+
| python3 -c "
|
|
100
|
+
import sys, json
|
|
101
|
+
d = json.load(sys.stdin)
|
|
102
|
+
data = d.get('data', {})
|
|
103
|
+
print('Public description:', data.get('public_description', '')[:300])
|
|
104
|
+
print('Subscribers:', data.get('subscribers', 0))
|
|
105
|
+
"
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
**Identify the subreddit type:**
|
|
109
|
+
|
|
110
|
+
| Type | Examples | Post style |
|
|
111
|
+
|------|----------|-----------|
|
|
112
|
+
| Technical practitioner | r/devops, r/sysadmin, r/ExperiencedDevs | Technical specifics, no fluff, "I did X and learned Y" |
|
|
113
|
+
| Startup/builder | r/startups, r/SideProject, r/indiehackers | Personal story, metrics, lessons learned |
|
|
114
|
+
| General tech | r/programming, r/technology | News angle, discussion hook, controversial take |
|
|
115
|
+
| Career | r/cscareerquestions, r/ITCareerQuestions | Question format, specific scenario, ask for experience |
|
|
116
|
+
| Niche tool | r/vim, r/rust, r/golang | Deep technical content, code examples, benchmarks |
|
|
117
|
+
|
|
118
|
+
Use the fetched rules and top posts to determine which style applies.
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Step 4: Draft the Post with Gemini
|
|
123
|
+
|
|
124
|
+
Write the post content to a temp file and call Gemini:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
cat > /tmp/reddit-post-request.json << 'ENDJSON'
|
|
128
|
+
{
|
|
129
|
+
"system_instruction": {
|
|
130
|
+
"parts": [{
|
|
131
|
+
"text": "You are a developer who is active in the {SUBREDDIT} community. Write a Reddit post that fits this subreddit's culture. Rules: (1) Write in first person if it is a project or experience post. (2) Do NOT include any product links in the body: links go in the first comment only. (3) The post must add genuine value to the community independent of any product being shared. (4) Match the tone of top posts in this subreddit: {SUBREDDIT_TONE_NOTES}. (5) Title max 300 characters. (6) Body 150-400 words for text posts. (7) No marketing language: no 'game-changing', 'powerful', 'robust', 'seamless', 'innovative'. (8) If the post is about a tool the user built, use the 'I made...' or 'I built...' opener: it performs best on Reddit. (9) Output: title on first line, blank line, then body. No labels, no commentary. Do not use em dashes."
|
|
132
|
+
}]
|
|
133
|
+
},
|
|
134
|
+
"contents": [{
|
|
135
|
+
"parts": [{
|
|
136
|
+
"text": "POST_DETAILS_HERE"
|
|
137
|
+
}]
|
|
138
|
+
}],
|
|
139
|
+
"generationConfig": {
|
|
140
|
+
"temperature": 0.7,
|
|
141
|
+
"maxOutputTokens": 1024
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
ENDJSON
|
|
145
|
+
|
|
146
|
+
curl -s -X POST \
|
|
147
|
+
"https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=$GEMINI_API_KEY" \
|
|
148
|
+
-H "Content-Type: application/json" \
|
|
149
|
+
-d @/tmp/reddit-post-request.json \
|
|
150
|
+
| python3 -c "import sys,json; d=json.load(sys.stdin); print(d['candidates'][0]['content']['parts'][0]['text'])"
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Replace `POST_DETAILS_HERE` with:
|
|
154
|
+
- Subreddit name and type
|
|
155
|
+
- Top post patterns observed
|
|
156
|
+
- What is being shared and why it's relevant
|
|
157
|
+
- Key technical details
|
|
158
|
+
- Builder's honest motivation
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## Step 5: Draft the First Comment
|
|
163
|
+
|
|
164
|
+
If the user has a product link or additional context to share, draft a first comment to post immediately after the post goes live.
|
|
165
|
+
|
|
166
|
+
The first comment serves two purposes:
|
|
167
|
+
1. Provide the link (which keeps the body link-free and feels less promotional)
|
|
168
|
+
2. Add context that would be too promotional in the post body
|
|
169
|
+
|
|
170
|
+
**First comment rules:**
|
|
171
|
+
- Post this as the first reply to your own post, immediately after it goes live
|
|
172
|
+
- Keep it under 100 words
|
|
173
|
+
- Example format: "Link for those who want to check it out: [URL]: also happy to answer questions about [specific technical thing mentioned in the post]."
|
|
174
|
+
- Only include the first comment if the subreddit allows self-promotion in comments
|
|
175
|
+
- If the subreddit has a "No self-promotion" rule, omit the link entirely
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## Step 6: Self-QA
|
|
180
|
+
|
|
181
|
+
Check the draft before presenting:
|
|
182
|
+
|
|
183
|
+
**Structure:**
|
|
184
|
+
- [ ] Title does not exceed 300 characters
|
|
185
|
+
- [ ] No links appear in the post body
|
|
186
|
+
- [ ] Post opens in first person (for project/experience posts)
|
|
187
|
+
- [ ] At least one specific technical detail or concrete number included
|
|
188
|
+
- [ ] Post matches the tone of top posts observed in this subreddit (noted in Step 3)
|
|
189
|
+
- [ ] Subreddit rules from Step 3 are not violated
|
|
190
|
+
|
|
191
|
+
**Claude-ism detection: scan for these vocabulary categories and remove all instances:**
|
|
192
|
+
|
|
193
|
+
| Category | Words to remove |
|
|
194
|
+
|----------|----------------|
|
|
195
|
+
| Filler intensifiers | incredibly, absolutely, certainly, definitely, essentially, fundamentally, literally, particularly, quite, rather, really, significantly, simply, truly, ultimately, very |
|
|
196
|
+
| AI hedging | I should note, it's worth noting, it's important to note, as mentioned, as I noted |
|
|
197
|
+
| Hype descriptors | game-changing, revolutionary, powerful, robust, seamless, innovative, best-in-class, cutting-edge, groundbreaking, remarkable |
|
|
198
|
+
| Throat-clearing | In conclusion, in summary, to summarize, overall, first and foremost, last but not least |
|
|
199
|
+
| Unnecessary connectors | Furthermore, moreover, additionally, however (at sentence start), thus, hence, thereby |
|
|
200
|
+
| AI tells | This ensures that, This allows for, This helps to, This enables, delve, utilize, leverage, foster |
|
|
201
|
+
|
|
202
|
+
If any appear: replace with a specific noun, verb, or number. "Very fast" becomes "runs in 12ms". "Powerful tool" becomes what it actually does.
|
|
203
|
+
|
|
204
|
+
**Instant-delete phrase check: these patterns trigger Reddit spam filters or moderator removal:**
|
|
205
|
+
|
|
206
|
+
- Any sentence that reads as an advertisement ("Try [Product] today", "Sign up now", "Get started free")
|
|
207
|
+
- Phrases that imply you are not the builder ("I came across this great tool", "I found this amazing product")
|
|
208
|
+
- First-person possession of users ("our users", "our customers") in subreddits where you have not established community presence
|
|
209
|
+
- "I made X and you can use it to..." followed immediately by a link (promotional structure)
|
|
210
|
+
- Superlatives without qualification ("the best way to...", "the only tool that...")
|
|
211
|
+
- External links in post body (use first comment only)
|
|
212
|
+
|
|
213
|
+
If any instant-delete phrases appear: revise the sentence entirely, not just swap words.
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## Step 7: Adversarial Review
|
|
218
|
+
|
|
219
|
+
Before presenting the final draft, run a 3-persona review. Each persona reads the post and finds ONE specific problem, quoting the exact text that triggers it.
|
|
220
|
+
|
|
221
|
+
**Persona 1: The Skeptical Practitioner**
|
|
222
|
+
This person has been in r/{SUBREDDIT} for years and has seen hundreds of product launches disguised as posts. Their read:
|
|
223
|
+
- Does any sentence feel promotional even if not explicitly selling?
|
|
224
|
+
- Does the post reveal genuine knowledge of the community's problems, or does it just talk about the product?
|
|
225
|
+
- Is there any claim that a practitioner would roll their eyes at?
|
|
226
|
+
|
|
227
|
+
State the one specific line they would flag and why.
|
|
228
|
+
|
|
229
|
+
**Persona 2: The Moderator**
|
|
230
|
+
This person enforces the rules fetched in Step 3. Their read:
|
|
231
|
+
- Does the post technically comply with subreddit rules?
|
|
232
|
+
- Is the ratio of self-promotion to community contribution acceptable?
|
|
233
|
+
- Would they have seen this exact post structure removed before?
|
|
234
|
+
|
|
235
|
+
State the one specific rule that is at risk of violation, or confirm it is clean.
|
|
236
|
+
|
|
237
|
+
**Persona 3: The Target Reader**
|
|
238
|
+
This is a non-builder community member who matches the subreddit's demographic. Their read:
|
|
239
|
+
- Would they upvote this post even if they never use the product?
|
|
240
|
+
- Is there a takeaway they can apply even if they skip the link in the first comment?
|
|
241
|
+
- Does the opening sentence make them want to keep reading?
|
|
242
|
+
|
|
243
|
+
State the one thing they would stop reading at, or confirm the post holds their attention.
|
|
244
|
+
|
|
245
|
+
After all three personas report: apply any fixes. If no persona found a problem, state "Adversarial review: clean."
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
## Step 8: Post via Composio (Optional)
|
|
250
|
+
|
|
251
|
+
If Composio Reddit MCP is connected and the user confirms they want to post:
|
|
252
|
+
|
|
253
|
+
```
|
|
254
|
+
Use the reddit-composio MCP tool REDDIT_CREATE_REDDIT_POST with:
|
|
255
|
+
- subreddit: {SUBREDDIT_WITHOUT_r/}
|
|
256
|
+
- title: {TITLE}
|
|
257
|
+
- kind: "self"
|
|
258
|
+
- text: {BODY}
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
**Before posting, confirm with the user:**
|
|
262
|
+
"Ready to post to r/{SUBREDDIT}. Post title: '{TITLE}'. Shall I go ahead?"
|
|
263
|
+
|
|
264
|
+
Only proceed after explicit confirmation.
|
|
265
|
+
|
|
266
|
+
**After posting:**
|
|
267
|
+
1. Note the post URL from the response
|
|
268
|
+
2. If a first comment was drafted, post it immediately using the same MCP with the returned post ID
|
|
269
|
+
|
|
270
|
+
**If posting fails (403, 429, or other error):**
|
|
271
|
+
Present the draft for manual submission. Tell the user: "Direct posting failed ([error code]). Here is your post for manual submission. Copy-paste the title and body at reddit.com/r/{SUBREDDIT}/submit."
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## Step 9: Present Output
|
|
276
|
+
|
|
277
|
+
```
|
|
278
|
+
## Reddit Post: r/{SUBREDDIT}
|
|
279
|
+
|
|
280
|
+
### Title
|
|
281
|
+
{title}
|
|
282
|
+
|
|
283
|
+
### Body
|
|
284
|
+
{body}
|
|
285
|
+
|
|
286
|
+
### First Comment (post immediately after)
|
|
287
|
+
{first comment, if applicable}
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
### Submission Notes
|
|
292
|
+
- Post type: {self/link}
|
|
293
|
+
- Best time to post: {peak hours for this subreddit: weekday mornings US time for most tech subreddits}
|
|
294
|
+
- After posting: Reply to every comment in the first hour: early engagement signals quality to the algorithm
|
|
295
|
+
- Karma note: {If account is new, note that some subreddits require minimum karma before posting}
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
If the post was already submitted via Composio, replace the output block with:
|
|
299
|
+
```
|
|
300
|
+
Post submitted: {reddit_post_url}
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill_name": "reddit-post-engine",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "Help me post my open source tool on r/devops. It's called Kargo: a Kubernetes deployment pipeline manager. Written in Go. It solves the problem of managing sequential deployments across multiple clusters without writing custom Argo CD app-of-apps configs.",
|
|
7
|
+
"expected_output": "Agent fetches r/devops subreddit rules and top posts. Notes the technical tone of the subreddit. Drafts a self-post with a title like 'I built Kargo – a deployment pipeline manager for Kubernetes without the app-of-apps complexity'. Body is technical, explains the problem, the approach, a specific tradeoff made. No links in body: link in first comment. Self-QA passes. Post fits r/devops practitioner tone (no marketing language, technical specifics included).",
|
|
8
|
+
"files": []
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"id": 2,
|
|
12
|
+
"prompt": "Write a Reddit post for r/SideProject for my project: a Raycast extension that generates shell aliases from natural language descriptions. Built it because I kept forgetting my own aliases.",
|
|
13
|
+
"expected_output": "Agent fetches r/SideProject top posts. Notes the personal/build-story tone. Drafts post opening with 'I built...' opener. Story includes: why (kept forgetting aliases), what it does (natural language to shell alias), current state (Raycast extension, works for zsh/bash). No product links in body. First comment drafted with link. Post is 150-300 words. Conversational tone.",
|
|
14
|
+
"files": []
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"id": 3,
|
|
18
|
+
"prompt": "Post to Reddit. Here is my project.",
|
|
19
|
+
"expected_output": "Agent recognizes missing required context: target subreddit, what the project does, why it is relevant to that community. Asks all four required questions in a single message before proceeding. Does not draft a post without knowing the target subreddit.",
|
|
20
|
+
"files": []
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"id": 4,
|
|
24
|
+
"prompt": "I want to post on r/startups and r/SideProject and r/indiehackers at the same time. My SaaS just hit $1k MRR and I want to share the story.",
|
|
25
|
+
"expected_output": "Agent drafts three separate posts, one per subreddit, each adapted to the community's tone: r/startups version focuses on the business lessons and what drove MRR growth; r/SideProject version is more personal and celebrates the milestone; r/indiehackers version includes specific numbers and metrics (revenue, users, time to $1k MRR) because that community expects transparency. Advises staggering the posts (not same-day cross-posting) to avoid spam detection.",
|
|
26
|
+
"files": []
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"id": 5,
|
|
30
|
+
"prompt": "Draft a Reddit post for my project and post it to r/devops via Composio.",
|
|
31
|
+
"expected_output": "Agent checks if Composio Reddit MCP is connected. If not connected: drafts the post and informs user how to set up Composio for direct posting (README instructions), presents post for manual submission. If connected: drafts post, shows preview, asks for explicit confirmation before posting. After confirmation, calls REDDIT_CREATE_REDDIT_POST with subreddit (without r/ prefix), title, kind='self', and text body. If posting succeeds, presents the post URL. If posting fails with 403/429, falls back to manual submission instructions.",
|
|
32
|
+
"files": []
|
|
33
|
+
}
|
|
34
|
+
]
|
|
35
|
+
}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
# Subreddit Playbook
|
|
2
|
+
|
|
3
|
+
Rules, tone, and post patterns for commonly used subreddits.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## r/SideProject
|
|
8
|
+
|
|
9
|
+
**Audience:** Indie builders, hobbyist developers, side project enthusiasts
|
|
10
|
+
|
|
11
|
+
**What works:**
|
|
12
|
+
- "I built X in [timeframe]" opener
|
|
13
|
+
- Share the build story, not just the product
|
|
14
|
+
- Be honest about usage numbers and what is still rough
|
|
15
|
+
- Mention if it is open source or free
|
|
16
|
+
|
|
17
|
+
**What gets removed:**
|
|
18
|
+
- Pure self-promotion with no story
|
|
19
|
+
- Posts that feel like product pages
|
|
20
|
+
- Repeated posts for the same project
|
|
21
|
+
|
|
22
|
+
**Post format:** Self-post. Lead with the build story. Link in first comment.
|
|
23
|
+
|
|
24
|
+
**Karma requirement:** None typically, but very new accounts get flagged
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## r/startups
|
|
29
|
+
|
|
30
|
+
**Audience:** Early-stage founders, VCs, operator types
|
|
31
|
+
|
|
32
|
+
**What works:**
|
|
33
|
+
- Share a lesson, not just a product
|
|
34
|
+
- Questions about strategy, GTM, or fundraising do well
|
|
35
|
+
- "We tried X and learned Y" posts outperform pure announcement posts
|
|
36
|
+
- Traction numbers signal credibility
|
|
37
|
+
|
|
38
|
+
**What gets removed:**
|
|
39
|
+
- "I launched my startup" posts without a specific hook
|
|
40
|
+
- Soliciting investment
|
|
41
|
+
- Posts that are thinly veiled ads
|
|
42
|
+
|
|
43
|
+
**Post format:** Self-post, 200-400 words. Lead with the non-obvious insight.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## r/devops
|
|
48
|
+
|
|
49
|
+
**Audience:** SREs, platform engineers, DevOps practitioners
|
|
50
|
+
|
|
51
|
+
**What works:**
|
|
52
|
+
- Specific technical problem and how you solved it
|
|
53
|
+
- Benchmark numbers, architecture diagrams
|
|
54
|
+
- "How we reduced X by Y%" posts
|
|
55
|
+
- Tool comparisons with real data
|
|
56
|
+
|
|
57
|
+
**What gets removed:**
|
|
58
|
+
- "Check out my tool" without technical depth
|
|
59
|
+
- Posts that read like product marketing
|
|
60
|
+
- Vague questions answerable by googling
|
|
61
|
+
|
|
62
|
+
**Post format:** Self-post with technical depth. Code snippets encouraged.
|
|
63
|
+
|
|
64
|
+
**Post tone:** Very direct. No fluff. Engineers here have low patience for marketing language.
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## r/programming
|
|
69
|
+
|
|
70
|
+
**Audience:** General developer community, CS nerds, broad technical interest
|
|
71
|
+
|
|
72
|
+
**What works:**
|
|
73
|
+
- Blog post or article link with an interesting angle in the title
|
|
74
|
+
- Show posts for technically novel projects
|
|
75
|
+
- Technical deep-dives
|
|
76
|
+
- Controversial/contrarian takes on tech decisions
|
|
77
|
+
|
|
78
|
+
**What gets removed:**
|
|
79
|
+
- Job posts
|
|
80
|
+
- Tutorial spam
|
|
81
|
+
- Low-effort link posts without discussion value
|
|
82
|
+
|
|
83
|
+
**Post format:** Link post for articles, self-post for discussion. Title should name the technical topic, not just the product.
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## r/ExperiencedDevs
|
|
88
|
+
|
|
89
|
+
**Audience:** Senior engineers and staff+ level developers
|
|
90
|
+
|
|
91
|
+
**What works:**
|
|
92
|
+
- Nuanced takes on engineering tradeoffs
|
|
93
|
+
- "Career at X level looks like..." experience posts
|
|
94
|
+
- Architecture decision retrospectives
|
|
95
|
+
- Anything that shows you have been burned and learned
|
|
96
|
+
|
|
97
|
+
**What gets removed:**
|
|
98
|
+
- Beginner questions
|
|
99
|
+
- "I just got my first job" posts
|
|
100
|
+
- Pure self-promotion
|
|
101
|
+
|
|
102
|
+
**Tone:** Skeptical audience. They will poke holes in your reasoning. Write defensively: acknowledge weaknesses before commenters do.
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## r/indiehackers
|
|
107
|
+
|
|
108
|
+
**Audience:** Solo founders, bootstrappers, people building profitable businesses without VC
|
|
109
|
+
|
|
110
|
+
**What works:**
|
|
111
|
+
- Revenue numbers (they love transparency)
|
|
112
|
+
- "Month 6 update" style posts showing growth
|
|
113
|
+
- Failed experiments and what you learned
|
|
114
|
+
- "I quit my job to build X, here is where I am at" stories
|
|
115
|
+
|
|
116
|
+
**What does not work:**
|
|
117
|
+
- VC-backed startups positioning as indie
|
|
118
|
+
- Posts without personal context
|
|
119
|
+
- Generic business advice
|
|
120
|
+
|
|
121
|
+
**Post format:** Self-post. Personal and honest. Numbers matter here.
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## r/webdev
|
|
126
|
+
|
|
127
|
+
**Audience:** Frontend and full-stack web developers
|
|
128
|
+
|
|
129
|
+
**What works:**
|
|
130
|
+
- Portfolio pieces with technical explanation
|
|
131
|
+
- "I built X, here is how" posts
|
|
132
|
+
- CSS tricks, JS patterns, performance wins
|
|
133
|
+
- Tools that solve a specific web dev pain
|
|
134
|
+
|
|
135
|
+
**Post tone:** Friendly and curious, less intense than r/programming
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## The 90/10 Rule
|
|
140
|
+
|
|
141
|
+
For any subreddit where you plan to share your own project:
|
|
142
|
+
|
|
143
|
+
Before you post, check your account's recent post history. At least 90% of your posts should be genuine contributions: answering questions, sharing interesting links, participating in discussions. At most 10% should be posts about your own work.
|
|
144
|
+
|
|
145
|
+
If you are posting about your project in multiple subreddits on the same day, stagger the posts. Identical posts across subreddits on the same day trigger spam detection.
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## Anti-Patterns That Get Posts Removed
|
|
150
|
+
|
|
151
|
+
1. **Cross-posting the exact same post to 5 subreddits simultaneously**: post one at a time, wait for results
|
|
152
|
+
2. **Asking friends to upvote**: vote manipulation gets posts and accounts banned
|
|
153
|
+
3. **Replying to your own post with a second account**: obvious and penalized
|
|
154
|
+
4. **Using your product URL as the post URL**: for self-posts, keep the link in the first comment
|
|
155
|
+
5. **"I need feedback" when you want users**: moderators read this correctly
|
|
156
|
+
6. **Flair violations**: some subreddits require flair; missing it gets the post auto-removed
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# schema-markup-generator -- Environment Variables
|
|
2
|
+
# ==================================================
|
|
3
|
+
# Most pages work without any API keys.
|
|
4
|
+
# Chrome is needed for JavaScript-rendered pages.
|
|
5
|
+
# GitHub token is needed only for auto-PR support.
|
|
6
|
+
|
|
7
|
+
# Chrome remote debugging port (default: 9222)
|
|
8
|
+
# Start Chrome with: google-chrome --remote-debugging-port=9222
|
|
9
|
+
# On macOS: open -a "Google Chrome" --args --remote-debugging-port=9222
|
|
10
|
+
CHROME_DEBUGGING_PORT=9222
|
|
11
|
+
|
|
12
|
+
# Optional: GitHub personal access token for opening PRs
|
|
13
|
+
# Scopes needed: repo (read + write)
|
|
14
|
+
# Get one at: https://github.com/settings/tokens
|
|
15
|
+
GITHUB_TOKEN=your_github_token_here
|
|
16
|
+
|
|
17
|
+
# Optional: Target GitHub repo slug (e.g. "yourorg/your-site")
|
|
18
|
+
# If set, the agent offers to open a PR automatically
|
|
19
|
+
GITHUB_REPO=your-org/your-repo
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# schema-markup-generator
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
Generate valid JSON-LD structured data for any webpage. The agent crawls the page, detects which schema types apply, and outputs a script tag ready to paste into your HTML. Optionally opens a GitHub PR with the markup injected.
|
|
7
|
+
|
|
8
|
+
## Schema Types Supported
|
|
9
|
+
|
|
10
|
+
| Type | Use When |
|
|
11
|
+
|------|----------|
|
|
12
|
+
| FAQPage | Page has 2 or more visible question/answer pairs |
|
|
13
|
+
| Article / BlogPosting | Page is a blog post or editorial article |
|
|
14
|
+
| Organization | Page represents a company or institution |
|
|
15
|
+
| Product | Page sells or describes a product with pricing |
|
|
16
|
+
| WebSite | Homepage schema with optional sitelinks search |
|
|
17
|
+
| HowTo | Page is a step-by-step guide with numbered steps |
|
|
18
|
+
| BreadcrumbList | Page has visible breadcrumb navigation |
|
|
19
|
+
| SoftwareApplication | Page describes a software tool or app |
|
|
20
|
+
| LocalBusiness | Page represents a physical business location |
|
|
21
|
+
|
|
22
|
+
The agent detects the right type automatically. A single page often gets multiple types (a blog post gets Article and BreadcrumbList, a homepage gets WebSite and Organization).
|
|
23
|
+
|
|
24
|
+
## Requirements
|
|
25
|
+
|
|
26
|
+
No LLM API key needed. The agent reads the page and generates the markup.
|
|
27
|
+
|
|
28
|
+
Chrome is needed for JavaScript-rendered pages. For static HTML pages or when you paste HTML directly, Chrome is not required.
|
|
29
|
+
|
|
30
|
+
A GitHub token is optional. Without it, the agent outputs the markup as text for you to paste manually.
|
|
31
|
+
|
|
32
|
+
## Setup
|
|
33
|
+
|
|
34
|
+
### 1. Start Chrome with remote debugging (for live URLs)
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
# macOS
|
|
38
|
+
open -a "Google Chrome" --args --remote-debugging-port=9222
|
|
39
|
+
|
|
40
|
+
# Linux
|
|
41
|
+
google-chrome --remote-debugging-port=9222
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### 2. Configure environment variables (optional)
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
cp .env.example .env
|
|
48
|
+
# Add GITHUB_TOKEN if you want auto-PR support
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## How to Use
|
|
52
|
+
|
|
53
|
+
From a live URL:
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
"Generate schema markup for https://example.com/faq"
|
|
57
|
+
"Add structured data to https://example.com/blog/my-post"
|
|
58
|
+
"What schema markup does this page need? https://example.com/about"
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
From pasted HTML:
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
"Generate schema markup for this page: [paste HTML]"
|
|
65
|
+
"Add JSON-LD to this HTML: [paste HTML]"
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Targeting a specific type:
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
"Generate FAQPage schema for https://example.com/support"
|
|
72
|
+
"Add Organization schema to our about page: https://example.com/about"
|
|
73
|
+
"Generate Product schema for this page: https://example.com/products/pro"
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
With auto-PR:
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
"Generate schema markup for https://example.com/blog/post and open a GitHub PR"
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Output
|
|
83
|
+
|
|
84
|
+
| Output | Description |
|
|
85
|
+
|--------|-------------|
|
|
86
|
+
| JSON-LD script block | One `<script type="application/ld+json">` block per schema type |
|
|
87
|
+
| Placement instructions | Where to insert the block in your HTML or framework |
|
|
88
|
+
| MISSING field list | Required fields not found on the page that you need to fill in |
|
|
89
|
+
| GitHub PR | If GITHUB_TOKEN and GITHUB_REPO are configured and you confirm |
|
|
90
|
+
|
|
91
|
+
## Validate Your Markup
|
|
92
|
+
|
|
93
|
+
After applying the markup, validate it at:
|
|
94
|
+
|
|
95
|
+
- Google Rich Results Test: https://search.google.com/test/rich-results
|
|
96
|
+
- Schema.org Validator: https://validator.schema.org
|
|
97
|
+
|
|
98
|
+
## Project Structure
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
schema-markup-generator/
|
|
102
|
+
├── SKILL.md
|
|
103
|
+
├── README.md
|
|
104
|
+
├── .env.example
|
|
105
|
+
├── evals/
|
|
106
|
+
│ └── evals.json
|
|
107
|
+
└── references/
|
|
108
|
+
├── json-ld-spec.md
|
|
109
|
+
└── output-template.md
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## License
|
|
113
|
+
|
|
114
|
+
MIT
|