opencode-skills-collection 3.0.32 → 3.0.34

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.
Files changed (48) hide show
  1. package/bundled-skills/.antigravity-install-manifest.json +10 -1
  2. package/bundled-skills/bilig-workpaper/SKILL.md +12 -3
  3. package/bundled-skills/bumblebee/SKILL.md +6 -2
  4. package/bundled-skills/bun-development/SKILL.md +5 -3
  5. package/bundled-skills/cloud-penetration-testing/SKILL.md +5 -3
  6. package/bundled-skills/container-security-hardening/SKILL.md +20 -7
  7. package/bundled-skills/container-security-hardening/references/kubernetes-pod-security.md +8 -2
  8. package/bundled-skills/doc2math/SKILL.md +102 -0
  9. package/bundled-skills/docs/integrations/jetski-cortex.md +3 -3
  10. package/bundled-skills/docs/integrations/jetski-gemini-loader/README.md +1 -1
  11. package/bundled-skills/docs/maintainers/repo-growth-seo.md +3 -3
  12. package/bundled-skills/docs/maintainers/skills-update-guide.md +1 -1
  13. package/bundled-skills/docs/users/bundles.md +1 -1
  14. package/bundled-skills/docs/users/claude-code-skills.md +1 -1
  15. package/bundled-skills/docs/users/gemini-cli-skills.md +1 -1
  16. package/bundled-skills/docs/users/getting-started.md +6 -2
  17. package/bundled-skills/docs/users/kiro-integration.md +1 -1
  18. package/bundled-skills/docs/users/usage.md +4 -4
  19. package/bundled-skills/docs/users/visual-guide.md +4 -4
  20. package/bundled-skills/environment-setup-guide/SKILL.md +10 -6
  21. package/bundled-skills/evolution/SKILL.md +5 -3
  22. package/bundled-skills/github-actions-advanced/SKILL.md +34 -9
  23. package/bundled-skills/gitops-workflow/SKILL.md +5 -3
  24. package/bundled-skills/ii-commons/SKILL.md +15 -1
  25. package/bundled-skills/lemmaly/SKILL.md +15 -6
  26. package/bundled-skills/linkerd-patterns/SKILL.md +5 -3
  27. package/bundled-skills/longbridge/SKILL.md +5 -1
  28. package/bundled-skills/mercury-mcp/SKILL.md +9 -1
  29. package/bundled-skills/moatmri/SKILL.md +84 -0
  30. package/bundled-skills/nextjs-seo-indexing/SKILL.md +263 -0
  31. package/bundled-skills/openclaw-github-repo-commander/scripts/repo-audit.sh +42 -0
  32. package/bundled-skills/photopea-embedded-editor/SKILL.md +7 -3
  33. package/bundled-skills/schema-markup-generator/SKILL.md +319 -0
  34. package/bundled-skills/sendblue/sendblue-api/SKILL.md +6 -1
  35. package/bundled-skills/sendblue/sendblue-cli/SKILL.md +6 -1
  36. package/bundled-skills/sendblue/sendblue-notify/SKILL.md +6 -1
  37. package/bundled-skills/sendblue/textme/SKILL.md +4 -0
  38. package/bundled-skills/social-metadata-hardening/SKILL.md +230 -0
  39. package/bundled-skills/socialclaw/SKILL.md +6 -1
  40. package/bundled-skills/uv-package-manager/resources/implementation-playbook.md +5 -3
  41. package/bundled-skills/varlock/SKILL.md +10 -6
  42. package/bundled-skills/vibe-code-cleanup/SKILL.md +231 -0
  43. package/bundled-skills/vibecode-production-qa-validator/SKILL.md +237 -0
  44. package/bundled-skills/wordpress-centric-high-seo-optimized-blogwriting-skill/SKILL.md +229 -162
  45. package/bundled-skills/yield-intelligence/SKILL.md +121 -0
  46. package/bundled-skills/youtube-full/SKILL.md +144 -0
  47. package/package.json +1 -1
  48. package/skills_index.json +199 -1
