feat: add comprehensive framework features and deployment improvements

Major additions:
- Storage abstraction layer with filesystem and in-memory implementations
- Gitea API integration with MCP tools for repository management
- Console dialog mode with interactive command execution
- WireGuard VPN DNS fix implementation and documentation
- HTTP client streaming response support
- Router generic result type
- Parameter type validator for framework core

Framework enhancements:
- Console command registry improvements
- Console dialog components
- Method signature analyzer updates
- Route mapper refinements
- MCP server and tool mapper updates
- Queue job chain and dependency commands
- Discovery tokenizer improvements

Infrastructure:
- Deployment architecture documentation
- Ansible playbook updates for WireGuard client regeneration
- Production environment configuration updates
- Docker Compose local configuration updates
- Remove obsolete docker-compose.yml (replaced by environment-specific configs)

Documentation:
- PERMISSIONS.md for access control guidelines
- WireGuard DNS fix implementation details
- Console dialog mode usage guide
- Deployment architecture overview

Testing:
- Multi-purpose attribute tests
- Gitea Actions integration tests (typed and untyped)
This commit is contained in:
2025-11-04 20:39:48 +01:00
parent 700fe8118b
commit 3ed2685e74
80 changed files with 9891 additions and 850 deletions

View File

@@ -92,8 +92,9 @@ final readonly class JobChainCommands
foreach ($status['job_statuses'] as $jobStatus) {
$canExecute = $jobStatus['can_execute'] ? '✅' : '⏳';
$depStatus = "{$jobStatus['dependencies_satisfied']}/{$jobStatus['dependencies_total']} deps";
$position = $jobStatus['position'] + 1;
echo " {$canExecute} Job {$jobStatus['position'] + 1}: {$jobStatus['job_id']} ({$depStatus})\n";
echo " {$canExecute} Job {$position}: {$jobStatus['job_id']} ({$depStatus})\n";
}
} catch (\Exception $e) {
@@ -167,7 +168,8 @@ final readonly class JobChainCommands
echo "🔗 {$statusIcon} {$chain['name']} ({$chain['chain_id']})\n";
echo " Status: {$chain['status']}\n";
echo " Mode: {$chain['execution_mode']}\n";
echo " Position: {$chain['job_position'] + 1}/{$chain['total_jobs']}\n";
$position = $chain['job_position'] + 1;
echo " Position: {$position}/{$chain['total_jobs']}\n";
if ($chain['next_job_after_current']) {
echo " Next job: {$chain['next_job_after_current']}\n";

View File

@@ -192,11 +192,12 @@ final readonly class JobDependencyCommands
foreach ($health['issues'] as $issue) {
echo " - {$issue['type']}: ";
match($issue['type']) {
'stalled_chain' => echo "Chain {$issue['chain_id']} running for {$issue['hours_running']} hours\n",
'many_unsatisfied_dependencies' => echo "Job {$issue['job_id']} has {$issue['unsatisfied_count']} unsatisfied dependencies\n",
default => echo "Unknown issue\n"
$message = match($issue['type']) {
'stalled_chain' => "Chain {$issue['chain_id']} running for {$issue['hours_running']} hours\n",
'many_unsatisfied_dependencies' => "Job {$issue['job_id']} has {$issue['unsatisfied_count']} unsatisfied dependencies\n",
default => "Unknown issue\n"
};
echo $message;
}
}
}