feat: transform to agent coordination platform with comprehensive documentation

Transform Issue Facade from a universal CLI tool into an agent coordination platform with comprehensive documentation and enhanced capabilities for autonomous coding agents.

Major Changes:
- Complete README rewrite focusing on agent-driven coordination
- New comprehensive documentation (AGENT_INTEGRATION.md, CLAUDE.md, ROADMAP.md)
- Capability integration setup with CAPABILITY.yaml and integration scripts
- Enhanced Makefile with local development targets for easier workflows

Bug Fixes:
- Fix schema initialization using executescript() for multi-line SQL support
- Disable FTS5 triggers due to compatibility issues (documented for future re-enablement)

Features:
- Enhanced CLI list command with full parameter passthrough
- New examples directory with agent integration patterns
- New comprehensive test suite (test_core_models.py, test_local_backend.py)

Code Quality:
- Remove @cached_property decorators for Label properties (simplification)
- Clean up test organization (removed old test_gitea_integration.py)

This milestone establishes Issue Facade as a production-ready coordination layer for multi-agent software development, with clear integration paths and comprehensive developer documentation.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-17 19:32:37 +01:00
parent 2dfe5130a3
commit 324453bd8d
22 changed files with 6489 additions and 835 deletions

View File

@@ -10,7 +10,6 @@ from dataclasses import dataclass, field
from datetime import datetime, timezone
from enum import Enum
from typing import List, Optional, Dict, Any
from functools import cached_property
class IssueState(Enum):
@@ -88,7 +87,7 @@ class Label:
description: Optional[str] = None
backend_id: Optional[str] = None # Backend-specific ID for sync
@cached_property
@property
def category(self) -> str:
"""Categorize label for efficient filtering."""
if self.name.startswith('priority:'):
@@ -102,12 +101,12 @@ class Label:
else:
return 'other'
@cached_property
@property
def priority(self) -> Optional[Priority]:
"""Extract priority if this is a priority label."""
return Priority.from_label(self.name)
@cached_property
@property
def issue_type(self) -> Optional[IssueType]:
"""Extract issue type if this is a type label."""
return IssueType.from_label(self.name)
@@ -121,7 +120,7 @@ class LabelCategories:
status_labels: List[Label]
other_labels: List[Label]
@cached_property
@property
def priority(self) -> Optional[Priority]:
"""Get the issue priority."""
for label in self.priority_labels:
@@ -129,7 +128,7 @@ class LabelCategories:
return label.priority
return None
@cached_property
@property
def issue_type(self) -> Optional[IssueType]:
"""Get the issue type."""
for label in self.type_labels:
@@ -205,9 +204,9 @@ class Issue:
sync_metadata: Dict[str, Any] = field(default_factory=dict)
# Performance Optimization
_label_categories: Optional[LabelCategories] = field(default=None, init=False)
_label_categories: Optional[LabelCategories] = field(default=None, init=False, repr=False)
@cached_property
@property
def label_categories(self) -> LabelCategories:
"""Efficiently categorize labels with caching."""
if self._label_categories is None:
@@ -227,12 +226,12 @@ class Issue:
else:
other_labels.append(label)
self._label_categories = LabelCategories(
object.__setattr__(self, '_label_categories', LabelCategories(
priority_labels=priority_labels,
type_labels=type_labels,
status_labels=status_labels,
other_labels=other_labels
)
))
return self._label_categories
@property