Agent skill
The fast-forward-container
skill teaches coding agents how to consume this
library: configuration-backed registration, factories, interface/scalar bindings,
test overrides, source precedence, standalone/delegated autowiring and cache
boundaries. Its portable entrypoint is
resources/skills/fast-forward-container/SKILL.md
;
references, runnable examples and its MIT license travel with it.
Compatibility and prerequisites
The skill supports fast-forward/container ^1.10
, PHP 8.3+ and Composer 2.
Earlier library versions are outside its supported API contract. Its four
examples cover configuration, composition, autowiring and provider resolution.
The agent checks the application's installed versions before applying these
instructions. A global copy does not upgrade dependencies or extend support to
older versions; report a mismatch rather than silently upgrading the application.
composer install
makes the bundled files available under
vendor/fast-forward/container/resources/skills/fast-forward-container
.
The library declares extra.skills.source
as resources/skills
and suggests
llm/skills
as an optional installer. The directory uses the plural
resources
convention, recognized by that tool. Composer alone makes the files
available; the consumer chooses automatic synchronization or an explicit copy.
Keep the complete skill directory so relative resource links remain valid.
Choose an installation scope
Prefer project-local installation
for a team. Record the source
version/reference and review updates with the project's library version.
composer.lock
pins the installed library. With the optional plugin, commit
its configuration and review any changes to committed generated copies. With a
manual or Skills CLI copy, commit the installed skill alongside the application;
those copies do not refresh automatically. Use one installation mechanism for a
given skill so an automatic sync does not overwrite a manually maintained copy.
Use global installation when a developer wants the skill across projects. That copy has an independent update lifecycle and must still inspect each project's Composer version. Avoid duplicate local/global copies with conflicting instructions; agent precedence varies, so keep one effective copy per host.
Discovery paths depend on the agent:
| Agent | Project | Global |
|---|---|---|
| Codex | .agents/skills/
|
~/.agents/skills/
|
| Claude Code | .claude/skills/
|
~/.claude/skills/
|
These are default paths; honor an agent's configured home and current discovery rules. Other Agent Skills-compatible hosts may use different paths. The skill itself has no dependency on a specific agent or discovery adapter.
Automatic project installation with Composer
The optional llm/skills Composer plugin
discovers the library's metadata and copies the complete skill directory into
the consumer project. It is suggested, not required: installing this library
does not install or authorize the plugin. The configuration below uses
llm/skills ^1.15
.
Before installing or enabling the plugin, prepare skills.json
at the
application root so your choices apply to its first automatic sync. For an
existing file, merge the fields below while preserving unrelated settings and
intentional aliases; do not replace the whole configuration with this example:
{
"target": ".agents/skills",
"aliases": [],
"discovery": false,
"auto-sync": true,
"vendor-sources": false,
"dependencies": {
"composer": {
"trusted": ["fast-forward/container"],
"trusted-replace": true
}
}
}
This selects only this library's declared skill without adding the tool's
built-in or direct-dependency trust defaults. A team deliberately trusting all
Fast Forward donor packages may choose fast-forward/*
instead.
vendor-sources: false
disables remote skill sources advertised by dependencies.
aliases: []
makes the default without extra host links explicit; preserve any
intentional aliases already configured in the project. Choose .claude/skills
as the target for a Claude Code-only project; the destination belongs to the
application, not the library.
Then install the tool as a development dependency:
composer require --dev llm/skills:^1.15
composer skills:show
Review and authorize llm/skills
when Composer asks. For non-interactive
installs, merge that specific authorization into the application's existing
composer.json
after approving the plugin:
{
"config": {
"allow-plugins": {
"llm/skills": true
}
}
}
Keep existing plugin authorizations and commit composer.json
,
composer.lock
and skills.json
. Subsequent composer install
and
composer update
runs synchronize accepted skills automatically; no library
script or application hook is needed. --no-plugins
prevents the plugin from
loading. With Composer 2.10.3 and plugin 1.15.0, --no-scripts
alone still
allowed the plugin's automatic sync; do not rely on it to disable this feature.
Set auto-sync
to false
to use only explicit commands:
composer skills:update fast-forward/container --dry-run
composer skills:update fast-forward/container
An explicit package name on that command also grants trust for that run, even
if the package is absent from the configured allowlist. The named command can
discover a skill without metadata; the automatic route above requires declared
metadata because discovery
is disabled.
The plugin copies files and does not prove an agent has loaded the skill. Inspect the result, refresh the agent session and confirm discovery. Installing the Composer tool globally makes its commands available across projects; it does not install this skill into the agent's global directory. Use the explicit global copy or Skills CLI route below when that is the intended scope.
Automatic update and removal limits
An ordinary sync overwrites files supplied by the donor package, including local edits to those same files. Additional local files survive. Treat donor files as managed copies and change their source or choose a separately maintained copy when customization is required.
The default merge does not delete files dropped upstream or skills left behind
by a removed dependency. Removing fast-forward/container
or llm/skills
therefore does not remove an already copied skill. A source path that is missing
or no longer accepted is also not proof that its old copy has disappeared.
The plugin offers cleanup, but scope matters:
composer skills:update --clean --dry-run
An unscoped --clean
can delete every skill directory in the target, including
handwritten ones; non-interactive runs proceed without a confirmation. A scoped
--clean
replaces skills that are still selected for that run and cannot
clean up a removed donor it no longer discovers. Do not add unscoped cleanup to
automatic hooks. For removal, identify the obsolete skill directory, move it to
a fresh backup outside all discovery paths using the copy-management procedure
below, then refresh the agent. Review the dry-run before any broader cleanup.
Copy from the installed library
From the consumer project root, select a source and one destination:
skill_source="vendor/fast-forward/container/resources/skills/fast-forward-container"
skill_target=".agents/skills/fast-forward-container"
# Global Codex alternative:
# skill_target="$HOME/.agents/skills/fast-forward-container"
# For Claude Code use .claude/skills instead.
test -f "$skill_source/SKILL.md" &&
test ! -e "$skill_target" &&
test ! -L "$skill_target" &&
mkdir -p "$(dirname "$skill_target")" &&
cp -R "$skill_source" "$skill_target"
The command refuses an existing destination, including a dangling symlink. If
the source is missing, check the installed library version and package contents
before continuing. Do not create a placeholder SKILL.md
or silently upgrade
production dependencies to install agent instructions.
Inspect the copied entrypoint and resources, then refresh the agent session and
confirm the skill appears in its available skills. For an explicit activation,
ask the agent to use fast-forward-container
to configure the application.
Installation alone does not prove that an agent has loaded the skill.
Update, removal and rollback for a copy
Record the new source version/reference and review the diff before an update.
Move the old package to a fresh backup path outside every skill discovery
directory
, then repeat the guarded copy command. For example, after choosing
the same skill_target
:
skill_backup="$HOME/.agent-skill-backups/fast-forward-container-$(date +%Y%m%d%H%M%S)-$$"
test -d "$skill_target" &&
test ! -L "$skill_target" &&
test ! -e "$skill_backup" &&
test ! -L "$skill_backup" &&
mkdir -p "$(dirname "$skill_backup")" &&
mv "$skill_target" "$skill_backup"
The command requires a real skill directory and refuses an existing backup,
including a dangling symlink. Record the backup path before installing a
replacement. Moving it out also removes a manually installed copy from discovery.
Refresh the agent session. To roll back, archive any replacement to a different
backup path first and move the saved directory back to its original destination.
Keep LICENSE
and all references
with the package; do not archive old copies inside .agents/skills
or
.claude/skills
, where they may remain discoverable.
Assisted installation with Skills CLI
The optional Skills CLI supports both
scopes and agent-specific paths. The commands use skills@1.7.2
, which requires
Node.js 22.20.0+.
Repository-source installation also requires Git. The CLI is a development tool,
not a PHP runtime dependency.
For a bundled source in the current project:
npx --yes skills@1.7.2 add ./vendor/fast-forward/container/resources/skills/fast-forward-container --skill fast-forward-container --agent codex --copy --yes
npx --yes skills@1.7.2 list --agent codex
Add --global
to add
and list
for a global installation. Replace
--agent codex
with --agent claude-code
for Claude Code. The explicit
--copy
avoids symlinks into a vendor directory that Composer may replace.
To pin instructions separately, set SKILL_REF
to a full commit SHA from
the library version used by the project
, then use:
npx --yes skills@1.7.2 add "https://github.com/php-fast-forward/container/tree/$SKILL_REF/resources/skills/fast-forward-container" --skill fast-forward-container --agent codex --copy --yes
Record that SHA with the application. A branch name can move. To update a pinned
installation, repeat add
with the newly reviewed source/revision and inspect
the resulting diff. An unqualified update-to-latest is not the same as a pinned
upgrade. Commit project copies and any lockfile generated by the CLI.
Remove only this skill with:
npx --yes skills@1.7.2 remove fast-forward-container --agent codex --yes
# For the global installation:
npx --yes skills@1.7.2 remove fast-forward-container --agent codex --global --yes
Other Composer tooling
netresearch/composer-agent-skill-plugin
can discover library-provided metadata or explicitly configured direct sources,
manage trust and generate an AGENTS.md
index. This is a useful option for teams
already choosing that workflow, but it executes as a Composer plugin and changes
project instruction files. It is not required by this library and no automatic
registration hook is enabled here.
Version 2.1.1 requires PHP 8.4, so it does not cover the full PHP 8.3 range supported here. If a project adopts it separately, review its version, allow-plugins/trust policy and generated-instruction ownership.