Files
2026-07-17 17:45:56 +08:00

59 lines
1.9 KiB
Python

from __future__ import annotations
import json
import subprocess
from pathlib import Path
from .config import AGENT4_ROOT, settings
from .models import SkillStep
from .skillflow import normalize_steps
class SolidWorksExtractor:
def audit_part(self, part_path: str) -> list[SkillStep]:
path = Path(part_path)
if not path.exists():
raise FileNotFoundError(part_path)
output_dir = settings.runtime_dir / "audits" / path.stem
output_dir.mkdir(parents=True, exist_ok=True)
command = [
"dotnet",
"run",
"--project",
str(settings.part_feature_audit_project),
"--",
str(path),
"--output-dir",
str(output_dir),
]
subprocess.run(command, check=True, cwd=str(AGENT4_ROOT))
return self._read_latest_steps(output_dir)
def audit_active_part(self) -> list[SkillStep]:
output_dir = settings.runtime_dir / "audits" / "active-part"
output_dir.mkdir(parents=True, exist_ok=True)
command = [
"dotnet",
"run",
"--project",
str(settings.part_feature_audit_project),
"--",
"--active",
"--output-dir",
str(output_dir),
]
subprocess.run(command, check=True, cwd=str(AGENT4_ROOT))
return self._read_latest_steps(output_dir)
def _read_latest_steps(self, output_dir: Path) -> list[SkillStep]:
candidates = sorted(
list(output_dir.glob("*_modeling_plan.json")) + list(output_dir.glob("*_skill_flow.json")),
key=lambda item: item.stat().st_mtime,
reverse=True,
)
if not candidates:
raise FileNotFoundError(f"No audit JSON generated under {output_dir}")
payload = json.loads(candidates[0].read_text(encoding="utf-8-sig"))
return normalize_steps(payload)