CodeIgniter4 (Agent Skills)

GitHub

Agent skills, system prompts, and AI developer rules for codeigniter4/CodeIgniter4

0 stars Code 2 Rule Files Full Docs MCP View JSON API

AGENTS.md

# CodeIgniter 4 — Repository Guidelines

CodeIgniter 4 is a mature open-source PHP framework. Framework production
code lives in `system/`; its tests mirror that structure under
`tests/system/`.

## Before making changes

Consult the relevant sections of:

- `contributing/pull_request.md`
- `contributing/internals.md`
- `contributing/styleguide.md`
- `tests/README.md`

Follow existing code and tests in the affected component. Search for an
existing implementation before introducing a new abstraction or convention.

## Target branch and compatibility policy

Compatibility is judged against the pull request's base branch, not the
contributor's source or feature branch. When the base branch is unknown,
apply the stricter `develop` policy.

### Base branch `develop`

`develop` is the next patch-release line. Intentional backward-incompatible
changes are not allowed.

- Preserve public and protected APIs, documented behavior, configuration
  defaults, generated project files, exceptions, and observable side effects.
- Do not remove deprecated items or change public/protected signatures,
  visibility, or interface/abstract requirements.
- A bug or security fix may correct faulty behavior but must preserve the
  documented contract and ordinary valid usage.
- If a fix necessarily breaks compatibility, target the appropriate minor
  branch instead.

### Base branch `4.*`

Minor-release lines (for example `4.9`). Small, deliberate compatibility
breaks may be accepted when they materially improve the framework or
complete the documented deprecation lifecycle.

- Keep each break narrow, explicit, and justified; never an incidental
  side effect of refactoring.
- Deprecated APIs may be removed no earlier than the second subsequent
  minor release (deprecated in 4.6.x means removable in 4.8.0), with a
  supported replacement.
- Every accepted break needs tests for the new behavior, a minor-version
  changelog entry, and migration instructions in the upgrading guide.

### All base branches

- Production code must run on PHP 8.2. Do not require a newer PHP version,
  even when a newer version is installed locally.
- Signatures, properties, constants, default values, exceptions, side
  effects, configuration, and generated project files are all
  compatibility-sensitive.
- Major-scale redesigns and ecosystem-wide migration requirements belong in
  a major release, not a patch or minor release.
- Prefer the minimum useful abstraction and keep framework components as
  independent as practical.
- Dependencies should be injectable. When a framework service is used as a
  default, preserve the ability for applications to replace it.
- Do not add or update a Composer dependency unless the task explicitly
  requires it and the change is justified.
- Do not modify code in `system/ThirdParty/`.

## Coding standards

- Do not add `declare(strict_types=1)` mechanically. Follow nearby code and
  check the `DeclareStrictTypesRector` exclusions in `rector.php`; PHP files
  use strict types unless excluded there. Treat the existing exclusions as
  intentional compatibility constraints. Do not remove an exclusion without
  dedicated justification and tests.
- Every new class property must have a native type declaration. Use the
  most precise type supported by PHP 8.2; use `mixed` only when the
  property intentionally accepts unrelated types.
- Do not add or change a type on an existing public or protected property
  mechanically. Property types affect inheritance and must follow the
  target-branch compatibility policy.
- Add PHPDoc only when it contributes information that native types cannot
  express. Do not duplicate a parent or interface docblock.
- Never suppress a static-analysis error or update a baseline to make a
  check pass.

## FrankenPHP Worker Mode

In Worker Mode one process serves many requests. The entry point's source
template is `system/Commands/Worker/Views/frankenphp-worker.php.tpl`; the
`worker:install` command publishes it as `public/frankenphp-worker.php`.

- For every change affecting application bootstrap, request handling,
  response sending, shutdown, superglobals, sessions, database or cache
  connections, services, factories, events, toolbar state, static state, or
  other request-lifecycle behavior, inspect the worker entry-point template
  even when it is not part of the diff.
- Compare traditional per-process execution with worker execution, where
  the framework boots once and handles multiple requests in the same
  process.
- Classify mutable state as process-lifetime, intentionally persistent, or
  request-specific. Request-specific state must be refreshed or reset for
  every request and must not leak into the next request.
- Preserve the ordering requirements between per-request reconnection,
  framework reset, superglobal refresh, application execution, and
  post-request cleanup.
- Treat the template as the source of truth. Do not edit a generated
  `public/frankenphp-worker.php` in place.
- When a release changes the template in a way existing installations must
  receive, add an upgrading instruction telling Worker Mode users to
  republish it with `php spark worker:install --force`.

## Tests

- Every bug fix should include a regression test that fails without the
  fix.
- Test failure paths, exceptions, boundary conditions, and state cleanup,
  not only the happy path.
- Prefer strict and dedicated PHPUnit assertions as described in the
  project style guide.
- Do not weaken or remove an existing test unless the documented behavior
  or specification changed.

## Documentation

- Public API, behavior, message, or default-value changes may require an
  update to the user guide and changelog.
- Changes requiring user action, including configuration changes, may also
  require an upgrading-guide entry.
- For a `4.*` target, every intentional compatibility break must be
  documented in both the minor-version changelog and its upgrading guide.

## Focused validation

GitHub Actions is the authoritative source for full validation. Do not
reproduce the complete CI matrix locally.

- Run only the narrowest PHPUnit test file or component that covers a code
  change, for example
  `vendor/bin/phpunit tests/system/<Component>/<Class>Test.php`.
- Run a file-scoped analysis or formatting check only when it is quick and
  directly relevant.
- Do not run the complete PHPUnit suite, `composer phpstan:check`,
  `composer cs`, Psalm, Structarmed, or a repository-wide Rector analysis
  by default.
- Report which focused checks were executed and which validation was left
  to CI.