playbook/antigravity-awesome-skills/skills/linkedin-content-generator/scripts/generate_post.py

78 lines
2.8 KiB
Python

"""
generate_post.py — LinkedIn Post Prompt Builder
Usage:
python generate_post.py --topic "<topic>" --niche "<niche>" [--tone <tone>] [--style <style>]
Tone: professional | storytelling | controversial | educational | motivational
Style: text-only | list-based | storytelling | data-driven | contrarian
"""
import argparse
import sys
import os
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, SCRIPT_DIR)
from utils import get_base_prompt_context
TONE_GUIDE = {
"professional": "Write with authority and expertise. Clear, polished, data-backed where possible.",
"storytelling": "Lead with a personal story or narrative. Make the reader feel something before delivering the insight.",
"controversial": "Take a bold, contrarian stance. Challenge the conventional wisdom in the niche. Prepare for debate.",
"educational": "Break down a complex concept simply. Use analogies, numbered steps, or mini-frameworks.",
"motivational": "Inspire and energize. Use strong action verbs. Make the reader feel capable and driven.",
}
STYLE_GUIDE = {
"text-only": "Write as flowing text paragraphs. No bullet points. Pure conversational prose.",
"list-based": "Structure the core value as a numbered or bulleted list. Maximum 7 items.",
"storytelling":"Write as a narrative arc: Setup → Conflict → Resolution → Lesson.",
"data-driven": "Anchor every key point with a statistic, study, or concrete example.",
"contrarian": "Start by stating what everyone believes, then flip it. Use 'But here's what they miss:' or similar.",
}
def main():
parser = argparse.ArgumentParser(description="Generate a LinkedIn Post prompt")
parser.add_argument("--topic", required=True)
parser.add_argument("--niche", required=True)
parser.add_argument("--tone", required=False, default="professional", choices=list(TONE_GUIDE.keys()))
parser.add_argument("--style", required=False, default="list-based", choices=list(STYLE_GUIDE.keys()))
args = parser.parse_args()
tone_instruction = TONE_GUIDE.get(args.tone, TONE_GUIDE["professional"])
style_instruction = STYLE_GUIDE.get(args.style, STYLE_GUIDE["list-based"])
context = get_base_prompt_context(args.niche, "LinkedIn Text Post")
prompt = f"""{context}
<TASK>
Generate a single, ready-to-publish LinkedIn post.
**Topic**: {args.topic}
**Niche**: {args.niche}
**Tone**: {tone_instruction}
**Style**: {style_instruction}
Mandatory output structure:
1. Hook (2 lines — scroll-stopping)
2. [blank line]
3. Body (follow tone + style instructions)
4. [blank line]
5. Key Takeaway (1-2 punchy sentences)
6. [blank line]
7. CTA (specific, value-driven)
8. [blank line]
9. Hashtags (3-5 only)
Output ONLY the final post. No preamble. Ready to paste into LinkedIn.
</TASK>"""
print(prompt)
if __name__ == "__main__":
main()