winter/storm
Winter Storm is the Laravel-based core library behind Winter CMS, providing the module and plugin system, backend scaffolding, and shared helpers that power the platform. Use it to build or extend Winter CMS applications on a familiar, well-documented foundation.
PathResolver (resolve(), within(), join(), standardize()) — an open_basedir-respecting realpath plus a separator-boundary-safe containment check that already carries a CVE-class fix (GHSA-58fp prefix-collision). The decision: never let a team hand-roll realpath() + str_starts_with() for user-supplied paths. Depend on this, vendor the class, or budget explicit review time for a homegrown equivalent.AGENTS.md search order (Storm → Laravel → Symfony) is a reusable engineering policy, not just documentation. It supports a roadmap item like "consolidate duplicated helper logic and reduce security-relevant drift" without buying a product.winter/storm to composer and build on it." It is "vendor PathResolver + Filesystem with tests and MIT attribution," or "use it because Winter CMS is already the platform."Adopt or borrow when:
PathResolver::within() and resolve() are worth reading even if you never install them.open_basedir respect, and symlink-escape handling as defaults.Look elsewhere when:
Illuminate\Support\Str/Arr/Collection, Illuminate\Filesystem, and Symfony\Component\Finder/Filesystem/Process cover the same table with mainstream documentation, Stack Overflow coverage, and Laravel's release cadence. Storm adds coupling for marginal gain.Http facade (Guzzle) is the answer; Storm's Network module is not a reason to adopt.To executives (one paragraph): Winter Storm is a small MIT-licensed utility library extracted from Winter CMS. Its real value isn't breadth — it's that it contains security-hardened filesystem path handling (traversal, prefix-collision, symlink-escape, open_basedir) plus a written policy that stops engineers and AI coding agents from rewriting those primitives badly. Cost of adoption is low and risk is bounded if we scope it surgically: we vendor the two or three classes we actually need rather than taking a hard dependency on the whole CMS substrate. It is not a strategic platform bet — 51 stars and no standalone downstream consumers means we should assume no external support and pin whatever we take.
To engineering: Use PathResolver::within() for every containment check on a user-supplied path; use resolve() instead of realpath() plus null-checks; use the substitution table (Str/Arr/Collection, Symfony Finder/Process/Filesystem) before writing any regex one-liner, loop, or shell_exec. Respect the layering rule — shared helpers live in the shared layer, not the app and not a feature module. If you add a helper, write the adversarial tests first: ../../etc/passwd, /var/www/secret_other against allowed /var/www/secret, symlink escape, Windows separators. Run the full suite before claiming a change is clean.
Framing to avoid: don't position this as "we should adopt Winter CMS." The pitch is "we should not be writing our own path sanitizers or our own helper utilities in 2025 — here's a hardened reference and a policy for where logic belongs." The code is a citation; the policy is the deliverable. Budget roughly one engineer-week for a spike plus narrow adoption (path/FS helpers only, gated by an upgrade-blocking contract test suite), and require a written justification before going any deeper into Halcyon/Argon or the CMS framework itself.
How can I help you explore Laravel packages today?