Summary
Implement automatic placeholder replacement directly in acorn-example-package so packages created via composer create-package roots/acorn-example-package ... can be configured immediately with prompts.
This keeps the template readable in-repo and gives users a deterministic post-create configuration step.
Proposed Implementation
1) Entrypoint
- Add root
configure.php as the canonical setup command.
- Intended flow: run after
composer create-package.
2) Inputs
Prompt for (with sensible defaults):
author_name
author_email
vendor_slug
vendor_namespace
package_slug
class_name
package_description
Derived:
command_signature = package_slug
3) Scope (Manifest-Based)
Transform only these files:
composer.json
README.md
src/Example.php
src/Providers/ExampleServiceProvider.php
src/Console/ExampleCommand.php
src/Facades/Example.php
config/example.php
resources/views/example.blade.php
No repo-wide grep/find/replace.
4) Replacement + Rename Rules
Use explicit, context-aware mappings for placeholders and symbols (vendor-name, example-package, VendorName, ExamplePackage, ExampleServiceProvider, etc.) per file.
Deterministic renames:
src/Example.php -> src/{class_name}.php
src/Providers/ExampleServiceProvider.php -> src/Providers/{class_name}ServiceProvider.php
src/Console/ExampleCommand.php -> src/Console/{class_name}Command.php
src/Facades/Example.php -> src/Facades/{class_name}.php
config/example.php -> config/{package_slug}.php
resources/views/example.blade.php -> resources/views/{package_slug}.blade.php
5) composer.json Handling
- Parse/mutate/write as JSON (
json_decode/json_encode) rather than raw text replacement.
- Preserve 2-space indentation on write.
- Update:
name
description
authors[0].name
authors[0].email
- PSR-4 namespace key
extra.acorn.providers
extra.acorn.aliases
6) CLI Behavior
--dry-run (preview only)
--no-interaction (requires explicit args)
- Interactive confirmation before writing
- No automatic
composer install
- No self-delete behavior
7) Smoke Test
Add tests/smoke/configure_smoke.php and composer script:
Test flow:
- Copy template to temp dir
- Run non-interactive configure with fixed inputs
- Assert renamed files exist and originals are gone
- Assert key namespace/class/config/view/command strings are updated
Acceptance Criteria
- One configure run yields consistent namespace/class/file/config/view/command wiring.
composer.json metadata is updated from inputs.
- No blind global replacements.
- Works on macOS/Linux/Windows.
- Smoke test passes via
composer test:configure.
Notes
- This follows the issue direction to keep it in
acorn-example-package first for the create-package flow.
- CLI extraction into Acorn can be a follow-up once the transform logic is proven here.
Summary
Implement automatic placeholder replacement directly in
acorn-example-packageso packages created viacomposer create-package roots/acorn-example-package ...can be configured immediately with prompts.This keeps the template readable in-repo and gives users a deterministic post-create configuration step.
Proposed Implementation
1) Entrypoint
configure.phpas the canonical setup command.composer create-package.2) Inputs
Prompt for (with sensible defaults):
author_nameauthor_emailvendor_slugvendor_namespacepackage_slugclass_namepackage_descriptionDerived:
command_signature = package_slug3) Scope (Manifest-Based)
Transform only these files:
composer.jsonREADME.mdsrc/Example.phpsrc/Providers/ExampleServiceProvider.phpsrc/Console/ExampleCommand.phpsrc/Facades/Example.phpconfig/example.phpresources/views/example.blade.phpNo repo-wide grep/find/replace.
4) Replacement + Rename Rules
Use explicit, context-aware mappings for placeholders and symbols (
vendor-name,example-package,VendorName,ExamplePackage,ExampleServiceProvider, etc.) per file.Deterministic renames:
src/Example.php->src/{class_name}.phpsrc/Providers/ExampleServiceProvider.php->src/Providers/{class_name}ServiceProvider.phpsrc/Console/ExampleCommand.php->src/Console/{class_name}Command.phpsrc/Facades/Example.php->src/Facades/{class_name}.phpconfig/example.php->config/{package_slug}.phpresources/views/example.blade.php->resources/views/{package_slug}.blade.php5) composer.json Handling
json_decode/json_encode) rather than raw text replacement.namedescriptionauthors[0].nameauthors[0].emailextra.acorn.providersextra.acorn.aliases6) CLI Behavior
--dry-run(preview only)--no-interaction(requires explicit args)composer install7) Smoke Test
Add
tests/smoke/configure_smoke.phpand composer script:composer test:configureTest flow:
Acceptance Criteria
composer.jsonmetadata is updated from inputs.composer test:configure.Notes
acorn-example-packagefirst for the create-package flow.