Compare commits

...

2 Commits

Author SHA1 Message Date
29925de52d test: cron model/provider config preservation (#222)
Some checks failed
Nix / nix (macos-latest) (pull_request) Waiting to run
Docker Build and Publish / build-and-push (pull_request) Has been skipped
Nix / nix (ubuntu-latest) (pull_request) Failing after 8s
Contributor Attribution Check / check-attribution (pull_request) Failing after 39s
Supply Chain Audit / Scan PR for supply chain risks (pull_request) Successful in 1m9s
Tests / e2e (pull_request) Successful in 5m1s
Tests / test (pull_request) Failing after 46m34s
2026-04-15 03:32:27 +00:00
80b18940c3 fix: pass model/provider config through cron create/edit — preserves on restart (#222) 2026-04-15 03:31:50 +00:00
2 changed files with 87 additions and 0 deletions

View File

@@ -72,6 +72,12 @@ def cron_list(show_all: bool = False):
deliver = [deliver]
deliver_str = ", ".join(deliver)
model = job.get("model")
provider = job.get("provider")
model_str = ""
if model:
model_str = f" @ {provider}/{model}" if provider else f" @ {model}"
skills = job.get("skills") or ([job["skill"]] if job.get("skill") else [])
if state == "paused":
status = color("[paused]", Colors.YELLOW)
@@ -168,6 +174,8 @@ def cron_create(args):
skill=getattr(args, "skill", None),
skills=_normalize_skills(getattr(args, "skill", None), getattr(args, "skills", None)),
script=getattr(args, "script", None),
model=getattr(args, "model", None),
provider=getattr(args, "provider", None),
)
if not result.get("success"):
print(color(f"Failed to create job: {result.get('error', 'unknown error')}", Colors.RED))
@@ -180,6 +188,10 @@ def cron_create(args):
job_data = result.get("job", {})
if job_data.get("script"):
print(f" Script: {job_data['script']}")
if job_data.get("model"):
provider = job_data.get("provider", "")
model_str = f"{provider}/{job_data['model']}" if provider else job_data["model"]
print(f" Model: {model_str}")
print(f" Next run: {result['next_run_at']}")
return 0
@@ -217,6 +229,8 @@ def cron_edit(args):
deliver=getattr(args, "deliver", None),
repeat=getattr(args, "repeat", None),
skills=final_skills,
model=getattr(args, "model", None),
provider=getattr(args, "provider", None),
script=getattr(args, "script", None),
)
if not result.get("success"):

View File

@@ -0,0 +1,73 @@
"""Tests for cron model/provider config preservation (#222)."""
import json
import pytest
from unittest.mock import patch, MagicMock
def test_create_job_preserves_model_and_provider():
"""create_job should store model and provider in the job dict."""
from cron.jobs import create_job, load_jobs, save_jobs
import tempfile, os
with tempfile.NamedTemporaryFile(mode="w", suffix=".json", delete=False) as f:
json.dump([], f)
tmp_path = f.name
try:
with patch("cron.jobs._JOBS_FILE", tmp_path):
job = create_job(
schedule="0 * * * *",
prompt="test prompt",
model="xiaomi/mimo-v2-pro",
provider="nous",
)
assert job["model"] == "xiaomi/mimo-v2-pro"
assert job["provider"] == "nous"
# Verify persisted
jobs = load_jobs()
assert jobs[0]["model"] == "xiaomi/mimo-v2-pro"
assert jobs[0]["provider"] == "nous"
finally:
os.unlink(tmp_path)
def test_update_job_preserves_model():
"""update_job should preserve model/provider when updating other fields."""
from cron.jobs import create_job, update_job
with patch("cron.jobs._JOBS_FILE", "/tmp/test_cron_jobs.json"):
import os
if os.path.exists("/tmp/test_cron_jobs.json"):
os.unlink("/tmp/test_cron_jobs.json")
job = create_job(
schedule="0 * * * *",
prompt="test",
model="xiaomi/mimo-v2-pro",
provider="nous",
)
# Update prompt — model should be preserved
updated = update_job(job["id"], {"prompt": "new prompt"})
assert updated["model"] == "xiaomi/mimo-v2-pro"
assert updated["provider"] == "nous"
assert updated["prompt"] == "new prompt"
os.unlink("/tmp/test_cron_jobs.json")
def test_create_job_without_model_is_none():
"""create_job without model/provider should store None."""
from cron.jobs import create_job
with patch("cron.jobs._JOBS_FILE", "/tmp/test_cron_none.json"):
import os
if os.path.exists("/tmp/test_cron_none.json"):
os.unlink("/tmp/test_cron_none.json")
job = create_job(schedule="0 * * * *", prompt="test")
assert job["model"] is None
assert job["provider"] is None
os.unlink("/tmp/test_cron_none.json")