mirror of
https://github.com/headroomlabs-ai/headroom.git
synced 2026-08-10 14:27:00 -04:00
`.gitattributes` declares `*.py text eol=lf` and `*.sh text eol=lf`, but 74 files (73 .py, 1 .sh) are stored in the index with CRLF line endings, violating that contract. Every macOS/Linux clone reports these files as "modified" on fresh checkout because git's diff engine sees the stored bytes don't match the attribute contract, even though the working tree and index match byte-for-byte. Running `git add --renormalize .` rewrites each affected blob so the stored form matches the attribute declaration. No semantic changes — every affected file's diff is "N insertions, N deletions" with inserts and deletes being the same lines modulo line endings. Follow-up commit adds `.git-blame-ignore-revs` so `git blame` / GitHub blame skip this mechanical commit. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
55 lines
2.1 KiB
Python
55 lines
2.1 KiB
Python
from __future__ import annotations
|
|
|
|
import json
|
|
from pathlib import Path
|
|
|
|
REPO_ROOT = Path(__file__).resolve().parents[1]
|
|
|
|
|
|
def _load_json(relative_path: str) -> object:
|
|
return json.loads((REPO_ROOT / relative_path).read_text(encoding="utf-8"))
|
|
|
|
|
|
def test_marketplace_manifests_match() -> None:
|
|
assert _load_json(".claude-plugin/marketplace.json") == _load_json(
|
|
".github/plugin/marketplace.json"
|
|
)
|
|
|
|
|
|
def test_plugin_manifests_share_core_metadata() -> None:
|
|
claude = _load_json("plugins/headroom-agent-hooks/.claude-plugin/plugin.json")
|
|
copilot = _load_json("plugins/headroom-agent-hooks/.github/plugin/plugin.json")
|
|
assert isinstance(claude, dict)
|
|
assert isinstance(copilot, dict)
|
|
for key in ("name", "version", "description", "author", "homepage", "repository", "keywords"):
|
|
assert claude[key] == copilot[key]
|
|
assert "hooks" not in claude
|
|
assert copilot["hooks"] == "./hooks"
|
|
|
|
|
|
def test_marketplace_entry_points_to_plugin_root() -> None:
|
|
marketplace = _load_json(".claude-plugin/marketplace.json")
|
|
assert isinstance(marketplace, dict)
|
|
plugins = marketplace["plugins"]
|
|
assert isinstance(plugins, list)
|
|
plugin = plugins[0]
|
|
assert plugin["name"] == "headroom"
|
|
plugin_root = (REPO_ROOT / plugin["source"]).resolve()
|
|
assert plugin_root.is_dir()
|
|
assert (plugin_root / ".claude-plugin" / "plugin.json").is_file()
|
|
assert (plugin_root / "hooks" / "hooks.json").is_file()
|
|
|
|
|
|
def test_plugin_metadata_points_to_upstream_repo() -> None:
|
|
expected_repo = "https://github.com/chopratejas/headroom"
|
|
marketplace = _load_json(".claude-plugin/marketplace.json")
|
|
claude = _load_json("plugins/headroom-agent-hooks/.claude-plugin/plugin.json")
|
|
assert isinstance(marketplace, dict)
|
|
assert isinstance(claude, dict)
|
|
plugin = marketplace["plugins"][0]
|
|
assert plugin["author"]["url"] == expected_repo
|
|
assert plugin["homepage"] == expected_repo
|
|
assert plugin["repository"] == expected_repo
|
|
assert claude["author"]["url"] == expected_repo
|
|
assert claude["homepage"] == expected_repo
|
|
assert claude["repository"] == expected_repo
|