149 lines
6.3 KiB
Python
149 lines
6.3 KiB
Python
from __future__ import annotations
|
|
|
|
import argparse
|
|
import json
|
|
from pathlib import Path
|
|
from typing import Any
|
|
|
|
|
|
def read_json(path: Path) -> dict[str, Any]:
|
|
if not path.exists():
|
|
return {}
|
|
return json.loads(path.read_text(encoding="utf-8"))
|
|
|
|
|
|
def artifact_status(path: Path) -> dict[str, Any]:
|
|
data = read_json(path)
|
|
return {
|
|
"path": str(path),
|
|
"exists": path.exists(),
|
|
"schema": data.get("schema"),
|
|
"status": data.get("status"),
|
|
"counts": data.get("counts") or {},
|
|
}
|
|
|
|
|
|
def build_status(root: Path) -> dict[str, Any]:
|
|
registry = read_json(root / "plugins/1c/metadata/moxel-schema-registry.json")
|
|
verification = read_json(root / "reports/1c-template-baselines/moxel-schema-registry-verification.json")
|
|
pipeline = read_json(root / "reports/1c-template-baselines/moxel-discovery-pipeline.json")
|
|
next_action = read_json(root / "reports/1c-template-baselines/moxel-next-action.json")
|
|
next_action_check = read_json(root / "reports/1c-template-baselines/moxel-next-action-check.json")
|
|
|
|
registry_counts = registry.get("counts") or {}
|
|
action = next_action.get("action") if isinstance(next_action.get("action"), dict) else {}
|
|
blockers = []
|
|
if int(registry_counts.get("candidate_read") or 0) > 0:
|
|
blockers.append("candidate_read rules remain; run the planned named-range/property experiments.")
|
|
if int(registry_counts.get("write_enabled") or 0) == 0:
|
|
blockers.append("MOXCEL write is intentionally disabled until disposable-base round-trip evidence exists.")
|
|
if next_action_check.get("status") not in {"ok", None}:
|
|
blockers.append("next action check is failing.")
|
|
if pipeline.get("status") not in {"ok", None}:
|
|
blockers.append("last MOXCEL discovery pipeline did not finish cleanly.")
|
|
|
|
return {
|
|
"schema": "codex_1c_moxel_status.v1",
|
|
"status": "ok" if pipeline.get("status") == "ok" and next_action_check.get("status") == "ok" else "partial",
|
|
"registry": {
|
|
"counts": registry_counts,
|
|
"verified_read_targets": [
|
|
rule.get("target")
|
|
for rule in registry.get("rules") or []
|
|
if isinstance(rule, dict) and rule.get("read_status") == "verified_read"
|
|
],
|
|
"candidate_read_targets": [
|
|
rule.get("target")
|
|
for rule in registry.get("rules") or []
|
|
if isinstance(rule, dict) and rule.get("read_status") == "candidate_read"
|
|
],
|
|
},
|
|
"pipeline": {
|
|
"status": pipeline.get("status"),
|
|
"steps": [
|
|
{"name": step.get("name"), "status": step.get("status")}
|
|
for step in pipeline.get("steps") or []
|
|
if isinstance(step, dict)
|
|
],
|
|
},
|
|
"verification": {
|
|
"status": verification.get("status"),
|
|
"counts": verification.get("counts") or {},
|
|
},
|
|
"next_action": {
|
|
"status": next_action.get("status"),
|
|
"id": action.get("id"),
|
|
"target": action.get("target"),
|
|
"manual_action": action.get("manual_action"),
|
|
"command": action.get("capture_command_with_pipeline"),
|
|
"check_status": next_action_check.get("status"),
|
|
},
|
|
"blockers": blockers,
|
|
"artifacts": {
|
|
"registry": artifact_status(root / "plugins/1c/metadata/moxel-schema-registry.json"),
|
|
"verification": artifact_status(root / "reports/1c-template-baselines/moxel-schema-registry-verification.json"),
|
|
"pipeline": artifact_status(root / "reports/1c-template-baselines/moxel-discovery-pipeline.json"),
|
|
"next_action": artifact_status(root / "reports/1c-template-baselines/moxel-next-action.json"),
|
|
"next_action_check": artifact_status(root / "reports/1c-template-baselines/moxel-next-action-check.json"),
|
|
},
|
|
}
|
|
|
|
|
|
def render_markdown(status: dict[str, Any]) -> str:
|
|
registry = status.get("registry") or {}
|
|
counts = registry.get("counts") or {}
|
|
next_action = status.get("next_action") or {}
|
|
lines = ["# 1C MOXCEL Status", ""]
|
|
lines.append(f"- Status: `{status.get('status')}`")
|
|
lines.append(f"- Rules: `{counts.get('rules')}`")
|
|
lines.append(f"- Verified read: `{counts.get('verified_read')}`")
|
|
lines.append(f"- Candidate read: `{counts.get('candidate_read')}`")
|
|
lines.append(f"- Write enabled: `{counts.get('write_enabled')}`")
|
|
lines.append(f"- Next action: `{next_action.get('id')}`")
|
|
lines.append("")
|
|
lines.append("## Next Action")
|
|
lines.append("")
|
|
lines.append(str(next_action.get("manual_action") or ""))
|
|
if next_action.get("command"):
|
|
lines.append("")
|
|
lines.append("```powershell")
|
|
lines.append(str(next_action.get("command")))
|
|
lines.append("```")
|
|
lines.append("")
|
|
lines.append("## Blockers")
|
|
lines.append("")
|
|
for blocker in status.get("blockers") or []:
|
|
lines.append(f"- {blocker}")
|
|
if not status.get("blockers"):
|
|
lines.append("- none")
|
|
lines.append("")
|
|
return "\n".join(lines)
|
|
|
|
|
|
def resolve_output_path(root: Path, value: str) -> Path:
|
|
path = Path(value)
|
|
return path if path.is_absolute() else root / path
|
|
|
|
|
|
def main() -> int:
|
|
parser = argparse.ArgumentParser(description="Summarize the 1C MOXCEL discovery/registry status.")
|
|
parser.add_argument("--root", type=Path, default=Path(__file__).resolve().parents[1])
|
|
parser.add_argument("--output-json", default="reports/1c-template-baselines/moxel-status.json")
|
|
parser.add_argument("--output-markdown", default="reports/1c-template-baselines/moxel-status.md")
|
|
args = parser.parse_args()
|
|
|
|
root = args.root.resolve()
|
|
status = build_status(root)
|
|
json_path = resolve_output_path(root, args.output_json)
|
|
md_path = resolve_output_path(root, args.output_markdown)
|
|
json_path.parent.mkdir(parents=True, exist_ok=True)
|
|
md_path.parent.mkdir(parents=True, exist_ok=True)
|
|
json_path.write_text(json.dumps(status, ensure_ascii=False, indent=2), encoding="utf-8")
|
|
md_path.write_text(render_markdown(status), encoding="utf-8")
|
|
print(json.dumps({"status": status["status"], "json": str(json_path), "markdown": str(md_path)}, ensure_ascii=False, indent=2))
|
|
return 0 if status["status"] in {"ok", "partial"} else 1
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|