IssueTriage can now interact with task in YouTrack and it is idempotent

This commit is contained in:
2026-09-20 20:56:36 +03:00
parent 74577cb50e
commit f25d9a5fab
34 changed files with 1834 additions and 201 deletions
+49
View File
@@ -0,0 +1,49 @@
import hashlib
from dataclasses import dataclass, field
from typing import Optional
from contracts.ProjectContext import ProjectContext
@dataclass
class IssueContext:
issue_id: str
title: str
body: str
acceptance_criteria: str | None
comments: list[dict]
labels: list[str] = field(default_factory=list)
repo: Optional[str] = None
metadata: dict = field(default_factory=dict)
images: list[str] = field(default_factory=list)
project: ProjectContext | None = None
def body_hash(self) -> str:
h = hashlib.sha256()
h.update(self.title.encode())
h.update(self.body.encode())
h.update((self.acceptance_criteria or "").encode())
return h.hexdigest()[:8]
def to_prompt_text(self) -> str:
parts = [f"# Issue {self.issue_id}: {self.title}", "", self.body]
if self.project:
parts.append("\n## Project info")
parts.append(self.project.to_prompt_text())
meta_lines = []
for key in ("state", "url"):
if self.metadata.get(key):
meta_lines.append(f"- {key.capitalize()}: {self.metadata[key]}")
if meta_lines:
parts.append("\n## Issue Metadata")
parts.extend(meta_lines)
if self.comments:
parts.append("\n## Discussion / Comments")
for c in self.comments:
parts.append(f"- @{c['author']} ({c['created_at']}): {c['body']}")
return "\n".join(parts)