diff --git a/.cursor/branding-guidelines.md b/.cursor/branding-guidelines.md
new file mode 100644
index 0000000..f92e51f
--- /dev/null
+++ b/.cursor/branding-guidelines.md
@@ -0,0 +1,242 @@
+# Phony Branding Guidelines
+
+This document defines the **final, approved brand identity** for **Phony** — a PHP developer tool orchestrator. It explains *what Phony is*, *why it is called Phony*, and *how the brand must be represented* visually and verbally.
+
+This is the **single source of truth** for branding decisions.
+
+---
+
+## Brand Overview
+
+| Attribute | Value |
+|----------------|-----------------------------|
+| **Name** | Phony |
+| **Package** | `wayofdev/phony` |
+| **Namespace** | `WayOfDev\\Phony` |
+| **Binary** | `phony` |
+| **Repository** | `github.com/wayofdev/phony` |
+
+---
+
+## Brand Rationale: Why “Phony”?
+
+The name **Phony** is intentionally ironic.
+
+At first glance, Phony looks like a single CLI tool. In reality, it is an **orchestrator** — a facade that coordinates multiple best-in-class PHP quality tools behind one simple interface.
+
+In this sense, Phony is *“phony”* in the same way many software abstractions are:
+
+> it presents a simplified surface while hiding real complexity underneath.
+
+This deliberate illusion is a **feature, not a flaw**.
+
+Phony does not replace existing tools —
+it *pretends* to be one tool so developers don’t have to think about many.
+
+This mirrors familiar software concepts:
+
+* Facade pattern
+* Adapter
+* Proxy
+* Unified interface over complex systems
+
+The name rewards curiosity: once understood, it feels *earned*.
+
+---
+
+## Brand Mantra
+
+> **One stable. One command. Trusted PHP quality.**
+
+Alternative internal phrasing (not for logo use):
+
+* *A friendly facade over serious tooling*
+* *Simple on the surface. Powerful underneath.*
+
+---
+
+## Mental Model (ASCII)
+
+This is how Phony should be understood architecturally and conceptually:
+
+```text
+┌──────────────┐
+│ phony │ ← one command, one interface
+└──────┬───────┘
+ │
+ ▼
+┌──────────────────────────────┐
+│ linters • formatters • SAST │
+│ analyzers • custom checks │
+│ best-in-class PHP tools │
+└──────────────────────────────┘
+```
+
+Phony is the **stable master**, not the horse.
+
+---
+
+## Mascot (FINAL)
+
+### Concept
+
+**Illustrated / plush elephant–pony hybrid** inspired by the official PHP **elePHPant** mascot.
+
+* Elephant head → PHP heritage
+* Pony body → speed, elegance, agility
+* Hybrid → intentional abstraction
+
+This mascot is **not realistic**. It is friendly, symbolic, and recognizably PHP-native.
+
+### Anatomy
+
+* **Head:** Elephant-like, short rounded trunk, big friendly eyes, round ears
+* **Body:** Compact pony body, plush proportions
+* **Pose:** One front hoof slightly raised (confidence + friendliness)
+* **Mane & Tail:** Flowing, stylized, adds motion
+
+---
+
+## Color Palette (FINAL)
+
+| Usage | Hex |
+|-----------------|-----------------------------|
+| Primary body | `#777BB4` (PHP purple-blue) |
+| Body shading | darker purple tones |
+| Mane & tail | `#CD853F` → `#DAA520` |
+| Eyes | `#FFFFFF` + dark pupils |
+| Text (light UI) | `#333333` |
+| Text (dark UI) | `#E6EDF3` |
+
+---
+
+## Logo System
+
+### Composition
+
+* Mascot on the **left**
+* Wordmark **“Phony”** on the right
+* Optional tagline below
+
+### Geometry Rule (MANDATORY)
+
+The tagline must align **exactly under the left edge of the “P”** in “Phony”.
+
+```text
+P h o n y
+|
+Your PHP quality stable
+```
+
+No centering by eye. This is a hard alignment rule.
+
+---
+
+## Tagline
+
+**Primary tagline:**
+
+> **Your PHP quality stable**
+
+Meaning:
+
+* *Stable (noun)* — a collection of tools
+* *Stable (adjective)* — reliable, trustworthy quality
+
+The tagline is **optional** and only used in full logo variants.
+
+---
+
+## Theme Variants (GitHub)
+
+Two official variants are required.
+
+### Light Theme
+
+* Optimized for white backgrounds
+* Tagline text: dark gray (`#333333`) or deep purple-gray
+
+### Dark Theme
+
+* Optimized for GitHub dark (`#0d1117`)
+* Tagline text: near-white (`#E6EDF3`)
+* Purple tones slightly brightened for contrast
+
+No glow, no background fills.
+
+---
+
+## Canonical Logo Generation Prompt (LOCKED)
+
+```text
+Create a high-quality illustrated mascot logo for a PHP developer CLI tool named “Phony”
+(PHP + Pony = Phony). Output with a fully transparent background (alpha).
+
+Mascot (left):
+- Cute elephant–pony hybrid inspired by the PHP elePHPant plush style
+- Elephant head, short rounded trunk, big friendly eyes, round ears
+- Compact pony body, plush proportions, one front hoof slightly raised
+- Flowing mane and tail with motion
+
+Colors:
+- Body: PHP purple-blue (#777BB4) with darker purple shading
+- Mane & tail: warm chestnut / amber (#CD853F to #DAA520)
+- Eyes: white with dark pupils and highlight
+
+Wordmark (right):
+- Text: “Phony”
+- Bold modern developer-friendly typography
+- Two-tone: “Ph” in purple, “ony” in warm chestnut/orange
+
+Tagline (optional second line):
+- “Your PHP quality stable”
+- MUST align exactly under the left edge of the “P” in “Phony”
+
+Composition:
+- Mascot left, wordmark right, tagline below
+- Transparent background only
+- Crisp edges suitable for SVG redraw
+```
+
+---
+
+## Asset Naming Convention
+
+```text
+assets/
+├── logo.svg
+├── logo.gh-light-mode-only.svg
+├── logo.gh-dark-mode-only.svg
+├── logo-icon.svg
+├── logo-icon-512.png
+├── favicon.ico
+└── social-preview.png
+```
+
+---
+
+## README.md Structure (Recommended)
+
+The README should reinforce the brand narrative:
+
+1. **Logo (auto light/dark switch)**
+2. **One-sentence value proposition**
+3. **Short explanation of “phony” (facade metaphor)**
+4. **What Phony does / does not do**
+5. **Quick start**
+6. **Tool ecosystem (what it orchestrates)**
+7. **Configuration philosophy**
+8. **Contributing & design principles**
+
+---
+
+## Brand Positioning Summary
+
+Phony is:
+
+* Friendly, not corporate
+* Honest about abstraction
+* PHP-native, not generic
+* Simple on the surface, serious underneath
+
+> **Phony is a deliberate illusion — built to make PHP quality boringly reliable.**
diff --git a/.github/workflows/coding-standards.yml b/.github/workflows/coding-standards.yml
index 464ecf3..d2cbe34 100644
--- a/.github/workflows/coding-standards.yml
+++ b/.github/workflows/coding-standards.yml
@@ -122,7 +122,7 @@ jobs:
uses: wayofdev/gh-actions/actions/phive/install@v3.3.0
with:
phive-home: '.phive'
- trust-gpg-keys: '0xC00543248C87FB13,0x033E5F8D801A2F8D'
+ trust-gpg-keys: '0xC00543248C87FB13,0x033E5F8D801A2F8D,0x2DF45277AEF09A2F'
- name: 🔍 Run ergebnis/composer-normalize
run: .phive/composer-normalize --ansi --dry-run
diff --git a/.github/workflows/dependency-analysis.yml b/.github/workflows/dependency-analysis.yml
index ba3fced..99ca086 100644
--- a/.github/workflows/dependency-analysis.yml
+++ b/.github/workflows/dependency-analysis.yml
@@ -77,7 +77,7 @@ jobs:
uses: wayofdev/gh-actions/actions/phive/install@v3.3.0
with:
phive-home: '.phive'
- trust-gpg-keys: 0xC00543248C87FB13,0x033E5F8D801A2F8D
+ trust-gpg-keys: 0xC00543248C87FB13,0x033E5F8D801A2F8D,0x2DF45277AEF09A2F
- name: 🔬 Run maglnet/composer-require-checker
run: .phive/composer-require-checker check --ansi --config-file="$(pwd)/composer-require-checker.json" --verbose
diff --git a/.phive/phars.xml b/.phive/phars.xml
index 3292c57..478e07d 100644
--- a/.phive/phars.xml
+++ b/.phive/phars.xml
@@ -2,4 +2,5 @@
-
+
diff --git a/assets/logo.png b/assets/logo.png new file mode 100644 index 0000000..20207c5 Binary files /dev/null and b/assets/logo.png differ diff --git a/bin/phony b/bin/phony new file mode 100644 index 0000000..3576688 --- /dev/null +++ b/bin/phony @@ -0,0 +1,29 @@ +#!/usr/bin/env php +run(); diff --git a/box.json b/box.json new file mode 100644 index 0000000..2a2a0b7 --- /dev/null +++ b/box.json @@ -0,0 +1,43 @@ +{ + "$schema": "https://raw.githubusercontent.com/box-project/box/main/res/schema.json", + "alias": "phony.phar", + "compactors": [ + "KevinGH\\Box\\Compactor\\Php" + ], + "compression": "GZ", + "directories": [ + "src" + ], + "files": [ + "bin/phony", + "LICENSE.md", + "composer.json", + "composer.lock" + ], + "finder": [ + { + "name": "*.php", + "exclude": [ + "Tests", + "tests", + "test", + "spec" + ], + "in": "vendor" + }, + { + "name": "*", + "in": "vendor/symfony/console/Resources" + }, + { + "name": "*.json", + "in": "vendor/ergebnis/composer-normalize/resource" + }, + { + "name": "*.json", + "in": "vendor/maglnet/composer-require-checker/data" + } + ], + "replacement-sigil": "@", + "output": ".build/phar/phony.phar" +} diff --git a/composer.json b/composer.json index 3c288e9..9b4d42c 100644 --- a/composer.json +++ b/composer.json @@ -42,6 +42,8 @@ "vimeo/psalm": "^6.14", "wayofdev/cs-fixer-config": "^1.5" }, + "minimum-stability": "dev", + "prefer-stable": true, "autoload": { "psr-4": { "WayOfDev\\Phony\\": "src/" @@ -52,6 +54,9 @@ "WayOfDev\\Tests\\": "tests/src/" } }, + "bin": [ + "bin/phony" + ], "config": { "allow-plugins": { "ergebnis/composer-normalize": true, diff --git a/composer.lock b/composer.lock index 231a83c..ef02d83 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "e46a810aad6954c1b3305c8fae728085", + "content-hash": "1a9928b209081be2ccc0cf8619f59155", "packages": [ { "name": "azjezz/psl", @@ -942,16 +942,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.92.3", + "version": "v3.92.4", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "2ba8f5a60f6f42fb65758cfb3768434fa2d1c7e8" + "reference": "9e7488b19403423e02e8403cc1eb596baf4673b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/2ba8f5a60f6f42fb65758cfb3768434fa2d1c7e8", - "reference": "2ba8f5a60f6f42fb65758cfb3768434fa2d1c7e8", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/9e7488b19403423e02e8403cc1eb596baf4673b0", + "reference": "9e7488b19403423e02e8403cc1eb596baf4673b0", "shasum": "" }, "require": { @@ -983,17 +983,17 @@ }, "require-dev": { "facile-it/paraunit": "^1.3.1 || ^2.7", - "infection/infection": "^0.31.0", - "justinrainbow/json-schema": "^6.5", - "keradus/cli-executor": "^2.2", + "infection/infection": "^0.31", + "justinrainbow/json-schema": "^6.6", + "keradus/cli-executor": "^2.3", "mikey179/vfsstream": "^1.6.12", "php-coveralls/php-coveralls": "^2.9", "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.6", "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.6", - "phpunit/phpunit": "^9.6.25 || ^10.5.53 || ^11.5.34", + "phpunit/phpunit": "^9.6.31 || ^10.5.60 || ^11.5.46", "symfony/polyfill-php85": "^1.33", - "symfony/var-dumper": "^5.4.48 || ^6.4.24 || ^7.3.2 || ^8.0", - "symfony/yaml": "^5.4.45 || ^6.4.24 || ^7.3.2 || ^8.0" + "symfony/var-dumper": "^5.4.48 || ^6.4.26 || ^7.4.0 || ^8.0", + "symfony/yaml": "^5.4.45 || ^6.4.30 || ^7.4.1 || ^8.0" }, "suggest": { "ext-dom": "For handling output formats in XML", @@ -1034,7 +1034,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.92.3" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.92.4" }, "funding": [ { @@ -1042,7 +1042,7 @@ "type": "github" } ], - "time": "2025-12-18T10:45:02+00:00" + "time": "2026-01-04T00:38:52+00:00" }, { "name": "justinrainbow/json-schema", @@ -6085,16 +6085,16 @@ }, { "name": "pestphp/pest", - "version": "v4.3.0", + "version": "v4.3.1", "source": { "type": "git", "url": "https://github.com/pestphp/pest.git", - "reference": "e86bec3e68f1874c112ca782fb9db1333f3fe7ab" + "reference": "bc57a84e77afd4544ff9643a6858f68d05aeab96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest/zipball/e86bec3e68f1874c112ca782fb9db1333f3fe7ab", - "reference": "e86bec3e68f1874c112ca782fb9db1333f3fe7ab", + "url": "https://api.github.com/repos/pestphp/pest/zipball/bc57a84e77afd4544ff9643a6858f68d05aeab96", + "reference": "bc57a84e77afd4544ff9643a6858f68d05aeab96", "shasum": "" }, "require": { @@ -6107,7 +6107,7 @@ "pestphp/pest-plugin-profanity": "^4.2.1", "php": "^8.3.0", "phpunit/phpunit": "^12.5.4", - "symfony/process": "^7.4.0|^8.0.0" + "symfony/process": "^7.4.3|^8.0.0" }, "conflict": { "filp/whoops": "<2.18.3", @@ -6185,7 +6185,7 @@ ], "support": { "issues": "https://github.com/pestphp/pest/issues", - "source": "https://github.com/pestphp/pest/tree/v4.3.0" + "source": "https://github.com/pestphp/pest/tree/v4.3.1" }, "funding": [ { @@ -6197,7 +6197,7 @@ "type": "github" } ], - "time": "2025-12-30T19:48:33+00:00" + "time": "2026-01-04T16:29:59+00:00" }, { "name": "pestphp/pest-plugin", @@ -7886,12 +7886,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "5ba14c800ff89c74333c22d56ca1c1f35c424805" + "reference": "ebc5572f219ad85f60f20fcff71b98b5055c4f8e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/5ba14c800ff89c74333c22d56ca1c1f35c424805", - "reference": "5ba14c800ff89c74333c22d56ca1c1f35c424805", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/ebc5572f219ad85f60f20fcff71b98b5055c4f8e", + "reference": "ebc5572f219ad85f60f20fcff71b98b5055c4f8e", "shasum": "" }, "conflict": { @@ -8024,10 +8024,11 @@ "contao/core-bundle": "<4.13.57|>=5,<5.3.42|>=5.4,<5.6.5", "contao/listing-bundle": ">=3,<=3.5.30|>=4,<4.4.8", "contao/managed-edition": "<=1.5", + "coreshop/core-shop": "<=4.1.7", "corveda/phpsandbox": "<1.3.5", "cosenary/instagram": "<=2.3", "couleurcitron/tarteaucitron-wp": "<0.3", - "craftcms/cms": "<=4.16.5|>=5,<=5.8.6", + "craftcms/cms": "<=4.16.16|>=5,<=5.8.20", "croogo/croogo": "<=4.0.7", "cuyz/valinor": "<0.12", "czim/file-handling": "<1.5|>=2,<2.3", @@ -8532,7 +8533,7 @@ "rap2hpoutre/laravel-log-viewer": "<0.13", "react/http": ">=0.7,<1.9", "really-simple-plugins/complianz-gdpr": "<6.4.2", - "redaxo/source": "<5.20.1", + "redaxo/source": "<=5.20.1", "remdex/livehelperchat": "<4.29", "renolit/reint-downloadmanager": "<4.0.2|>=5,<5.0.1", "reportico-web/reportico": "<=8.1", @@ -8885,7 +8886,7 @@ "type": "tidelift" } ], - "time": "2026-01-02T22:05:49+00:00" + "time": "2026-01-07T20:06:51+00:00" }, { "name": "sanmai/di-container", @@ -10635,16 +10636,16 @@ }, { "name": "webmozart/assert", - "version": "2.0.0", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "1b34b004e35a164bc5bb6ebd33c844b2d8069a54" + "reference": "b01be90dceff69c88c7b36c30ee45c9fd9107f7f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/1b34b004e35a164bc5bb6ebd33c844b2d8069a54", - "reference": "1b34b004e35a164bc5bb6ebd33c844b2d8069a54", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/b01be90dceff69c88c7b36c30ee45c9fd9107f7f", + "reference": "b01be90dceff69c88c7b36c30ee45c9fd9107f7f", "shasum": "" }, "require": { @@ -10691,17 +10692,17 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/2.0.0" + "source": "https://github.com/webmozarts/assert/tree/2.1.1" }, - "time": "2025-12-16T21:36:00+00:00" + "time": "2026-01-07T17:26:38+00:00" } ], "aliases": [], - "minimum-stability": "stable", + "minimum-stability": "dev", "stability-flags": { "roave/security-advisories": 20 }, - "prefer-stable": false, + "prefer-stable": true, "prefer-lowest": false, "platform": { "php": "^8.3",