aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/mozart/src/commands
AgeCommit message (Collapse)Author
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-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>
2026-02-22feat(validate): implement --with-dependencies flagnsfisis
Walk vendor/<vendor>/<package>/composer.json files and run the same manifest validations on each dependency, reporting per-package errors and warnings with a summary count. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22feat(update): implement --patch-only, --root-reqs, --bump-after-updatensfisis
- --patch-only: restrict updates to patch-level changes by pinning packages back to locked versions when major.minor differs - --root-reqs: auto-populate update list with root require/require-dev packages when no explicit packages are specified - --bump-after-update: bump composer.json version constraints to match resolved versions after update, with dev/no-dev/all modes Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22feat(audit): display version info in audit outputnsfisis
Use previously stored but unused fields: show installed_version in advisory tables/plain/JSON output, and package version in abandoned package output. Remove unused unlockable_ids field from LockTransaction. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22refactor: reorganize crates to match Composer subpackage structurensfisis
Rename mozart-constraint to mozart-semver (mirrors composer/semver) and extract mozart-class-map-generator from mozart-autoload (mirrors composer/class-map-generator). No logic changes. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22fix(install): fall back to update when composer.lock is missingnsfisis
Match Composer behavior: instead of failing with an error when no composer.lock is present, show a warning and delegate to the update command to resolve dependencies from composer.json. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22fix(resolver): replace __root__ with actual package name in error messagesnsfisis
Composer never shows the internal __root__ identifier to users. Add root_name field to ResolveRequest so the resolver can substitute the real package name (e.g. "laravel/laravel") in pubgrub error reports. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22fix(platform): detect PHP version from runtime instead of hardcoding 8.1nsfisis
PlatformConfig::new() was hardcoded to PHP 8.1 with a fixed extension list, causing resolution failures for packages requiring newer PHP (e.g. Laravel 12 requires >=8.2). Now calls detect_platform() to discover the actual PHP version, extensions and capabilities. Also adds a mutex to composer_home_dir tests to prevent env-var races. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22chore: cargo fmtnsfisis
2026-02-22refactor(http): centralize User-Agent string in mozart-corensfisis
Add mozart_core::http::user_agent() that returns a consistent "Mozart/<version> (<os>; <arch>)" string. Replace all scattered user-agent definitions across mozart-registry and mozart CLI commands. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22chore: remove some of #[ignore] attributesnsfisis
2026-02-22feat(init): add interactive dependency selection via Packagist searchnsfisis
Replace the TODO placeholders with a full interactive search-and-pick loop for both require and require-dev dependencies during `init`. Users can search Packagist, pick packages by number or name, and version constraints are auto-detected from available versions. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22feat(repository): implement repository command with all actionsnsfisis
Extract shared helpers (composer_home, read/write_json_file, add/remove_repository, render_value) from config.rs into config_helpers.rs module. Implement all 7 repository actions: list, add, remove, set-url, get-url, disable, enable with --append/--before/--after positioning support. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22refactor(async): migrate from blocking HTTP to async/await with tokionsfisis
Replace reqwest::blocking with async reqwest across the entire codebase. All command execute functions, registry API calls (packagist, downloader, resolver, lockfile), and the main entry point now use async/await with the tokio runtime. The pubgrub resolver runs on spawn_blocking since its DependencyProvider trait is synchronous, using Handle::block_on for async I/O within that context. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22refactor(workspace): split monolithic crate into 6 workspace cratesnsfisis
Extract modules from the single `mozart` crate into 5 focused library crates to improve compilation parallelism and architectural clarity: - mozart-constraint: version constraint parser (independent) - mozart-core: base types, console, validation, platform utilities - mozart-archiver: archive creation (tar, zip, bzip2) - mozart-registry: Packagist API, cache, resolver, downloader, lockfile - mozart-autoload: autoloader generation and PHP scanner Refactor Console::from_cli and build_cache_config to accept primitive args instead of &Cli to break circular dependencies. Introduce [workspace.dependencies] for centralized version management. Remove 9 unused direct dependencies from the CLI crate. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21feat(completion): add shell completion generation via clap_completensfisis
Add a `completion` subcommand that generates shell completion scripts for Bash, Zsh, Fish, Elvish, and PowerShell using the clap_complete crate. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21feat(console): add structured error handling, verbosity, and suggestionsnsfisis
Implement Phase 7.2 error handling & UX infrastructure: - Add exit_code module with MozartError, bail()/bail_silent() helpers, and Composer-compatible exit code constants (0-5, 100) - Redesign Console struct with Verbosity enum (Quiet/Normal/Verbose/ VeryVerbose/Debug), ANSI auto-detection via IsTerminal, and verbosity-gated output methods (info/verbose/debug/error) - Thread Console through all 33 command execute() signatures - Replace all std::process::exit() calls with structured MozartError returns handled in main() - Migrate eprintln\! status messages to console.info() for quiet-mode suppression - Add suggest module with Levenshtein distance and "Did you mean?" formatting for future package name suggestions Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21feat(self-update): implement command to update Mozart via GitHub Releasesnsfisis
Add full self-update functionality: fetch releases from GitHub API, download platform-specific binaries, atomically replace the running executable using self-replace, and support --rollback and --preview flags. Includes backup management and 12 unit tests. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21feat(archive): implement command to create distributable archivesnsfisis
Add archive command supporting zip, tar, tar.gz, and tar.bz2 formats with .gitattributes export-ignore filtering, composer.json archive.exclude patterns, remote package archiving via Packagist, and self-exclusion to prevent archives from including themselves. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21fix(licenses): handle root license as array and add ANSI color to headernsfisis
composer.json allows license to be either a string or an array. Parse the raw JSON to support both forms, emit license as a proper array in JSON output, and apply console::comment() coloring to the text header. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21feat(global): implement command to run subcommands in global Composer dirnsfisis
Resolves global home from $COMPOSER_HOME, $XDG_CONFIG_HOME, or $HOME/.config/composer, then re-dispatches the given subcommand with --working-dir set to that path. Forwards all global CLI flags and accepts hyphen-prefixed trailing arguments. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21feat(check-platform-reqs): implement command to verify PHP platform requirementsnsfisis
Collects platform requirements (php, ext-*, lib-*, composer-*-api) from lock file, installed.json, and root composer.json, then compares them against the detected PHP environment. Supports text/JSON output and exit codes 0 (pass), 1 (failed), 2 (missing). Extracts shared platform detection into a new platform.rs module, reused by both check-platform-reqs and show --platform. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21fix(licenses): match Composer text output formatnsfisis
Add "Dependencies:" label and remove column headers/separator from text output to align with Composer's licenses command behavior. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21feat(diagnose): implement diagnose command to check system health and ↵nsfisis
connectivity Adds 10 diagnostic checks: Mozart version, HTTPS/HTTP Packagist connectivity, GitHub API, HTTP proxy detection, composer.json validation, composer.lock freshness, git availability/version, disk free space, and cache directory writability. Exit codes: 0=clean, 1=warnings, 2=errors. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21feat(run-script): implement run-script command to execute composer.json scriptsnsfisis
Support shell commands, @php/@composer/@putenv prefixes, script references with circular detection, @additional_args/@no_additional_args, timeout handling, and COMPOSER_DEV_MODE. PHP callbacks are skipped with a warning since Mozart cannot execute PHP class methods. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21feat(audit): implement audit command to check packages for security ↵nsfisis
vulnerabilities Query Packagist security advisories API for known vulnerabilities affecting installed or locked packages, with version constraint matching, severity filtering, abandoned package detection, and multiple output formats (table, plain, json, summary). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21feat(create-project): implement create-project command to scaffold new ↵nsfisis
projects from packages Replaces the todo\!() stub with a full implementation that parses the package argument, resolves the best matching version from Packagist, downloads and extracts the dist archive into a target directory, removes VCS metadata, replaces self.version constraints, and runs dependency resolution and installation via the existing resolver and install infrastructure. Includes version constraint matching (caret, tilde, wildcard, comparison operators) and comprehensive unit tests. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>