{"owner":"FujiwaraChoki","repo":"MoneyPrinterV2","hasSkills":true,"hasMcp":false,"mcpConfig":null,"found":["CLAUDE.md","AGENTS.md"],"skills":{"CLAUDE.md":"# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## Project Overview\n\nMoneyPrinterV2 (MPV2) is a Python 3.12 CLI tool that automates four online workflows:\n1. **YouTube Shorts** — generate video (LLM script → TTS → images → MoviePy composite) and upload via Selenium\n2. **Twitter/X Bot** — generate and post tweets via Selenium\n3. **Affiliate Marketing** — scrape Amazon product info, generate pitch, share on Twitter\n4. **Local Business Outreach** — scrape Google Maps (Go binary), extract emails, send cold outreach via SMTP\n\nThere is no web UI, no REST API, no test suite, no CI, and no linting config.\n\n## Running the Application\n\n```bash\n# First-time setup\ncp config.example.json config.json   # then fill in values\npython -m venv venv && source venv/bin/activate\npip install -r requirements.txt\n\n# macOS quick setup (auto-configures Ollama, ImageMagick, Firefox profile)\nbash scripts/setup_local.sh\n\n# Preflight check (validates services are reachable)\npython scripts/preflight_local.py\n\n# Run\npython src/main.py\n```\n\nThe app **must** be run from the project root. `python src/main.py` adds `src/` to `sys.path`, so all imports use bare module names (e.g., `from config import *`, not `from src.config import *`).\n\n## Architecture\n\n### Entry Points\n- `src/main.py` — interactive menu loop (primary)\n- `src/cron.py` — headless runner invoked by the scheduler as a subprocess: `python src/cron.py <platform> <account_uuid>`\n\n### Provider Pattern\nTwo service categories use a string-based dispatch pattern configured in `config.json`:\n\n| Category | Config key | Options |\n|---|---|---|\n| LLM | `ollama_model` | Ollama (via `ollama` Python SDK). If empty, user picks from available models at startup. |\n| Image gen | — | `nanobanana2` (Gemini image API) |\n| STT | `stt_provider` | `local_whisper`, `third_party_assemblyai` |\n\nLLM always uses the local Ollama server. Image generation always uses Nano Banana 2.\n\n### Key Modules\n- **`src/llm_provider.py`** — unified `generate_text(prompt)` function using the Ollama Python SDK\n- **`src/config.py`** — 30+ getter functions, each re-reads `config.json` on every call (no caching). `ROOT_DIR` = project root, computed as `os.path.dirname(sys.path[0])`\n- **`src/cache.py`** — JSON file persistence in `.mp/` directory (accounts, videos, posts, products)\n- **`src/constants.py`** — menu strings, Selenium selectors (YouTube Studio, X.com, Amazon)\n- **`src/classes/YouTube.py`** — most complex class; full pipeline: topic → script → metadata → image prompts → images → TTS → subtitles → MoviePy combine → Selenium upload\n- **`src/classes/Twitter.py`** — Selenium automation against x.com\n- **`src/classes/AFM.py`** — Amazon scraping + LLM pitch generation\n- **`src/classes/Outreach.py`** — Google Maps scraper (requires Go) + email sending via yagmail\n- **`src/classes/Tts.py`** — KittenTTS wrapper\n\n### Data Storage\nAll persistent state lives in `.mp/` at the project root as JSON files (`youtube.json`, `twitter.json`, `afm.json`). This directory also serves as scratch space for temporary WAV, PNG, SRT, and MP4 files — non-JSON files are cleaned on each run by `rem_temp_files()`.\n\n### Browser Automation\nSelenium uses pre-authenticated Firefox profiles (never handles login). The profile path is stored per-account in the cache JSON and also in `config.json` as a default.\n\n### CRON Scheduling\nUses Python's `schedule` library (in-process, not OS cron). The scheduled job spawns `subprocess.run([\"python\", \"src/cron.py\", platform, account_id])`.\n\n## Configuration\n\nAll config lives in `config.json` at the project root. See `config.example.json` for the full template and `docs/Configuration.md` for reference. Key external dependencies to configure:\n- **ImageMagick** — required for MoviePy subtitle rendering (`imagemagick_path`)\n- **Firefox profile** — must be pre-logged-in to target platforms (`firefox_profile`)\n- **Ollama** — for LLM text generation (via `ollama` Python SDK)\n- **Nano Banana 2** — for image generation (Gemini image API)\n- **Go** — only needed for Outreach (Google Maps scraper)\n\n## Contributing\n\nPRs go against `main`. One feature/fix per PR. Open an issue first. Use `WIP` label for in-progress PRs.\n","AGENTS.md":"# Repository Guidelines\n\n## Project Structure & Module Organization\n- `src/` contains the application code. Use `src/main.py` as the interactive entrypoint.\n- `src/classes/` holds provider-specific components (for example `YouTube.py`, `Twitter.py`, `Tts.py`, `AFM.py`, `Outreach.py`).\n- Shared utilities and configuration live in modules like `src/config.py`, `src/utils.py`, `src/cache.py`, and `src/constants.py`.\n- `scripts/` contains helper workflows such as setup, preflight checks, and upload helpers.\n- `docs/` contains feature documentation; `assets/` and `fonts/` contain static resources.\n\n## Build, Test, and Development Commands\n- `bash scripts/setup_local.sh`: bootstrap local development (creates `venv`, installs deps, seeds `config.json`, runs preflight).\n- `source venv/bin/activate && pip install -r requirements.txt`: manual dependency install/update.\n- `python3 scripts/preflight_local.py`: validate local provider/config readiness before running tasks.\n- `python3 src/main.py`: start the CLI app.\n- `bash scripts/upload_video.sh`: run direct script-based upload flow from repo root.\n\n## Coding Style & Naming Conventions\n- Target Python 3.12 (project requirement in `README.md`).\n- Use 4-space indentation and follow existing Python conventions:\n  - `snake_case` for functions/variables\n  - `PascalCase` for classes\n  - `UPPER_SNAKE_CASE` for constants\n- Keep new business logic in focused modules under `src/`; keep provider/integration code in `src/classes/`.\n- Prefer small, explicit functions and preserve existing CLI-first behavior.\n\n## Testing Guidelines\n- There is currently no enforced automated test suite or coverage threshold.\n- Minimum validation for changes:\n  - Run `python3 scripts/preflight_local.py`\n  - Smoke-test impacted flows via `python3 src/main.py`\n- When adding tests, place them in a top-level `tests/` directory with names like `test_<module>.py`.\n\n## Commit & Pull Request Guidelines\n- Follow the existing commit style: imperative summaries like `Fix ...`, `Update ...`, optionally with issue refs (for example `(#128)`).\n- Open PRs against `main`.\n- Link each PR to an issue, keep scope to one feature/fix, and use a clear title + description.\n- Mark not-ready PRs with `WIP` and remove it when ready for review.\n\n## Security & Configuration Tips\n- Treat `config.json` as environment-specific; do not commit real API keys or private profile paths.\n- Start from `config.example.json` and prefer environment variables where supported (for example `GEMINI_API_KEY`).\n"},"files":{"CLAUDE.md":"# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## Project Overview\n\nMoneyPrinterV2 (MPV2) is a Python 3.12 CLI tool that automates four online workflows:\n1. **YouTube Shorts** — generate video (LLM script → TTS → images → MoviePy composite) and upload via Selenium\n2. **Twitter/X Bot** — generate and post tweets via Selenium\n3. **Affiliate Marketing** — scrape Amazon product info, generate pitch, share on Twitter\n4. **Local Business Outreach** — scrape Google Maps (Go binary), extract emails, send cold outreach via SMTP\n\nThere is no web UI, no REST API, no test suite, no CI, and no linting config.\n\n## Running the Application\n\n```bash\n# First-time setup\ncp config.example.json config.json   # then fill in values\npython -m venv venv && source venv/bin/activate\npip install -r requirements.txt\n\n# macOS quick setup (auto-configures Ollama, ImageMagick, Firefox profile)\nbash scripts/setup_local.sh\n\n# Preflight check (validates services are reachable)\npython scripts/preflight_local.py\n\n# Run\npython src/main.py\n```\n\nThe app **must** be run from the project root. `python src/main.py` adds `src/` to `sys.path`, so all imports use bare module names (e.g., `from config import *`, not `from src.config import *`).\n\n## Architecture\n\n### Entry Points\n- `src/main.py` — interactive menu loop (primary)\n- `src/cron.py` — headless runner invoked by the scheduler as a subprocess: `python src/cron.py <platform> <account_uuid>`\n\n### Provider Pattern\nTwo service categories use a string-based dispatch pattern configured in `config.json`:\n\n| Category | Config key | Options |\n|---|---|---|\n| LLM | `ollama_model` | Ollama (via `ollama` Python SDK). If empty, user picks from available models at startup. |\n| Image gen | — | `nanobanana2` (Gemini image API) |\n| STT | `stt_provider` | `local_whisper`, `third_party_assemblyai` |\n\nLLM always uses the local Ollama server. Image generation always uses Nano Banana 2.\n\n### Key Modules\n- **`src/llm_provider.py`** — unified `generate_text(prompt)` function using the Ollama Python SDK\n- **`src/config.py`** — 30+ getter functions, each re-reads `config.json` on every call (no caching). `ROOT_DIR` = project root, computed as `os.path.dirname(sys.path[0])`\n- **`src/cache.py`** — JSON file persistence in `.mp/` directory (accounts, videos, posts, products)\n- **`src/constants.py`** — menu strings, Selenium selectors (YouTube Studio, X.com, Amazon)\n- **`src/classes/YouTube.py`** — most complex class; full pipeline: topic → script → metadata → image prompts → images → TTS → subtitles → MoviePy combine → Selenium upload\n- **`src/classes/Twitter.py`** — Selenium automation against x.com\n- **`src/classes/AFM.py`** — Amazon scraping + LLM pitch generation\n- **`src/classes/Outreach.py`** — Google Maps scraper (requires Go) + email sending via yagmail\n- **`src/classes/Tts.py`** — KittenTTS wrapper\n\n### Data Storage\nAll persistent state lives in `.mp/` at the project root as JSON files (`youtube.json`, `twitter.json`, `afm.json`). This directory also serves as scratch space for temporary WAV, PNG, SRT, and MP4 files — non-JSON files are cleaned on each run by `rem_temp_files()`.\n\n### Browser Automation\nSelenium uses pre-authenticated Firefox profiles (never handles login). The profile path is stored per-account in the cache JSON and also in `config.json` as a default.\n\n### CRON Scheduling\nUses Python's `schedule` library (in-process, not OS cron). The scheduled job spawns `subprocess.run([\"python\", \"src/cron.py\", platform, account_id])`.\n\n## Configuration\n\nAll config lives in `config.json` at the project root. See `config.example.json` for the full template and `docs/Configuration.md` for reference. Key external dependencies to configure:\n- **ImageMagick** — required for MoviePy subtitle rendering (`imagemagick_path`)\n- **Firefox profile** — must be pre-logged-in to target platforms (`firefox_profile`)\n- **Ollama** — for LLM text generation (via `ollama` Python SDK)\n- **Nano Banana 2** — for image generation (Gemini image API)\n- **Go** — only needed for Outreach (Google Maps scraper)\n\n## Contributing\n\nPRs go against `main`. One feature/fix per PR. Open an issue first. Use `WIP` label for in-progress PRs.\n","AGENTS.md":"# Repository Guidelines\n\n## Project Structure & Module Organization\n- `src/` contains the application code. Use `src/main.py` as the interactive entrypoint.\n- `src/classes/` holds provider-specific components (for example `YouTube.py`, `Twitter.py`, `Tts.py`, `AFM.py`, `Outreach.py`).\n- Shared utilities and configuration live in modules like `src/config.py`, `src/utils.py`, `src/cache.py`, and `src/constants.py`.\n- `scripts/` contains helper workflows such as setup, preflight checks, and upload helpers.\n- `docs/` contains feature documentation; `assets/` and `fonts/` contain static resources.\n\n## Build, Test, and Development Commands\n- `bash scripts/setup_local.sh`: bootstrap local development (creates `venv`, installs deps, seeds `config.json`, runs preflight).\n- `source venv/bin/activate && pip install -r requirements.txt`: manual dependency install/update.\n- `python3 scripts/preflight_local.py`: validate local provider/config readiness before running tasks.\n- `python3 src/main.py`: start the CLI app.\n- `bash scripts/upload_video.sh`: run direct script-based upload flow from repo root.\n\n## Coding Style & Naming Conventions\n- Target Python 3.12 (project requirement in `README.md`).\n- Use 4-space indentation and follow existing Python conventions:\n  - `snake_case` for functions/variables\n  - `PascalCase` for classes\n  - `UPPER_SNAKE_CASE` for constants\n- Keep new business logic in focused modules under `src/`; keep provider/integration code in `src/classes/`.\n- Prefer small, explicit functions and preserve existing CLI-first behavior.\n\n## Testing Guidelines\n- There is currently no enforced automated test suite or coverage threshold.\n- Minimum validation for changes:\n  - Run `python3 scripts/preflight_local.py`\n  - Smoke-test impacted flows via `python3 src/main.py`\n- When adding tests, place them in a top-level `tests/` directory with names like `test_<module>.py`.\n\n## Commit & Pull Request Guidelines\n- Follow the existing commit style: imperative summaries like `Fix ...`, `Update ...`, optionally with issue refs (for example `(#128)`).\n- Open PRs against `main`.\n- Link each PR to an issue, keep scope to one feature/fix, and use a clear title + description.\n- Mark not-ready PRs with `WIP` and remove it when ready for review.\n\n## Security & Configuration Tips\n- Treat `config.json` as environment-specific; do not commit real API keys or private profile paths.\n- Start from `config.example.json` and prefer environment variables where supported (for example `GEMINI_API_KEY`).\n"},"items":[{"name":"CLAUDE.md","path":"CLAUDE.md","title":"CLAUDE.md","content":"# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## Project Overview\n\nMoneyPrinterV2 (MPV2) is a Python 3.12 CLI tool that automates four online workflows:\n1. **YouTube Shorts** — generate video (LLM script → TTS → images → MoviePy composite) and upload via Selenium\n2. **Twitter/X Bot** — generate and post tweets via Selenium\n3. **Affiliate Marketing** — scrape Amazon product info, generate pitch, share on Twitter\n4. **Local Business Outreach** — scrape Google Maps (Go binary), extract emails, send cold outreach via SMTP\n\nThere is no web UI, no REST API, no test suite, no CI, and no linting config.\n\n## Running the Application\n\n```bash\n# First-time setup\ncp config.example.json config.json   # then fill in values\npython -m venv venv && source venv/bin/activate\npip install -r requirements.txt\n\n# macOS quick setup (auto-configures Ollama, ImageMagick, Firefox profile)\nbash scripts/setup_local.sh\n\n# Preflight check (validates services are reachable)\npython scripts/preflight_local.py\n\n# Run\npython src/main.py\n```\n\nThe app **must** be run from the project root. `python src/main.py` adds `src/` to `sys.path`, so all imports use bare module names (e.g., `from config import *`, not `from src.config import *`).\n\n## Architecture\n\n### Entry Points\n- `src/main.py` — interactive menu loop (primary)\n- `src/cron.py` — headless runner invoked by the scheduler as a subprocess: `python src/cron.py <platform> <account_uuid>`\n\n### Provider Pattern\nTwo service categories use a string-based dispatch pattern configured in `config.json`:\n\n| Category | Config key | Options |\n|---|---|---|\n| LLM | `ollama_model` | Ollama (via `ollama` Python SDK). If empty, user picks from available models at startup. |\n| Image gen | — | `nanobanana2` (Gemini image API) |\n| STT | `stt_provider` | `local_whisper`, `third_party_assemblyai` |\n\nLLM always uses the local Ollama server. Image generation always uses Nano Banana 2.\n\n### Key Modules\n- **`src/llm_provider.py`** — unified `generate_text(prompt)` function using the Ollama Python SDK\n- **`src/config.py`** — 30+ getter functions, each re-reads `config.json` on every call (no caching). `ROOT_DIR` = project root, computed as `os.path.dirname(sys.path[0])`\n- **`src/cache.py`** — JSON file persistence in `.mp/` directory (accounts, videos, posts, products)\n- **`src/constants.py`** — menu strings, Selenium selectors (YouTube Studio, X.com, Amazon)\n- **`src/classes/YouTube.py`** — most complex class; full pipeline: topic → script → metadata → image prompts → images → TTS → subtitles → MoviePy combine → Selenium upload\n- **`src/classes/Twitter.py`** — Selenium automation against x.com\n- **`src/classes/AFM.py`** — Amazon scraping + LLM pitch generation\n- **`src/classes/Outreach.py`** — Google Maps scraper (requires Go) + email sending via yagmail\n- **`src/classes/Tts.py`** — KittenTTS wrapper\n\n### Data Storage\nAll persistent state lives in `.mp/` at the project root as JSON files (`youtube.json`, `twitter.json`, `afm.json`). This directory also serves as scratch space for temporary WAV, PNG, SRT, and MP4 files — non-JSON files are cleaned on each run by `rem_temp_files()`.\n\n### Browser Automation\nSelenium uses pre-authenticated Firefox profiles (never handles login). The profile path is stored per-account in the cache JSON and also in `config.json` as a default.\n\n### CRON Scheduling\nUses Python's `schedule` library (in-process, not OS cron). The scheduled job spawns `subprocess.run([\"python\", \"src/cron.py\", platform, account_id])`.\n\n## Configuration\n\nAll config lives in `config.json` at the project root. See `config.example.json` for the full template and `docs/Configuration.md` for reference. Key external dependencies to configure:\n- **ImageMagick** — required for MoviePy subtitle rendering (`imagemagick_path`)\n- **Firefox profile** — must be pre-logged-in to target platforms (`firefox_profile`)\n- **Ollama** — for LLM text generation (via `ollama` Python SDK)\n- **Nano Banana 2** — for image generation (Gemini image API)\n- **Go** — only needed for Outreach (Google Maps scraper)\n\n## Contributing\n\nPRs go against `main`. One feature/fix per PR. Open an issue first. Use `WIP` label for in-progress PRs.\n","category":"root","tokens":1062},{"name":"AGENTS.md","path":"AGENTS.md","title":"AGENTS.md","content":"# Repository Guidelines\n\n## Project Structure & Module Organization\n- `src/` contains the application code. Use `src/main.py` as the interactive entrypoint.\n- `src/classes/` holds provider-specific components (for example `YouTube.py`, `Twitter.py`, `Tts.py`, `AFM.py`, `Outreach.py`).\n- Shared utilities and configuration live in modules like `src/config.py`, `src/utils.py`, `src/cache.py`, and `src/constants.py`.\n- `scripts/` contains helper workflows such as setup, preflight checks, and upload helpers.\n- `docs/` contains feature documentation; `assets/` and `fonts/` contain static resources.\n\n## Build, Test, and Development Commands\n- `bash scripts/setup_local.sh`: bootstrap local development (creates `venv`, installs deps, seeds `config.json`, runs preflight).\n- `source venv/bin/activate && pip install -r requirements.txt`: manual dependency install/update.\n- `python3 scripts/preflight_local.py`: validate local provider/config readiness before running tasks.\n- `python3 src/main.py`: start the CLI app.\n- `bash scripts/upload_video.sh`: run direct script-based upload flow from repo root.\n\n## Coding Style & Naming Conventions\n- Target Python 3.12 (project requirement in `README.md`).\n- Use 4-space indentation and follow existing Python conventions:\n  - `snake_case` for functions/variables\n  - `PascalCase` for classes\n  - `UPPER_SNAKE_CASE` for constants\n- Keep new business logic in focused modules under `src/`; keep provider/integration code in `src/classes/`.\n- Prefer small, explicit functions and preserve existing CLI-first behavior.\n\n## Testing Guidelines\n- There is currently no enforced automated test suite or coverage threshold.\n- Minimum validation for changes:\n  - Run `python3 scripts/preflight_local.py`\n  - Smoke-test impacted flows via `python3 src/main.py`\n- When adding tests, place them in a top-level `tests/` directory with names like `test_<module>.py`.\n\n## Commit & Pull Request Guidelines\n- Follow the existing commit style: imperative summaries like `Fix ...`, `Update ...`, optionally with issue refs (for example `(#128)`).\n- Open PRs against `main`.\n- Link each PR to an issue, keep scope to one feature/fix, and use a clear title + description.\n- Mark not-ready PRs with `WIP` and remove it when ready for review.\n\n## Security & Configuration Tips\n- Treat `config.json` as environment-specific; do not commit real API keys or private profile paths.\n- Start from `config.example.json` and prefer environment variables where supported (for example `GEMINI_API_KEY`).\n","category":"root","tokens":629}]}