aboutsummaryrefslogtreecommitdiffhomepage
AgeCommit message (Collapse)Author
2026-02-23fix(reinstall): add per-pattern warnings, config autoloader defaults, and ↵nsfisis
COMPOSER_DEV_MODE Emit per-pattern warnings for unmatched package names, read optimize-autoloader/classmap-authoritative/apcu-autoloader from composer.json config section, and set COMPOSER_DEV_MODE env var. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23fix(licenses): add table headers and bordered summary outputnsfisis
Match Composer's Symfony Table formatting: add Name/Version/Licenses header row to text output and use bordered ASCII table for summary. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23fix(init): support COMPOSER_DEFAULT_* env vars and fix abort handlingnsfisis
- Add COMPOSER_DEFAULT_VENDOR env var support for package name default - Swap USERNAME/USER check order to match Composer (matters on Windows) - Add COMPOSER_DEFAULT_AUTHOR/COMPOSER_DEFAULT_EMAIL env var support - Require both name and email for author (Composer behavior) - Use bail_silent for abort to prevent double error message Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23fix(fund): add ANSI color styling and use Console API for outputnsfisis
Style vendor names with <comment> (yellow) and package names with <info> (green) to match Composer's Symfony Console output. Route all output through Console::write_stdout() so --quiet is respected. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23fix(exec): use bail_silent for exit code and style binary listingnsfisis
Replace std::process::exit() with bail_silent() so Rust cleanup runs properly. Style the binary listing output with console_format\! markup to match Composer's Symfony Console styling. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23fix(diagnose): use bail_silent for exit code and add git color.ui checknsfisis
Replace std::process::exit() with bail_silent() so Rust cleanup and Drop handlers run properly on non-zero exit. Add a check for git color.ui=always which is known to cause issues with git output parsing. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23fix(create-project): fix self.version rewriting and autoloader confignsfisis
- Extend self.version replacement to conflict, provide, and replace link types (previously only require and require-dev) - Only rewrite self.version when VCS metadata is actually removed, matching Composer's behavior - Read optimize-autoloader, classmap-authoritative, and apcu-autoloader from the project's composer.json config section instead of hardcoding false Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23fix(completion): auto-detect shell from $SHELL when argument omittednsfisis
Composer auto-detects the shell from the $SHELL environment variable when the shell argument is not provided. Mozart previously required the argument and errored without it. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23fix(clear-cache): add per-directory output, read-only guard, and always exit 0nsfisis
Match Composer's ClearCacheCommand behavior: - Print per-directory status messages (clearing/GC) instead of a single summary - Skip read-only caches with an informational message - Print message for non-existent cache directories instead of silently skipping - Catch filesystem errors and always return exit code 0 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23fix(audit): write human-readable output to stderr to match Composernsfisis
Composer writes advisory and abandoned-package output to stderr, reserving stdout for JSON format only. Mozart was writing everything to stdout, which breaks piping and scripting workflows. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23fix(bump): use exit code 2 for stale lock file to match Composernsfisis
Composer's BumpCommand uses ERROR_LOCK_OUTDATED=2 for stale lock files, but Mozart was using LOCK_FILE_INVALID=4. Define a local constant to avoid conflicting with the global exit code registry. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23fix(status): align output with Composer stderr/stdout separation and add ↵nsfisis
symlink detection - Route headers and hints to stderr, package paths to stdout - Show full install path instead of vendor/<name> (M) - Detect symlinked packages and report instead of diffing - Add verbose hint message when not using -v - Replace std::process::exit(1) with bail_silent for proper cleanup Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23fix(search): match Composer single-line output format with truncationnsfisis
Replace two-line output (name+counts, indented description) with Composer's single-line aligned format: padded name, abandoned warning, and terminal-width-aware description truncation. Remove summary header and download/faver count display from text output. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23fix(remove): wire apcu autoloader flags, add audit-format default, and match ↵nsfisis
output messages - Pass --apcu-autoloader and --apcu-autoloader-prefix through to InstallConfig instead of hardcoding false/None - Set --audit-format default to "summary" matching Composer behavior - Print "./composer.json has been updated" after modification - Print "Running composer update <packages>" before resolution step Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23fix(install): add CLI option validation, download-only wiring, and ↵nsfisis
apcu-prefix implicit enable - Restrict --prefer-install to source/dist/auto and --audit-format to table/plain/json/summary via clap value_parser - Error when --prefer-install is combined with --prefer-source/--prefer-dist - Wire --download-only through InstallConfig to skip autoloader and installed.json - Implicitly enable --apcu-autoloader when --apcu-autoloader-prefix is set - Apply same validation fixes to update, require, remove, create-project commands Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23fix(global): add ~/.composer fallback, XDG auto-detection, and no-arg handlingnsfisis
Rewrite composer_home() with Composer-compatible resolution: detect XDG environment (any XDG_* var or /etc/xdg), prefer existing directories, and fall back to ~/.composer for legacy systems. Consolidate duplicate composer_home_dir() from global.rs into shared config_helpers. Accept no subcommand gracefully with a helpful error instead of a parse error. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23fix(dump-autoload): add config defaults, CLI validation, and class count outputnsfisis
Read optimize-autoloader, classmap-authoritative, apcu-autoloader from composer.json config section. Reject --dev with --no-dev and --strict-psr/ --strict-ambiguous without --optimize. Emit pre/post generation messages with class count in optimized mode. Track ambiguous class mappings and exit with code 2 when --strict-ambiguous detects conflicts. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23fix(depends): prefer installed packages over lockfile and add platform supportnsfisis
Without --locked, prefer vendor/composer/installed.json over composer.lock to match Composer's data source priority. Add platform packages (php, ext-*, lib-*) from detect_platform() so queries like `depends php` work. Show a specific error message when a platform package is not found. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23fix(config): add missing keys, implement --absolute, fix output formatnsfisis
Add 18 missing config keys to config_value_type() including cache-read-only (was in defaults but unmanageable), audit.* dotted keys, and bool-or-enum keys like store-auths and bump-after-update. Implement --absolute flag to resolve *-dir values to absolute paths. Fix render_value() to JSON-encode arrays and use lowercase "null", matching Composer output. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23fix(check-platform-reqs): add informational messages and empty vendor fallbacknsfisis
Emit Composer-compatible stderr messages indicating which source is used (lock file, vendor dir, or fallback). Detect empty installed.json and fall back to the lock file with a warning instead of silently succeeding. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23fix(archive): add format completion, stability suffix parsing, and ↵nsfisis
Composer-compatible output Add value_parser for --format to enable shell completion with valid formats. Parse @stability suffix (e.g. 1.0@beta) from version constraints before resolution. Align output messages with Composer: "Searching for the specified package.", match reporting, and split "Created:" across stderr/stdout. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23fix(browse): use proper URL validation and match Composer's Windows browser ↵nsfisis
launch Replace simple prefix check in is_valid_url with url::Url::parse() for structural validation (e.g. "https://" with no host now correctly rejected). Update Windows open_browser to use `start "web" explorer` matching Composer's HomeCommand behavior. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23feat(init): add SPDX license validation and COMPOSER_DEFAULT_LICENSE supportnsfisis
Validate license input against SPDX identifiers, also accepting "proprietary". Interactive mode re-prompts on invalid input; non-interactive mode exits with an error. Fall back to COMPOSER_DEFAULT_LICENSE env var when no --license flag is given. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23fix(bump): support inline constraints and glob wildcards in package filternsfisis
Strip constraint suffixes (`:^2.0`, `=2.0`, ` ^2.0`) from filter args and replace exact matching with glob pattern matching (`psr/*`) to match Composer's BumpCommand behavior. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22fix(check-platform-reqs): check lib-* and composer-*-api against detected ↵nsfisis
platform Remove hardcoded early-return that always marked lib-*, composer-plugin-api, and composer-runtime-api as Missing. These packages now go through the normal platform lookup, matching Composer's behavior. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22fix(reinstall): exit 1 when no packages match criteriansfisis
Composer returns exit code 1 and writes to stderr when no packages match the reinstall patterns. Mozart was returning 0 with a stdout message, which could mislead CI pipelines into thinking the command succeeded. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22fix(show,outdated): reject multiple level filters at oncensfisis
Composer errors when more than one of --major-only, --minor-only, or --patch-only is specified. Mozart was silently giving --major-only precedence. Now both show and outdated commands validate mutual exclusivity with the same error message as Composer. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22fix(audit): change --abandoned default from "report" to "fail"nsfisis
Composer defaults to "fail" for the --abandoned flag, causing a non-zero exit code when abandoned packages are detected. Mozart was defaulting to "report", which only printed warnings. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22fix(fund): use 4-space JSON indentation to match Composernsfisis
Composer's JsonFile::encode uses JSON_PRETTY_PRINT with 4-space indent. Mozart was using serde_json::to_string_pretty which defaults to 2-space. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22fix(licenses): use 4-space JSON indentation to match Composernsfisis
Composer outputs JSON with 4-space indentation. Mozart was using serde_json::to_string_pretty which defaults to 2-space. Switch to a custom PrettyFormatter with explicit 4-space indent. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22fix(browse): match Composer's error messages, output formatting, and stderr ↵nsfisis
behavior Distinguish "Package not found" from "Invalid or missing repository URL" like Composer's HomeCommand. Add <info> color formatting for --show output, remove the unnecessary "Opening ... in browser" message, and emit a stderr message when no package is specified. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22feat(cli): match Composer's --version output formatnsfisis
Replace clap's built-in --version with custom handler that outputs Composer-compatible version info: Mozart version line, PHP version with binary path, and diagnose hint. Add detect_php_version_and_binary() to mozart-core platform module. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22fix(search): match Composer's --only-vendor and JSON output formatsnsfisis
Deduplicate --only-vendor results to unique vendor names instead of showing full package names. Align JSON output schema with Composer by emitting only name, description, url, and abandoned fields. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22feat(search): display abandoned package indicator in search resultsnsfisis
Parse the `abandoned` field from Packagist search API responses and show a "! Abandoned !" warning inline, matching Composer's behavior. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22refactor(console): add console_format! proc macro and migrate all commandsnsfisis
Introduce a Symfony Console-style tag macro that replaces verbose patterns like `console::info(&format!("text {name}"))` with `console_format!("<info>text {name}</info>")`. Supports all 6 tag types (info, comment, error, question, highlight, warning) with format argument distribution across multiple tagged segments. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22fix(validate): use CamelCase-to-dash name suggestion and propagate ↵nsfisis
dependency exit codes - Replace simple to_lowercase() with sanitize_package_name_component() for uppercase name suggestions (e.g. MyCompany/MyLibrary → my-company/my-library) - Return error/warning counts from validate_dependencies() and merge them into the final exit code, matching Composer behavior Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22fix(suggests): add deduplication and ANSI color outputnsfisis
Deduplicate suggestions by (source, target) pair matching Composer's map-based approach where last reason wins. Add ANSI color formatting using console::info (green) and console::comment (yellow) for package names, suggesters, and the transitive hint message. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22fix(depends): align exit codes and error messages with Composernsfisis
Return exit code 1 when no dependents are found or no packages are installed, matching Composer's behavior. Align error messages: use "Could not find package" and "There is no installed package depending on" phrasing. Write errors to stderr instead of stdout. Apply the same no-install fix to the prohibits command. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22fix(search): validate --only-name/--only-vendor exclusivity and --format valuesnsfisis
Reject simultaneous --only-name and --only-vendor flags with an error, and reject unsupported --format values with exit code 1, matching Composer's input validation behavior. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22fix(bump): align output messages with Composer outputnsfisis
- "Nothing to bump." → "No requirements to update in <path>." - "N constraint(s) bumped successfully." → "<path> has been updated (N changes)." - Dry-run now shows "<path> would be updated with:" followed by " - require.<pkg>: <ver>" per change, matching Composer's format - Also update bump message in update command for consistency Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22fix(licenses): align error messages with Composer outputnsfisis
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22fix(suggests): align output formatting and root package filtering with Composernsfisis
Add blank lines between groups, use 78-dash separator in dual mode, sanitize reason strings by replacing newlines and stripping control characters, and include root package name in direct-deps filter so its suggestions are correctly shown by default. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22fix(clear-cache): enforce 1 GB repo cache size limit during GCnsfisis
Composer caps the repo cache at 1 GB during garbage collection, but Mozart was passing u64::MAX (no limit). Align with Composer behavior. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22fix(about): respect --quiet flag by using console outputnsfisis
Replace direct println\! with console.write_stdout() so the about command honors verbosity settings, matching Composer's behavior. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22fix(bump): return exit code 1 on dry-run with changes and warn when type is ↵nsfisis
absent Match Composer behavior: --dry-run now returns exit code 1 when un-bumped constraints are detected (useful for CI). Also warn when the package type field is missing, since Composer treats it as "library" by default. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22feat(platform): detect lib-* platform packages from PHP environmentnsfisis
Extends the PHP inline script to query constants and functions for 14 library packages (lib-pcre, lib-openssl, lib-curl, lib-libxml, etc.) and parses the new LIB:name:version output format. This fixes SAT resolver failures for packages requiring lib-* constraints like lib-pcre >=7.0. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22fix(resolver): handle virtual packages and deduplicate pool explorationnsfisis
Virtual/meta packages (e.g. "psr/http-client-implementation") don't exist on Packagist and caused a fatal error during transitive dependency exploration. These packages are resolved via provides/replaces from other packages already in the pool, so 404 errors are now skipped. Also fix PoolBuilder::next_pending() repeatedly returning the same virtual package name by tracking explored names in a HashSet, since virtual packages are never added to inputs and the old check (inputs.any(name)) never matched them. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22fix(test): correct install command expectation when no lock file presentnsfisis
The install command succeeds with a warning when no lock file exists, rather than failing with a suggestion to run update.
2026-02-22chore: cargo fmtnsfisis
2026-02-22feat(remove): implement --unused flag to prune orphan packagesnsfisis
Re-resolve dependencies and compare with the current lock file to detect packages that are no longer reachable from root requirements. Removes them from the lock file and re-installs. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>