@@ -0,0 +1,319 @@
1
+ ---
2
+ name: schema-markup-generator
3
+ description: "Generate and implement JSON-LD structured data for web apps, tool pages, blogs, FAQs, and SaaS sites. Supports WebSite, SoftwareApplication, BlogPosting, FAQPage, HowTo, BreadcrumbList, and Organization schemas."
4
+ category: seo
5
+ risk: safe
6
+ source: self
7
+ source_type: self
8
+ date_added: "2026-05-31"
9
+ author: Whoisabhishekadhikari
10
+ tags: [seo, schema, json-ld, structured-data, rich-results, nextjs, technical-seo]
11
+ tools: [claude, cursor, gemini, claude-code]
12
+ version: 1.0.0
13
+ ---
14
+
15
+ # Schema Markup Generator Skill
16
+
17
+ Add JSON-LD structured data to pages to unlock rich results, improve CTR, and signal context to Google and AI systems.
18
+
19
+ ---
20
+
21
+ ## When to Use
22
+
23
+ - Use when adding or auditing JSON-LD schema for websites, SaaS apps, tools, articles, FAQs, breadcrumbs, or organization pages.
24
+ - Use when schema must be implemented in Next.js App Router or validated against Google Rich Results and Schema.org tooling.
25
+ - Use when a page has strong content but lacks structured data for search engines and rich-result eligibility.
26
+
27
+ ---
28
+
29
+ ## How to Add Schema in Next.js App Router
30
+
31
+ The cleanest approach is a reusable `JsonLd` component:
32
+
33
+ ```jsx
34
+ // components/JsonLd.jsx
35
+ export function JsonLd({ data }) {
36
+ return (
37
+ <script
38
+ type="application/ld+json"
39
+ dangerouslySetInnerHTML={{ __html: JSON.stringify(data) }}
40
+ />
41
+ );
42
+ }
43
+ ```
44
+
45
+ Use it in any page:
46
+ ```jsx
47
+ import { JsonLd } from '@/components/JsonLd';
48
+
49
+ export default function MyPage() {
50
+ return (
51
+ <>
52
+ <JsonLd data={mySchemaObject} />
53
+ {/* rest of page */}
54
+ </>
55
+ );
56
+ }
57
+ ```
58
+
59
+ ---
60
+
61
+ ## Schema Types by Page Type
62
+
63
+ ### WebSite + Sitelinks Searchbox (homepage only)
64
+ ```js
65
+ {
66
+ "@context": "https://schema.org",
67
+ "@type": "WebSite",
68
+ "name": "100 SEO Tools",
69
+ "url": "https://www.100seotools.com",
70
+ "description": "Free online SEO tools for keyword research, technical audits, and more.",
71
+ "potentialAction": {
72
+ "@type": "SearchAction",
73
+ "target": {
74
+ "@type": "EntryPoint",
75
+ "urlTemplate": "https://www.100seotools.com/search?q={search_term_string}"
76
+ },
77
+ "query-input": "required name=search_term_string"
78
+ }
79
+ }
80
+ ```
81
+
82
+ ---
83
+
84
+ ### SoftwareApplication (tool / SaaS app pages)
85
+ ```js
86
+ {
87
+ "@context": "https://schema.org",
88
+ "@type": "SoftwareApplication",
89
+ "name": "Keyword Density Checker",
90
+ "applicationCategory": "WebApplication",
91
+ "operatingSystem": "Web",
92
+ "url": "https://www.100seotools.com/tools/keyword-density-checker",
93
+ "description": "Free keyword density checker tool. Analyze keyword frequency and optimize your content for SEO.",
94
+ "offers": {
95
+ "@type": "Offer",
96
+ "price": "0",
97
+ "priceCurrency": "USD"
98
+ },
99
+ "featureList": [
100
+ "Analyze keyword frequency",
101
+ "Detect over-optimization",
102
+ "Export results as CSV"
103
+ ],
104
+ "provider": {
105
+ "@type": "Organization",
106
+ "name": "100 SEO Tools",
107
+ "url": "https://www.100seotools.com"
108
+ }
109
+ }
110
+ ```
111
+
112
+ ---
113
+
114
+ ### Article / BlogPosting (blog posts)
115
+ ```js
116
+ {
117
+ "@context": "https://schema.org",
118
+ "@type": "BlogPosting",
119
+ "headline": "How to Improve Your Core Web Vitals in 2025",
120
+ "description": "A practical guide to improving LCP, FID, and CLS scores for better rankings.",
121
+ "url": "https://www.100seotools.com/blog/improve-core-web-vitals",
122
+ "datePublished": "2025-01-15",
123
+ "dateModified": "2025-03-20",
124
+ "author": {
125
+ "@type": "Person",
126
+ "name": "Jane Smith",
127
+ "url": "https://www.100seotools.com/author/jane-smith"
128
+ },
129
+ "publisher": {
130
+ "@type": "Organization",
131
+ "name": "100 SEO Tools",
132
+ "logo": {
133
+ "@type": "ImageObject",
134
+ "url": "https://www.100seotools.com/logo.png"
135
+ }
136
+ },
137
+ "image": {
138
+ "@type": "ImageObject",
139
+ "url": "https://www.100seotools.com/images/blog/core-web-vitals.jpg",
140
+ "width": 1200,
141
+ "height": 630
142
+ },
143
+ "mainEntityOfPage": {
144
+ "@type": "WebPage",
145
+ "@id": "https://www.100seotools.com/blog/improve-core-web-vitals"
146
+ }
147
+ }
148
+ ```
149
+
150
+ ---
151
+
152
+ ### FAQPage (FAQ sections, tool help pages)
153
+ ```js
154
+ {
155
+ "@context": "https://schema.org",
156
+ "@type": "FAQPage",
157
+ "mainEntity": [
158
+ {
159
+ "@type": "Question",
160
+ "name": "What is keyword density?",
161
+ "acceptedAnswer": {
162
+ "@type": "Answer",
163
+ "text": "Keyword density is the percentage of times a keyword appears in a piece of content relative to the total word count. A healthy keyword density is typically 1-3%."
164
+ }
165
+ },
166
+ {
167
+ "@type": "Question",
168
+ "name": "Is this tool free to use?",
169
+ "acceptedAnswer": {
170
+ "@type": "Answer",
171
+ "text": "Yes, our keyword density checker is completely free with no registration required."
172
+ }
173
+ }
174
+ ]
175
+ }
176
+ ```
177
+
178
+ ---
179
+
180
+ ### HowTo (step-by-step tool guides)
181
+ ```js
182
+ {
183
+ "@context": "https://schema.org",
184
+ "@type": "HowTo",
185
+ "name": "How to Check Keyword Density",
186
+ "description": "Step-by-step guide to analyzing keyword density using our free tool.",
187
+ "totalTime": "PT2M",
188
+ "step": [
189
+ {
190
+ "@type": "HowToStep",
191
+ "position": 1,
192
+ "name": "Paste your content",
193
+ "text": "Copy your article or webpage content and paste it into the text area.",
194
+ "image": "https://www.100seotools.com/images/how-to/step1.jpg"
195
+ },
196
+ {
197
+ "@type": "HowToStep",
198
+ "position": 2,
199
+ "name": "Enter your target keyword",
200
+ "text": "Type the keyword you want to analyze in the keyword field."
201
+ },
202
+ {
203
+ "@type": "HowToStep",
204
+ "position": 3,
205
+ "name": "Click Analyze",
206
+ "text": "Press the Analyze button to get your keyword density report instantly."
207
+ }
208
+ ]
209
+ }
210
+ ```
211
+
212
+ ---
213
+
214
+ ### BreadcrumbList (all non-homepage pages)
215
+ ```js
216
+ {
217
+ "@context": "https://schema.org",
218
+ "@type": "BreadcrumbList",
219
+ "itemListElement": [
220
+ {
221
+ "@type": "ListItem",
222
+ "position": 1,
223
+ "name": "Home",
224
+ "item": "https://www.100seotools.com"
225
+ },
226
+ {
227
+ "@type": "ListItem",
228
+ "position": 2,
229
+ "name": "SEO Tools",
230
+ "item": "https://www.100seotools.com/tools"
231
+ },
232
+ {
233
+ "@type": "ListItem",
234
+ "position": 3,
235
+ "name": "Keyword Density Checker",
236
+ "item": "https://www.100seotools.com/tools/keyword-density-checker"
237
+ }
238
+ ]
239
+ }
240
+ ```
241
+
242
+ ---
243
+
244
+ ### Organization (about, contact pages)
245
+ ```js
246
+ {
247
+ "@context": "https://schema.org",
248
+ "@type": "Organization",
249
+ "name": "100 SEO Tools",
250
+ "url": "https://www.100seotools.com",
251
+ "logo": "https://www.100seotools.com/logo.png",
252
+ "sameAs": [
253
+ "https://twitter.com/100seotools",
254
+ "https://www.linkedin.com/company/100seotools"
255
+ ],
256
+ "contactPoint": {
257
+ "@type": "ContactPoint",
258
+ "contactType": "customer support",
259
+ "email": "hello@100seotools.com"
260
+ }
261
+ }
262
+ ```
263
+
264
+ ---
265
+
266
+ ## Combining Multiple Schemas on One Page
267
+
268
+ A tool page can have BreadcrumbList + SoftwareApplication + FAQPage:
269
+
270
+ ```jsx
271
+ export default function ToolPage() {
272
+ return (
273
+ <>
274
+ <JsonLd data={breadcrumbSchema} />
275
+ <JsonLd data={softwareApplicationSchema} />
276
+ <JsonLd data={faqSchema} />
277
+ {/* page content */}
278
+ </>
279
+ );
280
+ }
281
+ ```
282
+
283
+ Each schema lives in its own `<script>` tag — do NOT merge them into one object.
284
+
285
+ ---
286
+
287
+ ## Validation
288
+
289
+ Always validate schema before deploying:
290
+
291
+ 1. **Google Rich Results Test** — https://search.google.com/test/rich-results
292
+ 2. **Schema.org Validator** — https://validator.schema.org/
293
+ 3. **Google Search Console** → Enhancements → check for warnings after deployment
294
+
295
+ ```bash
296
+ # Quick check: schema appears in HTML
297
+ curl -s https://www.yourdomain.com/tools/keyword-density | grep -A 5 "application/ld+json"
298
+ ```
299
+
300
+ ---
301
+
302
+ ## Schema Markup Checklist
303
+
304
+ - [ ] Homepage has `WebSite` schema
305
+ - [ ] Tool/app pages have `SoftwareApplication` schema
306
+ - [ ] Blog posts have `BlogPosting` / `Article` schema
307
+ - [ ] FAQ sections have `FAQPage` schema
308
+ - [ ] Step-by-step guides have `HowTo` schema
309
+ - [ ] All non-homepage pages have `BreadcrumbList`
310
+ - [ ] About/contact page has `Organization` schema
311
+ - [ ] All URLs in schema are absolute HTTPS
312
+ - [ ] Schema validated with Google Rich Results Test
313
+ - [ ] No schema errors in Google Search Console
314
+
315
+ ## Limitations
316
+
317
+ - Does not guarantee rich-result eligibility or display; Google and other consumers decide whether to use valid schema.
318
+ - Generated examples must be adapted to the site's real content, legal entity details, ratings, pricing, and availability.
319
+ - Always validate deployed HTML, not only source code, because frameworks and rendering modes can change the final markup.
@@ -2,13 +2,17 @@
2
2
  name: sendblue-api
