메인 콘텐츠로 건너뛰기

시작하며

laravel/pao는 PHP 개발 도구의 출력을 AI 에이전트용으로 최적화하는 패키지입니다. **PAO (PHP Agent-Optimized output)**는 PHPUnit · Pest · Paratest · PHPStan · Laravel Artisan의 장황한 출력을 구조화된 컴팩트한 JSON으로 자동 변환합니다. GitHub Copilot을 포함한 많은 AI 에이전트가 토큰 수 기반의 요금 체계로 이행한 결과, 도구 출력의 삭감은 직접 비용 절감으로 이어지게 되었습니다. PAO는 이 과제를 해결하기 위해 설계되었으며, Laravel 스타터 킷의 기본 의존관계로서 편입될 예정입니다.

왜 중요한가

AI 에이전트가 개발 흐름에 깊이 통합됨에 따라 도구의 출력 토큰 수가 비용과 응답 속도에 직결되게 되었습니다. 테스트 수가 1,000건 있는 프로젝트에서는 PHPUnit의 출력이 수천 행이 되지만, AI 에이전트가 필요로 하는 정보는 “성공 · 실패 · 건수 · 실패 부분”뿐입니다. PAO는 이 정보를 한 자릿수의 JSON 오브젝트로 압축합니다.
  • 테스트 출력: 최대 99.8%의 토큰 삭감
  • PHPStan 출력: 구조화된 JSON으로 필요한 정보만 제공
  • Artisan 출력: ANSI 코드 · 괘선 문자 · 여백 제거로 최대 75% 삭감

설치

PHP 8.3 이상, PHPUnit 12-13 / Pest 4-5 / Paratest / PHPStan / Laravel 12 이상이 대상입니다.
composer require laravel/pao --dev
설치하는 것만으로 동작합니다. PAO는 Composer의 오토로더를 통해 PHPUnit · Pest · Paratest · PHPStan에 자동으로 훅합니다. Laravel 프로젝트에서는 서비스 프로바이더가 자동 감지되고, Artisan의 출력 최적화도 유효해집니다.
PAO는 AI 에이전트 환경을 감지한 경우에만 활성화됩니다. 사람이 터미널에서 직접 실행할 경우는 완전히 무효화되어, 일반 출력이 유지됩니다.

동작하는 AI 에이전트

PAO는 이하의 AI 에이전트를 자동 감지합니다.
에이전트감지 방법
GitHub CopilotCOPILOT_MODEL 등의 환경 변수
Claude CodeCLAUDECODE 또는 CLAUDE_CODE
CursorCURSOR_AGENT
Gemini CLIGEMINI_CLI
Devin/opt/.devin 파일
CodexCODEX_SANDBOX 등의 환경 변수

Before / After

테스트 출력 (PHPUnit / Pest)

1,000건의 테스트 스위트가 다음과 같이 변환됩니다. Before (PAO 없음)
PHPUnit 12.5.14 by Sebastian Bergmann and contributors.

.............................................................   61 / 1002 (  6%)
.............................................................  122 / 1002 ( 12%)
...
..........................                                    1002 / 1002 (100%)

Time: 00:00.321, Memory: 46.50 MB

OK (1002 tests, 1002 assertions)
After (PAO 있음)
{
  "tool": "phpunit",
  "result": "passed",
  "tests": 1002,
  "passed": 1002,
  "duration_ms": 321
}
테스트 수와 관계없이 출력은 항상 일정 크기입니다. 테스트가 실패한 경우에는 파일 경로 · 행 번호 · 실패 메시지가 포함됩니다.

커버리지 등의 플러그인 출력

--coverage--profile 등의 Pest 플러그인의 추가 출력은 ANSI 코드 · 장식을 제거한 후에 raw 배열에 포함됩니다.
{
  "tool": "pest",
  "result": "passed",
  "tests": 1002,
  "passed": 1002,
  "duration_ms": 1520,
  "raw": [
    "Http/Controllers/Controller 100.0%",
    "Models/User 0.0%",
    "Total: 33.3 %"
  ]
}

PHPStan 출력

{
  "tool": "phpstan",
  "result": "failed",
  "errors": 2,
  "error_details": {
    "/app/Http/Controllers/Controller.php": [
      {
        "line": 9,
        "message": "Method Controller::index() should return int but returns string.",
        "identifier": "return.type"
      },
      {
        "line": 14,
        "message": "Call to an undefined method Controller::doesNotExist().",
        "identifier": "method.notFound"
      }
    ]
  }
}

Laravel Artisan 출력

php artisan about 등의 명령 출력에서 ANSI 코드 · 괘선 문자 · 점 구분 · 여백이 제거됩니다. Before (PAO 없음) — 2,111문자
  Environment ................................................................
  Application Name ................................................... Laravel
  Laravel Version ..................................................... 13.3.0
  PHP Version .......................................................... 8.5.4
  Debug Mode ......................................................... ENABLED
After (PAO 있음) — 535문자
 Environment ..
 Application Name .. Laravel
 Laravel Version .. 13.3.0
 PHP Version .. 8.5.4
 Debug Mode .. ENABLED
about · db:show · migrate:status 등의 명령에서 최대 75%의 토큰 삭감을 기대할 수 있습니다.

Laravel 스타터 킷으로의 통합

PAO는 Laravel 스타터 킷의 기본 의존관계로서 편입될 예정입니다. 신규 프로젝트를 만들면 자동으로 설치되어, AI 에이전트를 사용한 개발에서 토큰 비용을 억제한 상태로 바로 시작할 수 있습니다.

정리

laravel/pao는 설치하는 것만으로 동작하고, AI 에이전트 환경에서만 유효해지므로, 기존 개발 워크플로우에 일절 영향을 주지 않습니다. AI 에이전트를 사용한 개발 비용을 낮추고 싶은 모든 PHP · Laravel 프로젝트에서 도입을 검토할 가치가 있는 패키지입니다.

laravel/pao 리포지토리

소스 코드와 최신 지원 도구 · 에이전트 목록은 이곳에서 확인하실 수 있습니다.
마지막 수정일 2026년 7월 13일