All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
2.1.1 - 2026-06-09
- Dependency updates (Renovate); CI now uses org reusable workflows.
- Suppress always-true PHPStan narrowing on the Composer
tryComposerguard.
2.1.0 - 2026-05-12
composer outdated+ direct skills — after Composer’s package table (text mode), lists direct skills whose lock pin lagsgit ls-remoteor local path content; JSON mode keeps package JSON valid and points tocomposer skills:outdated -f json. New commandcomposer skills:outdated(--strictfor CI exit 1).- Semver constraints on GitHub refs —
owner/repo:^1.2or--ref='^1.2'resolves to the highest remote tag matching the constraint (composer/semver+git ls-remote --tags);composer updatere-resolves and refreshescomposer.skills.lockwhilecomposer installkeeps the pinned commit. - Direct skill installation — declare sources under
extra.ai-agent-skills, pin them incomposer.skills.lock, and materialize trees underinstall-dir(defaultvendor/agent-skills/installed/). CLI:composer skillsdispatcher withskills:add,skills:install,skills:update,skills:remove,skills:list(see README,docs/IMPLEMENTATION-DIRECT-SKILLS.md, ADRs 009–012). - Git cache directory — ephemeral clones and worktrees use
cache-dir(defaultvendor/agent-skills/cache). Config keysinstall-dir,sources-dir, andcache-dirplus lock path fields are validated (no.., no absolutes) so installs cannot escape the project root on a tampered lock. - Shared trust store for direct skills — allow/deny uses
extra.ai-agent-skill.allow-skillswith keysdirect:<source>/<skill-name>;composer skills:trust/list-skills/read-skillbehave like package skills. DiscoveredSkillshelper — merges package + direct discovery forlist-skills/read-skill; duplicate names within Composer packages keep the first and print a[NOTE], while a package vs direct name collision now errors (aligned withSkillPlugin/ AGENTS.md generation).FilesystemUtil—0755directory mode, shared recursive tree removal with optional verbose IO diagnostics (replaces duplicatedrmTree/0777usage).
- Direct skills security hardening — reject symlinks when copying and hashing skill trees; validate
composer.skills.lockgit commits as 40-char hex before using them as cache path segments; allow path-sourceurl: "."in the lock; validate clone/tag refs so they cannot start with-(git CLI ambiguity). Note:git checkout -- <rev>is not used because Git treats a lone argument after--as a pathspec, not a revision. - PR review follow-ups — GitHub HTTPS repo URLs may contain dots in the name (regex delimiter fix); strict project-root prefix for stored path sources (no sibling-directory false positives);
skills:outdatedvalidates lockurl/path/install-pathlike install does so a tampered lock cannot drive reads outside the project.
2.0.0 - 2026-05-01
First-run trust default changed from "auto-trust everything" to "deny by default". If you upgrade an existing installation that was implicitly relying on the v0.1.x behaviour where every
type: ai-agent-skillpackage was auto-registered inAGENTS.md, you will now see a one-time prompt asking how to seed the trust map ([n] None / [d] Direct deps only / [a] All). Choose[a]to preserve the previous behaviour. Non-interactive runs (CI) default to[n]with acomposer skills:trust …recovery line per affected package.See #42 and the security review on PR #43 for the rationale.
- PHP 8.5 and Symfony 8.0 support in the test matrix and Composer constraints (
symfony/yaml,symfony/console). - Symfony 7.4 LTS added to the test matrix (replacing 7.2, which no longer receives security updates).
- Composer host matrix — every PHP × Symfony combination is now tested against both Composer 2.2 LTS and 2.9 (the only supported Composer 2.x release lines).
- Lowest declared dependency validation — one extra row resolves with
--prefer-lowest --prefer-stableagainst Composer 2.2 LTS, ensuring documented minimums actually install and pass tests. - Universal skill discovery: any Composer package can now ship skills via
extra.ai-agent-skill, regardless of its declaredtype. Closes #42. - Trust prompt: first-time discovery from a new package prompts the user (
y/n/a/d) before registering its skills. Decisions persist in rootcomposer.jsonunderextra.ai-agent-skill.allow-skillswith glob support, mirroring Composer'sconfig.allow-plugins. - First-run policy prompt for legacy
type: ai-agent-skillpackages:[n] None / [d] Direct deps only / [a] All, defaultn(strict). Non-interactive mode defaults tonwith a per-packagecomposer skills:trust ...recovery hint, so CI never silently auto-trusts dependencies. Replaces the earlier prototype's "auto-seed everything" behavior flagged HIGH by the security review. - Root package is auto-trusted — projects that ship their own
SKILL.mdno longer get prompted to authorize themselves. composer list-skillsnow shows trust state ([allowed]/[pending]/[denied]) per skill and a footer count of pending packages. The command is purely informational and never prompts.composer skills:trust <package>command — allow (composer skills:trust vendor/foo), deny (--deny), or revoke (--revoke) a trust decision without hand-editingcomposer.json. Used as the recovery path for accidental denies and as the canonical fix for non-interactive failures.composer skills:list-trustcommand — read-only inventory of every persisted decision inextra.ai-agent-skill.allow-skills, with[allowed]/[denied]and(exact)/(glob)markers per entry. Companion toskills:trust; never prompts, never mutates.- Trust prompt mirrors Composer's plugin prompt shape (
y/n/a/d/?). The?answer shows per-option help and re-prompts. The prompt also includes an inlinecomposer skills:trust <package>recovery hint so users have an on-screen breadcrumb if they picknby accident. composer read-skillnow shows trust state in the header and warns when reading content from a pending or denied skill (which is not registered inAGENTS.md).SkillTrustManager,PackageProvider,InstalledVersionsProvider,PackageInfo, andTrustDecisionabstractions for testability.
- Composer 2.2 LTS compatibility —
CommandContextTraitnow falls back to the legacygetComposer(false)API on Composer 2.2;tryComposer()was only introduced in Composer 2.3. Detected by the new--prefer-lowestmatrix row.
composer-plugin-apiconstraint changed from^2.1to2.2.*|^2.9— matches the only Composer release lines we test and the only ones that receive upstream support. Composer 2.0/2.1 are out of support; 2.3–2.8 are no longer maintained either.composer/composer(require-dev) constraint changed from^2.1to2.2.*|^2.9for the same reason.SkillDiscoveryno longer filters by packagetype. Legacytype: ai-agent-skillpackages with a rootSKILL.mdcontinue to work unchanged.SkillDiscovery::discoverAllSkills()is now pure — it enumerates every declared skill with atrust_statefield but never prompts. Gating happens at the install/update boundary inSkillPlugin::updateAgentsMd()only.- Non-interactive
composer installnow skips untrusted skill packages with acomposer config --jsonhint instead of registering them silently. - PHPStan level bumped from 8 to 10 (max).
1.1.5 - 2026-04-20
- Dependency updates via Renovate:
step-security/harden-runnerv2.17.0–2.19.0,actions/cachedigest refresh,dependabot/fetch-metadatav3.x,codecov/codecov-actionv6.
1.1.4 - 2026-03-20
- GitHub Actions hardening (#31): SHA-pin all third-party actions and add Dependabot for the
github-actionsecosystem so action updates ship as reviewable PRs rather than floating tags.
- Dependency updates via Renovate:
step-security/harden-runnerv2.15.0–2.16.0,shivammathur/setup-phpdigest refresh,codecov/codecov-actiondigest refresh.
1.1.3 - 2026-02-09
- "Agent Skills" branding and cross-platform compatibility (#10).
- Auto-merge workflow for vetted dependency updates.
- Renovate configuration (#1).
- Pinned GitHub Actions to commit SHAs with explicit per-job permissions (#2).
- PHPUnit upgraded to v13 (#21) — breaking-change adaptations in the test suite.
- Multiple Renovate-driven action and digest updates:
step-security/harden-runnerv2.14.0–2.14.2,actions/checkoutv6.0.2,actions/cachedigest refreshes,dependabot/fetch-metadatav2.5.0.
1.1.2 - 2025-11-26
- Skills Section Clarity: Clarified that project skills supplement Claude Code's built-in Skill tool capabilities
- Changed ambiguous "Only use skills listed" to "For project-specific tasks, only use skills listed"
- Added note explaining native capabilities remain available alongside project skills
- Prevents AI agents from ignoring their built-in skill system
1.1.1 - 2025-11-25
- Working Directory Reminder:
read-skillcommand now displays actionable footer with copy-paste readycdcommand to help AI agents execute scripts from correct directory
- AGENTS.md Instructions: Updated base directory instruction from descriptive to imperative language for clearer guidance
1.1.0 - 2025-11-25
- Symfony 5.4 LTS Support: Extended compatibility to support Symfony 5.4+ (previously 6.0+)
- Now supports: Symfony ^5.4|^6.0|^7.0
- Enables usage in projects still on Symfony 5.4 LTS
- GitHub Actions CI: Comprehensive continuous integration workflow
- Test matrix across PHP 8.2, 8.3, 8.4
- Test matrix across Symfony 5.4, 6.4, 7.1
- Lowest dependencies testing (PHP 8.2 + Symfony 5.4)
- Code quality checks (PHPStan level 8, PHP-CS-Fixer)
- Code coverage reporting with Codecov integration
- Automated testing on every push and pull request
- Library Best Practices: Removed
composer.lockfrom repository- Libraries should not commit lock files
- Added
composer.lockto.gitignore - Ensures proper dependency resolution for consumers
- Installation Documentation: Updated README with accurate Composer 2.2+ plugin authorization requirements
- Added interactive installation prompt example
- Added non-interactive/CI installation instructions
- Documented
allow-pluginsconfiguration requirement
1.0.0 - 2025-11-24
- Automatic Skill Discovery: Discovers all installed packages with type
ai-agent-skill - AGENTS.md Generation: Generates openskills-compatible XML skill registry
- CLI Commands:
composer list-skills- List all available AI agent skills with package infocomposer read-skill <name>- Display full SKILL.md content for a specific skill
- SKILL.md Parsing: Validates and extracts YAML frontmatter following Claude Code specification
- Multiple Skill Support: Packages can provide single or multiple skills via configuration
- Convention Over Configuration: Zero-config setup with
SKILL.mdin package root - Comprehensive Validation:
- Name format validation (kebab-case, max 64 chars)
- Description length validation (max 1024 chars)
- YAML syntax validation
- Required field validation (name, description)
- Edge Case Handling:
- Duplicate skill names (last wins with warning)
- Invalid frontmatter (skip with warning)
- Missing SKILL.md files (skip with warning)
- Malformed YAML (skip with detailed error)
- Configuration Options:
extra.ai-agent-skillfor custom skill paths- Support for single skill (string) or multiple skills (array)
- Base Directory Support: Outputs directory containing SKILL.md for resource path resolution
- Progressive Disclosure: Lightweight XML index, full details on demand
- Atomic File Updates: Safe AGENTS.md updates with temp file + rename
- Content Preservation: Updates only
<skills_system>block, preserves other AGENTS.md content
- Absolute Path Rejection: Blocks absolute paths in
extra.ai-agent-skillconfiguration - Path Traversal Protection: Uses
realpath()to resolve canonical paths - XML Escaping: Properly escapes skill metadata in generated XML