apm-cli 0.22.0__tar.gz → 0.23.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {apm_cli-0.22.0 → apm_cli-0.23.1}/NOTICE +2 -2
- {apm_cli-0.22.0/src/apm_cli.egg-info → apm_cli-0.23.1}/PKG-INFO +4 -4
- {apm_cli-0.22.0 → apm_cli-0.23.1}/README.md +1 -1
- {apm_cli-0.22.0 → apm_cli-0.23.1}/pyproject.toml +3 -3
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/bundle/local_bundle.py +8 -2
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/bundle/packer.py +2 -2
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/bundle/plugin_exporter.py +13 -4
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/bundle/unpacker.py +5 -2
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/cli.py +8 -2
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/compile/cli.py +13 -13
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/compile/watcher.py +0 -4
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/deps/_utils.py +4 -4
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/deps/cli.py +6 -2
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/init.py +5 -3
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/install.py +21 -19
- apm_cli-0.23.1/src/apm_cli/commands/lifecycle.py +591 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/marketplace/plugin/__init__.py +5 -1
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/mcp.py +3 -2
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/outdated.py +14 -2
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/run.py +4 -3
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/uninstall/cli.py +64 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/update.py +82 -6
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/view.py +158 -30
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/compilation/agents_compiler.py +7 -7
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/core/build_orchestrator.py +4 -4
- apm_cli-0.23.1/src/apm_cli/core/lifecycle_scripts.py +622 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/core/plugin_manifest.py +6 -2
- apm_cli-0.23.1/src/apm_cli/core/script_executors.py +1853 -0
- apm_cli-0.23.1/src/apm_cli/core/script_trust.py +350 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/aggregator.py +2 -2
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/download_strategies.py +1 -1
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/github_downloader.py +0 -1
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/lockfile.py +7 -1
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/package_validator.py +5 -5
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/plugin_parser.py +41 -12
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/registry/client.py +92 -29
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/registry/config_loader.py +26 -18
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/revision_pins.py +2 -2
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/cache_pin.py +17 -10
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/drift.py +21 -12
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/local_bundle_handler.py +4 -1
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/package_resolution.py +81 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/phases/lockfile.py +99 -8
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/plan.py +17 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/service.py +64 -1
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/template.py +22 -10
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/integration/agent_integrator.py +7 -17
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/integration/command_integrator.py +45 -12
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/integration/copilot_app_workflow_integrator.py +2 -3
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/integration/instruction_integrator.py +6 -5
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/integration/mcp_integrator.py +50 -36
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/integration/prompt_integrator.py +2 -3
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/marketplace/audit.py +2 -1
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/marketplace/builder.py +21 -7
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/marketplace/client.py +87 -43
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/marketplace/version_check.py +6 -1
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/models/apm_package.py +1 -1
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/models/dependency/reference.py +2 -4
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/models/validation.py +6 -7
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/policy/discovery.py +2 -1
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/policy/parser.py +2 -1
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/policy/project_config.py +4 -2
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/primitives/discovery.py +3 -9
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/primitives/parser.py +10 -13
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/registry/client.py +74 -14
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/update_policy.py +1 -1
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/utils/content_hash.py +55 -2
- apm_cli-0.23.1/src/apm_cli/utils/yaml_io.py +401 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/workflow/parser.py +2 -2
- {apm_cli-0.22.0 → apm_cli-0.23.1/src/apm_cli.egg-info}/PKG-INFO +4 -4
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli.egg-info/SOURCES.txt +4 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli.egg-info/requires.txt +2 -2
- {apm_cli-0.22.0 → apm_cli-0.23.1}/tests/test_apm_package_models.py +3 -3
- {apm_cli-0.22.0 → apm_cli-0.23.1}/tests/test_enhanced_discovery.py +17 -17
- {apm_cli-0.22.0 → apm_cli-0.23.1}/tests/test_github_downloader.py +0 -1
- apm_cli-0.22.0/src/apm_cli/utils/yaml_io.py +0 -95
- {apm_cli-0.22.0 → apm_cli-0.23.1}/AUTHORS +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/LICENSE +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/setup.cfg +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/adapters/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/adapters/client/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/adapters/client/_mcp_runtime_args.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/adapters/client/antigravity.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/adapters/client/base.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/adapters/client/claude.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/adapters/client/codex.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/adapters/client/copilot.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/adapters/client/cursor.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/adapters/client/gemini.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/adapters/client/hermes.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/adapters/client/intellij.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/adapters/client/kiro.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/adapters/client/opencode.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/adapters/client/vscode.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/adapters/client/windsurf.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/adapters/package_manager/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/adapters/package_manager/base.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/adapters/package_manager/default_manager.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/bootstrap_mirror.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/bundle/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/bundle/lockfile_enrichment.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/cache/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/cache/git_cache.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/cache/http_cache.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/cache/integrity.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/cache/locking.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/cache/paths.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/cache/url_normalize.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/_apm_yml_writer.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/_helpers.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/approve.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/audit.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/cache.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/compile/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/config.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/deps/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/deps/why.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/doctor.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/experimental.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/find.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/list_cmd.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/lock.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/marketplace/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/marketplace/audit.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/marketplace/check.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/marketplace/doctor.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/marketplace/init.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/marketplace/migrate.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/marketplace/outdated.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/marketplace/plugin/add.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/marketplace/plugin/remove.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/marketplace/plugin/set.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/marketplace/validate.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/pack.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/plugin/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/plugin/init.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/policy.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/prune.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/publish.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/runtime.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/self_update.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/targets.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/uninstall/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/commands/uninstall/engine.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/compilation/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/compilation/build_id.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/compilation/claude_formatter.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/compilation/constants.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/compilation/constitution.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/compilation/constitution_block.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/compilation/context_optimizer.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/compilation/distributed_compiler.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/compilation/gemini_formatter.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/compilation/injector.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/compilation/link_resolver.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/compilation/managed_section.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/compilation/output_writer.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/compilation/template_builder.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/compilation/user_root_context.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/config.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/constants.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/core/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/core/apm_yml.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/core/auth.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/core/azure_cli.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/core/command_logger.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/core/conflict_detector.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/core/docker_args.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/core/errors.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/core/experimental.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/core/install_audit.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/core/null_logger.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/core/operations.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/core/safe_installer.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/core/scope.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/core/script_runner.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/core/target_detection.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/core/token_manager.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/_shared.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/apm_resolver.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/artifactory_entry.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/artifactory_orchestrator.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/bare_cache.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/clone_engine.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/dependency_graph.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/git_auth_env.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/git_file_transport.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/git_reference_resolver.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/git_remote_ops.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/git_semver_resolver.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/github_downloader_validation.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/host_backends.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/installed_package.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/outdated_row.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/path_anchoring.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/registry/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/registry/auth.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/registry/extractor.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/registry/feature_gate.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/registry/outdated.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/registry/resolver.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/registry/semver.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/registry_proxy.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/shared_clone_cache.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/tiered_ref_resolver.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/transport_selection.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/verifier.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/deps/why_walker.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/drift.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/export/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/export/authoring.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/export/declared_license.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/export/formats.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/export/purl.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/export/sbom.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/export/spdx.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/export/spdx_data.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/factory.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/artifactory_resolver.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/context.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/deployed_paths.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/errors.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/exec_gate.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/gitlab_resolver.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/heals/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/heals/base.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/heals/branch_ref_drift.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/heals/buggy_lockfile_recovery.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/helpers/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/helpers/security_scan.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/insecure_policy.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/integrity.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/lsp/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/lsp/integration.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/manifest_reconcile.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/mcp/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/mcp/args.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/mcp/command.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/mcp/conflicts.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/mcp/entry.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/mcp/registry.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/mcp/warnings.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/mcp/writer.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/package_selection.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/phases/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/phases/_redownload.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/phases/_skip_logic.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/phases/audit.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/phases/cleanup.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/phases/download.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/phases/finalize.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/phases/heal.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/phases/integrate.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/phases/local_content.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/phases/policy_gate.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/phases/policy_target_check.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/phases/post_deps_local.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/phases/resolve.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/phases/targets.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/pipeline.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/presentation/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/presentation/dry_run.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/registry_wiring.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/request.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/root_redirect.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/services.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/skill_path_migration.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/sources.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/summary.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/target_filter.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/install/validation.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/integration/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/integration/_shared.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/integration/base_integrator.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/integration/canvas_integrator.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/integration/cleanup.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/integration/copilot_app_db.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/integration/copilot_app_project.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/integration/copilot_app_ws.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/integration/copilot_cowork_paths.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/integration/coverage.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/integration/dispatch.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/integration/hook_file_routing.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/integration/hook_integrator.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/integration/kiro_hook_integrator.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/integration/lsp_integrator.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/integration/mcp_integrator_install.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/integration/opencode_frontmatter.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/integration/skill_integrator.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/integration/skill_transformer.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/integration/targets.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/integration/utils.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/marketplace/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/marketplace/_git_utils.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/marketplace/_io.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/marketplace/_shared.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/marketplace/auth_helpers.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/marketplace/diagnostics.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/marketplace/drift_check.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/marketplace/errors.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/marketplace/git_stderr.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/marketplace/init_template.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/marketplace/migration.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/marketplace/models.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/marketplace/output_mappers.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/marketplace/output_profiles.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/marketplace/ref_resolver.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/marketplace/registry.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/marketplace/resolver.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/marketplace/semver.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/marketplace/shadow_detector.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/marketplace/tag_pattern.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/marketplace/validator.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/marketplace/version_pins.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/marketplace/version_resolver.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/marketplace/yml_editor.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/marketplace/yml_schema.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/models/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/models/dependency/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/models/dependency/identity.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/models/dependency/lsp.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/models/dependency/mcp.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/models/dependency/subsets.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/models/dependency/types.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/models/format_detection.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/models/plugin.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/models/results.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/output/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/output/formatters.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/output/models.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/output/script_formatters.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/policy/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/policy/_constraint_pinning.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/policy/_help_text.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/policy/_shared.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/policy/ci_checks.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/policy/inheritance.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/policy/install_preflight.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/policy/matcher.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/policy/models.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/policy/outcome_routing.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/policy/policy_checks.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/policy/schema.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/primitives/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/primitives/models.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/registry/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/registry/integration.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/registry/operations.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/runtime/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/runtime/base.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/runtime/codex_runtime.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/runtime/copilot_runtime.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/runtime/factory.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/runtime/llm_runtime.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/runtime/manager.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/runtime/utils.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/security/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/security/audit_report.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/security/content_scanner.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/security/executables.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/security/external/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/security/external/base.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/security/external/gate.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/security/external/generic_sarif.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/security/external/options.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/security/external/registry.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/security/external/runner.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/security/external/sarif_ingest.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/security/external/skillspector.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/security/file_scanner.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/security/gate.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/utils/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/utils/archive.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/utils/atomic_io.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/utils/console.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/utils/diagnostics.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/utils/exclude.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/utils/file_ops.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/utils/git_env.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/utils/git_sparse.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/utils/github_host.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/utils/guards.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/utils/helpers.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/utils/install_tui.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/utils/normalization.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/utils/path_security.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/utils/paths.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/utils/patterns.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/utils/perf_stats.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/utils/reflink.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/utils/short_sha.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/utils/subprocess_env.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/utils/version_checker.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/version.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/workflow/__init__.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/workflow/discovery.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli/workflow/runner.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli.egg-info/dependency_links.txt +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli.egg-info/entry_points.txt +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/src/apm_cli.egg-info/top_level.txt +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/tests/test_apm_resolver.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/tests/test_codex_docker_args_fix.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/tests/test_codex_empty_string_and_defaults.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/tests/test_collision_integration.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/tests/test_console.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/tests/test_distributed_compilation.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/tests/test_empty_string_and_defaults.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/tests/test_github_downloader_token_precedence.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/tests/test_gitlab_git_transport.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/tests/test_lockfile.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/tests/test_runnable_prompts.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/tests/test_runtime_manager_token_precedence.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/tests/test_token_manager.py +0 -0
- {apm_cli-0.22.0 → apm_cli-0.23.1}/tests/test_virtual_package_multi_install.py +0 -0
|
@@ -372,7 +372,7 @@ THE SOFTWARE.
|
|
|
372
372
|
|
|
373
373
|
## Component. llm
|
|
374
374
|
|
|
375
|
-
- Version requirement: `>=0.
|
|
375
|
+
- Version requirement: `>=0.28`
|
|
376
376
|
- Upstream: https://github.com/simonw/llm
|
|
377
377
|
- SPDX: `Apache-2.0`
|
|
378
378
|
- Notes: No NOTICE or AUTHORS file present upstream; nothing additional to forward.
|
|
@@ -589,7 +589,7 @@ _Copyright Simon Willison (per PyPI author metadata; LICENSE file is the unmodif
|
|
|
589
589
|
|
|
590
590
|
## Component. llm-github-models
|
|
591
591
|
|
|
592
|
-
- Version requirement: `>=0.
|
|
592
|
+
- Version requirement: `>=0.18.0`
|
|
593
593
|
- Upstream: https://github.com/tonybaloney/llm-github-models
|
|
594
594
|
- SPDX: `Apache-2.0`
|
|
595
595
|
- Notes: Upstream LICENSE file declares MIT license text but PyPI metadata + classifiers say Apache-2.0. See Open Issues.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: apm-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.23.1
|
|
4
4
|
Summary: MCP configuration tool
|
|
5
5
|
Author-email: Daniel Meppiel <user@example.com>
|
|
6
6
|
License: MIT License
|
|
@@ -42,8 +42,8 @@ Requires-Dist: colorama>=0.4.6
|
|
|
42
42
|
Requires-Dist: pyyaml>=6.0.0
|
|
43
43
|
Requires-Dist: requests>=2.31.0
|
|
44
44
|
Requires-Dist: python-frontmatter>=1.0.0
|
|
45
|
-
Requires-Dist: llm>=0.
|
|
46
|
-
Requires-Dist: llm-github-models>=0.
|
|
45
|
+
Requires-Dist: llm>=0.28
|
|
46
|
+
Requires-Dist: llm-github-models>=0.18.0
|
|
47
47
|
Requires-Dist: tomli>=1.2.0; python_version < "3.11"
|
|
48
48
|
Requires-Dist: toml>=0.10.2
|
|
49
49
|
Requires-Dist: rich>=13.0.0
|
|
@@ -178,7 +178,7 @@ curl -sSL https://aka.ms/apm-unix | sh
|
|
|
178
178
|
irm https://aka.ms/apm-windows | iex
|
|
179
179
|
```
|
|
180
180
|
|
|
181
|
-
Native release binaries are published for macOS, Linux, and Windows x86_64. `apm update` reuses the matching platform installer.
|
|
181
|
+
Native release binaries are published for macOS, Linux, and Windows x86_64. `apm self-update` reuses the matching platform installer.
|
|
182
182
|
|
|
183
183
|
<details>
|
|
184
184
|
<summary>Other install methods</summary>
|
|
@@ -110,7 +110,7 @@ curl -sSL https://aka.ms/apm-unix | sh
|
|
|
110
110
|
irm https://aka.ms/apm-windows | iex
|
|
111
111
|
```
|
|
112
112
|
|
|
113
|
-
Native release binaries are published for macOS, Linux, and Windows x86_64. `apm update` reuses the matching platform installer.
|
|
113
|
+
Native release binaries are published for macOS, Linux, and Windows x86_64. `apm self-update` reuses the matching platform installer.
|
|
114
114
|
|
|
115
115
|
<details>
|
|
116
116
|
<summary>Other install methods</summary>
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "apm-cli"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.23.1"
|
|
8
8
|
description = "MCP configuration tool"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -27,8 +27,8 @@ dependencies = [
|
|
|
27
27
|
"pyyaml>=6.0.0",
|
|
28
28
|
"requests>=2.31.0",
|
|
29
29
|
"python-frontmatter>=1.0.0",
|
|
30
|
-
"llm>=0.
|
|
31
|
-
"llm-github-models>=0.
|
|
30
|
+
"llm>=0.28",
|
|
31
|
+
"llm-github-models>=0.18.0",
|
|
32
32
|
"tomli>=1.2.0; python_version<'3.11'",
|
|
33
33
|
"toml>=0.10.2",
|
|
34
34
|
"rich>=13.0.0",
|
|
@@ -47,6 +47,7 @@ from ..utils.path_security import (
|
|
|
47
47
|
ensure_path_within,
|
|
48
48
|
validate_path_segments,
|
|
49
49
|
)
|
|
50
|
+
from ..utils.yaml_io import load_yaml_str
|
|
50
51
|
|
|
51
52
|
_MAX_ZIP_ENTRIES = MAX_ZIP_ENTRIES
|
|
52
53
|
_MAX_ZIP_UNCOMPRESSED = MAX_ZIP_UNCOMPRESSED
|
|
@@ -93,7 +94,12 @@ def read_bundle_plugin_json(bundle_dir: Path) -> dict[str, Any]:
|
|
|
93
94
|
return {}
|
|
94
95
|
try:
|
|
95
96
|
data = json.loads(pj_path.read_text(encoding="utf-8"))
|
|
96
|
-
except (
|
|
97
|
+
except (OSError, ValueError, RecursionError):
|
|
98
|
+
# json.JSONDecodeError is a ValueError subclass; the wider set also
|
|
99
|
+
# fails closed on a deeply-nested JSON (RecursionError) or an
|
|
100
|
+
# oversized-integer literal (bare ValueError from int_max_str_digits)
|
|
101
|
+
# in an untrusted bundle's plugin.json -- the same fail-closed posture
|
|
102
|
+
# parse_script_file / _load_trust_store take.
|
|
97
103
|
return {}
|
|
98
104
|
return data if isinstance(data, dict) else {}
|
|
99
105
|
|
|
@@ -104,7 +110,7 @@ def _read_bundle_lockfile(bundle_dir: Path) -> dict[str, Any] | None:
|
|
|
104
110
|
if not lf_path.is_file():
|
|
105
111
|
return None
|
|
106
112
|
try:
|
|
107
|
-
data =
|
|
113
|
+
data = load_yaml_str(lf_path.read_text(encoding="utf-8"))
|
|
108
114
|
except (yaml.YAMLError, OSError):
|
|
109
115
|
return None
|
|
110
116
|
return data if isinstance(data, dict) else None
|
|
@@ -104,10 +104,10 @@ def pack_bundle(
|
|
|
104
104
|
# at pack time -- this is the publish gate for the AUTHOR.
|
|
105
105
|
if is_hybrid_root and not package.description and logger:
|
|
106
106
|
try:
|
|
107
|
-
|
|
107
|
+
from apm_cli.utils.yaml_io import load_frontmatter
|
|
108
108
|
|
|
109
109
|
with open(skill_md_path, encoding="utf-8") as _f:
|
|
110
|
-
_skill_post =
|
|
110
|
+
_skill_post = load_frontmatter(_f)
|
|
111
111
|
_skill_desc = _skill_post.metadata.get("description")
|
|
112
112
|
except Exception:
|
|
113
113
|
_skill_desc = None
|
|
@@ -246,7 +246,9 @@ def _collect_hooks_from_apm(apm_dir: Path) -> dict:
|
|
|
246
246
|
data = json.loads(f.read_text(encoding="utf-8"))
|
|
247
247
|
if isinstance(data, dict):
|
|
248
248
|
_deep_merge(hooks, data, overwrite=False)
|
|
249
|
-
except (
|
|
249
|
+
except (OSError, ValueError, RecursionError):
|
|
250
|
+
# Untrusted .apm/hooks/*.json: oversized-int -> bare ValueError,
|
|
251
|
+
# deep nest -> RecursionError. Fail closed (skip this file).
|
|
250
252
|
pass
|
|
251
253
|
return hooks
|
|
252
254
|
|
|
@@ -261,7 +263,9 @@ def _collect_hooks_from_root(package_root: Path) -> dict:
|
|
|
261
263
|
data = json.loads(hooks_file.read_text(encoding="utf-8"))
|
|
262
264
|
if isinstance(data, dict):
|
|
263
265
|
_deep_merge(hooks, data, overwrite=False)
|
|
264
|
-
except (
|
|
266
|
+
except (OSError, ValueError, RecursionError):
|
|
267
|
+
# Untrusted root hooks.json: fail closed (oversized-int ValueError /
|
|
268
|
+
# deep-nest RecursionError are not JSONDecodeError).
|
|
265
269
|
pass
|
|
266
270
|
# Directory
|
|
267
271
|
hooks_dir = package_root / "hooks"
|
|
@@ -272,7 +276,8 @@ def _collect_hooks_from_root(package_root: Path) -> dict:
|
|
|
272
276
|
data = json.loads(f.read_text(encoding="utf-8"))
|
|
273
277
|
if isinstance(data, dict):
|
|
274
278
|
_deep_merge(hooks, data, overwrite=False)
|
|
275
|
-
except (
|
|
279
|
+
except (OSError, ValueError, RecursionError):
|
|
280
|
+
# Untrusted .../hooks/*.json: fail closed (skip this file).
|
|
276
281
|
pass
|
|
277
282
|
return hooks
|
|
278
283
|
|
|
@@ -356,7 +361,11 @@ def _has_marketplace_block(apm_yml_path: Path) -> bool:
|
|
|
356
361
|
try:
|
|
357
362
|
import yaml
|
|
358
363
|
|
|
359
|
-
|
|
364
|
+
# Bounded loader so a hostile apm.yml cannot wedge the export with a
|
|
365
|
+
# merge/alias expansion bomb (fails closed as yaml.YAMLError).
|
|
366
|
+
from apm_cli.utils.yaml_io import load_yaml
|
|
367
|
+
|
|
368
|
+
data = load_yaml(apm_yml_path) or {}
|
|
360
369
|
except (OSError, yaml.YAMLError):
|
|
361
370
|
return False
|
|
362
371
|
return bool(data.get("marketplace"))
|
|
@@ -130,9 +130,12 @@ def unpack_bundle(
|
|
|
130
130
|
# Extract pack: metadata (written by apm pack) before structured parse
|
|
131
131
|
pack_meta: dict = {}
|
|
132
132
|
try:
|
|
133
|
-
import
|
|
133
|
+
from ..utils.yaml_io import load_yaml
|
|
134
134
|
|
|
135
|
-
|
|
135
|
+
# Bounded loader: an untrusted bundle lockfile cannot hang the
|
|
136
|
+
# unpacker with a merge-key bomb (the except below cannot catch a
|
|
137
|
+
# non-terminating safe_load loop).
|
|
138
|
+
raw = load_yaml(lockfile_path)
|
|
136
139
|
if isinstance(raw, dict):
|
|
137
140
|
val = raw.get("pack", {})
|
|
138
141
|
pack_meta = val if isinstance(val, dict) else {}
|
|
@@ -29,6 +29,7 @@ from apm_cli.commands.experimental import experimental
|
|
|
29
29
|
from apm_cli.commands.find import find as find_cmd
|
|
30
30
|
from apm_cli.commands.init import init
|
|
31
31
|
from apm_cli.commands.install import install
|
|
32
|
+
from apm_cli.commands.lifecycle import lifecycle
|
|
32
33
|
from apm_cli.commands.list_cmd import list as list_cmd
|
|
33
34
|
from apm_cli.commands.lock import lock
|
|
34
35
|
from apm_cli.commands.marketplace import marketplace
|
|
@@ -142,8 +143,12 @@ def cli(ctx, verbose: bool) -> None:
|
|
|
142
143
|
|
|
143
144
|
warnings.filterwarnings("ignore", category=AgentsTargetDeprecationWarning)
|
|
144
145
|
|
|
145
|
-
# Check for updates
|
|
146
|
-
if
|
|
146
|
+
# Check for updates only for known commands; skip on invalid input to fail fast.
|
|
147
|
+
if (
|
|
148
|
+
not ctx.resilient_parsing
|
|
149
|
+
and ctx.invoked_subcommand is not None
|
|
150
|
+
and ctx.command.get_command(ctx, ctx.invoked_subcommand) is not None
|
|
151
|
+
):
|
|
147
152
|
_check_and_notify_updates()
|
|
148
153
|
|
|
149
154
|
|
|
@@ -187,6 +192,7 @@ cli.add_command(mcp)
|
|
|
187
192
|
cli.add_command(policy)
|
|
188
193
|
cli.add_command(outdated_cmd, name="outdated")
|
|
189
194
|
cli.add_command(doctor)
|
|
195
|
+
cli.add_command(lifecycle)
|
|
190
196
|
cli.add_command(marketplace)
|
|
191
197
|
cli.add_command(find_cmd)
|
|
192
198
|
cli.add_command(marketplace_search, name="search")
|
|
@@ -69,8 +69,8 @@ def _display_single_file_summary(stats, c_status, c_hash, output_path, dry_run):
|
|
|
69
69
|
"[+] All validated",
|
|
70
70
|
)
|
|
71
71
|
table.add_row(
|
|
72
|
-
"
|
|
73
|
-
str(stats.get("
|
|
72
|
+
"Agents",
|
|
73
|
+
str(stats.get("agents", 0)),
|
|
74
74
|
"[+] All validated",
|
|
75
75
|
)
|
|
76
76
|
|
|
@@ -448,7 +448,7 @@ def _validate_project(logger: CommandLogger, dry_run: bool, source_root: Path) -
|
|
|
448
448
|
# Check if .apm directory has actual content
|
|
449
449
|
apm_dir = source_root / APM_DIR
|
|
450
450
|
local_apm_has_content = apm_dir.exists() and (
|
|
451
|
-
any(apm_dir.rglob("*.instructions.md")) or any(apm_dir.rglob("*.
|
|
451
|
+
any(apm_dir.rglob("*.instructions.md")) or any(apm_dir.rglob("*.agent.md"))
|
|
452
452
|
)
|
|
453
453
|
|
|
454
454
|
# If no primitive sources exist, check deeper to provide better feedback
|
|
@@ -457,20 +457,20 @@ def _validate_project(logger: CommandLogger, dry_run: bool, source_root: Path) -
|
|
|
457
457
|
has_empty_apm = (
|
|
458
458
|
apm_dir.exists()
|
|
459
459
|
and not any(apm_dir.rglob("*.instructions.md"))
|
|
460
|
-
and not any(apm_dir.rglob("*.
|
|
460
|
+
and not any(apm_dir.rglob("*.agent.md"))
|
|
461
461
|
)
|
|
462
462
|
|
|
463
463
|
if has_empty_apm:
|
|
464
464
|
logger.error("No instruction files found in .apm/ directory")
|
|
465
465
|
logger.progress(" To add instructions, create files like:")
|
|
466
466
|
logger.progress(" .apm/instructions/coding-standards.instructions.md")
|
|
467
|
-
logger.progress(" .apm/
|
|
467
|
+
logger.progress(" .apm/agents/backend-engineer.agent.md")
|
|
468
468
|
else:
|
|
469
469
|
logger.error("No APM content found to compile")
|
|
470
470
|
logger.progress(" To get started:")
|
|
471
471
|
logger.progress(" 1. Install APM dependencies: apm install <owner>/<repo>")
|
|
472
472
|
logger.progress(" 2. Or create local instructions: mkdir -p .apm/instructions")
|
|
473
|
-
logger.progress(" 3. Then create .instructions.md or .
|
|
473
|
+
logger.progress(" 3. Then create .instructions.md or .agent.md files")
|
|
474
474
|
|
|
475
475
|
if not dry_run: # Don't exit on dry-run to allow testing
|
|
476
476
|
sys.exit(1)
|
|
@@ -951,23 +951,23 @@ def _run_compilation(
|
|
|
951
951
|
help="Compile for all canonical targets. Equivalent to --target all.",
|
|
952
952
|
)
|
|
953
953
|
@click.option(
|
|
954
|
-
"--
|
|
954
|
+
"--force-instructions/--no-force-instructions",
|
|
955
955
|
"no_dedup",
|
|
956
|
-
is_flag=True,
|
|
957
956
|
default=False,
|
|
958
957
|
help=(
|
|
959
958
|
"Include the instructions section in CLAUDE.md even when .claude/rules/ is "
|
|
959
|
+
"already populated, and in AGENTS.md even when .github/instructions/ is "
|
|
960
960
|
"already populated. Overrides the default deduplication that normally omits "
|
|
961
|
-
"
|
|
962
|
-
"
|
|
961
|
+
"these sections to avoid duplicate context. Affects both the Claude and "
|
|
962
|
+
"Copilot (AGENTS.md) deduplication paths. Alias: --no-dedup."
|
|
963
963
|
),
|
|
964
964
|
)
|
|
965
965
|
@click.option(
|
|
966
|
-
"--
|
|
966
|
+
"--no-dedup",
|
|
967
967
|
"no_dedup",
|
|
968
968
|
is_flag=True,
|
|
969
969
|
default=False,
|
|
970
|
-
help="Alias for --
|
|
970
|
+
help="Alias for --force-instructions.",
|
|
971
971
|
hidden=True,
|
|
972
972
|
)
|
|
973
973
|
@click.option(
|
|
@@ -1073,7 +1073,7 @@ def compile( # noqa: PLR0913 -- Click handler
|
|
|
1073
1073
|
"compile_all": "--all",
|
|
1074
1074
|
"legacy_skill_paths": "--legacy-skill-paths",
|
|
1075
1075
|
"local_only": "--local-only",
|
|
1076
|
-
"no_dedup": "--no-
|
|
1076
|
+
"no_dedup": "--force-instructions/--no-force-instructions",
|
|
1077
1077
|
"no_links": "--no-links",
|
|
1078
1078
|
"output": "--output",
|
|
1079
1079
|
"root": "--root",
|
|
@@ -234,10 +234,6 @@ def _watch_mode(
|
|
|
234
234
|
observer.schedule(event_handler, ".github/agents", recursive=True)
|
|
235
235
|
watch_paths.append(".github/agents/")
|
|
236
236
|
|
|
237
|
-
if Path(".github/chatmodes").exists():
|
|
238
|
-
observer.schedule(event_handler, ".github/chatmodes", recursive=True)
|
|
239
|
-
watch_paths.append(".github/chatmodes/")
|
|
240
|
-
|
|
241
237
|
if Path(APM_YML_FILENAME).exists():
|
|
242
238
|
observer.schedule(event_handler, ".", recursive=False)
|
|
243
239
|
watch_paths.append(APM_YML_FILENAME)
|
|
@@ -105,7 +105,7 @@ def _count_package_files(package_path: Path) -> tuple[int, int]:
|
|
|
105
105
|
return 0, workflow_count
|
|
106
106
|
|
|
107
107
|
context_count = 0
|
|
108
|
-
context_dirs = ["instructions", "
|
|
108
|
+
context_dirs = ["instructions", "agents", "context"]
|
|
109
109
|
|
|
110
110
|
for context_dir in context_dirs:
|
|
111
111
|
context_path = apm_dir / context_dir
|
|
@@ -134,12 +134,12 @@ def _get_detailed_context_counts(package_path: Path) -> dict[str, int]:
|
|
|
134
134
|
"""Get detailed context file counts by type."""
|
|
135
135
|
apm_dir = package_path / APM_DIR
|
|
136
136
|
if not apm_dir.exists():
|
|
137
|
-
return {"instructions": 0, "
|
|
137
|
+
return {"instructions": 0, "agents": 0, "contexts": 0}
|
|
138
138
|
|
|
139
139
|
counts = {}
|
|
140
140
|
context_directories = {
|
|
141
141
|
"instructions": "instructions",
|
|
142
|
-
"
|
|
142
|
+
"agents": "agents",
|
|
143
143
|
"contexts": "context", # Note: directory is 'context', not 'contexts'
|
|
144
144
|
}
|
|
145
145
|
|
|
@@ -235,7 +235,7 @@ def _get_detailed_package_info(package_path: Path) -> dict[str, Any]:
|
|
|
235
235
|
"author": "Unknown",
|
|
236
236
|
"source": "unknown",
|
|
237
237
|
"install_path": str(package_path.resolve()),
|
|
238
|
-
"context_files": {"instructions": 0, "
|
|
238
|
+
"context_files": {"instructions": 0, "agents": 0, "contexts": 0},
|
|
239
239
|
"workflows": 0,
|
|
240
240
|
"hooks": 0,
|
|
241
241
|
}
|
|
@@ -718,7 +718,9 @@ def clean(dry_run: bool, yes: bool):
|
|
|
718
718
|
sys.exit(1)
|
|
719
719
|
|
|
720
720
|
|
|
721
|
-
@deps.command(
|
|
721
|
+
@deps.command(
|
|
722
|
+
help="DEPRECATED: use 'apm update' instead (strict superset). Update APM dependencies to latest refs"
|
|
723
|
+
)
|
|
722
724
|
@click.argument("packages", nargs=-1)
|
|
723
725
|
@click.option("--verbose", "-v", is_flag=True, help="Show detailed update information")
|
|
724
726
|
@click.option(
|
|
@@ -914,7 +916,9 @@ def update(packages, verbose, force, target, parallel_downloads, global_, legacy
|
|
|
914
916
|
logger.success("All packages already at latest refs.")
|
|
915
917
|
|
|
916
918
|
|
|
917
|
-
@deps.command(
|
|
919
|
+
@deps.command(
|
|
920
|
+
help="Show detailed package information (alias for 'apm view PACKAGE' for installed packages; prefer 'apm view' in new scripts)"
|
|
921
|
+
)
|
|
918
922
|
@click.argument("package", required=True)
|
|
919
923
|
def info(package: str):
|
|
920
924
|
"""Show detailed information about a specific package including context files and workflows."""
|
|
@@ -537,13 +537,15 @@ def _read_existing_targets(project_root: Path) -> list[str]:
|
|
|
537
537
|
legacy singular ``target:`` CSV/scalar form for backwards compatibility
|
|
538
538
|
with apm.yml files written before plural became canonical.
|
|
539
539
|
"""
|
|
540
|
-
import yaml
|
|
541
|
-
|
|
542
540
|
apm_yml_path = project_root / APM_YML_FILENAME
|
|
543
541
|
if not apm_yml_path.exists():
|
|
544
542
|
return []
|
|
545
543
|
try:
|
|
546
|
-
|
|
544
|
+
# Bounded loader so a hostile apm.yml cannot wedge target parsing with a
|
|
545
|
+
# merge/alias expansion bomb (fails closed -> empty target list).
|
|
546
|
+
from apm_cli.utils.yaml_io import load_yaml
|
|
547
|
+
|
|
548
|
+
data = load_yaml(apm_yml_path)
|
|
547
549
|
if not isinstance(data, dict):
|
|
548
550
|
return []
|
|
549
551
|
# Canonical plural form
|
|
@@ -47,8 +47,9 @@ from apm_cli.install.mcp.entry import _build_mcp_entry # noqa: F401
|
|
|
47
47
|
from apm_cli.install.mcp.writer import _add_mcp_to_apm_yml # noqa: F401
|
|
48
48
|
from apm_cli.install.package_resolution import (
|
|
49
49
|
GIT_PARENT_USER_SCOPE_ERROR,
|
|
50
|
+
apply_cli_skill_pin,
|
|
51
|
+
cli_skill_subset,
|
|
50
52
|
dependency_reference_to_yaml_entry,
|
|
51
|
-
normalize_and_merge_skill_subset,
|
|
52
53
|
persist_dependency_list_if_changed,
|
|
53
54
|
resolve_parsed_dependency_reference,
|
|
54
55
|
update_existing_dependency_entry_if_needed,
|
|
@@ -329,6 +330,7 @@ def _resolve_package_references(
|
|
|
329
330
|
scope=None,
|
|
330
331
|
allow_insecure=False,
|
|
331
332
|
skill_subset=None,
|
|
333
|
+
skill_subset_from_cli=False,
|
|
332
334
|
default_registry=None,
|
|
333
335
|
):
|
|
334
336
|
"""Validate, canonicalize, and resolve package references.
|
|
@@ -453,16 +455,15 @@ def _resolve_package_references(
|
|
|
453
455
|
)
|
|
454
456
|
canonical = dep_ref.to_canonical()
|
|
455
457
|
identity = dep_ref.get_identity()
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
)
|
|
458
|
+
apply_cli_skill_pin(
|
|
459
|
+
dep_ref,
|
|
460
|
+
skill_subset,
|
|
461
|
+
skill_subset_from_cli,
|
|
462
|
+
current_deps,
|
|
463
|
+
_apm_yml_entries,
|
|
464
|
+
dependency_reference_cls=DependencyReference,
|
|
465
|
+
logger=logger,
|
|
466
|
+
)
|
|
466
467
|
if marketplace_dep_ref is not None or direct_virtual_resolved:
|
|
467
468
|
_apm_yml_entries[canonical] = dependency_reference_to_yaml_entry(dep_ref)
|
|
468
469
|
except ValueError as e:
|
|
@@ -633,6 +634,7 @@ def _validate_and_add_packages_to_apm_yml(
|
|
|
633
634
|
scope=None,
|
|
634
635
|
allow_insecure=False,
|
|
635
636
|
skill_subset=None,
|
|
637
|
+
skill_subset_from_cli=False,
|
|
636
638
|
):
|
|
637
639
|
"""Validate packages exist and can be accessed, then add to apm.yml dependencies section.
|
|
638
640
|
|
|
@@ -701,6 +703,7 @@ def _validate_and_add_packages_to_apm_yml(
|
|
|
701
703
|
scope=scope,
|
|
702
704
|
allow_insecure=allow_insecure,
|
|
703
705
|
skill_subset=skill_subset,
|
|
706
|
+
skill_subset_from_cli=skill_subset_from_cli,
|
|
704
707
|
default_registry=_default_registry_for_cli,
|
|
705
708
|
)
|
|
706
709
|
|
|
@@ -888,7 +891,8 @@ def _handle_mcp_install(
|
|
|
888
891
|
@click.option(
|
|
889
892
|
"--runtime",
|
|
890
893
|
help=(
|
|
891
|
-
"Target specific runtime only (copilot, claude, codex, cursor, gemini, antigravity, intellij, kiro, opencode,
|
|
894
|
+
"Target specific runtime only (copilot, claude, codex, cursor, gemini, antigravity, intellij, kiro, opencode, windsurf) "
|
|
895
|
+
"(legacy alias for --target, single value only; prefer --target)"
|
|
892
896
|
),
|
|
893
897
|
)
|
|
894
898
|
@click.option("--exclude", help="Exclude specific runtime from installation")
|
|
@@ -1047,7 +1051,7 @@ def _handle_mcp_install(
|
|
|
1047
1051
|
"skill_names",
|
|
1048
1052
|
multiple=True,
|
|
1049
1053
|
metavar="NAME",
|
|
1050
|
-
help="Install only named skill(s) from a SKILL_BUNDLE. Repeatable. Persisted in apm.yml and apm.lock so bare 'apm install' is deterministic. Use --skill '*' to reset to all skills.",
|
|
1054
|
+
help="Install only named skill(s) from a SKILL_BUNDLE. Repeatable. Persisted in apm.yml and apm.lock so bare 'apm install' is deterministic. Additive across installs: a later --skill X adds X to the existing pin (union) rather than replacing it. Use --skill '*' (quote the asterisk in your shell) to reset to all skills; to drop a single skill, edit the skills: list in apm.yml then re-run apm install.",
|
|
1051
1055
|
)
|
|
1052
1056
|
@click.option(
|
|
1053
1057
|
"--no-policy",
|
|
@@ -1383,12 +1387,9 @@ def install( # noqa: PLR0913
|
|
|
1383
1387
|
)
|
|
1384
1388
|
|
|
1385
1389
|
# Normalize --skill: '*' means all (same as absent). Reject with --mcp.
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
raise click.UsageError("--skill cannot be combined with --mcp.")
|
|
1390
|
-
if not any(s == "*" for s in skill_names):
|
|
1391
|
-
_skill_subset = builtins.tuple(skill_names)
|
|
1390
|
+
if skill_names and mcp_name is not None:
|
|
1391
|
+
raise click.UsageError("--skill cannot be combined with --mcp.")
|
|
1392
|
+
_skill_subset = cli_skill_subset(skill_names)
|
|
1392
1393
|
|
|
1393
1394
|
if mcp_name is not None:
|
|
1394
1395
|
_handle_mcp_install(
|
|
@@ -1516,6 +1517,7 @@ def install( # noqa: PLR0913
|
|
|
1516
1517
|
scope=scope,
|
|
1517
1518
|
allow_insecure=allow_insecure,
|
|
1518
1519
|
skill_subset=_skill_subset,
|
|
1520
|
+
skill_subset_from_cli=bool(skill_names),
|
|
1519
1521
|
)
|
|
1520
1522
|
# Short-circuit: all packages failed validation -- nothing to install
|
|
1521
1523
|
if outcome.all_failed:
|