opencode-skills-collection 3.0.37 → 3.0.38
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/bundled-skills/.antigravity-install-manifest.json +13 -1
- package/bundled-skills/2slides-ppt-generator/SKILL.md +786 -0
- package/bundled-skills/2slides-ppt-generator/references/api-reference.md +499 -0
- package/bundled-skills/2slides-ppt-generator/references/mcp-integration.md +282 -0
- package/bundled-skills/2slides-ppt-generator/references/pricing.md +195 -0
- package/bundled-skills/2slides-ppt-generator/scripts/api_constants.py +87 -0
- package/bundled-skills/2slides-ppt-generator/scripts/create_pdf_slides.py +159 -0
- package/bundled-skills/2slides-ppt-generator/scripts/download_slides_pages_voices.py +157 -0
- package/bundled-skills/2slides-ppt-generator/scripts/generate_narration.py +197 -0
- package/bundled-skills/2slides-ppt-generator/scripts/generate_slides.py +247 -0
- package/bundled-skills/2slides-ppt-generator/scripts/get_job_status.py +106 -0
- package/bundled-skills/2slides-ppt-generator/scripts/search_themes.py +137 -0
- package/bundled-skills/anti-sycophancy/README.md +86 -0
- package/bundled-skills/anti-sycophancy/SKILL.md +40 -0
- package/bundled-skills/antigravity-agent-manager/SKILL.md +112 -0
- package/bundled-skills/docs/integrations/jetski-cortex.md +3 -3
- package/bundled-skills/docs/integrations/jetski-gemini-loader/README.md +1 -1
- package/bundled-skills/docs/maintainers/repo-growth-seo.md +3 -3
- package/bundled-skills/docs/maintainers/skills-update-guide.md +1 -1
- package/bundled-skills/docs/sources/sources.md +1 -0
- package/bundled-skills/docs/users/bundles.md +1 -1
- package/bundled-skills/docs/users/claude-code-skills.md +1 -1
- package/bundled-skills/docs/users/gemini-cli-skills.md +1 -1
- package/bundled-skills/docs/users/getting-started.md +1 -1
- package/bundled-skills/docs/users/kiro-integration.md +1 -1
- package/bundled-skills/docs/users/usage.md +4 -4
- package/bundled-skills/docs/users/visual-guide.md +4 -4
- package/bundled-skills/event-staffing-compliance/SKILL.md +91 -0
- package/bundled-skills/event-staffing-ordering/SKILL.md +119 -0
- package/bundled-skills/examprep-ai/SKILL.md +446 -0
- package/bundled-skills/hasdata/SKILL.md +107 -0
- package/bundled-skills/hasdata/references/code-recipes.md +150 -0
- package/bundled-skills/hasdata/references/ecommerce.md +116 -0
- package/bundled-skills/hasdata/references/jobs.md +111 -0
- package/bundled-skills/hasdata/references/local-business.md +145 -0
- package/bundled-skills/hasdata/references/real-estate.md +84 -0
- package/bundled-skills/hasdata/references/scraper-jobs.md +252 -0
- package/bundled-skills/hasdata/references/search.md +154 -0
- package/bundled-skills/hasdata/references/travel.md +202 -0
- package/bundled-skills/hasdata/references/web-scraping.md +159 -0
- package/bundled-skills/hasdata/references/youtube.md +186 -0
- package/bundled-skills/hasdata-cli/SKILL.md +169 -0
- package/bundled-skills/hasdata-cli/references/all-commands.md +107 -0
- package/bundled-skills/hasdata-cli/references/ecommerce.md +106 -0
- package/bundled-skills/hasdata-cli/references/enrichment.md +227 -0
- package/bundled-skills/hasdata-cli/references/jobs.md +84 -0
- package/bundled-skills/hasdata-cli/references/local-business.md +123 -0
- package/bundled-skills/hasdata-cli/references/real-estate.md +126 -0
- package/bundled-skills/hasdata-cli/references/search.md +122 -0
- package/bundled-skills/hasdata-cli/references/travel.md +102 -0
- package/bundled-skills/hasdata-cli/references/web-scraping.md +181 -0
- package/bundled-skills/hasdata-cli/references/youtube.md +145 -0
- package/bundled-skills/linkedin-content-generator/SKILL.md +492 -0
- package/bundled-skills/linkedin-content-generator/scripts/generate_calendar.py +82 -0
- package/bundled-skills/linkedin-content-generator/scripts/generate_carousel.py +69 -0
- package/bundled-skills/linkedin-content-generator/scripts/generate_newsletter.py +64 -0
- package/bundled-skills/linkedin-content-generator/scripts/generate_post.py +77 -0
- package/bundled-skills/linkedin-content-generator/scripts/memory.md +49 -0
- package/bundled-skills/linkedin-content-generator/scripts/memory_manager.py +134 -0
- package/bundled-skills/linkedin-content-generator/scripts/utils.py +96 -0
- package/bundled-skills/permission-manager/README.md +22 -0
- package/bundled-skills/permission-manager/SKILL.md +54 -0
- package/bundled-skills/skill-suggester/README.md +14 -0
- package/bundled-skills/skill-suggester/SKILL.md +69 -0
- package/bundled-skills/smart-git-automation/README.md +31 -0
- package/bundled-skills/smart-git-automation/SKILL.md +96 -0
- package/bundled-skills/vercel-optimize/lib/cost-coverage.mjs +3 -1
- package/bundled-skills/vercel-optimize/lib/render-report.mjs +2 -2
- package/bundled-skills/vercel-optimize/lib/util.mjs +7 -0
- package/bundled-skills/vercel-optimize/lib/verify-claim.mjs +2 -7
- package/bundled-skills/vercel-optimize/lib/workspace-resolver.mjs +2 -1
- package/package.json +1 -1
- package/skills_index.json +268 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"""
|
|
2
|
+
generate_newsletter.py — LinkedIn Newsletter Prompt Builder
|
|
3
|
+
|
|
4
|
+
Usage:
|
|
5
|
+
python generate_newsletter.py --topic "<topic>" --niche "<niche>" [--title "<title>"] [--length <length>]
|
|
6
|
+
|
|
7
|
+
Length: short (~700w) | medium (~1200w) | long (~2000w)
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import argparse
|
|
11
|
+
import sys
|
|
12
|
+
import os
|
|
13
|
+
|
|
14
|
+
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
|
|
15
|
+
sys.path.insert(0, SCRIPT_DIR)
|
|
16
|
+
from utils import get_base_prompt_context
|
|
17
|
+
|
|
18
|
+
LENGTH_GUIDE = {
|
|
19
|
+
"short": "~600-800 words. Quick, punchy, skimmable. 2-3 sections max.",
|
|
20
|
+
"medium": "~1000-1400 words. Balanced depth and readability. 3-4 sections.",
|
|
21
|
+
"long": "~1800-2500 words. Deep dive. 4-6 sections with subsections.",
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def main():
|
|
26
|
+
parser = argparse.ArgumentParser(description="Generate a LinkedIn Newsletter prompt")
|
|
27
|
+
parser.add_argument("--topic", required=True)
|
|
28
|
+
parser.add_argument("--niche", required=True)
|
|
29
|
+
parser.add_argument("--title", required=False, default="")
|
|
30
|
+
parser.add_argument("--length", required=False, default="medium", choices=list(LENGTH_GUIDE.keys()))
|
|
31
|
+
|
|
32
|
+
args = parser.parse_args()
|
|
33
|
+
|
|
34
|
+
length_instruction = LENGTH_GUIDE.get(args.length, LENGTH_GUIDE["medium"])
|
|
35
|
+
title_line = f"**Newsletter Title**: {args.title}" if args.title else "**Newsletter Title**: Generate a compelling SEO-optimised headline."
|
|
36
|
+
context = get_base_prompt_context(args.niche, "LinkedIn Newsletter Article")
|
|
37
|
+
|
|
38
|
+
prompt = f"""{context}
|
|
39
|
+
|
|
40
|
+
<TASK>
|
|
41
|
+
Generate a complete LinkedIn Newsletter edition.
|
|
42
|
+
|
|
43
|
+
**Topic**: {args.topic}
|
|
44
|
+
**Niche**: {args.niche}
|
|
45
|
+
{title_line}
|
|
46
|
+
**Length**: {args.length.upper()} — {length_instruction}
|
|
47
|
+
|
|
48
|
+
Required structure:
|
|
49
|
+
1. Headline (H1) — catchy, SEO-optimised, keyword-rich
|
|
50
|
+
2. Opening Hook — personal anecdote, surprising statistic, or bold claim (2-3 sentences)
|
|
51
|
+
3. Body Sections (H2 subheadings) — background, insights, examples, data
|
|
52
|
+
4. Key Takeaways — bulleted list (3-5 items)
|
|
53
|
+
5. Action Step — 1 specific thing to do this week
|
|
54
|
+
6. Engagement Question — ask 1 question to spark comments
|
|
55
|
+
|
|
56
|
+
Formatting: Markdown (H1, H2, H3, bold, bullets). Short paragraphs only.
|
|
57
|
+
Output ONLY the final newsletter. No commentary.
|
|
58
|
+
</TASK>"""
|
|
59
|
+
|
|
60
|
+
print(prompt)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
if __name__ == "__main__":
|
|
64
|
+
main()
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"""
|
|
2
|
+
generate_post.py — LinkedIn Post Prompt Builder
|
|
3
|
+
|
|
4
|
+
Usage:
|
|
5
|
+
python generate_post.py --topic "<topic>" --niche "<niche>" [--tone <tone>] [--style <style>]
|
|
6
|
+
|
|
7
|
+
Tone: professional | storytelling | controversial | educational | motivational
|
|
8
|
+
Style: text-only | list-based | storytelling | data-driven | contrarian
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import argparse
|
|
12
|
+
import sys
|
|
13
|
+
import os
|
|
14
|
+
|
|
15
|
+
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
|
|
16
|
+
sys.path.insert(0, SCRIPT_DIR)
|
|
17
|
+
from utils import get_base_prompt_context
|
|
18
|
+
|
|
19
|
+
TONE_GUIDE = {
|
|
20
|
+
"professional": "Write with authority and expertise. Clear, polished, data-backed where possible.",
|
|
21
|
+
"storytelling": "Lead with a personal story or narrative. Make the reader feel something before delivering the insight.",
|
|
22
|
+
"controversial": "Take a bold, contrarian stance. Challenge the conventional wisdom in the niche. Prepare for debate.",
|
|
23
|
+
"educational": "Break down a complex concept simply. Use analogies, numbered steps, or mini-frameworks.",
|
|
24
|
+
"motivational": "Inspire and energize. Use strong action verbs. Make the reader feel capable and driven.",
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
STYLE_GUIDE = {
|
|
28
|
+
"text-only": "Write as flowing text paragraphs. No bullet points. Pure conversational prose.",
|
|
29
|
+
"list-based": "Structure the core value as a numbered or bulleted list. Maximum 7 items.",
|
|
30
|
+
"storytelling":"Write as a narrative arc: Setup → Conflict → Resolution → Lesson.",
|
|
31
|
+
"data-driven": "Anchor every key point with a statistic, study, or concrete example.",
|
|
32
|
+
"contrarian": "Start by stating what everyone believes, then flip it. Use 'But here's what they miss:' or similar.",
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def main():
|
|
37
|
+
parser = argparse.ArgumentParser(description="Generate a LinkedIn Post prompt")
|
|
38
|
+
parser.add_argument("--topic", required=True)
|
|
39
|
+
parser.add_argument("--niche", required=True)
|
|
40
|
+
parser.add_argument("--tone", required=False, default="professional", choices=list(TONE_GUIDE.keys()))
|
|
41
|
+
parser.add_argument("--style", required=False, default="list-based", choices=list(STYLE_GUIDE.keys()))
|
|
42
|
+
|
|
43
|
+
args = parser.parse_args()
|
|
44
|
+
|
|
45
|
+
tone_instruction = TONE_GUIDE.get(args.tone, TONE_GUIDE["professional"])
|
|
46
|
+
style_instruction = STYLE_GUIDE.get(args.style, STYLE_GUIDE["list-based"])
|
|
47
|
+
context = get_base_prompt_context(args.niche, "LinkedIn Text Post")
|
|
48
|
+
|
|
49
|
+
prompt = f"""{context}
|
|
50
|
+
|
|
51
|
+
<TASK>
|
|
52
|
+
Generate a single, ready-to-publish LinkedIn post.
|
|
53
|
+
|
|
54
|
+
**Topic**: {args.topic}
|
|
55
|
+
**Niche**: {args.niche}
|
|
56
|
+
**Tone**: {tone_instruction}
|
|
57
|
+
**Style**: {style_instruction}
|
|
58
|
+
|
|
59
|
+
Mandatory output structure:
|
|
60
|
+
1. Hook (2 lines — scroll-stopping)
|
|
61
|
+
2. [blank line]
|
|
62
|
+
3. Body (follow tone + style instructions)
|
|
63
|
+
4. [blank line]
|
|
64
|
+
5. Key Takeaway (1-2 punchy sentences)
|
|
65
|
+
6. [blank line]
|
|
66
|
+
7. CTA (specific, value-driven)
|
|
67
|
+
8. [blank line]
|
|
68
|
+
9. Hashtags (3-5 only)
|
|
69
|
+
|
|
70
|
+
Output ONLY the final post. No preamble. Ready to paste into LinkedIn.
|
|
71
|
+
</TASK>"""
|
|
72
|
+
|
|
73
|
+
print(prompt)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
if __name__ == "__main__":
|
|
77
|
+
main()
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# LinkedIn Content Memory
|
|
2
|
+
|
|
3
|
+
This file is the reinforcement learning database for the LinkedIn Content Skill.
|
|
4
|
+
It is automatically read by every generator script to personalise your content.
|
|
5
|
+
Use `/feedback` to update it. Use `/show-memory` to review it.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 🧠 Core Identity & Tone
|
|
10
|
+
- **Primary Niche:** (Update this — e.g. "AI & Technology", "Marketing", "SaaS")
|
|
11
|
+
- **Tone:** Professional, insightful, concise, and story-driven.
|
|
12
|
+
- **Voice:** First-person. Confident but humble. Write to one person, not an audience.
|
|
13
|
+
- **Formatting Preference:** Short paragraphs (1-2 sentences). Aggressive line breaks. Bullet points over dense paragraphs.
|
|
14
|
+
- **Emojis:** Use sparingly — 2-3 max per post, only where they genuinely add value.
|
|
15
|
+
- **CTA Style:** Specific and value-driven. Never "like and share" — always give a reason.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 🎯 Successful Hooks
|
|
20
|
+
> Add hooks that received high engagement here.
|
|
21
|
+
- (Empty — use `/feedback` to add your first successful hook)
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 📈 Top Performing Formats
|
|
26
|
+
> Note which content formats get the best reactions.
|
|
27
|
+
- (Empty — use `/feedback` to log your best performing format)
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## 🔑 High-Performing Topics
|
|
32
|
+
> Track which topics resonate most with your audience.
|
|
33
|
+
- (Empty — use `/feedback` to log topics that hit well)
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 🚫 What to Avoid
|
|
38
|
+
> Patterns, phrases, or formats that underperformed.
|
|
39
|
+
- Avoid cliché openers like "In today's fast-paced world..."
|
|
40
|
+
- Avoid posting without a clear CTA
|
|
41
|
+
- Avoid hashtag stuffing (max 5)
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## 📝 Positive Feedback Log
|
|
46
|
+
|
|
47
|
+
### [2026-06-01 21:58] — test-01
|
|
48
|
+
- **What worked:** Great hook!
|
|
49
|
+
- **Tags:** `hook`
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"""
|
|
2
|
+
memory_manager.py — Reinforcement Learning Memory Manager for LinkedIn Content Skill.
|
|
3
|
+
Resolves memory.md relative to this script's location (inside .claude/skills/scripts/).
|
|
4
|
+
|
|
5
|
+
Commands:
|
|
6
|
+
python memory_manager.py add --id <id> --feedback <text> [--tags <tags>]
|
|
7
|
+
python memory_manager.py read
|
|
8
|
+
python memory_manager.py clear
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import argparse
|
|
12
|
+
import json
|
|
13
|
+
import os
|
|
14
|
+
import sys
|
|
15
|
+
from datetime import datetime
|
|
16
|
+
|
|
17
|
+
# ─── Configuration ────────────────────────────────────────────────────────────
|
|
18
|
+
|
|
19
|
+
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
|
|
20
|
+
MEMORY_FILE = os.path.join(SCRIPT_DIR, "memory.md")
|
|
21
|
+
|
|
22
|
+
MEMORY_TEMPLATE = """# LinkedIn Content Memory
|
|
23
|
+
|
|
24
|
+
This file is the reinforcement learning database for the LinkedIn Content Skill.
|
|
25
|
+
It is automatically read by every generator script to personalise your content.
|
|
26
|
+
Use `/feedback` to update it. Use `/show-memory` to review it.
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## 🧠 Core Identity & Tone
|
|
31
|
+
- **Primary Niche:** (Update this — e.g. "AI & Technology", "Marketing", "SaaS")
|
|
32
|
+
- **Tone:** Professional, insightful, concise, and story-driven.
|
|
33
|
+
- **Voice:** First-person. Confident but humble. Write to one person, not an audience.
|
|
34
|
+
- **Formatting Preference:** Short paragraphs (1-2 sentences). Aggressive line breaks. Bullet points over dense paragraphs.
|
|
35
|
+
- **Emojis:** Use sparingly — 2-3 max per post, only where they genuinely add value.
|
|
36
|
+
- **CTA Style:** Specific and value-driven. Never "like and share" — always give a reason.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## 🎯 Successful Hooks
|
|
41
|
+
> Add hooks that received high engagement here.
|
|
42
|
+
- (Empty — use `/feedback` to add your first successful hook)
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## 📈 Top Performing Formats
|
|
47
|
+
> Note which content formats get the best reactions.
|
|
48
|
+
- (Empty — use `/feedback` to log your best performing format)
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## 🔑 High-Performing Topics
|
|
53
|
+
> Track which topics resonate most with your audience.
|
|
54
|
+
- (Empty — use `/feedback` to log topics that hit well)
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## 🚫 What to Avoid
|
|
59
|
+
> Patterns, phrases, or formats that underperformed.
|
|
60
|
+
- Avoid cliché openers like "In today's fast-paced world..."
|
|
61
|
+
- Avoid posting without a clear CTA
|
|
62
|
+
- Avoid hashtag stuffing (max 5)
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## 📝 Positive Feedback Log
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def ensure_memory_exists():
|
|
71
|
+
if not os.path.exists(MEMORY_FILE):
|
|
72
|
+
with open(MEMORY_FILE, "w", encoding="utf-8") as f:
|
|
73
|
+
f.write(MEMORY_TEMPLATE)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def read_memory() -> str:
|
|
77
|
+
ensure_memory_exists()
|
|
78
|
+
with open(MEMORY_FILE, "r", encoding="utf-8") as f:
|
|
79
|
+
return f.read()
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def append_feedback(content_id: str, feedback_text: str, tags: str = ""):
|
|
83
|
+
ensure_memory_exists()
|
|
84
|
+
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M")
|
|
85
|
+
entry = f"\n### [{timestamp}] — {content_id}\n"
|
|
86
|
+
entry += f"- **What worked:** {feedback_text}\n"
|
|
87
|
+
if tags:
|
|
88
|
+
entry += f"- **Tags:** `{tags.strip()}`\n"
|
|
89
|
+
|
|
90
|
+
with open(MEMORY_FILE, "a", encoding="utf-8") as f:
|
|
91
|
+
f.write(entry)
|
|
92
|
+
|
|
93
|
+
print(json.dumps({
|
|
94
|
+
"status": "success",
|
|
95
|
+
"message": f"✅ Memory updated in {MEMORY_FILE}",
|
|
96
|
+
"entry_id": content_id,
|
|
97
|
+
"timestamp": timestamp,
|
|
98
|
+
"instruction": "This feedback will now be injected into all future content generation prompts."
|
|
99
|
+
}, indent=2))
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def clear_memory():
|
|
103
|
+
with open(MEMORY_FILE, "w", encoding="utf-8") as f:
|
|
104
|
+
f.write(MEMORY_TEMPLATE)
|
|
105
|
+
print(json.dumps({
|
|
106
|
+
"status": "success",
|
|
107
|
+
"message": "✅ Memory has been cleared and reset to defaults."
|
|
108
|
+
}, indent=2))
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def main():
|
|
112
|
+
parser = argparse.ArgumentParser(description="LinkedIn Content Skill — Memory Manager")
|
|
113
|
+
subparsers = parser.add_subparsers(dest="command", required=True)
|
|
114
|
+
|
|
115
|
+
add_parser = subparsers.add_parser("add", help="Save positive feedback to memory")
|
|
116
|
+
add_parser.add_argument("--id", required=True)
|
|
117
|
+
add_parser.add_argument("--feedback", required=True)
|
|
118
|
+
add_parser.add_argument("--tags", required=False, default="")
|
|
119
|
+
|
|
120
|
+
subparsers.add_parser("read", help="Display current memory")
|
|
121
|
+
subparsers.add_parser("clear", help="Reset memory to defaults")
|
|
122
|
+
|
|
123
|
+
args = parser.parse_args()
|
|
124
|
+
|
|
125
|
+
if args.command == "add":
|
|
126
|
+
append_feedback(args.id, args.feedback, args.tags)
|
|
127
|
+
elif args.command == "read":
|
|
128
|
+
print(read_memory())
|
|
129
|
+
elif args.command == "clear":
|
|
130
|
+
clear_memory()
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
if __name__ == "__main__":
|
|
134
|
+
main()
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"""
|
|
2
|
+
utils.py — Shared prompt-building utilities for the LinkedIn Content Skill.
|
|
3
|
+
Reads the user's reinforcement learning memory from memory.md (same directory)
|
|
4
|
+
and constructs richly engineered system prompts for Claude to consume.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
import sys
|
|
9
|
+
|
|
10
|
+
# Always resolve paths relative to THIS script's location (inside scripts/)
|
|
11
|
+
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
|
|
12
|
+
MEMORY_FILE = os.path.join(SCRIPT_DIR, "memory.md")
|
|
13
|
+
|
|
14
|
+
# ─── LinkedIn SEO Rules ───────────────────────────────────────────────────────
|
|
15
|
+
|
|
16
|
+
LINKEDIN_SEO_RULES = """
|
|
17
|
+
## LinkedIn SEO & Content Rules (MANDATORY — Follow Exactly)
|
|
18
|
+
|
|
19
|
+
### Hook Engineering (Most Critical)
|
|
20
|
+
- Line 1 MUST be a scroll-stopping hook. Use one of these proven formats:
|
|
21
|
+
a) Bold contrarian statement: "Most LinkedIn advice is wrong. Here's why."
|
|
22
|
+
b) Surprising statistic: "95% of LinkedIn posts get fewer than 100 views. Here's the 5% secret."
|
|
23
|
+
c) Provocative question: "What if everything you knew about personal branding was backwards?"
|
|
24
|
+
d) Personal story opener: "3 years ago, I had 47 LinkedIn followers. Here's what changed."
|
|
25
|
+
- Line 2 MUST create a pattern interrupt — force the reader to click "see more"
|
|
26
|
+
- NEVER start with: "In today's...", "I am excited to...", "Happy to share...", "Thrilled to announce..."
|
|
27
|
+
|
|
28
|
+
### Content Structure
|
|
29
|
+
- Hook (2 lines, must not trigger "see more" cutoff)
|
|
30
|
+
- [blank line]
|
|
31
|
+
- Context/Problem (2-3 short sentences max)
|
|
32
|
+
- [blank line]
|
|
33
|
+
- Core Value (use numbered lists or bullets — max 7 items)
|
|
34
|
+
- [blank line]
|
|
35
|
+
- Key Takeaway (1-2 punchy sentences)
|
|
36
|
+
- [blank line]
|
|
37
|
+
- Call to Action (1 specific, non-generic CTA)
|
|
38
|
+
- [blank line]
|
|
39
|
+
- Hashtags (3-5 only — mix broad + niche)
|
|
40
|
+
|
|
41
|
+
### Readability Rules
|
|
42
|
+
- Maximum 2 sentences per paragraph
|
|
43
|
+
- Use line breaks aggressively — white space wins on LinkedIn
|
|
44
|
+
- Bold sparingly, only for truly critical points
|
|
45
|
+
- Sentences: short, punchy, declarative. Vary rhythm.
|
|
46
|
+
- Reading level: Grade 8 or below
|
|
47
|
+
|
|
48
|
+
### Tone & Voice
|
|
49
|
+
- Write like you're talking to ONE person, not an audience
|
|
50
|
+
- Use "you" and "I" — personal, not corporate
|
|
51
|
+
- Confident, not arrogant. Helpful, not preachy.
|
|
52
|
+
- Zero jargon unless explaining it is the point
|
|
53
|
+
|
|
54
|
+
### Hashtag Strategy
|
|
55
|
+
- 1 broad hashtag (#AI, #Marketing, #Leadership)
|
|
56
|
+
- 2 niche hashtags (#AIAgents, #ContentMarketing, #StartupLife)
|
|
57
|
+
- 1-2 community hashtags (#LinkedInTips, #PersonalBranding)
|
|
58
|
+
- Total: NEVER more than 5
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def read_memory() -> str:
|
|
63
|
+
"""Read and return the full contents of memory.md."""
|
|
64
|
+
if not os.path.exists(MEMORY_FILE):
|
|
65
|
+
return "No memory found. Use /feedback to start building personalised memory."
|
|
66
|
+
with open(MEMORY_FILE, "r", encoding="utf-8") as f:
|
|
67
|
+
return f.read()
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def get_base_prompt_context(niche: str, content_type: str) -> str:
|
|
71
|
+
"""
|
|
72
|
+
Build a complete system prompt context for the AI.
|
|
73
|
+
Injects LinkedIn SEO rules + the user's personal reinforcement learning memory.
|
|
74
|
+
"""
|
|
75
|
+
memory_context = read_memory()
|
|
76
|
+
|
|
77
|
+
prompt = f"""<SYSTEM_INSTRUCTION>
|
|
78
|
+
You are an elite LinkedIn Content Strategist and Copywriter working for a specific user.
|
|
79
|
+
Your task is to generate a world-class {content_type} for the niche: "{niche}".
|
|
80
|
+
|
|
81
|
+
{LINKEDIN_SEO_RULES}
|
|
82
|
+
|
|
83
|
+
## User's Personal Memory & Preferences (HIGHEST PRIORITY)
|
|
84
|
+
The following reinforcement learning memory reflects what has worked for this user.
|
|
85
|
+
You MUST prioritize and replicate these patterns in your output:
|
|
86
|
+
|
|
87
|
+
<MEMORY>
|
|
88
|
+
{memory_context}
|
|
89
|
+
</MEMORY>
|
|
90
|
+
|
|
91
|
+
If memory contains specific hooks, tones, or formats that worked well — USE THEM as inspiration.
|
|
92
|
+
If memory is empty — default to the SEO rules above and high-performing LinkedIn best practices.
|
|
93
|
+
|
|
94
|
+
</SYSTEM_INSTRUCTION>"""
|
|
95
|
+
|
|
96
|
+
return prompt
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# permission-manager
|
|
2
|
+
|
|
3
|
+
Manage opencode permissions: review always-allow lists, suggest safe read-only commands, configure permission patterns.
|
|
4
|
+
|
|
5
|
+
## What it does
|
|
6
|
+
|
|
7
|
+
- Reviews and summarizes currently always-allowed commands
|
|
8
|
+
- Suggests safe read-only commands for auto-approval
|
|
9
|
+
- Adds or removes commands from the allow list in opencode.json
|
|
10
|
+
- Configures skill-level permissions (allow/deny/ask) with wildcard patterns
|
|
11
|
+
- Audits permission configs for security and usability
|
|
12
|
+
|
|
13
|
+
## When to use
|
|
14
|
+
|
|
15
|
+
Use this when optimizing opencode's permission settings, reviewing allowed commands, or configuring skill access controls.
|
|
16
|
+
|
|
17
|
+
## Key capabilities
|
|
18
|
+
|
|
19
|
+
- **Config review**: Loads `~/.config/opencode/opencode.json` or project-level config
|
|
20
|
+
- **Permission summary**: Identifies currently allowed commands and skill permissions
|
|
21
|
+
- **Safe commands**: Suggests read-only commands (ls*, git status*, git log*, rg, grep, cat, etc.)
|
|
22
|
+
- **Change application**: Edits config to add/remove permission entries, validates JSON
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: permission-manager
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
description: "Manage opencode permissions: review always-allow lists, suggest safe read-only commands, configure permission patterns"
|
|
5
|
+
risk: critical
|
|
6
|
+
source: community
|
|
7
|
+
source_type: community
|
|
8
|
+
source_repo: mskadu/opencode-agent-skills
|
|
9
|
+
license: MIT
|
|
10
|
+
license_source: "https://github.com/mskadu/opencode-agent-skills/blob/main/LICENSE"
|
|
11
|
+
date_added: "2026-06-05"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## What I do
|
|
15
|
+
- Review and summarize currently always-allowed commands
|
|
16
|
+
- Suggest safe read-only commands for auto-approval
|
|
17
|
+
- Add or remove commands from the allow list in opencode.json
|
|
18
|
+
- Configure skill-level permissions (allow/deny/ask) with wildcard patterns
|
|
19
|
+
- Audit permission configs for security and usability
|
|
20
|
+
|
|
21
|
+
## When to Use
|
|
22
|
+
Use this when optimizing opencode's permission settings, reviewing allowed commands, or configuring skill access controls.
|
|
23
|
+
|
|
24
|
+
## Workflow Steps
|
|
25
|
+
|
|
26
|
+
1. **Read current config**: Load `~/.config/opencode/opencode.json` or project-level `opencode.json`
|
|
27
|
+
2. **Summarize permissions**: Identify currently allowed commands and skill permissions
|
|
28
|
+
3. **Suggest additions**: Propose safe read-only commands for auto-allow (see recommended list below)
|
|
29
|
+
4. **Apply changes**: Edit the config to add/remove permission entries
|
|
30
|
+
5. **Validate**: Ensure JSON is valid after changes
|
|
31
|
+
|
|
32
|
+
Complements opencode's built-in allow/deny/ask permissions by auditing current config and recommending adjustments through conversation.
|
|
33
|
+
|
|
34
|
+
## Key Rules
|
|
35
|
+
- Never allow commands that modify files, commit, push, or change system state
|
|
36
|
+
- Use wildcards appropriately (e.g., `git status*` not just `git status`)
|
|
37
|
+
- Confirm with user before modifying permission config
|
|
38
|
+
- Distinguish between bash command permissions and skill permissions
|
|
39
|
+
- Keep config organized: group related commands together
|
|
40
|
+
|
|
41
|
+
## Limitations
|
|
42
|
+
|
|
43
|
+
- This skill is scoped to opencode permission configuration and should not modify other agent hosts' permission stores.
|
|
44
|
+
- Treat all write-capable command permissions as high-risk; review them manually even when a pattern looks narrow.
|
|
45
|
+
|
|
46
|
+
## How to trigger me
|
|
47
|
+
|
|
48
|
+
Use the Task tool with the `permission-manager` subagent type:
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
/permissions
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Or in natural language, ask opencode to "manage opencode permissions" or "review allowed commands".
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# skill-suggester
|
|
2
|
+
|
|
3
|
+
Scans opencode prompt history for recurring patterns and proposes new skills or command templates.
|
|
4
|
+
|
|
5
|
+
## What it does
|
|
6
|
+
|
|
7
|
+
- Reads prompt history from `~/.local/state/opencode/prompt-history*.jsonl`
|
|
8
|
+
- Identifies repeated multi-step workflows that don't have a dedicated skill yet
|
|
9
|
+
- Estimates time savings if each pattern were turned into a skill
|
|
10
|
+
- Provides direct evidence with excerpts from your past prompts
|
|
11
|
+
|
|
12
|
+
## When to use
|
|
13
|
+
|
|
14
|
+
Run occasionally (weekly or monthly) to find automation opportunities you didn't know existed. Good for catching workflows that have become routine without you noticing.
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: skill-suggester
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
description: "Scan prompt history for recurring patterns and unmet needs, then propose new skills or command templates"
|
|
5
|
+
risk: safe
|
|
6
|
+
source: community
|
|
7
|
+
source_type: community
|
|
8
|
+
source_repo: mskadu/opencode-agent-skills
|
|
9
|
+
license: MIT
|
|
10
|
+
license_source: "https://github.com/mskadu/opencode-agent-skills/blob/main/LICENSE"
|
|
11
|
+
date_added: "2026-06-05"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## What I do
|
|
15
|
+
|
|
16
|
+
Reads your opencode prompt history, finds repeated multi-step workflows, and recommends skill-worthy candidates. Saves you from having the same conversation twice.
|
|
17
|
+
|
|
18
|
+
## When to Use
|
|
19
|
+
|
|
20
|
+
Use this skill when the user wants to mine opencode prompt history for repeated workflows, recurring unmet needs, or candidates for new reusable skills.
|
|
21
|
+
|
|
22
|
+
## How to invoke
|
|
23
|
+
|
|
24
|
+
Run `/skill skill-suggester` to scan the full history. Optionally pass `--since <date>` (e.g. `--since 2026-05-01`) to limit the window.
|
|
25
|
+
|
|
26
|
+
## Analysis method
|
|
27
|
+
|
|
28
|
+
1. Locate prompt history files at `~/.local/state/opencode/prompt-history*.jsonl`
|
|
29
|
+
2. Parse each entry's message content
|
|
30
|
+
3. Score for skill potential by looking for:
|
|
31
|
+
- **Repetition**: similar phrasing or topic used 3+ times ("scan all repos", "check my inbox")
|
|
32
|
+
- **Multi-step sequences**: a request that required 5+ tool calls to complete
|
|
33
|
+
- **Unsupported requests**: things you asked for that don't have a dedicated skill yet
|
|
34
|
+
- **Workaround patterns**: instructions you give every time instead of a one-shot command
|
|
35
|
+
4. For each candidate, note:
|
|
36
|
+
- How many times the pattern appeared
|
|
37
|
+
- How many tool calls it consumed
|
|
38
|
+
- The estimated time savings if it were a skill
|
|
39
|
+
|
|
40
|
+
## Output format
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
## Skill Candidates (last N entries)
|
|
44
|
+
|
|
45
|
+
### 1. "<candidate name>" (PRIORITY)
|
|
46
|
+
- **Pattern**: <what you keep asking for>
|
|
47
|
+
- **Frequency**: X times in history
|
|
48
|
+
- **Avg complexity**: Y tool calls per instance
|
|
49
|
+
- **Estimated savings**: ~Z minutes/week
|
|
50
|
+
- **Evidence**:
|
|
51
|
+
- "[excerpt from prompt history]"
|
|
52
|
+
- "[another excerpt]"
|
|
53
|
+
- **Recommendation**: <create as skill | add as command template | not worth it>
|
|
54
|
+
|
|
55
|
+
### 2. ...
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Key rules
|
|
59
|
+
|
|
60
|
+
- Only flag patterns that happen more than twice. One-offs are not skills.
|
|
61
|
+
- Include direct quotes from your past prompts as evidence.
|
|
62
|
+
- Rate each candidate: `high` (clear ROI, use weekly), `medium` (nice to have), `low` (rare but worth noting).
|
|
63
|
+
- If nothing qualifies, say so and explain why.
|
|
64
|
+
- After presenting candidates, ask if you want to create any of them.
|
|
65
|
+
|
|
66
|
+
## Limitations
|
|
67
|
+
|
|
68
|
+
- Prompt history can contain sensitive local context; summarize patterns without exposing unnecessary private excerpts.
|
|
69
|
+
- Recommendations are suggestions only and still need human review before creating or publishing a new skill.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# smart-git-automation
|
|
2
|
+
|
|
3
|
+
Intelligently detect and group changes, auto-generate branch names, and streamline the commit/PR workflow.
|
|
4
|
+
|
|
5
|
+
## What it does
|
|
6
|
+
|
|
7
|
+
- Intelligently detects and groups related changes
|
|
8
|
+
- Auto-generates descriptive branch names from changes
|
|
9
|
+
- Streamlines workflow: scan → branch → commit → push → PR with fewer prompts
|
|
10
|
+
- Generates commit messages and PR descriptions from changes
|
|
11
|
+
|
|
12
|
+
## When to use
|
|
13
|
+
|
|
14
|
+
Use this when you want a faster, smarter git workflow that groups changes logically and reduces manual confirmation overhead.
|
|
15
|
+
|
|
16
|
+
## Key capabilities
|
|
17
|
+
|
|
18
|
+
- **Smart grouping**: Runs git status/diff in parallel, groups files by module/directory or related edits
|
|
19
|
+
- **Auto branch names**: Generates `<type>/<short-description>` in kebab-case from dominant change pattern (feature, fix, refactor, docs, test, chore)
|
|
20
|
+
- **Streamlined commit**: Stages grouped files, auto-generates commit message, asks single-word confirmation
|
|
21
|
+
- **Push & PR**: Optional push to remote, then optional PR with auto-generated title/body from changes
|
|
22
|
+
- **Fork handling**: Detects fork remotes and uses correct remote for PR creation
|
|
23
|
+
|
|
24
|
+
## Rules
|
|
25
|
+
|
|
26
|
+
- Generate branch names from actual changes, don't ask user to name them
|
|
27
|
+
- Reduce confirmations to single-word answers or single confirmation points
|
|
28
|
+
- Never commit secrets, credentials, or large binaries
|
|
29
|
+
- Check if GitHub repo exists before PR creation
|
|
30
|
+
- Skip PR step if user says "no" at any point
|
|
31
|
+
- If branch already exists with changes, offer to amend or add new commit
|