v0.20 alpha skill-driven python core
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
"""Project artifact helpers shared by the Python runtime."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
|
||||
|
||||
REPO_ROOT = Path(__file__).resolve().parents[2]
|
||||
PROJECTS_DIR = REPO_ROOT / "projects"
|
||||
|
||||
|
||||
def resolve_project(project: str | Path) -> Path:
|
||||
p = Path(project)
|
||||
if p.is_dir():
|
||||
return p.resolve()
|
||||
candidate = PROJECTS_DIR / str(project)
|
||||
if candidate.is_dir():
|
||||
return candidate.resolve()
|
||||
raise FileNotFoundError(f"project not found: {project}")
|
||||
|
||||
|
||||
def load_manifest(project_root: Path) -> dict[str, Any]:
|
||||
path = project_root / "manifest.json"
|
||||
if not path.exists():
|
||||
raise FileNotFoundError(f"manifest not found: {path}")
|
||||
return json.loads(path.read_text(encoding="utf-8"))
|
||||
|
||||
|
||||
def write_manifest(project_root: Path, manifest: dict[str, Any]) -> None:
|
||||
path = project_root / "manifest.json"
|
||||
path.write_text(json.dumps(manifest, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
|
||||
|
||||
|
||||
def ensure_phase_dirs(project_root: Path) -> None:
|
||||
for rel in (
|
||||
"phase1",
|
||||
"phase2/drafts",
|
||||
"phase2/evidence",
|
||||
"phase2/packets",
|
||||
"phase3",
|
||||
"phase4",
|
||||
):
|
||||
(project_root / rel).mkdir(parents=True, exist_ok=True)
|
||||
|
||||
Reference in New Issue
Block a user