release: v0.2.0 repository hygiene, CI, and docs sync

Stop tracking personal workflow artifacts at repo root, add CI and MIT
license, align README and agent skills with artifacts/ defaults, and
enable Ruff in dev/CI so releases are verifiable without local-only runs.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
windyboy
2026-06-01 15:32:03 +08:00
co-authored by Claude Sonnet 4.5 Cursor
parent e70bd35498
commit 6f0df5a774
101 changed files with 1451 additions and 653105 deletions
+10 -7
View File
@@ -1,10 +1,11 @@
"""Unit tests for plan generator."""
import json
import pytest
from datetime import datetime, timezone
from pathlib import Path
import pytest
from vlm.config import Config
from vlm.models import (
ExecutionPlan,
@@ -1011,7 +1012,7 @@ def test_save_plan_to_json(config, tmp_path):
def test_load_plan_from_json(config, tmp_path):
"""Test loading execution plan from JSON file."""
from vlm.planner import save_plan, load_plan
from vlm.planner import load_plan, save_plan
# Create and save a plan
video_file = VideoFile(
@@ -1058,7 +1059,7 @@ def test_load_plan_from_json(config, tmp_path):
def test_save_and_load_plan_with_conflicts(config, tmp_path):
"""Test saving and loading plan with conflict information."""
from vlm.planner import save_plan, load_plan
from vlm.planner import load_plan, save_plan
# Set up config with tmp_path as library root
config.library_root = tmp_path
@@ -1102,7 +1103,7 @@ def test_save_and_load_plan_with_conflicts(config, tmp_path):
def test_save_and_load_plan_with_no_op_operations(config, tmp_path):
"""Test saving and loading plan with no-op operations."""
from vlm.planner import save_plan, load_plan
from vlm.planner import load_plan, save_plan
# Create files that will generate no-op operations
files_and_identities = [
@@ -1189,7 +1190,7 @@ def test_save_plan_json_is_human_readable(config, tmp_path):
def test_save_plan_with_multiple_operations(config, tmp_path):
"""Test saving plan with multiple operations of different types."""
from vlm.planner import save_plan, load_plan
from vlm.planner import load_plan, save_plan
files_and_identities = [
# Movie (move)
@@ -1265,8 +1266,9 @@ def test_load_plan_file_not_found(tmp_path):
def test_load_plan_invalid_json(tmp_path):
"""Test loading plan from invalid JSON raises JSONDecodeError."""
from vlm.planner import load_plan
import json
from vlm.planner import load_plan
invalid_json_path = tmp_path / "invalid.json"
with open(invalid_json_path, 'w') as f:
@@ -1278,8 +1280,9 @@ def test_load_plan_invalid_json(tmp_path):
def test_plan_json_includes_all_required_fields(config, tmp_path):
"""Test that saved JSON includes plan_id, created_at, operations, and summary."""
from vlm.planner import save_plan
import json
from vlm.planner import save_plan
video_file = VideoFile(
path=Path("/mnt/nas/videos/movie/Movie.2020.mkv"),