opencode-skills-collection 3.0.36 → 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.
Files changed (73) hide show
  1. package/bundled-skills/.antigravity-install-manifest.json +13 -1
  2. package/bundled-skills/2slides-ppt-generator/SKILL.md +786 -0
  3. package/bundled-skills/2slides-ppt-generator/references/api-reference.md +499 -0
  4. package/bundled-skills/2slides-ppt-generator/references/mcp-integration.md +282 -0
  5. package/bundled-skills/2slides-ppt-generator/references/pricing.md +195 -0
  6. package/bundled-skills/2slides-ppt-generator/scripts/api_constants.py +87 -0
  7. package/bundled-skills/2slides-ppt-generator/scripts/create_pdf_slides.py +159 -0
  8. package/bundled-skills/2slides-ppt-generator/scripts/download_slides_pages_voices.py +157 -0
  9. package/bundled-skills/2slides-ppt-generator/scripts/generate_narration.py +197 -0
  10. package/bundled-skills/2slides-ppt-generator/scripts/generate_slides.py +247 -0
  11. package/bundled-skills/2slides-ppt-generator/scripts/get_job_status.py +106 -0
  12. package/bundled-skills/2slides-ppt-generator/scripts/search_themes.py +137 -0
  13. package/bundled-skills/anti-sycophancy/README.md +86 -0
  14. package/bundled-skills/anti-sycophancy/SKILL.md +40 -0
  15. package/bundled-skills/antigravity-agent-manager/SKILL.md +112 -0
  16. package/bundled-skills/docs/integrations/jetski-cortex.md +3 -3
  17. package/bundled-skills/docs/integrations/jetski-gemini-loader/README.md +1 -1
  18. package/bundled-skills/docs/maintainers/repo-growth-seo.md +3 -3
  19. package/bundled-skills/docs/maintainers/skills-update-guide.md +1 -1
  20. package/bundled-skills/docs/sources/sources.md +1 -0
  21. package/bundled-skills/docs/users/bundles.md +1 -1
  22. package/bundled-skills/docs/users/claude-code-skills.md +1 -1
  23. package/bundled-skills/docs/users/gemini-cli-skills.md +1 -1
  24. package/bundled-skills/docs/users/getting-started.md +1 -1
  25. package/bundled-skills/docs/users/kiro-integration.md +1 -1
  26. package/bundled-skills/docs/users/usage.md +4 -4
  27. package/bundled-skills/docs/users/visual-guide.md +4 -4
  28. package/bundled-skills/event-staffing-compliance/SKILL.md +91 -0
  29. package/bundled-skills/event-staffing-ordering/SKILL.md +119 -0
  30. package/bundled-skills/examprep-ai/SKILL.md +446 -0
  31. package/bundled-skills/hasdata/SKILL.md +107 -0
  32. package/bundled-skills/hasdata/references/code-recipes.md +150 -0
  33. package/bundled-skills/hasdata/references/ecommerce.md +116 -0
  34. package/bundled-skills/hasdata/references/jobs.md +111 -0
  35. package/bundled-skills/hasdata/references/local-business.md +145 -0
  36. package/bundled-skills/hasdata/references/real-estate.md +84 -0
  37. package/bundled-skills/hasdata/references/scraper-jobs.md +252 -0
  38. package/bundled-skills/hasdata/references/search.md +154 -0
  39. package/bundled-skills/hasdata/references/travel.md +202 -0
  40. package/bundled-skills/hasdata/references/web-scraping.md +159 -0
  41. package/bundled-skills/hasdata/references/youtube.md +186 -0
  42. package/bundled-skills/hasdata-cli/SKILL.md +169 -0
  43. package/bundled-skills/hasdata-cli/references/all-commands.md +107 -0
  44. package/bundled-skills/hasdata-cli/references/ecommerce.md +106 -0
  45. package/bundled-skills/hasdata-cli/references/enrichment.md +227 -0
  46. package/bundled-skills/hasdata-cli/references/jobs.md +84 -0
  47. package/bundled-skills/hasdata-cli/references/local-business.md +123 -0
  48. package/bundled-skills/hasdata-cli/references/real-estate.md +126 -0
  49. package/bundled-skills/hasdata-cli/references/search.md +122 -0
  50. package/bundled-skills/hasdata-cli/references/travel.md +102 -0
  51. package/bundled-skills/hasdata-cli/references/web-scraping.md +181 -0
  52. package/bundled-skills/hasdata-cli/references/youtube.md +145 -0
  53. package/bundled-skills/linkedin-content-generator/SKILL.md +492 -0
  54. package/bundled-skills/linkedin-content-generator/scripts/generate_calendar.py +82 -0
  55. package/bundled-skills/linkedin-content-generator/scripts/generate_carousel.py +69 -0
  56. package/bundled-skills/linkedin-content-generator/scripts/generate_newsletter.py +64 -0
  57. package/bundled-skills/linkedin-content-generator/scripts/generate_post.py +77 -0
  58. package/bundled-skills/linkedin-content-generator/scripts/memory.md +49 -0
  59. package/bundled-skills/linkedin-content-generator/scripts/memory_manager.py +134 -0
  60. package/bundled-skills/linkedin-content-generator/scripts/utils.py +96 -0
  61. package/bundled-skills/permission-manager/README.md +22 -0
  62. package/bundled-skills/permission-manager/SKILL.md +54 -0
  63. package/bundled-skills/skill-suggester/README.md +14 -0
  64. package/bundled-skills/skill-suggester/SKILL.md +69 -0
  65. package/bundled-skills/smart-git-automation/README.md +31 -0
  66. package/bundled-skills/smart-git-automation/SKILL.md +96 -0
  67. package/bundled-skills/vercel-optimize/lib/cost-coverage.mjs +3 -1
  68. package/bundled-skills/vercel-optimize/lib/render-report.mjs +2 -2
  69. package/bundled-skills/vercel-optimize/lib/util.mjs +7 -0
  70. package/bundled-skills/vercel-optimize/lib/verify-claim.mjs +2 -7
  71. package/bundled-skills/vercel-optimize/lib/workspace-resolver.mjs +2 -1
  72. package/package.json +2 -2
  73. 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