go-agent/claude/code/skills/php/SKILL.md
Snider 61e01bfdf1 feat: initial go-agent — agentci + jobrunner + plugins marketplace
Consolidates three codebases into a single agent orchestration repo:

- agentci (from go-scm): Clotho dual-run verification, agent config,
  SSH security (sanitisation, secure commands, token masking)
- jobrunner (from go-scm): Poll-dispatch-report pipeline with 7 handlers
  (dispatch, completion, auto-merge, publish draft, dismiss reviews,
  send fix command, tick parent epic)
- plugins marketplace (from agentic/plugins): 27 Claude/Codex/Gemini
  plugins with shared MCP server

All 150+ tests passing across 6 packages.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-02-21 15:47:19 +00:00

2.8 KiB

name description
core-php Use when creating PHP modules, services, or actions in core-* packages.

PHP Framework Patterns

Host UK PHP modules follow strict conventions. Use core php commands.

Module Structure

core-{name}/
├── src/
│   ├── Core/              # Namespace: Core\{Name}
│   │   ├── Boot.php       # Module bootstrap (listens to lifecycle events)
│   │   ├── Actions/       # Single-purpose business logic
│   │   └── Models/        # Eloquent models
│   └── Mod/               # Namespace: Core\Mod\{Name} (optional extensions)
├── resources/views/       # Blade templates
├── routes/                # Route definitions
├── database/migrations/   # Migrations
├── tests/                 # Pest tests
└── composer.json

Boot Class Pattern

<?php

declare(strict_types=1);

namespace Core\{Name};

use Core\Php\Events\WebRoutesRegistering;
use Core\Php\Events\AdminPanelBooting;

class Boot
{
    public static array $listens = [
        WebRoutesRegistering::class => 'onWebRoutes',
        AdminPanelBooting::class => ['onAdmin', 10],  // With priority
    ];

    public function onWebRoutes(WebRoutesRegistering $event): void
    {
        $event->router->middleware('web')->group(__DIR__ . '/../routes/web.php');
    }

    public function onAdmin(AdminPanelBooting $event): void
    {
        $event->panel->resources([...]);
    }
}

Action Pattern

<?php

declare(strict_types=1);

namespace Core\{Name}\Actions;

use Core\Php\Action;

class CreateThing
{
    use Action;

    public function handle(User $user, array $data): Thing
    {
        return Thing::create([
            'user_id' => $user->id,
            ...$data,
        ]);
    }
}

// Usage: CreateThing::run($user, $validated);

Multi-Tenant Models

<?php

declare(strict_types=1);

namespace Core\{Name}\Models;

use Core\Tenant\Concerns\BelongsToWorkspace;
use Illuminate\Database\Eloquent\Model;

class Thing extends Model
{
    use BelongsToWorkspace;  // Auto-scopes queries, sets workspace_id

    protected $fillable = ['name', 'workspace_id'];
}

Commands

Task Command
Run tests core php test
Format core php fmt --fix
Analyse core php analyse
Dev server core php dev
Create migration /core:migrate create <name>
Create migration from model /core:migrate from-model <model>
Run migrations /core:migrate run
Rollback migrations /core:migrate rollback
Refresh migrations /core:migrate fresh
Migration status /core:migrate status

Rules

  • Always declare(strict_types=1);
  • UK English: colour, organisation, centre
  • Type hints on all parameters and returns
  • Pest for tests, not PHPUnit
  • Flux Pro for UI, not vanilla Alpine