Problem
dev-tools currently shows the ASCII logo only when the Symfony Application help path is executed (help/list), because the current customization is in DevTools::getHelp().
When users run normal commands, the logo is not shown. If we add output in run()/doRun(), orchestrator commands that execute nested dev-tools commands via process queue (for example dev-tools:standards) end up printing the logo repeatedly.
Proposal
Add a generic mechanism to show the logo at the top-level CLI execution only, while automatically suppressing it in orchestrated child invocations.
Goals
- Show the ASCII header before command output for direct
dev-tools CLI invocations.
- Preserve
list/help behavior and avoid regressions.
- Avoid per-command changes; centralize suppression logic in shared execution/process infrastructure.
- Prevent repeated logo output from orchestrators that spawn nested
dev-tools commands.
Expected Behavior
- Running
vendor/bin/dev-tools <command> prints the logo once before the command output.
- Running orchestrator commands that internally run
vendor/bin/dev-tools <subcommand> should print the logo only for the root process.
- Non-
dev-tools subprocesses should continue unchanged.
Implementation Strategy
- Add a single execution suppression flag read early in
DevTools (for example FAST_FORWARD_DEV_TOOLS_SUPPRESS_LOGO), defaulting to disabled.
- In
DevTools::run() (or doRun() if more appropriate in this stack), print the logo when the process is top-level and not in JSON/noisy-mode-restricted contexts, then delegate to parent execution.
- Make nested
ProcessBuilder instances automatically propagate FAST_FORWARD_DEV_TOOLS_SUPPRESS_LOGO=1 into the environment for all spawned processes, so nested dev-tools commands detect suppression automatically.
- Keep
getHelp() behavior unchanged (or make it explicit that logo is still shown for help list text only if desired).
- Add tests that cover:
- top-level invocation prints logo exactly once;
- nested orchestrator invocation does not print logo in subprocesses;
- command outputs/exit codes remain stable in JSON mode.
Non-goals
- Refactoring orchestrator command logic.
- Adding new process APIs outside command-run centralization.
- Changing output semantics outside CLI startup branding.
Requirements
- Deterministic and predictable logo emission, independent of command name for top-level runs.
- Child
dev-tools invocations launched by process queue must not show duplicate logo lines.
- Existing
list/help output should remain supported and readable.
Acceptance Criteria
Functional Criteria
Architectural / Isolation Criteria
- MUST: The core logic MUST be isolated into dedicated classes or services instead of living inside command or controller entrypoints.
- MUST: Responsibilities MUST be separated across input resolution, domain logic, processing or transformation, and output rendering when the change is non-trivial.
- MUST: The command or controller layer MUST act only as an orchestrator.
- MUST: The implementation MUST avoid tight coupling between core behavior and CLI or framework-specific I/O.
- MUST: The design MUST allow future extraction or reuse with minimal changes.
- MUST: The solution MUST remain extensible without requiring major refactoring for adjacent use cases.
- MUST: Argument and option resolution MUST be validated separately from command execution logic.
- MUST: Console formatting and rendering MUST stay separate from domain processing.
- MUST: Exit behavior, error messaging, and generated output MUST remain deterministic and testable.
Problem
dev-toolscurrently shows the ASCII logo only when the Symfony Application help path is executed (help/list), because the current customization is inDevTools::getHelp().When users run normal commands, the logo is not shown. If we add output in
run()/doRun(), orchestrator commands that execute nesteddev-toolscommands via process queue (for exampledev-tools:standards) end up printing the logo repeatedly.Proposal
Add a generic mechanism to show the logo at the top-level CLI execution only, while automatically suppressing it in orchestrated child invocations.
Goals
dev-toolsCLI invocations.list/helpbehavior and avoid regressions.dev-toolscommands.Expected Behavior
vendor/bin/dev-tools <command>prints the logo once before the command output.vendor/bin/dev-tools <subcommand>should print the logo only for the root process.dev-toolssubprocesses should continue unchanged.Implementation Strategy
DevTools(for exampleFAST_FORWARD_DEV_TOOLS_SUPPRESS_LOGO), defaulting to disabled.DevTools::run()(ordoRun()if more appropriate in this stack), print the logo when the process is top-level and not in JSON/noisy-mode-restricted contexts, then delegate to parent execution.ProcessBuilderinstances automatically propagateFAST_FORWARD_DEV_TOOLS_SUPPRESS_LOGO=1into the environment for all spawned processes, so nesteddev-toolscommands detect suppression automatically.getHelp()behavior unchanged (or make it explicit that logo is still shown for help list text only if desired).Non-goals
Requirements
dev-toolsinvocations launched by process queue must not show duplicate logo lines.list/helpoutput should remain supported and readable.Acceptance Criteria
Functional Criteria
dev-toolscommands do not print the logo in each subprocess call.list/helpoutput remains correct and still includes help text as expected.dev-toolssubprocess behavior remains unchanged.Architectural / Isolation Criteria