3
3
  description: "Send and receive iMessage, SMS, and RCS from application code via the Sendblue HTTP API — text, media, group messages, send styles, reactions, typing indicators, status callbacks, and inbound webhooks."
4
4
  category: api-integration
5
- risk: safe
5
+ risk: critical
6
6
  source: community
7
7
  source_type: official
8
8
  date_added: "2026-05-22"
9
9
  author: AnthonyFirth
10
10
  tags: [sendblue, imessage, sms, rcs, messaging, api, webhooks]
11
11
  tools: [claude, cursor, gemini]
12
+ plugin:
13
+ targets:
14
+ codex: blocked
15
+ claude: blocked
12
16
  ---
13
17
 
14
18
  # Sendblue API
@@ -167,6 +171,7 @@ Status callback payloads (`outbound`) mirror the send-message response and updat
167
171
  ## Security & Safety Notes
168
172
 
169
173
  - Keep `sb-api-key-id` and `sb-api-secret-key` server-side. They are not safe in browser, mobile, or CI logs.
174
+ - Treat every outbound send, contact/webhook mutation, read receipt, reaction, or typing indicator as state-changing. Preview the recipient, sender line, content, and callback/webhook changes, then wait for explicit user confirmation before sending.
170
175
  - Webhook endpoints should be on HTTPS and idempotent — same `message_handle` may arrive more than once.
