import subprocess import sys import tempfile import unittest from pathlib import Path ROOT = Path(__file__).resolve().parents[1] SCRIPT = ROOT / "scripts" / "plan_progress.py" def run_cli(*args, cwd=None): return subprocess.run( [sys.executable, str(SCRIPT), *args], capture_output=True, text=True, cwd=cwd, ) class PlanProgressCliTests(unittest.TestCase): def test_select_prefers_in_progress(self): with tempfile.TemporaryDirectory() as tmp_dir: root = Path(tmp_dir) plans_dir = root / "docs" / "plans" plans_dir.mkdir(parents=True) (plans_dir / "2026-01-01-old.md").write_text("old", encoding="utf-8") (plans_dir / "2026-01-02-new.md").write_text("new", encoding="utf-8") progress = root / "memory-bank" / "progress.md" progress.parent.mkdir(parents=True) progress.write_text( "[PLAN] docs/plans/2026-01-01-old.md | status=in-progress | date=2026-01-03\n", encoding="utf-8", ) result = run_cli( "select", "-plans", "docs/plans", "-progress", "memory-bank/progress.md", cwd=root, ) self.assertEqual(result.returncode, 0) self.assertEqual(result.stdout.strip(), "docs/plans/2026-01-01-old.md") def test_select_skips_done_and_blocked(self): with tempfile.TemporaryDirectory() as tmp_dir: root = Path(tmp_dir) plans_dir = root / "docs" / "plans" plans_dir.mkdir(parents=True) (plans_dir / "2026-01-01-a.md").write_text("a", encoding="utf-8") (plans_dir / "2026-01-02-b.md").write_text("b", encoding="utf-8") progress = root / "memory-bank" / "progress.md" progress.parent.mkdir(parents=True) progress.write_text( "\n".join( [ "[PLAN] docs/plans/2026-01-02-b.md | status=done | date=2026-01-03", "[PLAN] docs/plans/2026-01-01-a.md | status=blocked | date=2026-01-03", "", ] ), encoding="utf-8", ) result = run_cli( "select", "-plans", "docs/plans", "-progress", "memory-bank/progress.md", cwd=root, ) self.assertNotEqual(result.returncode, 0) self.assertIn("no pending plans", (result.stdout + result.stderr).lower()) def test_record_creates_section(self): with tempfile.TemporaryDirectory() as tmp_dir: root = Path(tmp_dir) progress = root / "memory-bank" / "progress.md" result = run_cli( "record", "-plan", "docs/plans/2026-01-03-demo.md", "-status", "done", "-progress", "memory-bank/progress.md", "-note", "done", cwd=root, ) self.assertEqual(result.returncode, 0) text = progress.read_text(encoding="utf-8") self.assertIn("## Plan 状态记录", text) self.assertIn("status=done", text) if __name__ == "__main__": unittest.main()