This commit is contained in:
timka123 committed 2026-10-18 18:02:05 +03:00
commit 17a0a3c4c9
121 files changed
+17641

No files matched your search

+76
View File
@@ -0,0 +1,76 @@
"""`kadence` — run the server, or poke it from a terminal/cron."""
from __future__ import annotations
import argparse
import json
from datetime import date
from app.db import init_db, session_scope
from app.services import report, settings_service, stats, tasks_service
from app.timeutil import local_date
def main() -> int:
parser = argparse.ArgumentParser(prog="kadence")
sub = parser.add_subparsers(dest="command", required=True)
serve = sub.add_parser("serve", help="run the API (and the web UI)")
serve.add_argument("--host", default="0.0.0.0")
serve.add_argument("--port", type=int, default=8000)
serve.add_argument("--reload", action="store_true")
sub.add_parser("refresh", help="pull every todo source once")
sub.add_parser("briefing", help="send the morning briefing now")
report_cmd = sub.add_parser("report", help="build and send today's report")
report_cmd.add_argument("--date", type=date.fromisoformat, default=None)
report_cmd.add_argument("--print", action="store_true", help="print, do not send")
sub.add_parser("stats", help="print a summary as JSON")
args = parser.parse_args()
if args.command == "serve":
import uvicorn
uvicorn.run("app.main:app", host=args.host, port=args.port, reload=args.reload)
return 0
init_db()
with session_scope() as session:
settings = settings_service.load_settings(session)
if args.command == "refresh":
print(json.dumps(tasks_service.refresh_tasks(session, settings), indent=2))
elif args.command == "briefing":
from app.services.notify import notify
text = report.render_morning_briefing(session, settings)
print(text)
print([d.as_dict() for d in notify(settings, text, urgent=True)])
elif args.command == "report":
day = args.date or local_date(settings.timezone)
if args.print:
_, payload = report.get_or_build_daily(session, settings, day, rebuild=True)
print(report.render_daily_telegram(payload, settings))
else:
result = report.send_daily(session, settings, day, force=True)
print(result.get("text", ""))
print([d for d in result.get("deliveries", [])])
elif args.command == "stats":
today = local_date(settings.timezone)
print(
json.dumps(
{
"today": stats.day_metrics(session, settings, today),
"streak": stats.streak(session, settings),
"lifetime": stats.lifetime(session, settings),
},
indent=2,
ensure_ascii=False,
)
)
return 0
if __name__ == "__main__": # pragma: no cover
raise SystemExit(main())