171
176
  - Sensitive data in message content is visible in lock-screen previews on the recipient's device. Don't embed secrets, tokens, or full PII — link to an authenticated dashboard or shortened payload instead.
172
177
  - Rotate API keys from the Sendblue dashboard if either value is exposed; the old pair is invalidated on rotation.
@@ -2,7 +2,7 @@
2
2
  name: sendblue-cli
3
3
  description: "Send iMessage and SMS from the shell via the @sendblue/cli npm package — outbound sends, contact management, and account setup with no API client or webhook server required."
4
4
  category: api-integration
5
- risk: safe
5
+ risk: critical
6
6
  source: community
7
7
  source_repo: sendblue-api/sendblue-cli
8
8
  source_type: official
@@ -12,6 +12,10 @@ tags: [sendblue, imessage, sms, cli, messaging, notifications]
12
12
  tools: [claude, cursor, gemini]
13
13
  license: "MIT"
14
14
  license_source: "https://github.com/sendblue-api/sendblue-cli/blob/main/LICENSE"
15
+ plugin:
16
+ targets:
17
+ codex: blocked
18
+ claude: blocked
15
19
  ---
16
20
 
17
21
  # Sendblue CLI
@@ -121,6 +125,7 @@ To text yourself at the end of every agent turn, register a `Stop` hook in `sett
121
125
  ## Security & Safety Notes
122
126
 
123
127
  - Credentials are written to `~/.sendblue/credentials.json` with mode `600`. Treat that file like an API key — do not commit it, do not copy it across machines without the same posture.
128
+ - Treat every outbound send, contact setup, login, or account setup action as state-changing. Preview the recipient, message body, and account/email target, then wait for explicit user confirmation before running it.
124
129
  - Run the CLI as the OS user that owns the credentials file. `sudo` writes a separate copy under root's home and silently desyncs.
125
130
  - Outbound messages to phone numbers are not free of consequence — wire `sendblue send` into hooks or loops only after gating on duration or success conditions to avoid spamming the recipient.
126
131
  - Verification codes arrive by email; treat the address you registered with as a recovery factor for the account.
@@ -2,13 +2,17 @@
2
2
  name: sendblue-notify
3
3
  description: "Text the user's phone when a long-running task, agent turn, or scheduled job finishes — via @sendblue/cli for outbound, optionally wired to a Claude Code Stop hook for automatic fire."
4
4
  category: automation
5
- risk: safe
5
+ risk: critical
6
6
  source: community
7
7
  source_type: official
8
8
  date_added: "2026-05-22"
9
9
  author: AnthonyFirth
10
10
  tags: [sendblue, imessage, sms, notifications, hooks, claude-code, automation]
11
11
  tools: [claude, cursor, gemini]
12
+ plugin:
13
+ targets:
14
+ codex: blocked
15
+ claude: blocked
12
16
  ---
13
17
 
14
18
  # Sendblue Notify
@@ -146,6 +150,7 @@ You can install both: textme on a server for inbound, notify as a local `Stop`-h
146
150
  ## Security & Safety Notes
147
151
 
148
152
  - **Lock-screen previews leak.** Anyone holding the phone can read notification copy. Do not embed secrets, customer data, full error stacks, or auth tokens. Link to a log, dashboard, or PR instead.
153
+ - **Confirm before sending or wiring hooks.** Preview the destination, message template, trigger, and duration gate; wait for explicit user confirmation before running `sendblue send` or editing hook config.
149
154
  - **Automated outbound is a footgun.** A misconfigured `Stop` hook can fire dozens of messages a minute. Always gate by duration and prove the threshold in a dry run before committing.
150
155
  - **Per-user numbers.** The destination phone number is a personal identifier — keep it in user-local config (env var, gitignored file), not in committed repo files or CI logs.
151
156
  - **Free-plan verification is silent.** If the destination contact hasn't texted in once, sends return an API error but the user just sees "no text arrived". Confirm verification before wiring an unattended hook.
@@ -12,6 +12,10 @@ tags: [textme, sendblue, imessage, sms, claude-code, daemon, remote-control, aut
12
12
  tools: [claude, cursor, gemini]
13
13
  license: "MIT"
14
14
  license_source: "https://github.com/njerschow/textme/blob/main/LICENSE"
15
+ plugin:
16
+ targets:
17
+ codex: blocked
18
+ claude: blocked
15
19
  ---
16
20
 
17
21
  # TextMe
@@ -0,0 +1,230 @@
1
+ ---
2
+ name: social-metadata-hardening
3
+ description: "Fix social sharing previews so URLs render as rich cards on Facebook, LinkedIn, X/Twitter, WhatsApp, Telegram, Slack, and Discord. Covers OG tags, Twitter cards, absolute image URLs, and metadata debugging."
4
+ category: seo
5
+ risk: safe
6
+ source: self
7
+ source_type: self
8
+ date_added: "2026-05-31"
9
+ author: Whoisabhishekadhikari
10
+ tags: [seo, open-graph, twitter-card, social-sharing, og-image, nextjs, metadata]
11
+ tools: [claude, cursor, gemini, claude-code]
12
+ version: 1.0.0
13
+ ---
14
+
15
+ # Social Metadata Hardening Skill
16
+
17
+ Fix social sharing so every important URL unfurls as a rich card across all platforms.
18
+
19
+ ---
20
+
21
+ ## When to Use
22
+
23
+ - Use when shared links show missing, stale, cropped, or incorrect previews on social and chat platforms.
24
+ - Use when auditing Open Graph, Twitter/X card, image URL, alt text, or `metadataBase` coverage in a web app.
25
+ - Use before launch when every public page needs predictable rich previews across LinkedIn, X, Facebook, WhatsApp, Slack, Discord, and Telegram.
26
+
27
+ ---
28
+
29
+ ## Why Previews Break
30
+
31
+ | Problem | Root Cause |
32
+ |---------|-----------|
33
+ | No preview at all | Missing og:title, og:description, or og:image |
34
+ | Broken image | Relative URL (must be absolute) |
35
+ | Wrong image size | Image not 1200×630px (OG standard) |
36
+ | Plain text card | Twitter card type missing or set to `summary` |
37
+ | Stale preview | Platform caching old metadata |
38
+ | Metadata missing on crawl | Tags added by client-side JS (crawlers don't run JS) |
39
+
40
+ ---
41
+
42
+ ## The Gold Standard Metadata Block
43
+
44
+ Every shareable page needs ALL of these in static HTML:
45
+
46
+ ```js
47
+ // Next.js App Router — lib/socialMetadata.js
48
+ export function buildSocialMetadata({
49
+ title,
50
+ description,
51
+ path, // '/blog/my-post'
52
+ image, // '/images/og/my-post.jpg' or full URL
53
+ imageAlt,
54
+ imageWidth = 1200,
55
+ imageHeight = 630,
56
+ }) {
57
+ const baseUrl = process.env.NEXT_PUBLIC_BASE_URL || 'https://www.yourdomain.com';
58
+
59
+ // Always produce an absolute URL
60
+ const imageUrl = image?.startsWith('http') ? image : `${baseUrl}${image}`;
61
+ const pageUrl = `${baseUrl}${path}`;
62
+
63
+ // Detect MIME type from extension
64
+ const ext = imageUrl.split('.').pop().toLowerCase();
65
+ const mimeMap = { jpg: 'image/jpeg', jpeg: 'image/jpeg', png: 'image/png', webp: 'image/webp' };
66
+ const imageType = mimeMap[ext] || 'image/jpeg';
67
+
68
+ return {
69
+ title,
70
+ description,
71
+ alternates: { canonical: pageUrl },
72
+ openGraph: {
73
+ title,
74
+ description,
75
+ url: pageUrl,
76
+ type: 'website', // use 'article' for blog posts
77
+ images: [{
78
+ url: imageUrl,
79
+ secureUrl: imageUrl, // explicit HTTPS version
80
+ width: imageWidth,
81
+ height: imageHeight,
82
+ alt: imageAlt || title,
83
+ type: imageType,
84
+ }],
85
+ },
86
+ twitter: {
87
+ card: 'summary_large_image', // NOT 'summary' — that shows a tiny image
88
+ title,
89
+ description,
90
+ images: [imageUrl],
91
+ },
92
+ };
93
+ }
94
+ ```
95
+
96
+ ---
97
+
98
+ ## Applying the Helper
99
+
100
+ ### Static page
101
+ ```js
102
+ // app/about/page.js
103
+ import { buildSocialMetadata } from '@/lib/socialMetadata';
104
+
105
+ export const metadata = buildSocialMetadata({
106
+ title: 'About Us | My Site',
107
+ description: 'Learn about our team and mission.',
108
+ path: '/about',
109
+ image: '/images/og/about.jpg',
110
+ imageAlt: 'The My Site team',
111
+ });
112
+ ```
113
+
114
+ ### Dynamic page (blog post, tool page)
115
+ ```js
116
+ // app/blog/[slug]/page.js
117
+ import { buildSocialMetadata } from '@/lib/socialMetadata';
118
+
119
+ export async function generateMetadata({ params }) {
120
+ const post = await getPost(params.slug);
121
+ return buildSocialMetadata({
122
+ title: `${post.title} | My Blog`,
123
+ description: post.excerpt,
124
+ path: `/blog/${params.slug}`,
125
+ image: post.ogImage || '/images/og/default.jpg',
126
+ imageAlt: post.title,
127
+ });
128
+ }
129
+ ```
130
+
131
+ ### Homepage (app/layout.js or app/page.js)
132
+ ```js
133
+ export const metadata = {
134
+ metadataBase: new URL('https://www.yourdomain.com'), // REQUIRED for absolute URLs
135
+ ...buildSocialMetadata({
136
+ title: 'My Site — Tagline Here',
137
+ description: 'Site-wide description.',
138
+ path: '/',
139
+ image: '/images/og/home.jpg',
140
+ }),
141
+ };
142
+ ```
143
+
144
+ > ⚠️ **`metadataBase` is critical.** Without it, Next.js generates relative OG image URLs that every platform rejects.
145
+
146
+ ---
147
+
148
+ ## OG Image Checklist
149
+
150
+ Good OG images:
151
+ - **1200 × 630px** (2:1 ratio — works on all platforms)
152
+ - **Under 8MB** (Facebook limit)
153
+ - Served over **HTTPS**
154
+ - File name has **no spaces** (use hyphens)
155
+ - Format: **JPEG or PNG** (WebP works on most but not all crawlers)
156
+ - **Accessible via GET** with no authentication
157
+
158
+ ```bash
159
+ # Verify your OG image is reachable and correct size
160
+ curl -sI https://www.yourdomain.com/images/og/home.jpg | grep -i "content-type\|content-length\|status"
161
+ ```
162
+
163
+ ---
164
+
165
+ ## Platform-Specific Notes
166
+
167
+ ### Facebook / Meta
168
+ - Caches aggressively — use the [Sharing Debugger](https://developers.facebook.com/tools/debug/) to force recrawl
169
+ - Minimum image: 200×200px (but use 1200×630 for quality)
170
+ - Needs: `og:title`, `og:description`, `og:image`, `og:url`
171
+
172
+ ### X / Twitter
173
+ - Use `twitter:card = summary_large_image` for full-width images
174
+ - `twitter:image` must be an absolute URL
175
+ - Use the [Card Validator](https://cards-dev.twitter.com/validator) to test
176
+
177
+ ### LinkedIn
178
+ - Caches hard — use [Post Inspector](https://www.linkedin.com/post-inspector/) to refresh
179
+ - Respects `og:` tags; ignores `twitter:` tags
180
+ - Image must be ≥1.91:1 aspect ratio
181
+
182
+ ### WhatsApp / Telegram
183
+ - Read OG tags on first share; cache can last hours
184
+ - Re-share after a few hours for the cache to clear naturally
185
+
186
+ ### Slack / Discord
187
+ - Both use OG tags; both cache
188
+ - Discord also supports `og:type = article` for richer embeds
189
+
190
+ ---
191
+
192
+ ## Debugging Social Previews
193
+
194
+ ### 1. Check raw HTML for tags
195
+ ```bash
196
+ curl -s https://www.yourdomain.com/blog/my-post | grep -i "og:\|twitter:"
197
+ ```
198
+ If tags don't appear → they're being added by JavaScript (not crawlable). Fix: move to `export const metadata` or `generateMetadata`.
199
+
200
+ ### 2. Validate with platform tools
201
+ | Platform | Tool |
202
+ |----------|------|
203
+ | Facebook | https://developers.facebook.com/tools/debug/ |
204
+ | LinkedIn | https://www.linkedin.com/post-inspector/ |
205
+ | Twitter/X | https://cards-dev.twitter.com/validator |
206
+ | General | https://metatags.io |
207
+
208
+ ### 3. Force cache refresh
209
+ After deploying fixes, paste the URL into each platform's debugger and click "Fetch new scrape information" (or equivalent).
210
+
211
+ ---
212
+
213
+ ## Social Metadata Checklist
214
+
215
+ - [ ] `metadataBase` set in root layout
216
+ - [ ] All shareable pages use shared `buildSocialMetadata` helper
217
+ - [ ] OG image URLs are absolute (start with `https://`)
218
+ - [ ] `secureUrl` set equal to `url` in OG image block
219
+ - [ ] Image is 1200×630px, under 8MB, HTTPS
220
+ - [ ] `twitter:card` is `summary_large_image` (not `summary`)
221
+ - [ ] Image alt text present
222
+ - [ ] Tags visible in raw HTML (not JavaScript-rendered)
223
+ - [ ] All platform debuggers show correct preview
224
+ - [ ] Cache refreshed on all platforms after deployment
225
+
226
+ ## Limitations
227
+
228
+ - Cannot force immediate cache refresh on every social platform; some previews may remain stale after a correct fix.
229
+ - Requires deployed, publicly reachable URLs for reliable validation with platform debuggers.
230
+ - Does not replace brand, accessibility, or legal review of image text, alt text, and preview copy.
@@ -2,7 +2,7 @@
2
2
  name: socialclaw
