@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,141 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pr-description-writer
|
|
3
|
+
description: ''
|
|
4
|
+
compatibility: [claude-code, gemini-cli, github-copilot]
|
|
5
|
+
author: OpenDirectory
|
|
6
|
+
version: 1.0.0
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# PR Description Writer
|
|
10
|
+
|
|
11
|
+
Read the current branch diff and write a complete GitHub pull request description. Create or update the PR with one command.
|
|
12
|
+
|
|
13
|
+
## Writing Style
|
|
14
|
+
|
|
15
|
+
Apply to all generated PR descriptions:
|
|
16
|
+
|
|
17
|
+
- Active voice. "Adds X" not "X has been added."
|
|
18
|
+
- Present tense for summary ("Adds caching layer"), past tense for context ("The old approach caused N requests per render")
|
|
19
|
+
- Short sentences, one idea per bullet
|
|
20
|
+
- No em dashes — use a comma or period instead
|
|
21
|
+
- No filler: "this PR", "this commit", "as per the discussion"
|
|
22
|
+
- Specifics beat generalities: "reduces p95 latency from 800ms to 90ms" beats "improves performance"
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Step 1: Check Setup
|
|
27
|
+
|
|
28
|
+
Confirm `gh` is authenticated:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
gh auth status
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
If not authenticated: `gh auth login` and follow the prompts.
|
|
35
|
+
|
|
36
|
+
Confirm the current directory is a git repo with an active branch:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
git branch --show-current
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
If detached HEAD or no branch, stop and ask the user which branch they want to describe.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Step 2: Gather Diff Context
|
|
47
|
+
|
|
48
|
+
Run all three commands to build context:
|
|
49
|
+
|
|
50
|
+
**File summary (what changed):**
|
|
51
|
+
```bash
|
|
52
|
+
git diff main...HEAD --stat
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**Commit messages (why it changed):**
|
|
56
|
+
```bash
|
|
57
|
+
git log main...HEAD --oneline
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**Full diff (how it changed):**
|
|
61
|
+
|
|
62
|
+
Use `origin/main` first (always up to date), fall back to local `main`, then `master`:
|
|
63
|
+
```bash
|
|
64
|
+
if git rev-parse origin/main &>/dev/null 2>&1; then
|
|
65
|
+
BASE=origin/main
|
|
66
|
+
elif git rev-parse main &>/dev/null 2>&1; then
|
|
67
|
+
BASE=main
|
|
68
|
+
else
|
|
69
|
+
BASE=master
|
|
70
|
+
fi
|
|
71
|
+
git diff $BASE...HEAD
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
If the diff is very large (over 500 lines), read the `--stat` summary and the commit messages only. Also read the first 200 lines of the diff to understand the primary changes without processing the entire output.
|
|
75
|
+
|
|
76
|
+
Also check for an existing PR and read its current title/body:
|
|
77
|
+
```bash
|
|
78
|
+
gh pr view --json title,body,baseRefName 2>/dev/null
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Step 3: Read the Format Guide
|
|
84
|
+
|
|
85
|
+
Read `references/pr-format-guide.md` in full before writing anything. Internalize:
|
|
86
|
+
- Required sections and their order
|
|
87
|
+
- How to write each section
|
|
88
|
+
- What to include vs omit
|
|
89
|
+
- The testing section format
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Step 4: Generate the Description
|
|
94
|
+
|
|
95
|
+
Write the PR description using the format from `references/pr-format-guide.md`.
|
|
96
|
+
|
|
97
|
+
Rules:
|
|
98
|
+
- Every bullet in the Changes section must trace to something in the diff
|
|
99
|
+
- Do not invent testing steps that are not implied by the code changes
|
|
100
|
+
- If a section has no relevant content, omit it entirely (do not write "N/A" or leave it empty)
|
|
101
|
+
- Screenshots section: only include if there are UI changes visible in the diff
|
|
102
|
+
- If commit messages explain the "why", use that context in the Summary
|
|
103
|
+
|
|
104
|
+
**QA checkpoint:** Before presenting, verify:
|
|
105
|
+
- [ ] Summary is 1-2 sentences, active voice, no filler
|
|
106
|
+
- [ ] Every change bullet is specific and traces to the diff
|
|
107
|
+
- [ ] No invented metrics or outcomes
|
|
108
|
+
- [ ] Testing steps are actionable (someone could follow them)
|
|
109
|
+
- [ ] No em dashes in any line
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Step 5: Create or Update the PR
|
|
114
|
+
|
|
115
|
+
Present the description to the user and ask: "Ready to create the PR, update the existing one, or output only?"
|
|
116
|
+
|
|
117
|
+
**Create a new PR:**
|
|
118
|
+
|
|
119
|
+
Pass the body via stdin to handle backticks, quotes, and newlines safely:
|
|
120
|
+
```bash
|
|
121
|
+
gh pr create --title "TITLE_HERE" --body-file - << 'EOF'
|
|
122
|
+
BODY_HERE
|
|
123
|
+
EOF
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Suggest a title based on the commit messages and diff summary. The title should be imperative mood, under 72 characters: "Add Redis caching for user session lookups" not "Added caching".
|
|
127
|
+
|
|
128
|
+
**Update an existing PR:**
|
|
129
|
+
```bash
|
|
130
|
+
gh pr edit --body-file - << 'EOF'
|
|
131
|
+
BODY_HERE
|
|
132
|
+
EOF
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
**Output only:** Present the title and body in a code block for manual copy-paste.
|
|
136
|
+
|
|
137
|
+
After creating or updating, confirm: "PR description updated. View it at: [URL]"
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill_name": "pr-description-writer",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "Write a PR description for my current branch",
|
|
7
|
+
"expected_output": "Agent runs git branch --show-current, git diff main...HEAD --stat, git log main...HEAD --oneline, and git diff main...HEAD. Reads references/pr-format-guide.md. Generates a PR description with Summary (1-2 sentences, active voice, present tense), Changes (specific bullets starting with verbs, tracing to diff), and Testing sections. No invented metrics. No em dashes. Presents the description and asks whether to create, update, or output only.",
|
|
8
|
+
"files": []
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"id": 2,
|
|
12
|
+
"prompt": "Create a PR for this branch with a good description",
|
|
13
|
+
"expected_output": "Agent gathers diff context, generates description, suggests a title in imperative mood under 72 characters. Runs gh pr create --title 'suggested title' --body 'generated body'. Returns the PR URL after creation. Title does not start with 'Added' or 'This PR'.",
|
|
14
|
+
"files": []
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"id": 3,
|
|
18
|
+
"prompt": "Update my existing PR's description",
|
|
19
|
+
"expected_output": "Agent runs gh pr view --json title,body,baseRefName to check for an existing PR. Finds the PR. Generates a new description from the current diff. Runs gh pr edit --body 'new body'. Confirms the update with the PR URL.",
|
|
20
|
+
"files": []
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"id": 4,
|
|
24
|
+
"prompt": "Write a PR description for this large refactor branch",
|
|
25
|
+
"expected_output": "Agent detects the diff is large (over 500 lines). Falls back to reading --stat and commit messages only, plus the first 200 lines of the diff. Still produces a valid PR description. The Changes section uses sub-headers to group related changes if there are more than 6 bullets. Does not time out or fail on a large diff.",
|
|
26
|
+
"files": []
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"id": 5,
|
|
30
|
+
"prompt": "Write a PR description for a branch with only documentation changes",
|
|
31
|
+
"expected_output": "Agent detects the diff only touches .md or documentation files. Generates a short description: Summary explains what docs were updated, Changes lists the specific files and what changed in them. Omits the Testing section (no behavior change). Final description is 5-10 lines total.",
|
|
32
|
+
"files": []
|
|
33
|
+
}
|
|
34
|
+
]
|
|
35
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# PR Description Format Guide
|
|
2
|
+
|
|
3
|
+
The format every generated PR description must follow. Read before writing.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Required Sections
|
|
8
|
+
|
|
9
|
+
### Summary
|
|
10
|
+
|
|
11
|
+
One to two sentences. What does this PR do and why?
|
|
12
|
+
|
|
13
|
+
- Use present tense, active voice: "Adds Redis caching to reduce database load on high-traffic endpoints."
|
|
14
|
+
- Include the motivation if it's clear from the diff or commits: "Fixes a race condition in the session store that caused intermittent 401s under load."
|
|
15
|
+
- Do not start with "This PR" or "This commit"
|
|
16
|
+
|
|
17
|
+
Good:
|
|
18
|
+
```
|
|
19
|
+
Adds Redis caching for user session lookups. Reduces average response time on /api/me from 340ms to 12ms by eliminating a database query on every authenticated request.
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Bad:
|
|
23
|
+
```
|
|
24
|
+
This PR adds caching. It should improve performance.
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
### Changes
|
|
30
|
+
|
|
31
|
+
A bulleted list of what changed. One bullet per logical change.
|
|
32
|
+
|
|
33
|
+
Rules:
|
|
34
|
+
- Start each bullet with a verb: "Adds", "Removes", "Moves", "Fixes", "Refactors", "Updates"
|
|
35
|
+
- Be specific: file names, function names, config keys where relevant
|
|
36
|
+
- Group related changes under a sub-header if there are more than 6 bullets
|
|
37
|
+
|
|
38
|
+
Good:
|
|
39
|
+
```
|
|
40
|
+
- Adds `src/cache/redis.ts` with `get`, `set`, and `invalidate` methods
|
|
41
|
+
- Wraps `UserService.getById()` with a 5-minute Redis cache
|
|
42
|
+
- Removes the inline `Map` cache in `auth.middleware.ts` (replaced by Redis)
|
|
43
|
+
- Updates `.env.example` with `REDIS_URL` and `REDIS_TTL_SECONDS`
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Bad:
|
|
47
|
+
```
|
|
48
|
+
- Updated files
|
|
49
|
+
- Fixed the bug
|
|
50
|
+
- Added new feature
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
### Testing
|
|
56
|
+
|
|
57
|
+
How to verify this PR works. Actionable steps someone else can follow.
|
|
58
|
+
|
|
59
|
+
Format options:
|
|
60
|
+
|
|
61
|
+
**For code changes with clear test steps:**
|
|
62
|
+
```
|
|
63
|
+
- Run `npm test` — all tests pass
|
|
64
|
+
- Start the server and hit `GET /api/me` 10 times rapidly — confirm only 1 DB query appears in logs
|
|
65
|
+
- Check Redis with `redis-cli monitor` while making requests — confirm cache hits after the first request
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
**For simple refactors with no behavior change:**
|
|
69
|
+
```
|
|
70
|
+
- Run `npm test` — no regressions
|
|
71
|
+
- No behavior change expected
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**For infrastructure / config changes:**
|
|
75
|
+
```
|
|
76
|
+
- Deploy to staging and confirm the service starts without errors
|
|
77
|
+
- Check CloudWatch logs for `[redis] connected` on startup
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Omit this section if the change is purely documentation or a trivially safe refactor with no observable behavior.
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
### Screenshots (optional)
|
|
85
|
+
|
|
86
|
+
Only include if there are UI changes in the diff. Skip entirely for backend-only or infrastructure changes.
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
Before: [paste screenshot or describe]
|
|
90
|
+
After: [paste screenshot or describe]
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
### Linked Issues (optional)
|
|
96
|
+
|
|
97
|
+
Only include if the PR closes or references an issue.
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
Closes #123
|
|
101
|
+
Related to #456
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Use GitHub closing keywords: `Closes`, `Fixes`, `Resolves` to auto-close on merge.
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## What to Omit
|
|
109
|
+
|
|
110
|
+
- Do not list every file changed — that is what the diff is for
|
|
111
|
+
- Do not repeat the commit messages verbatim
|
|
112
|
+
- Do not include "TODO" items or future work unless the reviewer needs to know about them
|
|
113
|
+
- Do not add "cc @person" — leave that for reviewers
|
|
114
|
+
- Do not add a changelog entry — that belongs in a separate file
|
|
115
|
+
- Do not include a "Why" section — fold motivation into the Summary
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## Length Guide
|
|
120
|
+
|
|
121
|
+
| PR size | Description length |
|
|
122
|
+
|---------|-------------------|
|
|
123
|
+
| 1-3 files changed | 5-10 lines total |
|
|
124
|
+
| 4-10 files changed | 10-20 lines total |
|
|
125
|
+
| 10+ files changed | 20-40 lines total, use sub-headers in Changes |
|
|
126
|
+
|
|
127
|
+
Longer is not better. A clear 8-line description beats a padded 40-line one.
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Title Format
|
|
132
|
+
|
|
133
|
+
Imperative mood, present tense, under 72 characters.
|
|
134
|
+
|
|
135
|
+
Good:
|
|
136
|
+
- `Add Redis caching for session lookups`
|
|
137
|
+
- `Fix race condition in auth middleware`
|
|
138
|
+
- `Migrate user service to TypeScript`
|
|
139
|
+
- `Remove deprecated /v1 API endpoints`
|
|
140
|
+
|
|
141
|
+
Bad:
|
|
142
|
+
- `Added caching` (past tense)
|
|
143
|
+
- `This PR fixes the auth bug that was causing issues` (too long, filler)
|
|
144
|
+
- `WIP: caching stuff` (not ready to merge)
|
|
145
|
+
- `JIRA-1234: add caching` (ticket reference in title)
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# producthunt-launch-kit — Environment Variables
|
|
2
|
+
# =================================================
|
|
3
|
+
# Gemini is required for generating all launch copy.
|
|
4
|
+
|
|
5
|
+
# Required: Google Gemini API key for launch copy generation
|
|
6
|
+
# Get it: aistudio.google.com, Get API key
|
|
7
|
+
GEMINI_API_KEY=your_gemini_api_key_here
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# producthunt-launch-kit
|
|
2
|
+
|
|
3
|
+
<img width="1280" height="640" alt="producthunt-launch-kit" src="https://github.com/user-attachments/assets/dc16bde9-9bc4-4022-94a8-a4db024cbd95" />
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
Generates a complete Product Hunt launch kit from your product description: tagline variants (60 chars max), listing description, maker comment, launch day tweet thread, LinkedIn post, and a 4-email sequence.
|
|
7
|
+
|
|
8
|
+
## What It Does
|
|
9
|
+
|
|
10
|
+
- Generates 5 tagline variants with character counts (all under 60 chars)
|
|
11
|
+
- Writes a listing description under 500 characters
|
|
12
|
+
- Drafts a maker comment (300-400 words) that opens with the builder story, not "Hi PH!"
|
|
13
|
+
- Creates a launch day tweet thread (5-7 tweets, no hashtags)
|
|
14
|
+
- Writes a LinkedIn post for launch day
|
|
15
|
+
- Generates a 4-email sequence: existing users, newsletter, day-of reminder, follow-up
|
|
16
|
+
- Includes a launch checklist with timing and community guidelines
|
|
17
|
+
|
|
18
|
+
## Requirements
|
|
19
|
+
|
|
20
|
+
| Requirement | Purpose | How to Set Up |
|
|
21
|
+
|------------|---------|--------------|
|
|
22
|
+
| Gemini API key | All copy generation | aistudio.google.com, Get API key |
|
|
23
|
+
|
|
24
|
+
## Setup
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
cp .env.example .env
|
|
28
|
+
# Add GEMINI_API_KEY
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## How to Use
|
|
32
|
+
|
|
33
|
+
Full launch kit:
|
|
34
|
+
```
|
|
35
|
+
"Generate a Product Hunt launch kit for my product"
|
|
36
|
+
"Prepare my PH listing and launch copy"
|
|
37
|
+
"Help me launch on Product Hunt"
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Specific assets:
|
|
41
|
+
```
|
|
42
|
+
"Write my Product Hunt tagline for [product description]"
|
|
43
|
+
"Draft a maker comment for my PH launch"
|
|
44
|
+
"Write PH launch tweets"
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
From README:
|
|
48
|
+
```
|
|
49
|
+
"Generate a Product Hunt kit: my README is in this repo"
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Copy Constraints
|
|
53
|
+
|
|
54
|
+
| Asset | Limit | Notes |
|
|
55
|
+
|-------|-------|-------|
|
|
56
|
+
| Tagline | 60 chars | Hard limit, enforced by PH form |
|
|
57
|
+
| Description | 500 chars | Appears in search and email digests |
|
|
58
|
+
| Maker comment | 300-400 words | Post within 60 seconds of launch |
|
|
59
|
+
| Tweets | 280 chars each | No hashtags on technical threads |
|
|
60
|
+
|
|
61
|
+
## Maker Comment Strategy
|
|
62
|
+
|
|
63
|
+
The maker comment drives more PH success than any other single action. It should:
|
|
64
|
+
|
|
65
|
+
- Open with the real builder story (not "Hi PH! We're excited to announce...")
|
|
66
|
+
- Include at least one technical detail about how it works
|
|
67
|
+
- Acknowledge what the product does NOT do
|
|
68
|
+
- End with a specific question that invites comments
|
|
69
|
+
|
|
70
|
+
The comment goes live as your first reply to your own listing, within 60 seconds of the product going live at 12:01 AM PST.
|
|
71
|
+
|
|
72
|
+
## Launch Timing
|
|
73
|
+
|
|
74
|
+
Best days: Tuesday, Wednesday, Thursday
|
|
75
|
+
|
|
76
|
+
Avoid: Friday afternoons, holiday weeks, major tech conference days
|
|
77
|
+
|
|
78
|
+
The first 4 hours determine front page placement. Notify your audience before midnight PST on launch day so they are ready.
|
|
79
|
+
|
|
80
|
+
## Project Structure
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
producthunt-launch-kit/
|
|
84
|
+
├── SKILL.md
|
|
85
|
+
├── README.md
|
|
86
|
+
├── .env.example
|
|
87
|
+
├── evals/
|
|
88
|
+
│ └── evals.json
|
|
89
|
+
└── references/
|
|
90
|
+
└── copy-rules.md
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## License
|
|
94
|
+
|
|
95
|
+
MIT
|