The Composer library ships the complete
coisa-error-handler package
under resources/skills/coisa-error-handler, including its MIT license,
references and executable application examples. It supports the library's
^2.4 API and PHP ^7.4 || ^8.0. Earlier API versions are outside that skill
contract. JSON/Whoops/provider routes were published in 2.5.0 and require ^2.5;
the common skill baseline remains ^2.4. Inspect composer show coisa/error-handler and the actual files;
do not upgrade a production dependency just to obtain instructions.
Shipping a skill does not install it in a discovery directory or activate it in
an agent session. Composer's suggest entry installs nothing automatically.
Choose one copy per consumer/host and preserve its source link and license.
Project scope is the default for reviewable team configuration; global scope is
an explicit consumer choice.
llm/skills ^1.15 is optional development tooling and requires PHP 8.2+ with
Composer 2. It does not change this library's PHP 7.4 runtime contract. A consumer
on an earlier PHP can use the manual route below. The library declares
extra.skills.source: resources/skills but does not require or approve the
plugin on the consumer's behalf.
Before installing/enabling the plugin or running its first sync, merge this
configuration into the consumer's skills.json, preserving existing intentional
settings:
{
"target": ".agents/skills",
"aliases": [],
"discovery": false,
"auto-sync": true,
"vendor-sources": false,
"dependencies": {
"composer": {
"trusted": ["coisa/error-handler"],
"trusted-replace": true
}
}
}The allowlist selects this donor; trusted-replace:true replaces implicit
dependency trust. discovery:false restricts discovery and
vendor-sources:false disables dependency-advertised remote sources.
aliases:[] requests no extra host directory links; preserve any intentional
aliases in an existing application. A Claude Code consumer may choose
.claude/skills as its target instead. Check the actual host's configured
discovery directories.
With the consumer's authority to install and execute that project plugin:
composer config allow-plugins.llm/skills true
composer require --dev 'llm/skills:^1.15'
composer skills:showPreserve every unrelated allow-plugins entry. Prepare root approval before
noninteractive installation; a donor cannot grant it. Commit intended application
Composer files/lockfile and skills.json according to the application's policy.
Normal approved install/update operations synchronize the selected installed
donor; no extra post-install hook is needed.
For manual synchronization only, set auto-sync:false before installation:
composer skills:show
composer skills:update coisa/error-handler --dry-run
composer skills:update coisa/error-handlerNaming a donor explicitly selects/trusts it for that run; it does not prove the
unfiltered automatic policy. Composer's
--no-scripts skips
scripts defined in composer.json; plugin event listeners can still run.
With Composer 2.10.3 and llm/skills 1.15.0, automatic copying still ran with that
flag. Use auto-sync:false to disable only this tool's automatic synchronization.
--no-plugins prevents loading all Composer plugins, including unrelated ones.
Inspect both the report and destination bytes.
Treat synchronized copies as donor-managed. Ordinary 1.15 synchronization replaces incoming same-path files, overwriting local edits, while additional local files and files removed upstream remain. Removing the donor or plugin leaves copied skills behind. A missing/moved donor source is not removal of an old installed copy. Keep intentional local guidance in a separately named, consumer-owned skill and review donor/tool version changes.
Preview clean behavior before selecting any cleanup:
composer skills:update --clean --dry-runAn unscoped clean can delete all installed skills in the target, including handwritten packages; noninteractive runs need not prompt. A scoped clean reinstalls selected skills and cannot identify a donor already removed from dependencies. Do not add a blanket clean hook. Inventory, archive the exact stale package outside discovery and inspect the dry run before an authorized cleanup.
Use the complete package from an installed distribution or an inspected immutable repository revision. From the consumer root, for project Codex use:
skill_source="vendor/coisa/error-handler/resources/skills/coisa-error-handler"
skill_target=".agents/skills/coisa-error-handler"
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 guards refuse an existing destination and a dangling symlink. A missing
source calls for inspecting the selected installed version/archive, not creating
an empty placeholder. For explicit global Codex use choose
$HOME/.agents/skills/coisa-error-handler; for Claude Code choose the project's
.claude/skills/coisa-error-handler or its explicit home counterpart. Preserve
configured locations and avoid duplicate copies. Do not symlink into replaceable
Composer vendor/ content.
For an update or removal, move only the selected existing package to a unique backup outside discovery:
skill_backup="$HOME/.agent-skill-backups/coisa-error-handler-$(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"Moving out removes the manual copy from discovery. For an update, review the new source and repeat the guarded copy. For rollback, archive any replacement first and restore the complete saved package to its original path. Never store backups under an agent discovery root. An installer-managed copy can return on the next sync until the application's donor/trust settings change.
Installing a Composer plugin globally is not installing skill files in a host's global discovery root. This guide needs no global plugin or host configuration changes.
Compare the source and copied file inventory, including references, examples and
license. Refresh the agent session and confirm that it discovers the exact public
name coisa-error-handler. Then perform a bounded synthetic integration task and
run the bundled example
against the application's explicit autoloader. File presence, native discovery
and successful task execution are separate observations.
See first-party llm/skills documentation, Composer suggestions and plugin approval for the corresponding tool contracts.