This repository has been archived on 2026-03-09. You can view files and clone it, but cannot push or open issues or pull requests.
php-agentic/Console/Commands/PrManageCommand.php

95 lines
2.6 KiB
PHP
Raw Normal View History

<?php
/*
* Core PHP Framework
*
* Licensed under the European Union Public Licence (EUPL) v1.2.
* See LICENSE file for details.
*/
declare(strict_types=1);
namespace Core\Mod\Agentic\Console\Commands;
use Core\Mod\Agentic\Actions\Forge\ManagePullRequest;
use Core\Mod\Agentic\Services\ForgejoService;
use Illuminate\Console\Command;
class PrManageCommand extends Command
{
protected $signature = 'agentic:pr-manage
{--repos=* : Repos to manage (owner/name format)}
{--dry-run : Show what would be merged}';
protected $description = 'Review and merge ready pull requests on Forgejo repositories';
public function handle(): int
{
$repos = $this->option('repos');
if (empty($repos)) {
$repos = config('agentic.scan_repos', []);
}
$repos = array_filter($repos);
if (empty($repos)) {
$this->warn('No repositories configured. Pass --repos or set AGENTIC_SCAN_REPOS.');
return self::SUCCESS;
}
$isDryRun = (bool) $this->option('dry-run');
$forge = app(ForgejoService::class);
$totalProcessed = 0;
foreach ($repos as $repoSpec) {
$parts = explode('/', $repoSpec, 2);
if (count($parts) !== 2) {
$this->error("Invalid repo format: {$repoSpec} (expected owner/name)");
continue;
}
[$owner, $repo] = $parts;
$this->info("Checking PRs for {$owner}/{$repo}...");
$pullRequests = $forge->listPullRequests($owner, $repo, 'open');
if (empty($pullRequests)) {
$this->line(" No open PRs.");
continue;
}
foreach ($pullRequests as $pr) {
$prNumber = (int) $pr['number'];
$prTitle = (string) ($pr['title'] ?? '');
$totalProcessed++;
if ($isDryRun) {
$this->line(" DRY RUN: Would evaluate PR #{$prNumber}{$prTitle}");
continue;
}
$result = ManagePullRequest::run($owner, $repo, $prNumber);
if ($result['merged']) {
$this->line(" Merged PR #{$prNumber}: {$prTitle}");
} else {
$reason = $result['reason'] ?? 'unknown';
$this->line(" Skipped PR #{$prNumber}: {$prTitle} ({$reason})");
}
}
}
$action = $isDryRun ? 'found' : 'processed';
$this->info("PR management complete: {$totalProcessed} PR(s) {$action}.");
return self::SUCCESS;
}
}