83 lines
2.3 KiB
Python
83 lines
2.3 KiB
Python
#region: Project Context (Phase 2 dataclasses for cruft_elimination_20260627)
|
|
|
|
|
|
@dataclass(frozen=True, slots=True)
|
|
class ProjectMeta:
|
|
name: str = ""
|
|
summary_only: bool = False
|
|
execution_mode: str = "standard"
|
|
|
|
|
|
@dataclass(frozen=True, slots=True)
|
|
class ProjectOutput:
|
|
namespace: str = "project"
|
|
output_dir: str = ""
|
|
|
|
|
|
@dataclass(frozen=True, slots=True)
|
|
class ProjectFiles:
|
|
base_dir: str = ""
|
|
paths: tuple[str, ...] = ()
|
|
|
|
|
|
@dataclass(frozen=True, slots=True)
|
|
class ProjectScreenshots:
|
|
base_dir: str = "."
|
|
paths: tuple[str, ...] = ()
|
|
|
|
|
|
@dataclass(frozen=True, slots=True)
|
|
class ProjectDiscussion:
|
|
roles: tuple[str, ...] = ()
|
|
history: tuple[str, ...] = ()
|
|
|
|
|
|
@dataclass(frozen=True, slots=True)
|
|
class ProjectContext:
|
|
"""Typed return type for project_manager.flat_config().
|
|
Replaces the dict[str, Any] that flat_config() returned.
|
|
Per conductor/tracks/cruft_elimination_20260627/SPEC_CORRECTION_phase_2.md."""
|
|
project: ProjectMeta = field(default_factory=ProjectMeta)
|
|
output: ProjectOutput = field(default_factory=ProjectOutput)
|
|
files: ProjectFiles = field(default_factory=ProjectFiles)
|
|
screenshots: ProjectScreenshots = field(default_factory=ProjectScreenshots)
|
|
context_presets: Metadata = field(default_factory=dict)
|
|
discussion: ProjectDiscussion = field(default_factory=ProjectDiscussion)
|
|
|
|
def to_dict(self) -> Metadata:
|
|
return {
|
|
"project": {
|
|
"name": self.project.name,
|
|
"summary_only": self.project.summary_only,
|
|
"execution_mode": self.project.execution_mode,
|
|
},
|
|
"output": {
|
|
"namespace": self.output.namespace,
|
|
"output_dir": self.output.output_dir,
|
|
},
|
|
"files": {
|
|
"base_dir": self.files.base_dir,
|
|
"paths": list(self.files.paths),
|
|
},
|
|
"screenshots": {
|
|
"base_dir": self.screenshots.base_dir,
|
|
"paths": list(self.screenshots.paths),
|
|
},
|
|
"context_presets": dict(self.context_presets),
|
|
"discussion": {
|
|
"roles": list(self.discussion.roles),
|
|
"history": list(self.discussion.history),
|
|
},
|
|
}
|
|
|
|
def __getitem__(self, key: str) -> Any:
|
|
return self.to_dict()[key]
|
|
|
|
def get(self, key: str, default: Any = None) -> Any:
|
|
return self.to_dict().get(key, default)
|
|
|
|
|
|
EMPTY_PROJECT_CONTEXT: ProjectContext = ProjectContext()
|
|
|
|
|
|
#endregion: Project Context |