| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- #!/usr/bin/env python3
- # -*- coding: utf-8 -*-
- import json
- import sys
- from pathlib import Path
- def _ensure_scripts_on_path() -> None:
- scripts_dir = Path(__file__).resolve().parents[1]
- if str(scripts_dir) not in sys.path:
- sys.path.insert(0, str(scripts_dir))
- _ensure_scripts_on_path()
- from validate_plugin_package import validate_package # noqa: E402
- def _write_json(path: Path, payload: dict) -> None:
- path.parent.mkdir(parents=True, exist_ok=True)
- path.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8")
- def _write_minimal_package(root: Path, *, plugin_version: str = "1.2.3", marketplace_version: str = "1.2.3") -> None:
- _write_json(
- root / "webnovel-writer" / ".claude-plugin" / "plugin.json",
- {"name": "webnovel-writer", "version": plugin_version, "description": "desc"},
- )
- _write_json(
- root / ".claude-plugin" / "marketplace.json",
- {
- "plugins": [
- {
- "name": "webnovel-writer",
- "version": marketplace_version,
- "source": "./webnovel-writer",
- }
- ]
- },
- )
- (root / "README.md").write_text(
- "\n".join(
- [
- "# Test",
- "",
- "| 版本 | 说明 |",
- "|------|------|",
- f"| **v{plugin_version} (当前)** | test |",
- "",
- ]
- ),
- encoding="utf-8",
- )
- (root / "webnovel-writer" / "LICENSE").parent.mkdir(parents=True, exist_ok=True)
- (root / "webnovel-writer" / "LICENSE").write_text("license\n", encoding="utf-8")
- skill = root / "webnovel-writer" / "skills" / "demo" / "SKILL.md"
- skill.parent.mkdir(parents=True, exist_ok=True)
- skill.write_text("---\nname: demo\ndescription: demo\n---\n\n# Demo\n", encoding="utf-8")
- agent = root / "webnovel-writer" / "agents" / "demo.md"
- agent.parent.mkdir(parents=True, exist_ok=True)
- agent.write_text("---\nname: demo\ndescription: demo\ntools: Read\n---\n\n# Demo\n", encoding="utf-8")
- def test_validate_plugin_package_passes_minimal_package(tmp_path):
- _write_minimal_package(tmp_path)
- report = validate_package(tmp_path)
- assert report["ok"] is True
- assert report["error_count"] == 0
- def test_validate_plugin_package_accepts_plugin_root(tmp_path):
- _write_minimal_package(tmp_path)
- report = validate_package(tmp_path / "webnovel-writer")
- assert report["ok"] is True
- assert report["error_count"] == 0
- def test_validate_plugin_package_detects_version_mismatch(tmp_path):
- _write_minimal_package(tmp_path, plugin_version="1.2.3", marketplace_version="1.2.4")
- report = validate_package(tmp_path)
- assert report["ok"] is False
- assert any(item["code"] == "version.marketplace" for item in report["issues"])
- def test_validate_plugin_package_detects_missing_skill_frontmatter(tmp_path):
- _write_minimal_package(tmp_path)
- skill = tmp_path / "webnovel-writer" / "skills" / "demo" / "SKILL.md"
- skill.write_text("---\nname: demo\n---\n\n# Demo\n", encoding="utf-8")
- report = validate_package(tmp_path)
- assert report["ok"] is False
- assert any(item["code"] == "skill.frontmatter" for item in report["issues"])
|