3
3
  description: "Agent-first social media publishing skill — schedule and publish posts across 13 platforms (X, LinkedIn, Instagram, Facebook Pages, TikTok, Discord, Telegram, YouTube, Reddit, WordPress, Pinterest) via a single workspace API key."
4
4
  category: marketing
5
- risk: safe
5
+ risk: critical
6
6
  source: community
7
7
  source_repo: ndesv21/socialclaw
8
8
  source_type: community
@@ -12,6 +12,10 @@ tags: [social-media, publishing, scheduling, marketing, twitter, linkedin, insta
12
12
  tools: [claude]
13
13
  license: "MIT"
14
14
  license_source: "https://github.com/ndesv21/socialclaw/blob/main/LICENSE"
15
+ plugin:
16
+ targets:
17
+ codex: blocked
18
+ claude: blocked
15
19
  ---
16
20
 
17
21
  # SocialClaw — Social Media Publisher
@@ -103,5 +107,6 @@ Website: [getsocialclaw.com](https://getsocialclaw.com)
103
107
  ## Limitations
104
108
 
105
109
  - Requires a valid SocialClaw workspace API key; do not attempt publishing without explicit user-provided credentials.
110
+ - Treat every publish, schedule, delete, or account-changing action as state-changing: show the target platforms, content, media, and timing, then wait for explicit user confirmation before calling the service.
106
111
  - Platform availability, rate limits, analytics fields, and scheduling behavior depend on the upstream SocialClaw service.
107
112
  - This skill describes the publishing workflow; it does not replace platform-specific compliance, brand review, or legal approval before posting.
@@ -51,9 +51,11 @@ Comprehensive guide to using uv, an extremely fast Python package installer and
51
51
 
52
52
  ```bash
53
53
  # macOS/Linux
54
- curl -LsSf https://astral.sh/uv/install.sh -o /tmp/uv-install.sh
55
- sed -n '1,160p' /tmp/uv-install.sh
56
- sh /tmp/uv-install.sh
54
+ tmpdir="$(mktemp -d)"
55
+ trap 'rm -rf "$tmpdir"' EXIT
56
+ curl -LsSf https://astral.sh/uv/install.sh -o "$tmpdir/uv-install.sh"
57
+ sed -n '1,160p' "$tmpdir/uv-install.sh"
58
+ sh "$tmpdir/uv-install.sh"
57
59
 
58
60
  # Windows (PowerShell)
59
61
  powershell -NoProfile -Command "Invoke-WebRequest https://astral.sh/uv/install.ps1 -OutFile $env:TEMP\\uv-install.ps1; Get-Content $env:TEMP\\uv-install.ps1 -TotalCount 120; powershell -ExecutionPolicy Bypass -File $env:TEMP\\uv-install.ps1"