@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,175 @@
|
|
|
1
|
+
# CLAUDE.md Section Guide
|
|
2
|
+
|
|
3
|
+
What to include in each section and what to leave out.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Canonical Section Order
|
|
8
|
+
|
|
9
|
+
```markdown
|
|
10
|
+
# CLAUDE.md
|
|
11
|
+
|
|
12
|
+
## Project Overview
|
|
13
|
+
## Commands
|
|
14
|
+
## Architecture
|
|
15
|
+
## Code Style
|
|
16
|
+
## Testing
|
|
17
|
+
## Gotchas
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Not all sections are required. If a section has nothing non-obvious to say, omit it.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Project Overview
|
|
25
|
+
|
|
26
|
+
**Include:**
|
|
27
|
+
- What the project does in one sentence (only if it is not obvious from the directory name)
|
|
28
|
+
- The core tech stack if it is unusual or non-standard for the file types present
|
|
29
|
+
- Any important context for understanding the codebase (e.g., "this is the billing service, not the main app")
|
|
30
|
+
|
|
31
|
+
**Do not include:**
|
|
32
|
+
- "This is a Next.js project" (Claude can see the files)
|
|
33
|
+
- Marketing copy about what the product does for users
|
|
34
|
+
- History of the project or team
|
|
35
|
+
|
|
36
|
+
**Example: good:**
|
|
37
|
+
```markdown
|
|
38
|
+
## Project Overview
|
|
39
|
+
The billing service. Handles subscription lifecycle, invoices, and Stripe webhooks. Runs as a standalone Express app; the main app in /apps/web calls it via internal API.
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Commands
|
|
45
|
+
|
|
46
|
+
**Include:**
|
|
47
|
+
- The exact command to run the dev server
|
|
48
|
+
- The exact command to run all tests
|
|
49
|
+
- How to run a single test file or test by name
|
|
50
|
+
- How to build for production
|
|
51
|
+
- Lint/typecheck command
|
|
52
|
+
- Any command that requires setup steps to work (note the setup)
|
|
53
|
+
- Database migration commands if they are needed before running tests
|
|
54
|
+
|
|
55
|
+
**Do not include:**
|
|
56
|
+
- Commands that are self-explanatory from package.json (`npm install`, `npm start`)
|
|
57
|
+
- Commands that Claude can infer from the framework
|
|
58
|
+
|
|
59
|
+
**Example: good:**
|
|
60
|
+
```markdown
|
|
61
|
+
## Commands
|
|
62
|
+
- Dev: `npm run dev` (starts on port 3000)
|
|
63
|
+
- Test: `npm test` (requires `DATABASE_URL` in .env.local)
|
|
64
|
+
- Test single file: `npm test -- --testPathPattern=auth`
|
|
65
|
+
- Lint: `npm run lint`
|
|
66
|
+
- Build: `npm run build && npm run export`
|
|
67
|
+
- DB migrations: `npm run db:migrate` (run after pulling main)
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Architecture
|
|
73
|
+
|
|
74
|
+
**Include:**
|
|
75
|
+
- Non-obvious directory organization (e.g., why `lib/` vs `utils/` exists)
|
|
76
|
+
- How the main entry points connect to each other
|
|
77
|
+
- External services and what they are used for
|
|
78
|
+
- Any generated directories that should not be edited
|
|
79
|
+
|
|
80
|
+
**Do not include:**
|
|
81
|
+
- "The src directory contains source code" (obvious)
|
|
82
|
+
- Framework defaults ("pages directory is for Next.js pages")
|
|
83
|
+
- Descriptions of standard patterns (REST API routes, MVC structure)
|
|
84
|
+
|
|
85
|
+
**Example: good:**
|
|
86
|
+
```markdown
|
|
87
|
+
## Architecture
|
|
88
|
+
`src/api/`: Express route handlers only. Business logic lives in `src/services/`.
|
|
89
|
+
`src/generated/`: Auto-generated from Prisma schema and GraphQL introspection. Do not edit these files.
|
|
90
|
+
The queue workers (`src/workers/`) are separate processes; they share the database but do not import from `src/api/`.
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Code Style
|
|
96
|
+
|
|
97
|
+
**Include:**
|
|
98
|
+
- Anything that differs from the linter/formatter default
|
|
99
|
+
- Import alias mappings (`@/` = `src/`, `~components/` = `src/components/`)
|
|
100
|
+
- Export convention (named vs default) if the project enforces one consistently
|
|
101
|
+
- File naming convention if it differs from framework default
|
|
102
|
+
- Any rule about where to put types
|
|
103
|
+
|
|
104
|
+
**Do not include:**
|
|
105
|
+
- Indent size and tab/space settings (the formatter enforces this)
|
|
106
|
+
- "We use TypeScript" (obviously visible from the files)
|
|
107
|
+
- ESLint rules that are already in .eslintrc
|
|
108
|
+
|
|
109
|
+
**Example: good:**
|
|
110
|
+
```markdown
|
|
111
|
+
## Code Style
|
|
112
|
+
- Imports: use `@/` alias for `src/` (configured in tsconfig paths and Jest moduleNameMapper)
|
|
113
|
+
- Exports: named exports only: no default exports except for Next.js pages
|
|
114
|
+
- Types: co-located with the code that uses them; shared types in `src/types/`
|
|
115
|
+
- Components: one component per file, file name matches component name
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## Testing
|
|
121
|
+
|
|
122
|
+
**Include:**
|
|
123
|
+
- How to run tests (if not already in Commands)
|
|
124
|
+
- What needs to be running for tests to pass (database, mock server, env vars)
|
|
125
|
+
- Test file naming convention if non-standard
|
|
126
|
+
- Where fixtures or test data live
|
|
127
|
+
- Any `beforeAll` setup that is important to know about
|
|
128
|
+
|
|
129
|
+
**Do not include:**
|
|
130
|
+
- "We use Jest" (visible from package.json)
|
|
131
|
+
- "Tests go in the tests directory" (obvious from the file structure)
|
|
132
|
+
|
|
133
|
+
**Example: good:**
|
|
134
|
+
```markdown
|
|
135
|
+
## Testing
|
|
136
|
+
Tests require a running PostgreSQL instance. Start it with `docker compose up -d db` before running `npm test`.
|
|
137
|
+
Test files: `*.test.ts` next to the source file. Integration tests: `tests/integration/*.test.ts`.
|
|
138
|
+
Fixtures: `tests/fixtures/`: seeded before each test suite in `tests/setup.ts`.
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## Gotchas
|
|
144
|
+
|
|
145
|
+
**The most important section.** This is where you put the things that will waste 30+ minutes if not documented.
|
|
146
|
+
|
|
147
|
+
**Always include:**
|
|
148
|
+
- Things that look like they should work but do not
|
|
149
|
+
- Files that are auto-generated and should not be edited manually
|
|
150
|
+
- Env vars that must exist before the app starts
|
|
151
|
+
- Dependencies between services (e.g., must start service A before service B)
|
|
152
|
+
- Known issues that are intentional (not bugs)
|
|
153
|
+
- Auth setup that differs from standard
|
|
154
|
+
|
|
155
|
+
**Examples:**
|
|
156
|
+
|
|
157
|
+
```markdown
|
|
158
|
+
## Gotchas
|
|
159
|
+
- `src/graphql/types.ts` is auto-generated by `npm run codegen`. Do not edit it directly.
|
|
160
|
+
- The test database is separate from the dev database. Run `npm run db:seed:test` once before running tests for the first time.
|
|
161
|
+
- `NEXT_PUBLIC_API_URL` must be set at build time (not runtime): changing it requires a rebuild.
|
|
162
|
+
- The `useAuth` hook returns `null` during SSR. Guard with `if (!user)` before accessing user properties.
|
|
163
|
+
- Tailwind classes are not purged during dev but are in production. If a class works in dev but disappears in production, check that it appears as a complete string (not assembled dynamically).
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## What CLAUDE.md is NOT
|
|
169
|
+
|
|
170
|
+
- Not a README for human developers
|
|
171
|
+
- Not documentation of how the framework works
|
|
172
|
+
- Not a list of all dependencies
|
|
173
|
+
- Not a tutorial for new team members
|
|
174
|
+
|
|
175
|
+
If a section would read the same for any project using the same framework, cut it.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# cook-the-blog
|
|
2
|
+
|
|
3
|
+
<img width="1280" height="640" alt="cook-the-blog-cover" src="https://github.com/user-attachments/assets/01fc87a2-78a8-433d-8531-a06a6a6df617" />
|
|
4
|
+
|
|
5
|
+
This guide explains how to set up, configure, and run the `cook-the-blog` skill. This AI agent pipeline autonomously researches companies, extracts SEO keywords, generates custom cover images, writes high-converting MDX case studies without AI fluff, uploads assets to cloud storage, and pushes the final code to your designated GitHub repository.
|
|
6
|
+
|
|
7
|
+
## Prerequisites & Dependencies
|
|
8
|
+
|
|
9
|
+
Before running the skill, the AI agent needs access to several external tools, APIs, and environment details.
|
|
10
|
+
|
|
11
|
+
**Agent Instruction:** Before executing the pipeline for the first time, you (the AI Agent) must explicitly ask the user for any missing configuration details listed below (Target Repo, GCS Bucket, Email, etc.). **Do not hardcode these values into the skill.md file automatically without asking.**
|
|
12
|
+
|
|
13
|
+
### 1. Tavily Search (Deep Research)
|
|
14
|
+
Used for deep, high-quality web research to extract hard metrics, founder details, and GTM strategies.
|
|
15
|
+
- **Setup:** You need a Tavily API key from [Tavily](https://tavily.com/).
|
|
16
|
+
- **Installation:** Install the Tavily MCP server so the agent can use it natively.
|
|
17
|
+
```bash
|
|
18
|
+
npx -y @modelcontextprotocol/server-tavily
|
|
19
|
+
```
|
|
20
|
+
- **Environment Variable:** Set `TAVILY_API_KEY` in your agent's environment or MCP config.
|
|
21
|
+
|
|
22
|
+
### 2. SerpApi (SEO Keyword Research)
|
|
23
|
+
Used to pull Google Trends data to find breakout search queries.
|
|
24
|
+
- **Setup:** Get a SerpApi key from [SerpApi](https://serpapi.com/).
|
|
25
|
+
- **Installation:** Ensure Python 3 and the `requests` / `google-search-results` libraries are installed. The user must provide a custom Python script (e.g., `blog_seo_research.py`) that queries the Google Trends API. The agent must be told the exact file path to this script.
|
|
26
|
+
- **Environment Variable:** `SERPAPI_KEY`
|
|
27
|
+
|
|
28
|
+
### 3. Blog Cover Image CLI
|
|
29
|
+
A custom Node.js CLI tool used to generate 16:9 minimalist cover images with company logos.
|
|
30
|
+
- **Installation:** Install the tool globally via npm.
|
|
31
|
+
```bash
|
|
32
|
+
npm i -g blog-cover-image-cli
|
|
33
|
+
```
|
|
34
|
+
- **Usage:** The agent calls it via `blog-cover-cli generate -t "Title" -l "Logo URL" -o "./cover.png"`.
|
|
35
|
+
|
|
36
|
+
### 4. Cloud Storage (e.g., Google Cloud Storage, AWS S3)
|
|
37
|
+
Used to host the generated cover images. The user must specify which cloud provider they want to use.
|
|
38
|
+
- **Setup (Example for GCP):** The user needs a Google Cloud Service Account with storage write permissions.
|
|
39
|
+
- **Installation:** Install the Google Cloud SDK (`gcloud` and `gsutil`).
|
|
40
|
+
- **Authentication:** The user must provide a `service-account.json` file to authenticate.
|
|
41
|
+
```bash
|
|
42
|
+
gcloud auth activate-service-account --key-file=service-account.json
|
|
43
|
+
```
|
|
44
|
+
- **Target Bucket:** The user must provide the target bucket URL (e.g., `gs://your-bucket-name/covers/`).
|
|
45
|
+
|
|
46
|
+
### 5. GitHub CLI & Git
|
|
47
|
+
Used for pushing the final MDX file to the target repository.
|
|
48
|
+
- **Setup:** Ensure `git` and `gh` (GitHub CLI) are installed on the host.
|
|
49
|
+
- **Authentication:** Log in to the GitHub CLI using a personal access token.
|
|
50
|
+
```bash
|
|
51
|
+
gh auth login --with-token < token.txt
|
|
52
|
+
```
|
|
53
|
+
- **Configuration:** The agent will need the user's `git config user.name` and `git config user.email` to ensure proper commit attribution.
|
|
54
|
+
|
|
55
|
+
### 6. Email Notifications (SMTP)
|
|
56
|
+
Used to send a final success summary to the admin.
|
|
57
|
+
- **Setup:** The agent creates a Python script (`send_summary.py`) using the built-in `smtplib`.
|
|
58
|
+
- **Credentials:** The user must provide a dedicated sender Gmail account and an **App Password** (not their real password), as well as the destination admin email.
|
|
59
|
+
|
|
60
|
+
### 7. Stop Slop (AI Output Quality)
|
|
61
|
+
Used to ensure the generated case studies avoid typical AI fluff and maintain a high-quality, human-like tone.
|
|
62
|
+
- **Setup:** Add the [Stop Slop](https://github.com/hardikpandya/stop-slop) skill to your agent's loaded skills before running the generation pipeline.
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Configuration Variables to Ask For
|
|
67
|
+
|
|
68
|
+
When initializing this skill, the agent must ask the user to provide or confirm the following placeholders before running the pipeline:
|
|
69
|
+
|
|
70
|
+
1. **`[TARGET_REPO_URL]`**: The exact GitHub repository URL or slug (e.g., `username/my-blog-repo`).
|
|
71
|
+
2. **`[TARGET_BUCKET]`**: The cloud storage bucket path (e.g., `gs://my-images-bucket/blogs/`).
|
|
72
|
+
3. **`[PUBLIC_IMAGE_BASE_URL]`**: The public base URL where the uploaded images will be accessible (e.g., `https://storage.googleapis.com/my-images-bucket/blogs/`).
|
|
73
|
+
4. **`[GIT_USER_NAME]` & `[GIT_USER_EMAIL]`**: The exact name and email to use for Git commit authorship.
|
|
74
|
+
5. **`[ADMIN_EMAIL]`**: Where to send the final summary report.
|
|
75
|
+
6. **`[SENDER_EMAIL]` & `[SENDER_APP_PASSWORD]`**: The credentials for the SMTP Python script.
|
|
76
|
+
7. **`[PATH_TO_SEO_SCRIPT]`**: The exact path to the Python script that handles the SerpApi Google Trends queries.
|
|
77
|
+
8. **Brand Promotion Link**: The URL and pitch text to inject into the final FAQ of the MDX template (e.g., "If you want to build this, check out [MyBrand](https://mybrand.com)").
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## How to Run
|
|
82
|
+
|
|
83
|
+
1. Once the user has provided the environment variables and configuration details, place the `skill.md` file in your agent's workspace.
|
|
84
|
+
2. The agent will read `skill.md` to understand the 8-step execution loop.
|
|
85
|
+
3. Trigger the agent by saying: *"Run the case study generator for [Company Name]."*
|
|
86
|
+
4. The agent will autonomously execute the entire pipeline from research to deployment.
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cook-the-blog
|
|
3
|
+
description: "Generate high-converting, deep-dive growth case studies in MDX format. Use this skill when asked to write a case study or blog post about a company's growth, tech stack, or product-led strategy. It handles the full pipeline (researching the company via Tavily, generating a 16:9 cover image, quality checking the draft, uploading assets to cloud storage, and pushing directly to the target repository)."
|
|
4
|
+
author: OpenDirectory
|
|
5
|
+
version: 1.0.0
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# cook-the-blog Workflow
|
|
9
|
+
|
|
10
|
+
Follow these steps exactly when asked to generate a case study for a company.
|
|
11
|
+
|
|
12
|
+
**MANDATORY SETUP CHECK:** Before starting, ensure you have the required environment variables and target destinations configured (Target Repo, Image Bucket/Storage, Author Email, etc.). If any are missing, STOP and ask the user for them.
|
|
13
|
+
|
|
14
|
+
**MANDATORY QA CHECK AT EACH STEP:** After completing every single step below, you MUST perform a strict, self-critical QA check. If a step fails or is hallucinated, you MUST retry until it succeeds. Do not fake success.
|
|
15
|
+
|
|
16
|
+
## 1. Deep Research (Tavily)
|
|
17
|
+
- Use the `tavily` tool (via MCP) and standard web searches to deeply research the company. **Note:** Always check if the registered business name differs from the product name. Search Reddit and other relevant forums for authentic developer insights.
|
|
18
|
+
- **QA Tester:** Did you actually extract real, hard metrics and specific details about their GTM strategy, or is it generic fluff? If fluff, research deeper.
|
|
19
|
+
|
|
20
|
+
## 2. SEO Keyword Research (Google Trends via SerpApi)
|
|
21
|
+
- Run the python script: `export SERPAPI_KEY="[YOUR_SERPAPI_KEY]" && python3 [PATH_TO_SEO_SCRIPT] "[Company Name]"`
|
|
22
|
+
- Identify the breakout and high-growth keywords from the output.
|
|
23
|
+
- **QA Tester:** Did the script succeed? Are the keywords real and high-volume? If not, retry or adjust the query.
|
|
24
|
+
|
|
25
|
+
## 3. Title & Cover Generation
|
|
26
|
+
- **Title:** Format: `"How [Company] [Achieved X] by [Core Strategy]"`. Make it specific and highly descriptive.
|
|
27
|
+
- **Cover:** Use the `blog-cover-cli generate` command to generate the cover image. **CRITICAL: The title passed to the cover image generator using the `-t` flag should contain around 7-10 words total. Do NOT use newlines (`\n`) in the string. Just provide a normal, single-line string and let the CLI handle the text wrapping automatically! Write a concise, aggressive title (e.g., `blog-cover-cli generate -t "How Baseten Scaled AI Infrastructure To a 5 Billion Valuation" -l "domain.com" -o "./cover.png"`).**
|
|
28
|
+
- **QA Tester:** Was the image actually generated and saved? Verify the file exists.
|
|
29
|
+
|
|
30
|
+
## 4. MDX Assembly
|
|
31
|
+
Synthesize the research and write the case study in a strict MDX format.
|
|
32
|
+
**Writing Rules (Use the `stop-slop` skill):**
|
|
33
|
+
- Tone: Sharp, analytical, founder-focused. No fluff. Every sentence should teach something.
|
|
34
|
+
- Audience: Early-stage startup founders, AI/developer tool builders, product-led growth enthusiasts.
|
|
35
|
+
- Length: 1,200-1,800 words.
|
|
36
|
+
- POV: Third-person analysis, like a smart investor memo written for a builder audience.
|
|
37
|
+
- Do not ever use em-dashes (—).
|
|
38
|
+
- Always use simple and conversational English with connector words. Avoid corporate jargon ("synergy," "leverage," "ecosystem play," "disruption" -> replace with plain language).
|
|
39
|
+
- Every claim must feel backed by evidence or logic. Use specific numbers.
|
|
40
|
+
- Each H3 sub-section should start with a concept sentence, then explain the mechanism, then give 1 example.
|
|
41
|
+
- **Do not repeat the title in the MDX body.** The title should only exist in the frontmatter. Do NOT include an `<h1>` or `# [Title]` just before the TL;DR.
|
|
42
|
+
- Never write a conclusion section. End on the takeaway paragraph or the FAQ.
|
|
43
|
+
|
|
44
|
+
The MDX must follow this exact structure:
|
|
45
|
+
|
|
46
|
+
```mdx
|
|
47
|
+
---
|
|
48
|
+
title: "How [Company] [Achieved X] by [Core Strategy]"
|
|
49
|
+
description: "[1-2 sentence compelling summary with hard numbers]"
|
|
50
|
+
date: "YYYY-MM-DD"
|
|
51
|
+
slug: "[URL-friendly-slug-e.g.-company-name-case-study]"
|
|
52
|
+
image: "[PUBLIC_IMAGE_URL]"
|
|
53
|
+
readingTime: "[X] Min"
|
|
54
|
+
published: true
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
<div style={{ textAlign: 'left' }}>
|
|
58
|
+
|
|
59
|
+
**TL;DR**
|
|
60
|
+
* **Challenge:** [The core painful problem in the market they addressed]
|
|
61
|
+
* **Solution:** [What they specifically built or did differently]
|
|
62
|
+
* **Results:** [2–3 hard metrics — downloads, revenue, users, growth %]
|
|
63
|
+
* **Investment/Strategy:** [The one key strategic bet they made]
|
|
64
|
+
|
|
65
|
+
## The Problem
|
|
66
|
+
[Paint the before-state: What was the world like before this company's solution? Who was suffering, and what were they forced to do instead? Make it visceral use developer/founder language. Length: 2-3 paragraphs. No bullet points.]
|
|
67
|
+
|
|
68
|
+
## The Execution & GTM Strategy
|
|
69
|
+
[Break into 2–4 H3 sub-sections picking from: a) THE DISTRIBUTION STRATEGY, b) THE MONETIZATION LAYER, c) THE TECHNICAL / PRODUCT MOAT, d) THE INTERNAL DOGFOODING MOMENT, e) THE TIMING INSIGHT]
|
|
70
|
+
### [H3 Sub-section]
|
|
71
|
+
[Concept sentence. Mechanism. 1 Example.]
|
|
72
|
+
|
|
73
|
+
## The Results & Takeaways
|
|
74
|
+
[3–5 hard metrics in bullet points (downloads, revenue, customers, conversions, time saved)]
|
|
75
|
+
|
|
76
|
+
**What a small startup can take from them:**
|
|
77
|
+
[Actionable and specific takeaway connected directly to the target audience. Tie the lesson directly to the company's specific strategy. No generic advice.]
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Frequently Asked Questions
|
|
82
|
+
|
|
83
|
+
<FAQSection>
|
|
84
|
+
<FAQItem question="[AEO Question 1 - e.g., What was their primary growth strategy?]">
|
|
85
|
+
[Fully answered in 2-4 sentences. Never leave blank.]
|
|
86
|
+
</FAQItem>
|
|
87
|
+
|
|
88
|
+
<FAQItem question="[AEO Question 2 - e.g., How do they monetize?]">
|
|
89
|
+
[Fully answered in 2-4 sentences. Never leave blank.]
|
|
90
|
+
</FAQItem>
|
|
91
|
+
|
|
92
|
+
<FAQItem question="[Promotion Question - e.g., How can my startup replicate this?]">
|
|
93
|
+
[Answer explaining the strategy, followed by a subtle pitch for your brand/product: "If you are looking to build a predictable distribution engine like [Company], [YourBrand](https://yourdomain.com) specializes in engineering these exact growth loops. Book a strategy call to see if you are a fit."]
|
|
94
|
+
</FAQItem>
|
|
95
|
+
</FAQSection>
|
|
96
|
+
|
|
97
|
+
</div>
|
|
98
|
+
```
|
|
99
|
+
- **QA Tester:** Are there 0 em-dashes? Is it 1200-1800 words? Are there hard metrics? If not, rewrite.
|
|
100
|
+
|
|
101
|
+
## 5. Quality Assurance (QA) Check
|
|
102
|
+
Before proceeding, self-audit the draft again:
|
|
103
|
+
- **MDX Rules:** Is it strictly following the MDX format? Are there exactly zero em-dashes?
|
|
104
|
+
- **Tone:** Is it punchy and analytical?
|
|
105
|
+
- **Cover Image:** Is the image generated and ready?
|
|
106
|
+
|
|
107
|
+
## 6. Asset Upload
|
|
108
|
+
- Upload the cover image to the user's preferred storage bucket (e.g., GCS, AWS S3, Cloudinary).
|
|
109
|
+
- Command: Use the appropriate CLI tool (e.g., `gsutil cp ./cover.png [TARGET_BUCKET]`).
|
|
110
|
+
- Verify the public URL matches the `image:` field in the MDX.
|
|
111
|
+
- **QA Tester:** Did the upload succeed? Verify the public URL exists.
|
|
112
|
+
|
|
113
|
+
## 7. GitHub Publishing (Direct Push)
|
|
114
|
+
- Use `git` CLI to clone the target repository: `[TARGET_REPO_URL]`
|
|
115
|
+
- Move the generated MDX file into the target directory (e.g., `blogs/`).
|
|
116
|
+
- **Build Check:** Before committing, run the project's build command (e.g., `npm install && npm run build`) inside the repo to ensure the MDX syntax doesn't break the build.
|
|
117
|
+
- **Git Config:** Ensure you are pushing with the correct author details. Run `git config user.name "[GIT_USER_NAME]"` and `git config user.email "[GIT_USER_EMAIL]"` before committing.
|
|
118
|
+
- Commit the changes and push directly to the remote branch of `[TARGET_REPO_URL]` using `git pull upstream main --rebase && git push upstream main` (or the equivalent remote structure).
|
|
119
|
+
- **QA Tester:** Did the build pass? Did the git push succeed? If not, fix the errors.
|
|
120
|
+
|
|
121
|
+
## 8. Verification & Delivery
|
|
122
|
+
- **DO NOT SKIP THIS:** Before completing the task, you MUST run `git log -1` and `git status` inside the repo to prove the file was committed and pushed.
|
|
123
|
+
- Your final response to the user MUST include:
|
|
124
|
+
1. A detailed summary of the SerpAPI (Google Trends) research.
|
|
125
|
+
2. The public URL of the uploaded cover image.
|
|
126
|
+
3. The actual output of the `git log -1` command proving the work is done.
|
|
127
|
+
- **Email Notification:** You MUST also send this exact same final summary via email to `[ADMIN_EMAIL]`. You can quickly write and execute a Python script using `smtplib` to send it from the configured sender email using an App Password.
|
|
128
|
+
- **Final QA Tester:** Did you send the email? Did you include the git log in the final message? If not, you have failed the entire pipeline.
|
|
129
|
+
|
|
130
|
+
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# dependency-update-bot — Environment Variables
|
|
2
|
+
# ================================================
|
|
3
|
+
# Gemini is required. GITHUB_TOKEN is optional but recommended.
|
|
4
|
+
|
|
5
|
+
# Required: Google Gemini API key for changelog summarization
|
|
6
|
+
# Get it: aistudio.google.com, Get API key
|
|
7
|
+
GEMINI_API_KEY=your_gemini_api_key_here
|
|
8
|
+
|
|
9
|
+
# Optional: GitHub personal access token for higher changelog fetch rate limits
|
|
10
|
+
# Without this: 60 unauthenticated GitHub API requests per hour (enough for ~30 packages)
|
|
11
|
+
# With this: 5,000 requests per hour
|
|
12
|
+
# Get it: github.com/settings/tokens — create a fine-grained token with read-only access to public repos
|
|
13
|
+
GITHUB_TOKEN=your_github_token_here
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# dependency-update-bot
|
|
2
|
+
|
|
3
|
+
<img width="1280" height="640" alt="dependency-update-bot" src="https://github.com/user-attachments/assets/08939280-bba2-4ac9-a349-2ca8c25ca328" />
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
Weekly scan for outdated npm or pip packages. Fetches changelogs for each. Summarizes breaking changes with Gemini. Opens one PR per risk group.
|
|
7
|
+
|
|
8
|
+
## What It Does
|
|
9
|
+
|
|
10
|
+
- Runs `npm outdated --json` or `pip list --outdated` to find outdated packages
|
|
11
|
+
- Classifies each update as patch (low risk), minor (medium risk), or major (high risk) using semver
|
|
12
|
+
- Fetches changelogs from GitHub Releases, CHANGELOG.md, or npm/PyPI registry as fallback
|
|
13
|
+
- Uses Gemini to summarize what changed between old and new versions, flagging breaking changes
|
|
14
|
+
- Creates a branch per risk group, updates the package file, and opens a PR with the changelog summary
|
|
15
|
+
- Opens one PR per major update (since each major bump needs individual review)
|
|
16
|
+
|
|
17
|
+
## Requirements
|
|
18
|
+
|
|
19
|
+
| Requirement | Purpose | How to Set Up |
|
|
20
|
+
|------------|---------|--------------|
|
|
21
|
+
| Gemini API key | Changelog summarization | aistudio.google.com, Get API key |
|
|
22
|
+
| GitHub CLI authenticated | PR creation | `gh auth login` |
|
|
23
|
+
| GitHub token (optional) | Higher rate limit for changelog fetching | github.com/settings/tokens, read-only scope |
|
|
24
|
+
|
|
25
|
+
## Setup
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
cp .env.example .env
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Fill in:
|
|
32
|
+
- `GEMINI_API_KEY` (required)
|
|
33
|
+
- `GITHUB_TOKEN` (optional, increases GitHub API rate limit from 60 to 5,000 requests/hour)
|
|
34
|
+
|
|
35
|
+
## How to Use
|
|
36
|
+
|
|
37
|
+
Scan npm dependencies:
|
|
38
|
+
```
|
|
39
|
+
"Check for outdated packages"
|
|
40
|
+
"Update my dependencies and open PRs"
|
|
41
|
+
"Run the dependency update bot"
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Scan pip dependencies:
|
|
45
|
+
```
|
|
46
|
+
"Check my Python packages for updates"
|
|
47
|
+
"Scan requirements.txt for outdated dependencies"
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Specific risk level only:
|
|
51
|
+
```
|
|
52
|
+
"Only open PRs for patch updates today"
|
|
53
|
+
"Show me which packages have major version updates"
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## PR Structure
|
|
57
|
+
|
|
58
|
+
Each PR includes:
|
|
59
|
+
- Risk level label (patch / minor / major)
|
|
60
|
+
- For each package: version bump, changelog summary (3-5 bullets), breaking changes flagged with BREAKING prefix
|
|
61
|
+
- How to verify section
|
|
62
|
+
|
|
63
|
+
**One PR per risk group** for patch and minor updates. **One PR per package** for major updates (since each breaking change needs individual review).
|
|
64
|
+
|
|
65
|
+
## Risk Classification
|
|
66
|
+
|
|
67
|
+
| Level | Version Change | Example | Action |
|
|
68
|
+
|-------|---------------|---------|--------|
|
|
69
|
+
| Patch | Z in X.Y.Z | 4.17.19 to 4.17.21 | Safe to merge after CI passes |
|
|
70
|
+
| Minor | Y in X.Y.Z | 4.17.x to 4.18.x | Review changelog before merging |
|
|
71
|
+
| Major | X in X.Y.Z | 4.x.x to 5.x.x | Read changelog carefully, test thoroughly |
|
|
72
|
+
|
|
73
|
+
If a patch or minor update's changelog contains BREAKING CHANGE keywords, the bot escalates it to major automatically.
|
|
74
|
+
|
|
75
|
+
## Changelog Sources
|
|
76
|
+
|
|
77
|
+
The bot tries these sources in order for each package:
|
|
78
|
+
|
|
79
|
+
1. GitHub Releases API (best)
|
|
80
|
+
2. Raw CHANGELOG.md from the repo
|
|
81
|
+
3. npm registry README (fallback)
|
|
82
|
+
4. PyPI project description (last resort)
|
|
83
|
+
|
|
84
|
+
If no changelog is found, the PR still includes the version bump with a note to review manually.
|
|
85
|
+
|
|
86
|
+
## Project Structure
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
dependency-update-bot/
|
|
90
|
+
├── SKILL.md
|
|
91
|
+
├── README.md
|
|
92
|
+
├── .env.example
|
|
93
|
+
├── evals/
|
|
94
|
+
│ └── evals.json
|
|
95
|
+
└── references/
|
|
96
|
+
└── changelog-patterns.md
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## License
|
|
100
|
+
|
|
101
|
+
MIT
|