From dbee9c98c7f76b48e42af1c076ea00bad5f9ab77 Mon Sep 17 00:00:00 2001 From: L Apple Date: Wed, 30 Sep 2026 12:40:38 +0200 Subject: [PATCH 01/24] docs(cli): clarify command and flag help texts Rework the help texts of project ci, dev, validate, fix and format and of extension validate and package so they match what the code does: which code is covered, when files change, and what each flag really does. - Align --only, --exclude, --no-copy, --format and --allow-non-git across the project and extension commands - Add Long descriptions for project validate, fix and format, and for extension validate and package - Fix inaccurate texts, e.g. --overwrite-app-backend-url, --check-against, --force (also blocks on untracked files) and --on-port-conflict (saves the chosen ports) - Remove the project ci pointer to the unreleased deployment commands Help texts that carry deprecation notices are left unchanged. Co-Authored-By: Claude Opus 5.5 --- cmd/extension/extension_fix.go | 6 +++--- cmd/extension/extension_format.go | 4 ++-- cmd/extension/extension_package.go | 21 +++++++++++---------- cmd/extension/extension_validate.go | 15 ++++++++------- cmd/project/ci.go | 12 +++++++----- cmd/project/project_dev.go | 4 ++-- cmd/project/project_fix.go | 5 +++-- cmd/project/project_format.go | 7 ++++--- cmd/project/project_validate.go | 9 +++++---- cmd/project/project_worker.go | 2 +- cmd/root.go | 6 +++--- 11 files changed, 49 insertions(+), 42 deletions(-) diff --git a/cmd/extension/extension_fix.go b/cmd/extension/extension_fix.go index fb313062..3f7b17f6 100644 --- a/cmd/extension/extension_fix.go +++ b/cmd/extension/extension_fix.go @@ -79,7 +79,7 @@ var extensionFixCmd = &cobra.Command{ func init() { extensionRootCmd.AddCommand(extensionFixCmd) - extensionFixCmd.Flags().String("only", "", "Run only specific fixers by name (comma-separated, e.g. eslint,rector)") - extensionFixCmd.Flags().String("exclude", "", "Exclude fixers after applying --only (comma-separated, e.g. eslint,rector)") - extensionFixCmd.Flags().Bool("allow-non-git", false, "Allow running the fix command on non-git repositories") + extensionFixCmd.Flags().String("only", "", "Run only these fixers (comma-separated, e.g. eslint,rector)") + extensionFixCmd.Flags().String("exclude", "", "Skip these fixers; must be in the --only list if set (comma-separated, e.g. eslint,rector)") + extensionFixCmd.Flags().Bool("allow-non-git", false, "Allow fixes to an extension that is not in a Git repository") } diff --git a/cmd/extension/extension_format.go b/cmd/extension/extension_format.go index 079d797a..93d8503e 100644 --- a/cmd/extension/extension_format.go +++ b/cmd/extension/extension_format.go @@ -73,7 +73,7 @@ var extensionFormat = &cobra.Command{ func init() { extensionRootCmd.AddCommand(extensionFormat) - extensionFormat.Flags().String("only", "", "Run only specific formatters by name (comma-separated, e.g. prettier,php-cs-fixer)") - extensionFormat.Flags().String("exclude", "", "Exclude formatters after applying --only (comma-separated, e.g. prettier,php-cs-fixer)") + extensionFormat.Flags().String("only", "", "Run only these formatters (comma-separated, e.g. prettier,php-cs-fixer)") + extensionFormat.Flags().String("exclude", "", "Skip these formatters; must be in the --only list if set (comma-separated, e.g. prettier,php-cs-fixer)") extensionFormat.Flags().Bool("dry-run", false, "Run in dry run mode") } diff --git a/cmd/extension/extension_package.go b/cmd/extension/extension_package.go index 6e958a39..cf147193 100644 --- a/cmd/extension/extension_package.go +++ b/cmd/extension/extension_package.go @@ -25,8 +25,9 @@ var ( ) var extensionPackageCmd = &cobra.Command{ - Use: "package path [branch]", + Use: "package [path] [branch]", Short: "Build a distributable extension ZIP", + Long: "Build a ZIP of an extension. By default, files come from a clean Git checkout of the current tag or branch, so uncommitted changes are not included; use --disable-git to package the working copy. The build runs in a temporary folder and leaves the extension folder unchanged. The ZIP is named -.zip unless --filename is set.", Aliases: []string{"zip"}, Args: cobra.RangeArgs(1, 2), RunE: func(cmd *cobra.Command, args []string) error { @@ -228,17 +229,17 @@ var extensionPackageCmd = &cobra.Command{ func init() { extensionRootCmd.AddCommand(extensionPackageCmd) - extensionPackageCmd.Flags().BoolVar(&disableGit, "disable-git", false, "Package the working copy instead of a clean git checkout (symlinks are skipped)") - extensionPackageCmd.Flags().BoolVar(&extensionReleaseMode, "release", false, "Prepare a release build (generate the changelog, remove app secrets)") - extensionPackageCmd.Flags().String("overwrite-app-backend-url", "", "Change all URLs in manifest.xml to this URL") - extensionPackageCmd.Flags().String("overwrite-app-backend-secret", "", "Change the secret to this value") - extensionPackageCmd.Flags().String("overwrite-version", "", "Change the extension version to this value") - extensionPackageCmd.Flags().Bool("use-git-tag-as-version", false, "Use the detected git tag as the extension version") + extensionPackageCmd.Flags().BoolVar(&disableGit, "disable-git", false, "Package the working copy instead of a clean Git checkout (symlinks are skipped)") + extensionPackageCmd.Flags().BoolVar(&extensionReleaseMode, "release", false, "Prepare a release build: generate the changelog if enabled and, for apps, remove the secret from manifest.xml") + extensionPackageCmd.Flags().String("overwrite-app-backend-url", "", "Replace the scheme and host of the app backend URLs in manifest.xml (apps only)") + extensionPackageCmd.Flags().String("overwrite-app-backend-secret", "", "Set the app secret in manifest.xml (apps only)") + extensionPackageCmd.Flags().String("overwrite-version", "", "Set the extension version in the package") + extensionPackageCmd.Flags().Bool("use-git-tag-as-version", false, "Use the Git tag (without a leading v) as the extension version") extensionPackageCmd.MarkFlagsMutuallyExclusive("use-git-tag-as-version", "disable-git") extensionPackageCmd.MarkFlagsMutuallyExclusive("use-git-tag-as-version", "overwrite-version") - extensionPackageCmd.Flags().String("output-directory", "", "Output directory for the zip file") - extensionPackageCmd.Flags().String("git-commit", "", "Commit hash or tag to package (defaults to the current tag or branch)") - extensionPackageCmd.Flags().String("filename", "", "Name of the zip file, generated from the extension name and tag when not set") + extensionPackageCmd.Flags().String("output-directory", "", "Directory for the ZIP file (created if missing)") + extensionPackageCmd.Flags().String("git-commit", "", "Git commit, tag, or branch to package (default: the current tag or branch)") + extensionPackageCmd.Flags().String("filename", "", "Name of the ZIP file (default: -.zip)") } func getStringOnStringError(val string, _ error) string { diff --git a/cmd/extension/extension_validate.go b/cmd/extension/extension_validate.go index e6821480..73529eb9 100644 --- a/cmd/extension/extension_validate.go +++ b/cmd/extension/extension_validate.go @@ -19,8 +19,9 @@ import ( ) var extensionValidateCmd = &cobra.Command{ - Use: "validate path", + Use: "validate [path]", Short: "Validate extension metadata, assets, and code quality", + Long: "Validate an extension folder or ZIP file. By default, it runs the built-in checks and external tools such as PHPStan and ESLint; use --only or --exclude to choose. Folders are checked on a temporary copy unless --no-copy is passed. With --store-compliance (or SHOPWARE_CLI_STORE_COMPLIANCE=1), the Store's rules apply and the extension's validation.ignore list is not used.", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { isFull, _ := cmd.Flags().GetBool("full") @@ -186,13 +187,13 @@ func extensionValidationFormat(cmd *cobra.Command) (string, error) { func init() { extensionRootCmd.AddCommand(extensionValidateCmd) extensionValidateCmd.PersistentFlags().Bool("full", false, "Run all validation checks by default (minus --exclude selections)") - extensionValidateCmd.PersistentFlags().Bool("store-compliance", false, "Run the Extension Store compliance checks") - extensionValidateCmd.PersistentFlags().String("format", "", "Reporting format (summary, json, github, gitlab, junit, markdown)") + extensionValidateCmd.PersistentFlags().Bool("store-compliance", false, "Apply Shopware Extension Store rules: run compliance checks and ignore the validation.ignore list") + extensionValidateCmd.PersistentFlags().String("format", "", "Report format (summary, json, github, gitlab, junit, markdown; auto-detected if unset)") extensionValidateCmd.PersistentFlags().String("reporter", "", "Reporting format (summary, json, github, gitlab, junit, markdown)") - extensionValidateCmd.PersistentFlags().String("check-against", "highest", "Check against Shopware Version (highest, lowest)") - extensionValidateCmd.PersistentFlags().String("only", "", "Run only these validation checks, regardless of --full (comma-separated, e.g. phpstan,eslint)") - extensionValidateCmd.PersistentFlags().String("exclude", "", "Exclude specific tools by name (comma-separated, e.g. phpstan,eslint)") - extensionValidateCmd.PersistentFlags().Bool("no-copy", false, "Do not copy extension files to temporary directory") + extensionValidateCmd.PersistentFlags().String("check-against", "highest", "Check PHPStan against the highest or lowest Shopware versions allowed by composer.json") + extensionValidateCmd.PersistentFlags().String("only", "", "Run only these tools (comma-separated, e.g. phpstan,eslint)") + extensionValidateCmd.PersistentFlags().String("exclude", "", "Skip these tools; must be in the --only list if set (comma-separated, e.g. phpstan,eslint)") + extensionValidateCmd.PersistentFlags().Bool("no-copy", false, "Validate the extension directory itself, not a temporary copy") extensionValidateCmd.MarkFlagsMutuallyExclusive("format", "reporter") _ = extensionValidateCmd.PersistentFlags().MarkDeprecated("reporter", "use --format instead") _ = extensionValidateCmd.PersistentFlags().MarkHidden("reporter") diff --git a/cmd/project/ci.go b/cmd/project/ci.go index 731ac3ab..b6456553 100644 --- a/cmd/project/ci.go +++ b/cmd/project/ci.go @@ -17,9 +17,11 @@ import ( ) var projectCI = &cobra.Command{ - Use: "ci", - Short: "Create a production build of a Shopware project", - Args: cobra.ExactArgs(1), + Use: "ci [path]", + Short: "Turn a project directory into a production build (removes dev files, adds SBOM)", + Long: "Build the given Shopware project directory for production and generate an SBOM. The directory itself is changed: development-only files (tests, Administration sources, source maps, build.cleanup_paths) are removed, and empty placeholders are added so Shopware still runs without them.\n" + + "Use it in CI or on a disposable checkout; outside CI it refuses to run with uncommitted changes or untracked files unless --force is passed.", + Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { root, err := filepath.Abs(args[0]) if err != nil { @@ -56,8 +58,8 @@ var projectCI = &cobra.Command{ func init() { projectRootCmd.AddCommand(projectCI) - projectCI.PersistentFlags().Bool("with-dev-dependencies", false, "Include development dependencies in the build") - projectCI.PersistentFlags().Bool("force", false, "Force the CI build despite uncommitted changes") + projectCI.PersistentFlags().Bool("with-dev-dependencies", false, "Include Composer dev dependencies in the build") + projectCI.PersistentFlags().Bool("force", false, "Run the build outside CI despite uncommitted changes or untracked files") } func projectCISafetyCheck(ctx context.Context, root string, force bool, getenv func(string) string) error { diff --git a/cmd/project/project_dev.go b/cmd/project/project_dev.go index cb938fc5..b05428f4 100644 --- a/cmd/project/project_dev.go +++ b/cmd/project/project_dev.go @@ -98,7 +98,7 @@ const ( var projectDevCmd = &cobra.Command{ Use: "dev", - Short: "Start a project's configured Shopware development environment", + Short: "Start the project's development environment and open its terminal dashboard", Long: "Start the development environment. This launches the interactive TUI dashboard when run in a terminal, or starts the containers in the background otherwise. Requires a Docker environment; local and ssh environments do not manage containers.", RunE: func(cmd *cobra.Command, args []string) error { projectRoot, err := shop.FindClosestShopwareProject(false) @@ -460,5 +460,5 @@ func init() { projectDevCmd.AddCommand(projectDevStatusCmd) projectDevStopCmd.Flags().Bool("remove-data", false, "Remove the named volumes declared in the Compose file, deleting all data stored in them") - projectDevCmd.PersistentFlags().String("on-port-conflict", portConflictModeFail, "When host ports are occupied: fail or use random free ports (non-interactive mode; the dashboard prompts instead)") + projectDevCmd.PersistentFlags().String("on-port-conflict", portConflictModeFail, "In non-interactive mode, if host ports are in use: fail, or random to pick free ports and save them to the local config (the dashboard asks instead)") } diff --git a/cmd/project/project_fix.go b/cmd/project/project_fix.go index 43d8c100..217bc4b3 100644 --- a/cmd/project/project_fix.go +++ b/cmd/project/project_fix.go @@ -15,6 +15,7 @@ import ( var projectFixCmd = &cobra.Command{ Use: "fix [path]", Short: "Apply code-quality fixes to a project", + Long: "Run code-quality fixers on the project's own code, such as extensions in custom/ and configured bundles, and change the files directly. Packages that Composer installs into vendor/ are not changed. Requires a Git repository so the changes can be reviewed, unless --allow-non-git is passed.", Args: cobra.MaximumNArgs(1), PreRunE: func(cmd *cobra.Command, args []string) error { return verifier.SetupTools(cmd.Context(), cmd.Root().Version) @@ -73,6 +74,6 @@ var projectFixCmd = &cobra.Command{ func init() { projectRootCmd.AddCommand(projectFixCmd) - projectFixCmd.PersistentFlags().String("only", "", "Run only the specified fixers (comma-separated, e.g. eslint,rector)") - projectFixCmd.PersistentFlags().Bool("allow-non-git", false, "Allow fixes in projects without a Git repository") + projectFixCmd.PersistentFlags().String("only", "", "Run only these fixers (comma-separated, e.g. eslint,rector)") + projectFixCmd.PersistentFlags().Bool("allow-non-git", false, "Allow fixes to a project that is not in a Git repository") } diff --git a/cmd/project/project_format.go b/cmd/project/project_format.go index 95c92401..f001e886 100644 --- a/cmd/project/project_format.go +++ b/cmd/project/project_format.go @@ -13,7 +13,8 @@ import ( var projectFormatCmd = &cobra.Command{ Use: "format [path]", - Short: "Run configured formatters on project files", + Short: "Format a project's code with PHP-CS-Fixer and Prettier", + Long: "Format the project's own code, such as extensions in custom/ and configured bundles, and change the files directly. Packages that Composer installs into vendor/ are not changed. PHP-CS-Fixer uses the project's .php-cs-fixer.dist.php if present; Prettier always uses the CLI's own config. Use --dry-run to only report files that would change.", Args: cobra.MaximumNArgs(1), PreRunE: func(cmd *cobra.Command, args []string) error { return verifier.SetupTools(cmd.Context(), cmd.Root().Version) @@ -65,6 +66,6 @@ var projectFormatCmd = &cobra.Command{ func init() { projectRootCmd.AddCommand(projectFormatCmd) - projectFormatCmd.PersistentFlags().String("only", "", "Run only the specified formatters (comma-separated, e.g. prettier,php-cs-fixer)") - projectFormatCmd.PersistentFlags().Bool("dry-run", false, "Run formatters without changing files") + projectFormatCmd.PersistentFlags().String("only", "", "Run only these formatters (comma-separated, e.g. prettier,php-cs-fixer)") + projectFormatCmd.PersistentFlags().Bool("dry-run", false, "Report files that would change, without changing them") } diff --git a/cmd/project/project_validate.go b/cmd/project/project_validate.go index 4496ed1c..b6e69a50 100644 --- a/cmd/project/project_validate.go +++ b/cmd/project/project_validate.go @@ -18,6 +18,7 @@ import ( var projectValidateCmd = &cobra.Command{ Use: "validate [path]", Short: "Run static analysis and Shopware checks on a project", + Long: "Validate the project's own code, such as extensions in custom/ and configured bundles. Packages that Composer installs into vendor/ are not validated. Runs on a temporary copy unless --no-copy is passed.", Args: cobra.MaximumNArgs(1), PreRunE: func(cmd *cobra.Command, args []string) error { if _, err := projectValidationFormat(cmd); err != nil { @@ -122,11 +123,11 @@ func projectValidationFormat(cmd *cobra.Command) (string, error) { func init() { projectRootCmd.AddCommand(projectValidateCmd) - projectValidateCmd.PersistentFlags().String("format", "", "Validation report format (summary, json, github, gitlab, junit, or markdown)") + projectValidateCmd.PersistentFlags().String("format", "", "Report format (summary, json, github, gitlab, junit, markdown; auto-detected if unset)") projectValidateCmd.PersistentFlags().String("reporter", "", "Reporting format (summary, json, github, gitlab, junit, markdown)") - projectValidateCmd.PersistentFlags().String("only", "", "Run only the specified tools (comma-separated, e.g. phpstan,eslint)") - projectValidateCmd.PersistentFlags().String("exclude", "", "Exclude tools after applying --only; names must be in the selected set (comma-separated, e.g. phpstan,eslint)") - projectValidateCmd.PersistentFlags().Bool("no-copy", false, "Validate the project in place instead of copying it to a temporary directory") + projectValidateCmd.PersistentFlags().String("only", "", "Run only these tools (comma-separated, e.g. phpstan,eslint)") + projectValidateCmd.PersistentFlags().String("exclude", "", "Skip these tools; must be in the --only list if set (comma-separated, e.g. phpstan,eslint)") + projectValidateCmd.PersistentFlags().Bool("no-copy", false, "Validate the project directory itself, not a temporary copy") projectValidateCmd.PersistentFlags().Bool("local-only", false, "Validate only extensions in custom/* folders") projectValidateCmd.MarkFlagsMutuallyExclusive("format", "reporter") _ = projectValidateCmd.PersistentFlags().MarkDeprecated("reporter", "use --format instead") diff --git a/cmd/project/project_worker.go b/cmd/project/project_worker.go index 67990a9f..ad02438f 100644 --- a/cmd/project/project_worker.go +++ b/cmd/project/project_worker.go @@ -104,7 +104,7 @@ queue. The count per queue is optional and defaults to 1.`, func init() { projectRootCmd.AddCommand(projectWorkerCmd) - projectWorkerCmd.PersistentFlags().Bool("verbose", false, "Enable verbose worker output") + projectWorkerCmd.PersistentFlags().Bool("verbose", false, "Show every message the workers handle, plus debug logs") projectWorkerCmd.PersistentFlags().String("queue", "", "Queues to consume (comma-separated)") projectWorkerCmd.PersistentFlags().String("memory-limit", "512M", "Worker memory limit") projectWorkerCmd.PersistentFlags().String("time-limit", "120", "Worker time limit in seconds") diff --git a/cmd/root.go b/cmd/root.go index 498ce326..b9c8f5f2 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -96,9 +96,9 @@ func init() { _ = system.CloseCaches() }) - rootCmd.PersistentFlags().Bool("verbose", false, "Show debug output") - rootCmd.PersistentFlags().BoolP("no-interaction", "n", false, "Do not ask any interactive questions") - rootCmd.PersistentFlags().Bool("no-update-hint", false, "Do not show update notifications") + rootCmd.PersistentFlags().Bool("verbose", false, "Show debug logs and detailed tool output") + rootCmd.PersistentFlags().BoolP("no-interaction", "n", false, "Run without prompting; commands use defaults or fail where input is needed") + rootCmd.PersistentFlags().Bool("no-update-hint", false, "Skip checking for a newer shopware-cli version") project.Register(rootCmd) extension.Register(rootCmd) From c949c85ba8ae3e84f271102a172b4b3e665c2ef8 Mon Sep 17 00:00:00 2001 From: L Apple Date: Wed, 30 Sep 2026 12:43:59 +0200 Subject: [PATCH 02/24] docs(cli): leave extension validate flags to #1618 Keep only the Use and a Long that holds before and after #1618, so this PR doesn't conflict with #1618 or #1627. Co-Authored-By: Claude Opus 5.5 --- cmd/extension/extension_validate.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/cmd/extension/extension_validate.go b/cmd/extension/extension_validate.go index 73529eb9..8dbe1f9c 100644 --- a/cmd/extension/extension_validate.go +++ b/cmd/extension/extension_validate.go @@ -21,7 +21,7 @@ import ( var extensionValidateCmd = &cobra.Command{ Use: "validate [path]", Short: "Validate extension metadata, assets, and code quality", - Long: "Validate an extension folder or ZIP file. By default, it runs the built-in checks and external tools such as PHPStan and ESLint; use --only or --exclude to choose. Folders are checked on a temporary copy unless --no-copy is passed. With --store-compliance (or SHOPWARE_CLI_STORE_COMPLIANCE=1), the Store's rules apply and the extension's validation.ignore list is not used.", + Long: "Validate an extension folder or ZIP file. With --store-compliance (or SHOPWARE_CLI_STORE_COMPLIANCE=1), the Store's rules apply and the extension's validation.ignore list is not used.", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { isFull, _ := cmd.Flags().GetBool("full") @@ -187,13 +187,13 @@ func extensionValidationFormat(cmd *cobra.Command) (string, error) { func init() { extensionRootCmd.AddCommand(extensionValidateCmd) extensionValidateCmd.PersistentFlags().Bool("full", false, "Run all validation checks by default (minus --exclude selections)") - extensionValidateCmd.PersistentFlags().Bool("store-compliance", false, "Apply Shopware Extension Store rules: run compliance checks and ignore the validation.ignore list") - extensionValidateCmd.PersistentFlags().String("format", "", "Report format (summary, json, github, gitlab, junit, markdown; auto-detected if unset)") + extensionValidateCmd.PersistentFlags().Bool("store-compliance", false, "Run the Extension Store compliance checks") + extensionValidateCmd.PersistentFlags().String("format", "", "Reporting format (summary, json, github, gitlab, junit, markdown)") extensionValidateCmd.PersistentFlags().String("reporter", "", "Reporting format (summary, json, github, gitlab, junit, markdown)") - extensionValidateCmd.PersistentFlags().String("check-against", "highest", "Check PHPStan against the highest or lowest Shopware versions allowed by composer.json") - extensionValidateCmd.PersistentFlags().String("only", "", "Run only these tools (comma-separated, e.g. phpstan,eslint)") - extensionValidateCmd.PersistentFlags().String("exclude", "", "Skip these tools; must be in the --only list if set (comma-separated, e.g. phpstan,eslint)") - extensionValidateCmd.PersistentFlags().Bool("no-copy", false, "Validate the extension directory itself, not a temporary copy") + extensionValidateCmd.PersistentFlags().String("check-against", "highest", "Check against Shopware Version (highest, lowest)") + extensionValidateCmd.PersistentFlags().String("only", "", "Run only these validation checks, regardless of --full (comma-separated, e.g. phpstan,eslint)") + extensionValidateCmd.PersistentFlags().String("exclude", "", "Exclude specific tools by name (comma-separated, e.g. phpstan,eslint)") + extensionValidateCmd.PersistentFlags().Bool("no-copy", false, "Do not copy extension files to temporary directory") extensionValidateCmd.MarkFlagsMutuallyExclusive("format", "reporter") _ = extensionValidateCmd.PersistentFlags().MarkDeprecated("reporter", "use --format instead") _ = extensionValidateCmd.PersistentFlags().MarkHidden("reporter") From 6445acf63a737a6738bfaeafc00a7f3a2466aa7a Mon Sep 17 00:00:00 2001 From: somethings Date: Wed, 30 Sep 2026 12:51:05 +0200 Subject: [PATCH 03/24] docs(cli): fix required argument help and package filename --- cmd/extension/extension_package.go | 6 +++--- cmd/extension/extension_validate.go | 2 +- cmd/project/ci.go | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cmd/extension/extension_package.go b/cmd/extension/extension_package.go index cf147193..9de73d5a 100644 --- a/cmd/extension/extension_package.go +++ b/cmd/extension/extension_package.go @@ -25,9 +25,9 @@ var ( ) var extensionPackageCmd = &cobra.Command{ - Use: "package [path] [branch]", + Use: "package [branch]", Short: "Build a distributable extension ZIP", - Long: "Build a ZIP of an extension. By default, files come from a clean Git checkout of the current tag or branch, so uncommitted changes are not included; use --disable-git to package the working copy. The build runs in a temporary folder and leaves the extension folder unchanged. The ZIP is named -.zip unless --filename is set.", + Long: "Build a ZIP of an extension. By default, files come from a clean Git checkout of the current tag or branch, so uncommitted changes are not included; use --disable-git to package the working copy. The build runs in a temporary folder and leaves the extension folder unchanged. The ZIP is named -.zip when a tag is available, or .zip otherwise, unless --filename is set.", Aliases: []string{"zip"}, Args: cobra.RangeArgs(1, 2), RunE: func(cmd *cobra.Command, args []string) error { @@ -239,7 +239,7 @@ func init() { extensionPackageCmd.MarkFlagsMutuallyExclusive("use-git-tag-as-version", "overwrite-version") extensionPackageCmd.Flags().String("output-directory", "", "Directory for the ZIP file (created if missing)") extensionPackageCmd.Flags().String("git-commit", "", "Git commit, tag, or branch to package (default: the current tag or branch)") - extensionPackageCmd.Flags().String("filename", "", "Name of the ZIP file (default: -.zip)") + extensionPackageCmd.Flags().String("filename", "", "Name of the ZIP file (default: -.zip when tagged, otherwise .zip)") } func getStringOnStringError(val string, _ error) string { diff --git a/cmd/extension/extension_validate.go b/cmd/extension/extension_validate.go index 8dbe1f9c..c09c1037 100644 --- a/cmd/extension/extension_validate.go +++ b/cmd/extension/extension_validate.go @@ -19,7 +19,7 @@ import ( ) var extensionValidateCmd = &cobra.Command{ - Use: "validate [path]", + Use: "validate ", Short: "Validate extension metadata, assets, and code quality", Long: "Validate an extension folder or ZIP file. With --store-compliance (or SHOPWARE_CLI_STORE_COMPLIANCE=1), the Store's rules apply and the extension's validation.ignore list is not used.", Args: cobra.ExactArgs(1), diff --git a/cmd/project/ci.go b/cmd/project/ci.go index b6456553..83be856a 100644 --- a/cmd/project/ci.go +++ b/cmd/project/ci.go @@ -17,7 +17,7 @@ import ( ) var projectCI = &cobra.Command{ - Use: "ci [path]", + Use: "ci ", Short: "Turn a project directory into a production build (removes dev files, adds SBOM)", Long: "Build the given Shopware project directory for production and generate an SBOM. The directory itself is changed: development-only files (tests, Administration sources, source maps, build.cleanup_paths) are removed, and empty placeholders are added so Shopware still runs without them.\n" + "Use it in CI or on a disposable checkout; outside CI it refuses to run with uncommitted changes or untracked files unless --force is passed.", From 72d337df425a2e439aa65af98701c371d517bf33 Mon Sep 17 00:00:00 2001 From: somethings Date: Wed, 30 Sep 2026 13:39:33 +0200 Subject: [PATCH 04/24] Update cmd/extension/extension_package.go Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- cmd/extension/extension_package.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/extension/extension_package.go b/cmd/extension/extension_package.go index 9de73d5a..09fd5c2e 100644 --- a/cmd/extension/extension_package.go +++ b/cmd/extension/extension_package.go @@ -27,7 +27,7 @@ var ( var extensionPackageCmd = &cobra.Command{ Use: "package [branch]", Short: "Build a distributable extension ZIP", - Long: "Build a ZIP of an extension. By default, files come from a clean Git checkout of the current tag or branch, so uncommitted changes are not included; use --disable-git to package the working copy. The build runs in a temporary folder and leaves the extension folder unchanged. The ZIP is named -.zip when a tag is available, or .zip otherwise, unless --filename is set.", + Long: "Build a ZIP of an extension. By default, files come from a clean Git checkout of the current tag or branch, so uncommitted changes are not included; use --disable-git to package the working copy. The build runs in a temporary folder and leaves the extension folder unchanged. The ZIP is named -.zip when a tag or branch is available, or .zip otherwise, unless --filename is set.", Aliases: []string{"zip"}, Args: cobra.RangeArgs(1, 2), RunE: func(cmd *cobra.Command, args []string) error { From d1c747abd0a9f4066914a4268f37b041e46061dd Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 30 Sep 2026 11:43:34 +0000 Subject: [PATCH 05/24] Clarify project dev dashboard description Co-authored-by: lasomethingsomething <2453640+lasomethingsomething@users.noreply.github.com> --- cmd/project/project_dev.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/project/project_dev.go b/cmd/project/project_dev.go index b05428f4..fcb2edfd 100644 --- a/cmd/project/project_dev.go +++ b/cmd/project/project_dev.go @@ -98,7 +98,7 @@ const ( var projectDevCmd = &cobra.Command{ Use: "dev", - Short: "Start the project's development environment and open its terminal dashboard", + Short: "Start the project's development environment and, when run in a terminal, open its terminal dashboard", Long: "Start the development environment. This launches the interactive TUI dashboard when run in a terminal, or starts the containers in the background otherwise. Requires a Docker environment; local and ssh environments do not manage containers.", RunE: func(cmd *cobra.Command, args []string) error { projectRoot, err := shop.FindClosestShopwareProject(false) From 4932770600a6c5cc0db1822324e5a61bb67a4c61 Mon Sep 17 00:00:00 2001 From: somethings Date: Wed, 30 Sep 2026 15:21:02 +0200 Subject: [PATCH 06/24] Deprecate store compliance flag --- cmd/extension/extension_validate.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cmd/extension/extension_validate.go b/cmd/extension/extension_validate.go index c09c1037..3c12e6ba 100644 --- a/cmd/extension/extension_validate.go +++ b/cmd/extension/extension_validate.go @@ -21,7 +21,7 @@ import ( var extensionValidateCmd = &cobra.Command{ Use: "validate ", Short: "Validate extension metadata, assets, and code quality", - Long: "Validate an extension folder or ZIP file. With --store-compliance (or SHOPWARE_CLI_STORE_COMPLIANCE=1), the Store's rules apply and the extension's validation.ignore list is not used.", + Long: "Validate an extension folder or ZIP file. Enable Store compliance with validation.store_compliance: true in .shopware-extension.yml. The --store-compliance flag is deprecated and remains available during the deprecation period; SHOPWARE_CLI_STORE_COMPLIANCE=1 remains available as a CI override.", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { isFull, _ := cmd.Flags().GetBool("full") @@ -187,7 +187,7 @@ func extensionValidationFormat(cmd *cobra.Command) (string, error) { func init() { extensionRootCmd.AddCommand(extensionValidateCmd) extensionValidateCmd.PersistentFlags().Bool("full", false, "Run all validation checks by default (minus --exclude selections)") - extensionValidateCmd.PersistentFlags().Bool("store-compliance", false, "Run the Extension Store compliance checks") + extensionValidateCmd.PersistentFlags().Bool("store-compliance", false, "Deprecated: use validation.store_compliance: true in .shopware-extension.yml") extensionValidateCmd.PersistentFlags().String("format", "", "Reporting format (summary, json, github, gitlab, junit, markdown)") extensionValidateCmd.PersistentFlags().String("reporter", "", "Reporting format (summary, json, github, gitlab, junit, markdown)") extensionValidateCmd.PersistentFlags().String("check-against", "highest", "Check against Shopware Version (highest, lowest)") @@ -196,6 +196,7 @@ func init() { extensionValidateCmd.PersistentFlags().Bool("no-copy", false, "Do not copy extension files to temporary directory") extensionValidateCmd.MarkFlagsMutuallyExclusive("format", "reporter") _ = extensionValidateCmd.PersistentFlags().MarkDeprecated("reporter", "use --format instead") + _ = extensionValidateCmd.PersistentFlags().MarkDeprecated("store-compliance", "set validation.store_compliance to true in .shopware-extension.yml") _ = extensionValidateCmd.PersistentFlags().MarkHidden("reporter") extensionValidateCmd.PreRunE = func(cmd *cobra.Command, args []string) error { if _, err := extensionValidationFormat(cmd); err != nil { From 34573f34e0d669bf0762c8570505f047b308a113 Mon Sep 17 00:00:00 2001 From: somethings Date: Wed, 30 Sep 2026 15:29:01 +0200 Subject: [PATCH 07/24] Revert store-compliance flag deprecation changes --- cmd/extension/extension_validate.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/cmd/extension/extension_validate.go b/cmd/extension/extension_validate.go index 3c12e6ba..c09c1037 100644 --- a/cmd/extension/extension_validate.go +++ b/cmd/extension/extension_validate.go @@ -21,7 +21,7 @@ import ( var extensionValidateCmd = &cobra.Command{ Use: "validate ", Short: "Validate extension metadata, assets, and code quality", - Long: "Validate an extension folder or ZIP file. Enable Store compliance with validation.store_compliance: true in .shopware-extension.yml. The --store-compliance flag is deprecated and remains available during the deprecation period; SHOPWARE_CLI_STORE_COMPLIANCE=1 remains available as a CI override.", + Long: "Validate an extension folder or ZIP file. With --store-compliance (or SHOPWARE_CLI_STORE_COMPLIANCE=1), the Store's rules apply and the extension's validation.ignore list is not used.", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { isFull, _ := cmd.Flags().GetBool("full") @@ -187,7 +187,7 @@ func extensionValidationFormat(cmd *cobra.Command) (string, error) { func init() { extensionRootCmd.AddCommand(extensionValidateCmd) extensionValidateCmd.PersistentFlags().Bool("full", false, "Run all validation checks by default (minus --exclude selections)") - extensionValidateCmd.PersistentFlags().Bool("store-compliance", false, "Deprecated: use validation.store_compliance: true in .shopware-extension.yml") + extensionValidateCmd.PersistentFlags().Bool("store-compliance", false, "Run the Extension Store compliance checks") extensionValidateCmd.PersistentFlags().String("format", "", "Reporting format (summary, json, github, gitlab, junit, markdown)") extensionValidateCmd.PersistentFlags().String("reporter", "", "Reporting format (summary, json, github, gitlab, junit, markdown)") extensionValidateCmd.PersistentFlags().String("check-against", "highest", "Check against Shopware Version (highest, lowest)") @@ -196,7 +196,6 @@ func init() { extensionValidateCmd.PersistentFlags().Bool("no-copy", false, "Do not copy extension files to temporary directory") extensionValidateCmd.MarkFlagsMutuallyExclusive("format", "reporter") _ = extensionValidateCmd.PersistentFlags().MarkDeprecated("reporter", "use --format instead") - _ = extensionValidateCmd.PersistentFlags().MarkDeprecated("store-compliance", "set validation.store_compliance to true in .shopware-extension.yml") _ = extensionValidateCmd.PersistentFlags().MarkHidden("reporter") extensionValidateCmd.PreRunE = func(cmd *cobra.Command, args []string) error { if _, err := extensionValidationFormat(cmd); err != nil { From c5287f5f4c991732dd3f070e42a85ae8e94447d4 Mon Sep 17 00:00:00 2001 From: somethings Date: Wed, 30 Sep 2026 15:55:55 +0200 Subject: [PATCH 08/24] docs(cli): list project validation tools in help --- cmd/project/project_validate.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/project/project_validate.go b/cmd/project/project_validate.go index b6e69a50..3cea5562 100644 --- a/cmd/project/project_validate.go +++ b/cmd/project/project_validate.go @@ -125,8 +125,8 @@ func init() { projectRootCmd.AddCommand(projectValidateCmd) projectValidateCmd.PersistentFlags().String("format", "", "Report format (summary, json, github, gitlab, junit, markdown; auto-detected if unset)") projectValidateCmd.PersistentFlags().String("reporter", "", "Reporting format (summary, json, github, gitlab, junit, markdown)") - projectValidateCmd.PersistentFlags().String("only", "", "Run only these tools (comma-separated, e.g. phpstan,eslint)") - projectValidateCmd.PersistentFlags().String("exclude", "", "Skip these tools; must be in the --only list if set (comma-separated, e.g. phpstan,eslint)") + projectValidateCmd.PersistentFlags().String("only", "", "Run only these tools (comma-separated; available: phpstan, eslint, stylelint, storefront-twig, sw-cli)") + projectValidateCmd.PersistentFlags().String("exclude", "", "Skip these tools (comma-separated); with --only, each must be selected there. Available: phpstan, eslint, stylelint, storefront-twig, sw-cli") projectValidateCmd.PersistentFlags().Bool("no-copy", false, "Validate the project directory itself, not a temporary copy") projectValidateCmd.PersistentFlags().Bool("local-only", false, "Validate only extensions in custom/* folders") projectValidateCmd.MarkFlagsMutuallyExclusive("format", "reporter") From cfd57d73ed756a4271157186e7b6a10ad63b3ac6 Mon Sep 17 00:00:00 2001 From: somethings Date: Wed, 30 Sep 2026 15:58:43 +0200 Subject: [PATCH 09/24] docs(cli): use canonical builtin checker name --- cmd/project/project_validate.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/project/project_validate.go b/cmd/project/project_validate.go index 3cea5562..565f808c 100644 --- a/cmd/project/project_validate.go +++ b/cmd/project/project_validate.go @@ -125,8 +125,8 @@ func init() { projectRootCmd.AddCommand(projectValidateCmd) projectValidateCmd.PersistentFlags().String("format", "", "Report format (summary, json, github, gitlab, junit, markdown; auto-detected if unset)") projectValidateCmd.PersistentFlags().String("reporter", "", "Reporting format (summary, json, github, gitlab, junit, markdown)") - projectValidateCmd.PersistentFlags().String("only", "", "Run only these tools (comma-separated; available: phpstan, eslint, stylelint, storefront-twig, sw-cli)") - projectValidateCmd.PersistentFlags().String("exclude", "", "Skip these tools (comma-separated); with --only, each must be selected there. Available: phpstan, eslint, stylelint, storefront-twig, sw-cli") + projectValidateCmd.PersistentFlags().String("only", "", "Run only these tools (comma-separated): phpstan, eslint, stylelint, storefront-twig, builtin (legacy alias: sw-cli, deprecated)") + projectValidateCmd.PersistentFlags().String("exclude", "", "Skip these tools (comma-separated); with --only, each must be selected there. Names: phpstan, eslint, stylelint, storefront-twig, builtin (legacy alias: sw-cli, deprecated)") projectValidateCmd.PersistentFlags().Bool("no-copy", false, "Validate the project directory itself, not a temporary copy") projectValidateCmd.PersistentFlags().Bool("local-only", false, "Validate only extensions in custom/* folders") projectValidateCmd.MarkFlagsMutuallyExclusive("format", "reporter") From 104373fee814c055d654ec94e00d07e391467435 Mon Sep 17 00:00:00 2001 From: somethings Date: Wed, 30 Sep 2026 17:14:57 +0200 Subject: [PATCH 10/24] Update cmd/project/project_validate.go Co-authored-by: Anne --- cmd/project/project_validate.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/project/project_validate.go b/cmd/project/project_validate.go index 565f808c..fb04b832 100644 --- a/cmd/project/project_validate.go +++ b/cmd/project/project_validate.go @@ -125,7 +125,7 @@ func init() { projectRootCmd.AddCommand(projectValidateCmd) projectValidateCmd.PersistentFlags().String("format", "", "Report format (summary, json, github, gitlab, junit, markdown; auto-detected if unset)") projectValidateCmd.PersistentFlags().String("reporter", "", "Reporting format (summary, json, github, gitlab, junit, markdown)") - projectValidateCmd.PersistentFlags().String("only", "", "Run only these tools (comma-separated): phpstan, eslint, stylelint, storefront-twig, builtin (legacy alias: sw-cli, deprecated)") + projectValidateCmd.PersistentFlags().String("only", "", "Run only the selected tools (comma-separated). Available: phpstan, eslint, stylelint, storefront-twig, builtin (legacy alias: sw-cli, deprecated)") projectValidateCmd.PersistentFlags().String("exclude", "", "Skip these tools (comma-separated); with --only, each must be selected there. Names: phpstan, eslint, stylelint, storefront-twig, builtin (legacy alias: sw-cli, deprecated)") projectValidateCmd.PersistentFlags().Bool("no-copy", false, "Validate the project directory itself, not a temporary copy") projectValidateCmd.PersistentFlags().Bool("local-only", false, "Validate only extensions in custom/* folders") From 0a16ddd85443648218f959171ab493b8182e0e1e Mon Sep 17 00:00:00 2001 From: somethings Date: Wed, 30 Sep 2026 19:49:21 +0200 Subject: [PATCH 11/24] Update cmd/extension/extension_fix.go Co-authored-by: Anne --- cmd/extension/extension_fix.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/extension/extension_fix.go b/cmd/extension/extension_fix.go index 3f7b17f6..2968b60f 100644 --- a/cmd/extension/extension_fix.go +++ b/cmd/extension/extension_fix.go @@ -79,7 +79,7 @@ var extensionFixCmd = &cobra.Command{ func init() { extensionRootCmd.AddCommand(extensionFixCmd) - extensionFixCmd.Flags().String("only", "", "Run only these fixers (comma-separated, e.g. eslint,rector)") + extensionFixCmd.Flags().String("only", "", "Run only the specified fixers (comma-separated, e.g. eslint,rector)") extensionFixCmd.Flags().String("exclude", "", "Skip these fixers; must be in the --only list if set (comma-separated, e.g. eslint,rector)") extensionFixCmd.Flags().Bool("allow-non-git", false, "Allow fixes to an extension that is not in a Git repository") } From 57558bc2ddcce65288503a2d55f25646df66c265 Mon Sep 17 00:00:00 2001 From: somethings Date: Wed, 30 Sep 2026 19:51:18 +0200 Subject: [PATCH 12/24] Update cmd/extension/extension_package.go Co-authored-by: Anne --- cmd/extension/extension_package.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/extension/extension_package.go b/cmd/extension/extension_package.go index 09fd5c2e..3d4bea19 100644 --- a/cmd/extension/extension_package.go +++ b/cmd/extension/extension_package.go @@ -238,7 +238,7 @@ func init() { extensionPackageCmd.MarkFlagsMutuallyExclusive("use-git-tag-as-version", "disable-git") extensionPackageCmd.MarkFlagsMutuallyExclusive("use-git-tag-as-version", "overwrite-version") extensionPackageCmd.Flags().String("output-directory", "", "Directory for the ZIP file (created if missing)") - extensionPackageCmd.Flags().String("git-commit", "", "Git commit, tag, or branch to package (default: the current tag or branch)") + extensionPackageCmd.Flags().String("git-commit", "", "Git commit hash, tag, or branch to package (default: the current tag or branch)") extensionPackageCmd.Flags().String("filename", "", "Name of the ZIP file (default: -.zip when tagged, otherwise .zip)") } From a6cc7812ce38a90cd1a32073187da65e8a047b43 Mon Sep 17 00:00:00 2001 From: somethings Date: Wed, 30 Sep 2026 19:52:11 +0200 Subject: [PATCH 13/24] Update cmd/extension/extension_format.go Co-authored-by: Anne --- cmd/extension/extension_format.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/extension/extension_format.go b/cmd/extension/extension_format.go index 93d8503e..825bbf6e 100644 --- a/cmd/extension/extension_format.go +++ b/cmd/extension/extension_format.go @@ -73,7 +73,7 @@ var extensionFormat = &cobra.Command{ func init() { extensionRootCmd.AddCommand(extensionFormat) - extensionFormat.Flags().String("only", "", "Run only these formatters (comma-separated, e.g. prettier,php-cs-fixer)") + extensionFormat.Flags().String("only", "", "Run only the specified formatters (comma-separated, e.g. prettier,php-cs-fixer)") extensionFormat.Flags().String("exclude", "", "Skip these formatters; must be in the --only list if set (comma-separated, e.g. prettier,php-cs-fixer)") extensionFormat.Flags().Bool("dry-run", false, "Run in dry run mode") } From 0f5e8337d8775926d1044357d640a8f676e07953 Mon Sep 17 00:00:00 2001 From: somethings Date: Wed, 30 Sep 2026 19:52:42 +0200 Subject: [PATCH 14/24] Update cmd/project/project_fix.go Co-authored-by: Anne --- cmd/project/project_fix.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/project/project_fix.go b/cmd/project/project_fix.go index 217bc4b3..d76a1484 100644 --- a/cmd/project/project_fix.go +++ b/cmd/project/project_fix.go @@ -75,5 +75,5 @@ var projectFixCmd = &cobra.Command{ func init() { projectRootCmd.AddCommand(projectFixCmd) projectFixCmd.PersistentFlags().String("only", "", "Run only these fixers (comma-separated, e.g. eslint,rector)") - projectFixCmd.PersistentFlags().Bool("allow-non-git", false, "Allow fixes to a project that is not in a Git repository") + projectFixCmd.PersistentFlags().Bool("allow-non-git", false, "Allow fix to run outside a Git repository") } From 8e8ce8a7ac02352d8c5148c94bf4cd4e11fc8b4f Mon Sep 17 00:00:00 2001 From: somethings Date: Wed, 30 Sep 2026 19:53:40 +0200 Subject: [PATCH 15/24] Update cmd/project/project_fix.go Co-authored-by: Anne --- cmd/project/project_fix.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/project/project_fix.go b/cmd/project/project_fix.go index d76a1484..9a58a0d6 100644 --- a/cmd/project/project_fix.go +++ b/cmd/project/project_fix.go @@ -74,6 +74,6 @@ var projectFixCmd = &cobra.Command{ func init() { projectRootCmd.AddCommand(projectFixCmd) - projectFixCmd.PersistentFlags().String("only", "", "Run only these fixers (comma-separated, e.g. eslint,rector)") + projectFixCmd.PersistentFlags().String("only", "", "Run only the specified fixers (comma-separated, e.g. eslint,rector)") projectFixCmd.PersistentFlags().Bool("allow-non-git", false, "Allow fix to run outside a Git repository") } From 3ae4fe7191081b122504ac01f397519391a60e2e Mon Sep 17 00:00:00 2001 From: somethings Date: Wed, 30 Sep 2026 19:54:02 +0200 Subject: [PATCH 16/24] Update cmd/project/project_validate.go Co-authored-by: Anne --- cmd/project/project_validate.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/project/project_validate.go b/cmd/project/project_validate.go index fb04b832..b2c135bf 100644 --- a/cmd/project/project_validate.go +++ b/cmd/project/project_validate.go @@ -125,7 +125,7 @@ func init() { projectRootCmd.AddCommand(projectValidateCmd) projectValidateCmd.PersistentFlags().String("format", "", "Report format (summary, json, github, gitlab, junit, markdown; auto-detected if unset)") projectValidateCmd.PersistentFlags().String("reporter", "", "Reporting format (summary, json, github, gitlab, junit, markdown)") - projectValidateCmd.PersistentFlags().String("only", "", "Run only the selected tools (comma-separated). Available: phpstan, eslint, stylelint, storefront-twig, builtin (legacy alias: sw-cli, deprecated)") + projectValidateCmd.PersistentFlags().String("only", "", "Run only the specified tools (comma-separated). Available: phpstan, eslint, stylelint, storefront-twig, builtin (legacy alias: sw-cli, deprecated)") projectValidateCmd.PersistentFlags().String("exclude", "", "Skip these tools (comma-separated); with --only, each must be selected there. Names: phpstan, eslint, stylelint, storefront-twig, builtin (legacy alias: sw-cli, deprecated)") projectValidateCmd.PersistentFlags().Bool("no-copy", false, "Validate the project directory itself, not a temporary copy") projectValidateCmd.PersistentFlags().Bool("local-only", false, "Validate only extensions in custom/* folders") From 7dbf3e6808528288d8475b184d0df743cd3cbcce Mon Sep 17 00:00:00 2001 From: somethings Date: Wed, 30 Sep 2026 19:57:31 +0200 Subject: [PATCH 17/24] Update cmd/extension/extension_fix.go Co-authored-by: Anne --- cmd/extension/extension_fix.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/extension/extension_fix.go b/cmd/extension/extension_fix.go index 2968b60f..733183e9 100644 --- a/cmd/extension/extension_fix.go +++ b/cmd/extension/extension_fix.go @@ -81,5 +81,5 @@ func init() { extensionRootCmd.AddCommand(extensionFixCmd) extensionFixCmd.Flags().String("only", "", "Run only the specified fixers (comma-separated, e.g. eslint,rector)") extensionFixCmd.Flags().String("exclude", "", "Skip these fixers; must be in the --only list if set (comma-separated, e.g. eslint,rector)") - extensionFixCmd.Flags().Bool("allow-non-git", false, "Allow fixes to an extension that is not in a Git repository") + extensionFixCmd.Flags().Bool("allow-non-git", false, "Allow fix to run outside a Git repository") } From 08211602b49b4351563622d0db712d8fe99c42c4 Mon Sep 17 00:00:00 2001 From: somethings Date: Wed, 30 Sep 2026 19:58:05 +0200 Subject: [PATCH 18/24] Update cmd/project/project_fix.go Co-authored-by: Anne --- cmd/project/project_fix.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/project/project_fix.go b/cmd/project/project_fix.go index 9a58a0d6..f4194c05 100644 --- a/cmd/project/project_fix.go +++ b/cmd/project/project_fix.go @@ -13,7 +13,7 @@ import ( ) var projectFixCmd = &cobra.Command{ - Use: "fix [path]", + Use: "fix ", Short: "Apply code-quality fixes to a project", Long: "Run code-quality fixers on the project's own code, such as extensions in custom/ and configured bundles, and change the files directly. Packages that Composer installs into vendor/ are not changed. Requires a Git repository so the changes can be reviewed, unless --allow-non-git is passed.", Args: cobra.MaximumNArgs(1), From 24c5e2cecd405d9230cfbb0c1b4893a9ea17422a Mon Sep 17 00:00:00 2001 From: somethings Date: Wed, 30 Sep 2026 19:58:20 +0200 Subject: [PATCH 19/24] Update cmd/project/project_format.go Co-authored-by: Anne --- cmd/project/project_format.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/project/project_format.go b/cmd/project/project_format.go index f001e886..df64c810 100644 --- a/cmd/project/project_format.go +++ b/cmd/project/project_format.go @@ -66,6 +66,6 @@ var projectFormatCmd = &cobra.Command{ func init() { projectRootCmd.AddCommand(projectFormatCmd) - projectFormatCmd.PersistentFlags().String("only", "", "Run only these formatters (comma-separated, e.g. prettier,php-cs-fixer)") + projectFormatCmd.PersistentFlags().String("only", "", "Run only the specified formatters (comma-separated, e.g. prettier,php-cs-fixer)") projectFormatCmd.PersistentFlags().Bool("dry-run", false, "Report files that would change, without changing them") } From 149357e06f20ea2fc2baa36d3393e745cab3f0e0 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 30 Sep 2026 18:02:05 +0000 Subject: [PATCH 20/24] Clear copied ignores for Store compliance Co-authored-by: lasomethingsomething <2453640+lasomethingsomething@users.noreply.github.com> --- cmd/extension/extension_validate.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/extension/extension_validate.go b/cmd/extension/extension_validate.go index c09c1037..50c081f4 100644 --- a/cmd/extension/extension_validate.go +++ b/cmd/extension/extension_validate.go @@ -105,6 +105,7 @@ var extensionValidateCmd = &cobra.Command{ toolCfg.Extension.GetExtensionConfig().Validation.StoreCompliance = true // The user is not allowed to provide a custom ignore list when store compliance is enabled toolCfg.Extension.GetExtensionConfig().Validation.Ignore = extension.ConfigValidationList{} + toolCfg.ValidationIgnores = nil } toolCfg.CheckAgainst = checkAgainst From f60fa0da16886b9527050b18a47d2f79b6b23087 Mon Sep 17 00:00:00 2001 From: somethings Date: Thu, 1 Oct 2026 10:15:37 +0200 Subject: [PATCH 21/24] Update cmd/project/ci.go Co-authored-by: Lena Forlin <118278183+moshimorschi@users.noreply.github.com> --- cmd/project/ci.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/project/ci.go b/cmd/project/ci.go index 83be856a..4f597392 100644 --- a/cmd/project/ci.go +++ b/cmd/project/ci.go @@ -17,7 +17,7 @@ import ( ) var projectCI = &cobra.Command{ - Use: "ci ", + Use: "ci path", Short: "Turn a project directory into a production build (removes dev files, adds SBOM)", Long: "Build the given Shopware project directory for production and generate an SBOM. The directory itself is changed: development-only files (tests, Administration sources, source maps, build.cleanup_paths) are removed, and empty placeholders are added so Shopware still runs without them.\n" + "Use it in CI or on a disposable checkout; outside CI it refuses to run with uncommitted changes or untracked files unless --force is passed.", From 65e53bcb67b077175f0e8d2249c4561833cf6841 Mon Sep 17 00:00:00 2001 From: somethings Date: Thu, 1 Oct 2026 10:16:24 +0200 Subject: [PATCH 22/24] Update cmd/extension/extension_validate.go Co-authored-by: Lena Forlin <118278183+moshimorschi@users.noreply.github.com> --- cmd/extension/extension_validate.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/extension/extension_validate.go b/cmd/extension/extension_validate.go index 50c081f4..b4584b36 100644 --- a/cmd/extension/extension_validate.go +++ b/cmd/extension/extension_validate.go @@ -19,7 +19,7 @@ import ( ) var extensionValidateCmd = &cobra.Command{ - Use: "validate ", + Use: "validate path", Short: "Validate extension metadata, assets, and code quality", Long: "Validate an extension folder or ZIP file. With --store-compliance (or SHOPWARE_CLI_STORE_COMPLIANCE=1), the Store's rules apply and the extension's validation.ignore list is not used.", Args: cobra.ExactArgs(1), From 39f7f3ea1ca34bedea66450fef308659a5fd0564 Mon Sep 17 00:00:00 2001 From: somethings Date: Thu, 1 Oct 2026 10:16:36 +0200 Subject: [PATCH 23/24] Update cmd/project/project_fix.go Co-authored-by: Lena Forlin <118278183+moshimorschi@users.noreply.github.com> --- cmd/project/project_fix.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/project/project_fix.go b/cmd/project/project_fix.go index f4194c05..9a58a0d6 100644 --- a/cmd/project/project_fix.go +++ b/cmd/project/project_fix.go @@ -13,7 +13,7 @@ import ( ) var projectFixCmd = &cobra.Command{ - Use: "fix ", + Use: "fix [path]", Short: "Apply code-quality fixes to a project", Long: "Run code-quality fixers on the project's own code, such as extensions in custom/ and configured bundles, and change the files directly. Packages that Composer installs into vendor/ are not changed. Requires a Git repository so the changes can be reviewed, unless --allow-non-git is passed.", Args: cobra.MaximumNArgs(1), From 33b9f639a476ce91eb46df5f537d28d19229416c Mon Sep 17 00:00:00 2001 From: somethings Date: Thu, 1 Oct 2026 10:16:57 +0200 Subject: [PATCH 24/24] Update cmd/extension/extension_package.go Co-authored-by: Lena Forlin <118278183+moshimorschi@users.noreply.github.com> --- cmd/extension/extension_package.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/extension/extension_package.go b/cmd/extension/extension_package.go index 3d4bea19..8a5b8912 100644 --- a/cmd/extension/extension_package.go +++ b/cmd/extension/extension_package.go @@ -25,7 +25,7 @@ var ( ) var extensionPackageCmd = &cobra.Command{ - Use: "package [branch]", + Use: "package path [branch]", Short: "Build a distributable extension ZIP", Long: "Build a ZIP of an extension. By default, files come from a clean Git checkout of the current tag or branch, so uncommitted changes are not included; use --disable-git to package the working copy. The build runs in a temporary folder and leaves the extension folder unchanged. The ZIP is named -.zip when a tag or branch is available, or .zip otherwise, unless --filename is set.", Aliases: []string{"zip"},