Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
242 changes: 242 additions & 0 deletions .cursor/branding-guidelines.md
Original file line number Diff line number Diff line change
@@ -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.**
2 changes: 1 addition & 1 deletion .github/workflows/coding-standards.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/dependency-analysis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
1 change: 1 addition & 0 deletions .phive/phars.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@
<phive xmlns="https://phar.io/phive">
<phar name="composer-normalize" version="^2.48.0" installed="2.48.2" location="./.phive/composer-normalize" copy="false"/>
<phar name="composer-require-checker" version="^4.20.0" installed="4.20.0" location="./.phive/composer-require-checker" copy="false"/>
<phar name="box-project/box" version="^4.6.10" installed="4.6.10" location="./.phive/box" copy="false"/>
</phive>
12 changes: 11 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -177,9 +177,19 @@ update: ## Updates composer dependencies by running composer update command
.PHONY: update

phive: ## Installs dependencies with phive
$(APP_RUNNER) /usr/local/bin/phive install --trust-gpg-keys 0xC00543248C87FB13,0x033E5F8D801A2F8D
$(APP_RUNNER) /usr/local/bin/phive install --trust-gpg-keys 0xC00543248C87FB13,0x033E5F8D801A2F8D,0x2DF45277AEF09A2F
.PHONY: phive

phar: ## Builds the PHAR archive
$(APP_RUNNER) sh -c "git config --global --add safe.directory /app \
&& composer install --no-dev --optimize-autoloader --classmap-authoritative \
&& .phive/box validate \
&& .phive/box compile \
&& .phive/box info .build/phar/phony.phar \
&& .build/phar/phony.phar \
&& composer install"
.PHONY: phar

#
# Code Quality, Git, Linting
# ------------------------------------------------------------------------------------
Expand Down
6 changes: 2 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
<p align="center">
<br>
<a href="https://wayof.dev" target="_blank">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/wayofdev/.github/master/assets/logo.gh-dark-mode-only.png">
<img width="400" src="https://raw.githubusercontent.com/wayofdev/.github/master/assets/logo.gh-light-mode-only.png" alt="WayOfDev Logo">
<source media="(prefers-color-scheme: dark)" srcset="assets/logo.png">
<img width="600" src="assets/logo.png" alt="WayOfDev Logo">
</picture>
</a>
<br>
</p>

<p align="center">
Expand Down
Binary file added assets/logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
29 changes: 29 additions & 0 deletions bin/phony
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#!/usr/bin/env php
<?php

declare(strict_types=1);

use WayOfDev\Phony\Application;

// Find autoloader
$autoloadPaths = [
__DIR__ . '/../vendor/autoload.php',
__DIR__ . '/../../../autoload.php',
];

$autoloadFound = false;
foreach ($autoloadPaths as $autoloadPath) {
if (file_exists($autoloadPath)) {
require $autoloadPath;
$autoloadFound = true;
break;
}
}

if (! $autoloadFound) {
fwrite(STDERR, "Could not find autoloader. Run 'composer install' first.\n");
exit(1);
}

$application = new Application();
$application->run();
43 changes: 43 additions & 0 deletions box.json
Original file line number Diff line number Diff line change
@@ -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"
}
5 changes: 5 additions & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -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/"
Expand All @@ -52,6 +54,9 @@
"WayOfDev\\Tests\\": "tests/src/"
}
},
"bin": [
"bin/phony"
],
"config": {
"allow-plugins": {
"ergebnis/composer-normalize": true,
Expand Down
Loading
Loading