@@ -154,6 +154,27 @@ jobs:
154154 def digest(path: Path) -> str:
155155 return hashlib.sha256(path.read_bytes()).hexdigest()
156156
157+ def rel_site_files(root: Path) -> dict[str, Path]:
158+ site = root / "site"
159+ if not site.exists():
160+ return {}
161+ wanted_files = {"site/package.json", "site/package-lock.json"}
162+ files: dict[str, Path] = {}
163+ for path in sorted(site.rglob("*")):
164+ if not path.is_file():
165+ continue
166+ rel = str(path.relative_to(root)).replace("\\", "/")
167+ if (
168+ rel.startswith("site/src/")
169+ or rel.startswith("site/public/")
170+ or rel in wanted_files
171+ or re.match(r"site/astro\.config\.[cm]?[jt]s$", rel)
172+ ):
173+ if rel.startswith("site/public/v1/") or rel == "site/public/openapi.json":
174+ continue
175+ files[rel] = path
176+ return files
177+
157178 def verified_value(record: dict[str, Any]) -> bool | None:
158179 value = record.get("verified")
159180 return value if isinstance(value, bool) else None
@@ -324,6 +345,37 @@ jobs:
324345 change_lines.append("")
325346 change_lines.append("- No data file changes detected.")
326347
348+ site_lines: list[str] = []
349+ site_lines.append("## Changed site")
350+ site_lines.append("")
351+ head_site = rel_site_files(Path("TechAPI"))
352+ base_site = rel_site_files(Path("TechAPI-main"))
353+ site_added = sorted(set(head_site) - set(base_site))
354+ site_deleted = sorted(set(base_site) - set(head_site))
355+ site_modified = sorted(
356+ key for key in set(head_site) & set(base_site) if digest(head_site[key]) != digest(base_site[key])
357+ )
358+ site_lines.append("| Area | Added | Modified | Deleted |")
359+ site_lines.append("| --- | ---: | ---: | ---: |")
360+ site_lines.append(f"| homepage/site | {len(site_added)} | {len(site_modified)} | {len(site_deleted)} |")
361+ if site_added or site_modified or site_deleted:
362+ def append_site_examples(title: str, keys: list[str], limit: int = 20) -> None:
363+ if not keys:
364+ return
365+ site_lines.append("")
366+ site_lines.append(f"### {title}")
367+ for rel in keys[:limit]:
368+ site_lines.append(f"- `{rel}`")
369+ if len(keys) > limit:
370+ site_lines.append(f"- ... {len(keys) - limit} more")
371+
372+ append_site_examples("Added site files", site_added)
373+ append_site_examples("Modified site files", site_modified)
374+ append_site_examples("Deleted site files", site_deleted)
375+ else:
376+ site_lines.append("")
377+ site_lines.append("- No homepage/site file changes detected.")
378+
327379 change_lines.append("")
328380 change_lines.append("## Heuristic review")
329381 change_lines.append("")
@@ -358,6 +410,7 @@ jobs:
358410 change_lines.append("- Heuristic warnings: none found.")
359411
360412 Path("change-review.md").write_text("\n".join(change_lines) + "\n", encoding="utf-8")
413+ Path("site-change-review.md").write_text("\n".join(site_lines) + "\n", encoding="utf-8")
361414 Path("data-stats.md").write_text("\n".join(stats_lines) + "\n", encoding="utf-8")
362415 PY
363416
@@ -481,6 +534,8 @@ jobs:
481534 echo "| \`cd TechAPI/site && npm ci && npm run build\` | $([ "${{ steps.site_build.outputs.status }}" = "0" ] && echo PASS || echo FAIL) |"
482535 echo
483536 cat change-review.md
537+ echo
538+ cat site-change-review.md
484539 } > change-comment.md
485540
486541 {
0 commit comments