CASAN Supply Chain and Provenance / verify-scan-attest (push) Canceled after 0s
CASAN CI Gate / Frontend Tests (H3 gate) (push) Canceled after 0s
CASAN CI Gate / CASAN Security Gate + Vault KMS (H4/H5) (push) Canceled after 0s
CASAN CI Gate / Build & Deploy OKR → /opt/webapps/okr (push) Canceled after 0s
CASAN Harness CI / harness (push) Canceled after 0s
77 lines
2.3 KiB
Python
77 lines
2.3 KiB
Python
#!/usr/bin/env python3
|
|
"""Validate the repository-root CASAN native plugin facades."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
from pathlib import Path
|
|
|
|
|
|
ROOT = Path(__file__).resolve().parents[3]
|
|
VERSION = (ROOT / "VERSION").read_text(encoding="utf-8").strip()
|
|
|
|
|
|
def load_json(relative_path: str) -> dict[str, object]:
|
|
payload = json.loads((ROOT / relative_path).read_text(encoding="utf-8"))
|
|
assert isinstance(payload, dict), relative_path
|
|
return payload
|
|
|
|
|
|
def main() -> None:
|
|
codex = load_json(".codex-plugin/plugin.json")
|
|
assert codex["name"] == "casan"
|
|
assert codex["version"] == VERSION
|
|
assert codex["skills"] == "./skills/"
|
|
assert "hooks" not in codex
|
|
assert codex["license"] == "Proprietary"
|
|
|
|
interface = codex["interface"]
|
|
assert isinstance(interface, dict)
|
|
for field in (
|
|
"displayName",
|
|
"shortDescription",
|
|
"longDescription",
|
|
"developerName",
|
|
"category",
|
|
"capabilities",
|
|
"defaultPrompt",
|
|
):
|
|
assert interface.get(field), field
|
|
|
|
claude = load_json(".claude-plugin/plugin.json")
|
|
assert claude["name"] == "casan"
|
|
assert claude["version"] == VERSION
|
|
assert claude["skills"] == ["./skills/"]
|
|
assert "hooks" not in claude
|
|
|
|
marketplace = load_json(".claude-plugin/marketplace.json")
|
|
plugins = marketplace["plugins"]
|
|
assert isinstance(plugins, list) and len(plugins) == 1
|
|
entry = plugins[0]
|
|
assert isinstance(entry, dict)
|
|
assert entry["name"] == "casan"
|
|
assert entry["source"] == "./"
|
|
assert entry["version"] == VERSION
|
|
|
|
skill = (ROOT / "skills/casan/SKILL.md").read_text(encoding="utf-8")
|
|
assert skill.startswith("---\nname: casan\n")
|
|
assert "description:" in skill
|
|
assert "[TODO:" not in skill
|
|
assert (ROOT / "skills/casan/agents/openai.yaml").is_file()
|
|
|
|
levels = load_json("packaging/levels.json")
|
|
level_map = levels["levels"]
|
|
assert isinstance(level_map, dict)
|
|
core = level_map["core"]
|
|
assert isinstance(core, dict)
|
|
includes = core["includes"]
|
|
assert isinstance(includes, list)
|
|
for required in (".codex-plugin", ".claude-plugin", "skills"):
|
|
assert required in includes, required
|
|
|
|
print(f"NATIVE_PLUGIN_PASS version={VERSION} codex=true claude=true")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|