| 387 | |
| 388 | |
| 389 | def parse_args(argv: list[str]) -> argparse.Namespace: |
| 390 | parser = argparse.ArgumentParser(description=__doc__) |
| 391 | parser.add_argument("--dry-run", action="store_true", help="Do not call any APIs; print what would happen.") |
| 392 | parser.add_argument("--draft-mode", action="store_true", |
| 393 | help="Create as draft (dev.to: published=false; Hashnode: createDraft) instead of publishing. Useful for verifying formatting without going live.") |
| 394 | parser.add_argument( |
| 395 | "--platforms", |
| 396 | default=DEFAULT_PLATFORMS, |
| 397 | help=f"Comma-separated subset of platforms to consider (default: {DEFAULT_PLATFORMS}).", |
| 398 | ) |
| 399 | parser.add_argument( |
| 400 | "--today", |
| 401 | default=None, |
| 402 | help="Override today's date (YYYY-MM-DD). Useful for testing.", |
| 403 | ) |
| 404 | parser.add_argument( |
| 405 | "--floor", |
| 406 | default=ELIGIBILITY_FLOOR.isoformat(), |
| 407 | help=f"Posts must be dated strictly after this date (default: {ELIGIBILITY_FLOOR.isoformat()}).", |
| 408 | ) |
| 409 | parser.add_argument( |
| 410 | "--min-age-days", |
| 411 | type=int, |
| 412 | default=MIN_AGE_DAYS, |
| 413 | help=f"Minimum post age in days before syndicating (default: {MIN_AGE_DAYS}).", |
| 414 | ) |
| 415 | parser.add_argument( |
| 416 | "--blog-dir", |
| 417 | default=str(BLOG_DIR), |
| 418 | help="Directory containing Hugo blog posts.", |
| 419 | ) |
| 420 | parser.add_argument( |
| 421 | "--state-file", |
| 422 | default=str(STATE_FILE), |
| 423 | help="Path to syndication state JSON.", |
| 424 | ) |
| 425 | return parser.parse_args(argv) |
| 426 | |
| 427 | |
| 428 | def is_platform_configured(platform: str) -> bool: |