← Files AgentBrokoARCHIVED FILE
src/pdf_playbook/cli.py
3.99 KB · Sep 30, 2026 · 23:15 UTC
from __future__ import annotations
import argparse
import os
import sys
from pathlib import Path
from .generator import generate_playbook, get_available_ai_engines
def _ask(prompt: str, default: str = "") -> str:
value = input(f"{prompt}{f' [{default}]' if default else ''}: ").strip()
return value or default
def main(argv: list[str] | None = None) -> int:
parser = argparse.ArgumentParser(
prog="agentbroko pdf-playbook",
description="Generate a 100% meaningful, AI-authored 20-page playbook PDF (Zero generic sample text)"
)
parser.add_argument("--output", default="agentbroko-playbook.pdf", help="Output PDF file path")
parser.add_argument("--title", default="The Modern AI Engineering Playbook", help="Playbook title")
parser.add_argument("--audience", default="Developers & Engineers", help="Target audience")
parser.add_argument("--topic", default="Step-by-step practical guide to mastering your workflow", help="Core promise / topic")
parser.add_argument("--api-key", default=None, help="Gemini or OpenAI API Key (or pass 'ollama')")
parser.add_argument("--provider", choices=["gemini", "openai", "ollama"], default=None, help="AI model provider")
parser.add_argument("--model", default=None, help="Specific model name (e.g., gemini-1.5-flash, gpt-4o-mini, llama3.2:1b)")
parser.add_argument("--spec", default=None, help="Path to custom JSON spec generated by your AI coding agent")
parser.add_argument("--remove-branding", action="store_true", help="Reserved for a future premium edition")
parser.add_argument("--non-interactive", action="store_true", help="Run in headless non-interactive mode")
args = parser.parse_args(argv)
answers = {
"title": args.title,
"audience": args.audience,
"topic": args.topic,
"api_key": args.api_key or os.environ.get("GEMINI_API_KEY") or os.environ.get("GOOGLE_API_KEY") or os.environ.get("OPENAI_API_KEY")
}
if not args.non_interactive and not args.spec:
print("\n=======================================================")
print("⚡ AgentBroko PDF Playbook Generator (AI-Powered)")
print("=======================================================")
detected = get_available_ai_engines()
if detected:
print("Detected AI Engines:")
for k, v in detected.items():
print(f" ✓ {v}")
print("-------------------------------------------------------")
answers["title"] = _ask("Guide title", args.title)
answers["audience"] = _ask("Primary audience", args.audience)
answers["topic"] = _ask("Core promise / topic", args.topic)
if not answers["api_key"] and "ollama" not in detected:
print("\n[AI Engine Required - Never Uses Generic Sample Text]")
print("Options:")
print(" 1. Google Gemini API Key (Free tier at https://aistudio.google.com)")
print(" 2. OpenAI API Key (sk-...)")
print(" 3. Type 'ollama' to connect to local Ollama (run: ollama run llama3)")
print(" 4. Or press Enter to check environment variables / local services")
key_choice = _ask("Enter API Key or 'ollama'", "")
if key_choice:
answers["api_key"] = key_choice
print(f"\n⚡ Authoring 20-page custom playbook for: '{answers['title']}'...")
try:
path = generate_playbook(
Path(args.output),
answers,
spec_file=args.spec,
remove_branding=args.remove_branding,
api_key=answers.get("api_key"),
provider=args.provider,
model=args.model
)
except ValueError as exc:
print(f"\n❌ Error: {exc}", file=sys.stderr)
return 1
except Exception as exc:
print(f"\n❌ Generation failed: {exc}", file=sys.stderr)
return 1
print(f"✓ Created branded AgentBroko PDF: {path.resolve()}\n")
return 0
if __name__ == "__main__":
raise SystemExit(main())
SHA-256: ca63cb5fdc55facbca2ef86ac7c3e74e9c39c4138c696a0c3a0443120666e59a