← Files AgentBrokoARCHIVED FILE

src/pdf_playbook/cli.py

3.99 KB · Sep 30, 2026 · 23:15 UTC

↓ Download file

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