Files
OpenOPC/opc/market/package_format.py
T
2026-07-01 17:56:31 +08:00

101 lines
3.0 KiB
Python

"""OPC Market package format — data models for .opcpkg packages."""
from __future__ import annotations
from dataclasses import dataclass, field
from typing import Any
from pydantic import BaseModel, Field
# ---------------------------------------------------------------------------
# Pydantic models (persisted in YAML / org_config)
# ---------------------------------------------------------------------------
class PackageAuthor(BaseModel):
name: str = ""
github: str = ""
class PackageContents(BaseModel):
roles: int = 0
work_item_templates: int = 0
gates: int = 0
prompts: int = 0
skills: int = 0
class OPCPackageManifest(BaseModel):
"""manifest.yaml schema for an .opcpkg package."""
opc_package: str = "1.0"
id: str
name: str
description: str = ""
version: str = "1.0.0"
author: PackageAuthor = Field(default_factory=PackageAuthor)
license: str = "MIT"
category: str = "general"
tags: list[str] = Field(default_factory=list)
industry: list[str] = Field(default_factory=list)
team_size: str = ""
use_cases: list[str] = Field(default_factory=list)
opc_version: str = ">=0.1.0"
contents: PackageContents = Field(default_factory=PackageContents)
class InstalledPackageInfo(BaseModel):
"""Tracks a package installed into the current org."""
package_id: str
name: str = ""
version: str = "1.0.0"
installed_at: str = ""
source_path: str = ""
role_ids: list[str] = Field(default_factory=list)
template_ids: list[str] = Field(default_factory=list)
work_item_template_ids: list[str] = Field(default_factory=list)
# ---------------------------------------------------------------------------
# Dataclasses (in-memory only, not persisted)
# ---------------------------------------------------------------------------
@dataclass
class OPCPackage:
"""A fully parsed .opcpkg package ready for install."""
manifest: OPCPackageManifest
roles: list[dict[str, Any]] = field(default_factory=list)
work_item_templates: list[dict[str, Any]] = field(default_factory=list)
runtime_policy: dict[str, Any] | None = None
talent_templates: list[dict[str, Any]] = field(default_factory=list)
employees: list[dict[str, Any]] = field(default_factory=list)
prompt_contents: dict[str, str] = field(default_factory=dict)
skill_contents: dict[str, str] = field(default_factory=dict)
readme: str = ""
@dataclass
class SandboxReport:
"""Result of security validation."""
passed: bool = True
warnings: list[str] = field(default_factory=list)
errors: list[str] = field(default_factory=list)
@dataclass
class ConflictReport:
"""Result of conflict detection against current org."""
role_conflicts: list[str] = field(default_factory=list)
template_conflicts: list[str] = field(default_factory=list)
work_item_template_conflicts: list[str] = field(default_factory=list)
@property
def has_conflicts(self) -> bool:
return bool(self.role_conflicts or self.template_conflicts or self.work_item_template_conflicts)