apm-cli 0.29.0__tar.gz → 0.30.0__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.29.0/src/apm_cli.egg-info → apm_cli-0.30.0}/PKG-INFO +19 -7
- {apm_cli-0.29.0 → apm_cli-0.30.0}/README.md +18 -6
- {apm_cli-0.29.0 → apm_cli-0.30.0}/pyproject.toml +2 -1
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/client/base.py +1 -4
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/client/codex.py +3 -2
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/client/copilot.py +3 -2
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/client/gemini.py +6 -2
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/client/intellij.py +69 -1
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/client/opencode.py +6 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/client/vscode.py +3 -2
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/agent_plugins/loader.py +6 -6
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/bundle/agent_plugin_exporter.py +7 -4
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/bundle/local_bundle.py +18 -41
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/bundle/packer.py +2 -4
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/bundle/plugin_exporter.py +2 -4
- apm_cli-0.30.0/src/apm_cli/bundle/plugin_layout.py +60 -0
- apm_cli-0.30.0/src/apm_cli/cache/cleanup.py +51 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/cache/git_cache.py +209 -76
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/cache/http_cache.py +12 -7
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/cache/url_normalize.py +7 -3
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/_helpers.py +3 -2
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/approve.py +75 -10
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/audit.py +16 -6
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/cache.py +41 -26
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/compile/cli.py +250 -42
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/compile/watcher.py +112 -57
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/config.py +31 -4
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/deps/cli.py +4 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/experimental.py +4 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/init.py +2 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/install.py +273 -265
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/lifecycle.py +2 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/lock.py +13 -14
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/marketplace/__init__.py +43 -245
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/marketplace/check.py +2 -1
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/marketplace/doctor.py +38 -10
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/marketplace/init.py +2 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/marketplace/plugin/add.py +2 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/marketplace/plugin/remove.py +2 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/marketplace/plugin/set.py +2 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/mcp.py +36 -29
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/pack.py +116 -19
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/plugin/init.py +2 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/prune.py +29 -1
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/publish.py +1 -1
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/self_update.py +18 -4
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/uninstall/cli.py +272 -78
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/uninstall/engine.py +255 -92
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/update.py +73 -10
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/compilation/agents_compiler.py +339 -118
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/compilation/build_id.py +1 -3
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/compilation/claude_formatter.py +2 -4
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/compilation/constants.py +21 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/compilation/context_optimizer.py +3 -5
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/compilation/distributed_compiler.py +39 -37
- apm_cli-0.30.0/src/apm_cli/compilation/footer.py +20 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/compilation/gemini_formatter.py +2 -2
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/compilation/inventory.py +26 -2
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/compilation/output_writer.py +27 -5
- apm_cli-0.30.0/src/apm_cli/compilation/root_context_protection.py +121 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/compilation/template_builder.py +6 -8
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/compilation/user_root_context.py +4 -5
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/config.py +119 -25
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/apm_yml.py +70 -6
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/auth.py +246 -110
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/build_orchestrator.py +122 -27
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/command_logger.py +101 -6
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/deployment_ledger.py +86 -21
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/experimental.py +4 -14
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/host_providers.py +60 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/lifecycle_scripts.py +15 -8
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/null_logger.py +5 -2
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/scope.py +8 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/target_catalog.py +1 -1
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/target_detection.py +29 -4
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/token_manager.py +9 -4
- apm_cli-0.30.0/src/apm_cli/deps/_shared.py +244 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/apm_resolver.py +271 -54
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/artifactory_entry.py +31 -5
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/artifactory_orchestrator.py +22 -10
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/bare_cache.py +122 -46
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/clone_engine.py +180 -78
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/download_strategies.py +87 -36
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/git_auth_env.py +14 -11
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/git_file_transport.py +51 -17
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/git_reference_resolver.py +109 -47
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/git_remote_ops.py +71 -4
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/github_downloader.py +234 -130
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/github_downloader_validation.py +234 -96
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/github_rate_limit.py +15 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/host_backends.py +4 -3
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/lockfile.py +142 -25
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/path_anchoring.py +78 -17
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/plugin_parser.py +228 -74
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/reachability.py +16 -2
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/registry/auth.py +31 -5
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/registry/client.py +56 -2
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/registry/config_loader.py +8 -4
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/registry/feature_gate.py +8 -4
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/registry/outdated.py +1 -1
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/registry/resolver.py +10 -13
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/revision_pins.py +55 -10
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/tiered_ref_resolver.py +1 -1
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/transport_selection.py +192 -66
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/drift.py +3 -11
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/audit_replay.py +11 -1
- apm_cli-0.30.0/src/apm_cli/install/audit_target_roots.py +79 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/context.py +1 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/deployed_paths.py +14 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/drift.py +53 -31
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/drift_render.py +15 -0
- apm_cli-0.30.0/src/apm_cli/install/dry_run_plan.py +133 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/errors.py +14 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/exec_gate.py +9 -24
- apm_cli-0.30.0/src/apm_cli/install/finalization.py +19 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/helpers/ref_reuse.py +188 -38
- apm_cli-0.30.0/src/apm_cli/install/legacy_plugin_compat.py +264 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/local_bundle_handler.py +99 -35
- apm_cli-0.30.0/src/apm_cli/install/local_bundle_paths.py +206 -0
- apm_cli-0.30.0/src/apm_cli/install/locking.py +143 -0
- apm_cli-0.30.0/src/apm_cli/install/lsp/integration.py +486 -0
- apm_cli-0.30.0/src/apm_cli/install/manifest_helpers.py +98 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/manifest_reconcile.py +122 -26
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/mcp/command.py +109 -18
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/mcp/conflicts.py +2 -9
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/mcp/integration.py +23 -15
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/mcp/ownership.py +23 -1
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/mcp/registry.py +85 -62
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/outcome.py +59 -10
- apm_cli-0.30.0/src/apm_cli/install/package_selection.py +45 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/phases/integrate.py +3 -6
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/phases/local_content.py +2 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/phases/lockfile.py +12 -1
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/phases/resolve.py +107 -112
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/phases/targets.py +33 -28
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/pipeline.py +12 -21
- apm_cli-0.30.0/src/apm_cli/install/presentation/dry_run.py +107 -0
- apm_cli-0.30.0/src/apm_cli/install/primitive_classification.py +245 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/registry_wiring.py +7 -3
- apm_cli-0.30.0/src/apm_cli/install/resolution_staging.py +356 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/service.py +1 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/service_integration.py +12 -4
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/services.py +60 -71
- apm_cli-0.30.0/src/apm_cli/install/source_helpers.py +56 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/sources.py +83 -133
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/summary.py +39 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/target_filter.py +19 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/target_hints.py +3 -1
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/template.py +13 -28
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/transaction.py +82 -24
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/validation.py +192 -190
- apm_cli-0.30.0/src/apm_cli/integration/_shared.py +92 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/agent_integrator.py +55 -11
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/base_integrator.py +118 -11
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/cleanup.py +14 -1
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/hook_integrator.py +34 -32
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/instruction_integrator.py +285 -123
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/lsp_integrator.py +360 -43
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/mcp_config_view.py +39 -34
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/mcp_integrator.py +217 -33
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/mcp_integrator_install.py +225 -42
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/skill_integrator.py +12 -3
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/skill_support.py +6 -1
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/targets.py +63 -13
- apm_cli-0.30.0/src/apm_cli/marketplace/_git_utils.py +12 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/builder.py +347 -97
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/client.py +77 -38
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/drift_check.py +44 -12
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/errors.py +6 -4
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/models.py +32 -41
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/ref_resolver.py +111 -43
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/registry.py +1 -1
- apm_cli-0.30.0/src/apm_cli/marketplace/source_identity.py +264 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/apm_package.py +45 -13
- apm_cli-0.30.0/src/apm_cli/models/dependency/host_virtual.py +364 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/dependency/lsp.py +2 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/dependency/mcp.py +26 -16
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/dependency/reference.py +179 -159
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/format_detection.py +49 -23
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/results.py +2 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/validation.py +48 -17
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/policy/_gitlab.py +8 -5
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/policy/ci_checks.py +181 -32
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/policy/discovery.py +16 -37
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/policy/inheritance.py +2 -4
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/policy/policy_checks.py +28 -6
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/policy/project_config.py +12 -4
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/primitives/discovery.py +27 -103
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/registry/client.py +173 -25
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/registry/operations.py +75 -17
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/security/content_scanner.py +31 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/security/executables.py +241 -55
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/security/file_scanner.py +40 -3
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/security/gate.py +9 -4
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/atomic_io.py +36 -5
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/diagnostics.py +2 -0
- apm_cli-0.30.0/src/apm_cli/utils/git_env.py +1524 -0
- apm_cli-0.30.0/src/apm_cli/utils/git_sparse.py +309 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/github_host.py +22 -87
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/patterns.py +5 -11
- apm_cli-0.30.0/src/apm_cli/utils/staging_guard.py +63 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/version_checker.py +131 -18
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/yaml_io.py +78 -35
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/version.py +3 -1
- {apm_cli-0.29.0 → apm_cli-0.30.0/src/apm_cli.egg-info}/PKG-INFO +19 -7
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli.egg-info/SOURCES.txt +14 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/tests/test_apm_package_models.py +39 -3
- {apm_cli-0.29.0 → apm_cli-0.30.0}/tests/test_apm_resolver.py +107 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/tests/test_github_downloader.py +153 -121
- {apm_cli-0.29.0 → apm_cli-0.30.0}/tests/test_gitlab_git_transport.py +85 -3
- {apm_cli-0.29.0 → apm_cli-0.30.0}/tests/test_lockfile.py +208 -1
- {apm_cli-0.29.0 → apm_cli-0.30.0}/tests/test_token_manager.py +14 -2
- apm_cli-0.29.0/src/apm_cli/bundle/plugin_layout.py +0 -24
- apm_cli-0.29.0/src/apm_cli/deps/_shared.py +0 -64
- apm_cli-0.29.0/src/apm_cli/install/local_bundle_paths.py +0 -93
- apm_cli-0.29.0/src/apm_cli/install/lsp/integration.py +0 -253
- apm_cli-0.29.0/src/apm_cli/install/package_selection.py +0 -26
- apm_cli-0.29.0/src/apm_cli/install/presentation/dry_run.py +0 -92
- apm_cli-0.29.0/src/apm_cli/install/resolution_staging.py +0 -135
- apm_cli-0.29.0/src/apm_cli/integration/_shared.py +0 -71
- apm_cli-0.29.0/src/apm_cli/marketplace/_git_utils.py +0 -19
- apm_cli-0.29.0/src/apm_cli/utils/git_env.py +0 -113
- apm_cli-0.29.0/src/apm_cli/utils/git_sparse.py +0 -62
- {apm_cli-0.29.0 → apm_cli-0.30.0}/AUTHORS +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/LICENSE +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/NOTICE +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/setup.cfg +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/client/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/client/_mcp_runtime_args.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/client/antigravity.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/client/claude.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/client/cursor.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/client/hermes.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/client/kiro.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/client/windsurf.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/package_manager/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/package_manager/base.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/package_manager/default_manager.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/agent_plugins/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/agent_plugins/assets.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/agent_plugins/constants.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/agent_plugins/errors.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/agent_plugins/io.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/agent_plugins/ir.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/agent_plugins/projection.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/agent_plugins/validation.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/bootstrap_mirror.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/bundle/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/bundle/attest.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/bundle/claude_plugin_exporter.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/bundle/export_common.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/bundle/formats.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/bundle/lockfile_enrichment.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/bundle/reproducible_archive.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/bundle/unpacker.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/cache/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/cache/integrity.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/cache/locking.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/cache/paths.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/cli.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/_apm_yml_writer.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/compile/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/deps/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/deps/_utils.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/deps/why.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/doctor.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/find.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/list_cmd.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/marketplace/audit.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/marketplace/migrate.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/marketplace/outdated.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/marketplace/plugin/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/marketplace/validate.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/outdated.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/plugin/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/policy.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/run.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/runtime.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/targets.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/uninstall/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/uninstall/lockfile_state.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/view.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/compilation/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/compilation/constitution.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/compilation/constitution_block.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/compilation/injector.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/compilation/link_resolver.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/compilation/managed_section.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/constants.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/copilot_plugins/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/copilot_plugins/capability.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/copilot_plugins/catalog.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/copilot_plugins/constants.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/copilot_plugins/registrar.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/copilot_plugins/settings.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/_child_tls/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/_child_tls/_apm_tls.pth +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/_child_tls/_apm_tls_bootstrap.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/azure_cli.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/conflict_detector.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/deployment_state.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/docker_args.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/errors.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/install_audit.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/operations.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/output_mode.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/plugin_manifest.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/project_name.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/safe_installer.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/script_executors.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/script_runner.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/script_trust.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/tls_trust.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/aggregator.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/dependency_graph.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/git_semver_resolver.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/installed_package.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/outdated_ref_cache.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/outdated_row.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/package_validator.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/registry/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/registry/extractor.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/registry/semver.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/registry_proxy.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/shared_clone_cache.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/verifier.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/why_walker.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/export/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/export/authoring.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/export/declared_license.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/export/formats.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/export/purl.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/export/sbom.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/export/spdx.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/export/spdx_data.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/factory.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/hook_contract.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/argv.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/artifactory_resolver.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/cache_pin.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/deployable_source_plan.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/gitlab_resolver.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/heals/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/heals/base.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/heals/branch_ref_drift.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/heals/buggy_lockfile_recovery.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/helpers/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/helpers/no_work.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/helpers/ref_seed.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/helpers/security_scan.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/insecure_policy.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/integrity.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/lsp/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/mcp/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/mcp/args.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/mcp/entry.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/mcp/warnings.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/mcp/writer.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/native_plugin_admission.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/package_resolution.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/phases/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/phases/_redownload.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/phases/_skip_logic.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/phases/audit.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/phases/cleanup.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/phases/copilot_plugins.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/phases/download.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/phases/finalize.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/phases/heal.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/phases/policy_gate.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/phases/policy_target_check.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/phases/post_deps_local.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/plan.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/presentation/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/request.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/root_redirect.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/skill_path_migration.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/target_warnings.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/_hook_dropped_targets.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/canvas_integrator.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/command_integrator.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/copilot_app_db.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/copilot_app_project.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/copilot_app_workflow_integrator.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/copilot_app_ws.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/copilot_cowork_paths.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/coverage.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/dispatch.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/hook_bundle.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/hook_command_paths.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/hook_command_warnings.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/hook_file_routing.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/hook_ir.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/hook_native_formats.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/hook_ownership.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/hook_reintegration.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/hook_source_selection.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/kiro_hook_integrator.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/opencode_frontmatter.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/prompt_integrator.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/skill_package_routing.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/skill_transformer.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/utils.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/_io.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/_shared.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/audit.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/auth_helpers.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/diagnostics.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/git_stderr.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/init_template.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/migration.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/output_mappers.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/output_profiles.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/resolver.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/semver.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/shadow_detector.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/tag_pattern.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/validator.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/version_check.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/version_pins.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/version_resolver.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/yml_editor.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/yml_schema.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/dependency/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/dependency/identity.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/dependency/materialization.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/dependency/object_fields.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/dependency/provider_coordinates.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/dependency/registry_entry.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/dependency/selection.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/dependency/subsets.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/dependency/types.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/manifest_contract.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/plugin.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/output/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/output/formatters.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/output/models.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/output/script_formatters.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/policy/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/policy/_constraint_pinning.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/policy/_help_text.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/policy/_shared.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/policy/install_preflight.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/policy/matcher.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/policy/models.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/policy/outcome_routing.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/policy/parser.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/policy/schema.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/primitives/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/primitives/models.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/primitives/parser.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/registry/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/registry/integration.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/runtime/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/runtime/base.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/runtime/codex_runtime.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/runtime/copilot_runtime.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/runtime/factory.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/runtime/llm_runtime.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/runtime/manager.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/runtime/registry.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/runtime/utils.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/security/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/security/audit_report.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/security/external/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/security/external/base.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/security/external/gate.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/security/external/generic_sarif.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/security/external/options.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/security/external/registry.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/security/external/runner.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/security/external/sarif_ingest.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/security/external/skillspector.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/update_policy.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/archive.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/console.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/content_hash.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/exclude.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/file_ops.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/guards.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/helpers.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/install_tui.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/net.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/normalization.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/path_security.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/paths.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/perf_stats.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/reflink.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/short_sha.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/subprocess_env.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/workflow/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/workflow/discovery.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/workflow/parser.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/workflow/runner.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli.egg-info/dependency_links.txt +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli.egg-info/entry_points.txt +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli.egg-info/requires.txt +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli.egg-info/top_level.txt +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/tests/test_codex_docker_args_fix.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/tests/test_codex_empty_string_and_defaults.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/tests/test_collision_integration.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/tests/test_console.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/tests/test_distributed_compilation.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/tests/test_empty_string_and_defaults.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/tests/test_enhanced_discovery.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/tests/test_github_downloader_token_precedence.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/tests/test_runnable_prompts.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/tests/test_runtime_manager_token_precedence.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.30.0}/tests/test_virtual_package_multi_install.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: apm-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.30.0
|
|
4
4
|
Summary: MCP configuration tool
|
|
5
5
|
Author-email: Daniel Meppiel <user@example.com>
|
|
6
6
|
License: MIT License
|
|
@@ -170,7 +170,16 @@ apm-policy.yml governs what gets installed; your agent harness governs what runs
|
|
|
170
170
|
|
|
171
171
|
## Get Started
|
|
172
172
|
|
|
173
|
-
####
|
|
173
|
+
#### macOS with Homebrew
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
brew install apm
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
No custom tap is required. Homebrew manages installation and updates:
|
|
180
|
+
use `brew upgrade apm`, not `apm self-update`.
|
|
181
|
+
|
|
182
|
+
#### Linux / macOS without Homebrew
|
|
174
183
|
|
|
175
184
|
```bash
|
|
176
185
|
curl -sSL https://aka.ms/apm-unix | sh
|
|
@@ -182,17 +191,17 @@ curl -sSL https://aka.ms/apm-unix | sh
|
|
|
182
191
|
irm https://aka.ms/apm-windows | iex
|
|
183
192
|
```
|
|
184
193
|
|
|
185
|
-
Native release binaries are published for macOS, Linux, and Windows x86_64.
|
|
194
|
+
Native release binaries are published for macOS, Linux, and Windows x86_64.
|
|
195
|
+
For standalone installations, `apm self-update` reuses the matching platform installer.
|
|
196
|
+
You do not need Homebrew to use APM.
|
|
186
197
|
|
|
187
198
|
<details>
|
|
188
|
-
<summary>Other install methods</summary>
|
|
199
|
+
<summary>Other install methods: pip and Scoop</summary>
|
|
189
200
|
|
|
190
201
|
#### Linux / macOS
|
|
191
202
|
|
|
192
203
|
```bash
|
|
193
|
-
#
|
|
194
|
-
brew install microsoft/apm/apm
|
|
195
|
-
# pip
|
|
204
|
+
# pip (Python 3.10+)
|
|
196
205
|
pip install apm-cli
|
|
197
206
|
```
|
|
198
207
|
|
|
@@ -208,6 +217,9 @@ pip install apm-cli
|
|
|
208
217
|
|
|
209
218
|
</details>
|
|
210
219
|
|
|
220
|
+
Already using the Microsoft Homebrew tap? See the
|
|
221
|
+
[migration guide](https://microsoft.github.io/apm/getting-started/installation/#migrate-from-the-microsoft-tap).
|
|
222
|
+
|
|
211
223
|
Then start adding packages:
|
|
212
224
|
|
|
213
225
|
```bash
|
|
@@ -98,7 +98,16 @@ apm-policy.yml governs what gets installed; your agent harness governs what runs
|
|
|
98
98
|
|
|
99
99
|
## Get Started
|
|
100
100
|
|
|
101
|
-
####
|
|
101
|
+
#### macOS with Homebrew
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
brew install apm
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
No custom tap is required. Homebrew manages installation and updates:
|
|
108
|
+
use `brew upgrade apm`, not `apm self-update`.
|
|
109
|
+
|
|
110
|
+
#### Linux / macOS without Homebrew
|
|
102
111
|
|
|
103
112
|
```bash
|
|
104
113
|
curl -sSL https://aka.ms/apm-unix | sh
|
|
@@ -110,17 +119,17 @@ curl -sSL https://aka.ms/apm-unix | sh
|
|
|
110
119
|
irm https://aka.ms/apm-windows | iex
|
|
111
120
|
```
|
|
112
121
|
|
|
113
|
-
Native release binaries are published for macOS, Linux, and Windows x86_64.
|
|
122
|
+
Native release binaries are published for macOS, Linux, and Windows x86_64.
|
|
123
|
+
For standalone installations, `apm self-update` reuses the matching platform installer.
|
|
124
|
+
You do not need Homebrew to use APM.
|
|
114
125
|
|
|
115
126
|
<details>
|
|
116
|
-
<summary>Other install methods</summary>
|
|
127
|
+
<summary>Other install methods: pip and Scoop</summary>
|
|
117
128
|
|
|
118
129
|
#### Linux / macOS
|
|
119
130
|
|
|
120
131
|
```bash
|
|
121
|
-
#
|
|
122
|
-
brew install microsoft/apm/apm
|
|
123
|
-
# pip
|
|
132
|
+
# pip (Python 3.10+)
|
|
124
133
|
pip install apm-cli
|
|
125
134
|
```
|
|
126
135
|
|
|
@@ -136,6 +145,9 @@ pip install apm-cli
|
|
|
136
145
|
|
|
137
146
|
</details>
|
|
138
147
|
|
|
148
|
+
Already using the Microsoft Homebrew tap? See the
|
|
149
|
+
[migration guide](https://microsoft.github.io/apm/getting-started/installation/#migrate-from-the-microsoft-tap).
|
|
150
|
+
|
|
139
151
|
Then start adding packages:
|
|
140
152
|
|
|
141
153
|
```bash
|
|
@@ -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.30.0"
|
|
8
8
|
description = "MCP configuration tool"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -219,4 +219,5 @@ markers = [
|
|
|
219
219
|
"req: binds a test to one or more OpenAPM req-XXX ids (spec-conformance suite)",
|
|
220
220
|
"lifecycle_smoke: promoted to the required PR-time Lifecycle Smoke (Linux) job -- see ci.yml's lifecycle-smoke job and docs/src/content/docs/contributing/integration-testing.md",
|
|
221
221
|
"lifecycle_merge_group: unique lifecycle contracts retained in the full merge-group integration suite",
|
|
222
|
+
"xdist_group(name): assigns HOME-mutating tests to one pytest-xdist loadgroup for process-level serialization",
|
|
222
223
|
]
|
|
@@ -7,7 +7,7 @@ from dataclasses import dataclass
|
|
|
7
7
|
from pathlib import Path
|
|
8
8
|
from typing import Any, ClassVar
|
|
9
9
|
|
|
10
|
-
from ...models.dependency.mcp import
|
|
10
|
+
from ...models.dependency.mcp import _EXTRA_DENYLIST, TrustedEnvLiteral
|
|
11
11
|
from ...utils.console import _rich_error, _rich_warning
|
|
12
12
|
|
|
13
13
|
_INPUT_VAR_RE = re.compile(r"\$\{input:([^}]+)\}")
|
|
@@ -185,9 +185,6 @@ def _docker_image_repository(reference: str) -> str:
|
|
|
185
185
|
# not be injectable via passthrough. Enforced unconditionally per adapter path
|
|
186
186
|
# (NOT guarded by "key absent from config"), so it also closes paths that do not
|
|
187
187
|
# pre-set the key. Security boundary for PR #1765 / issue #1670.
|
|
188
|
-
_EXTRA_DENYLIST = _RESERVED_EXTRA_KEYS | frozenset({"http_headers"})
|
|
189
|
-
|
|
190
|
-
|
|
191
188
|
@dataclass(frozen=True)
|
|
192
189
|
class _MCPLauncherArgumentGroup:
|
|
193
190
|
"""One atomic registry argument and its rendered argv values."""
|
|
@@ -42,8 +42,9 @@ class CodexClientAdapter(MCPClientAdapter):
|
|
|
42
42
|
|
|
43
43
|
Args:
|
|
44
44
|
registry_url (str, optional): URL of the MCP registry.
|
|
45
|
-
If not provided,
|
|
46
|
-
|
|
45
|
+
If not provided, resolves the MCP_REGISTRY_URL env var,
|
|
46
|
+
then ``apm config set mcp-registry-url``, then the public
|
|
47
|
+
default (see ``registry.client.resolve_mcp_registry_url``).
|
|
47
48
|
project_root: Project root used to resolve project-local Codex
|
|
48
49
|
config paths.
|
|
49
50
|
user_scope: Whether the adapter should resolve user-scope Codex
|
|
@@ -92,8 +92,9 @@ class CopilotClientAdapter(MCPClientAdapter):
|
|
|
92
92
|
|
|
93
93
|
Args:
|
|
94
94
|
registry_url (str, optional): URL of the MCP registry.
|
|
95
|
-
If not provided,
|
|
96
|
-
|
|
95
|
+
If not provided, resolves the MCP_REGISTRY_URL env var,
|
|
96
|
+
then ``apm config set mcp-registry-url``, then the public
|
|
97
|
+
default (see ``registry.client.resolve_mcp_registry_url``).
|
|
97
98
|
project_root: Project root context passed through to the base
|
|
98
99
|
adapter for scope-aware operations.
|
|
99
100
|
user_scope: Whether the adapter should resolve user-scope config
|
|
@@ -31,6 +31,7 @@ import logging
|
|
|
31
31
|
import os
|
|
32
32
|
from pathlib import Path
|
|
33
33
|
|
|
34
|
+
from ...utils.atomic_io import atomic_write_text
|
|
34
35
|
from ...utils.console import _rich_error, _rich_success
|
|
35
36
|
from .copilot import CopilotClientAdapter
|
|
36
37
|
|
|
@@ -102,8 +103,11 @@ class GeminiClientAdapter(CopilotClientAdapter):
|
|
|
102
103
|
"Creating %s for %s user configuration", config_path.parent, self.target_name
|
|
103
104
|
)
|
|
104
105
|
config_path.parent.mkdir(parents=True, exist_ok=True)
|
|
105
|
-
|
|
106
|
-
|
|
106
|
+
atomic_write_text(
|
|
107
|
+
config_path,
|
|
108
|
+
json.dumps(current_config, indent=2),
|
|
109
|
+
new_file_mode=0o600,
|
|
110
|
+
)
|
|
107
111
|
os.chmod(config_path, 0o600)
|
|
108
112
|
|
|
109
113
|
def get_current_config(self):
|
|
@@ -91,6 +91,74 @@ def _legacy_intellij_config_dir() -> Path | None:
|
|
|
91
91
|
return root.joinpath(*_CONFIG_SUFFIX)
|
|
92
92
|
|
|
93
93
|
|
|
94
|
+
def _strip_jsonc_comments(raw: str) -> str:
|
|
95
|
+
"""Strip JSONC comments while preserving string contents and line layout."""
|
|
96
|
+
chars = list(raw)
|
|
97
|
+
in_string = False
|
|
98
|
+
escaped = False
|
|
99
|
+
i = 0
|
|
100
|
+
while i < len(chars):
|
|
101
|
+
ch = chars[i]
|
|
102
|
+
if in_string:
|
|
103
|
+
if escaped:
|
|
104
|
+
escaped = False
|
|
105
|
+
elif ch == "\\":
|
|
106
|
+
escaped = True
|
|
107
|
+
elif ch == '"':
|
|
108
|
+
in_string = False
|
|
109
|
+
i += 1
|
|
110
|
+
continue
|
|
111
|
+
if ch == '"':
|
|
112
|
+
in_string = True
|
|
113
|
+
i += 1
|
|
114
|
+
continue
|
|
115
|
+
if ch == "/" and i + 1 < len(chars) and chars[i + 1] == "/":
|
|
116
|
+
j = i
|
|
117
|
+
while j < len(chars) and chars[j] not in "\r\n":
|
|
118
|
+
chars[j] = " "
|
|
119
|
+
j += 1
|
|
120
|
+
i = j
|
|
121
|
+
continue
|
|
122
|
+
if ch == "/" and i + 1 < len(chars) and chars[i + 1] == "*":
|
|
123
|
+
end = raw.find("*/", i + 2)
|
|
124
|
+
if end == -1:
|
|
125
|
+
return raw
|
|
126
|
+
for j in range(i, end + 2):
|
|
127
|
+
if chars[j] not in "\r\n":
|
|
128
|
+
chars[j] = " "
|
|
129
|
+
i = end + 2
|
|
130
|
+
continue
|
|
131
|
+
i += 1
|
|
132
|
+
return "".join(chars)
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def _strip_jsonc_trailing_commas(raw: str) -> str:
|
|
136
|
+
"""Blank trailing commas outside strings so strict JSON parsing accepts JSONC."""
|
|
137
|
+
chars = list(raw)
|
|
138
|
+
in_string = False
|
|
139
|
+
escaped = False
|
|
140
|
+
for index, char in enumerate(chars):
|
|
141
|
+
if in_string:
|
|
142
|
+
if escaped:
|
|
143
|
+
escaped = False
|
|
144
|
+
elif char == "\\":
|
|
145
|
+
escaped = True
|
|
146
|
+
elif char == '"':
|
|
147
|
+
in_string = False
|
|
148
|
+
continue
|
|
149
|
+
if char == '"':
|
|
150
|
+
in_string = True
|
|
151
|
+
continue
|
|
152
|
+
if char != ",":
|
|
153
|
+
continue
|
|
154
|
+
next_index = index + 1
|
|
155
|
+
while next_index < len(chars) and chars[next_index].isspace():
|
|
156
|
+
next_index += 1
|
|
157
|
+
if next_index < len(chars) and chars[next_index] in "}]":
|
|
158
|
+
chars[index] = " "
|
|
159
|
+
return "".join(chars)
|
|
160
|
+
|
|
161
|
+
|
|
94
162
|
def _config_without_servers(
|
|
95
163
|
config: dict,
|
|
96
164
|
names: set[str],
|
|
@@ -153,7 +221,7 @@ class IntelliJClientAdapter(CopilotClientAdapter):
|
|
|
153
221
|
"Check its permissions and UTF-8 encoding, then rerun apm install."
|
|
154
222
|
) from exc
|
|
155
223
|
try:
|
|
156
|
-
config = json.loads(raw)
|
|
224
|
+
config = json.loads(_strip_jsonc_trailing_commas(_strip_jsonc_comments(raw)))
|
|
157
225
|
except json.JSONDecodeError as exc:
|
|
158
226
|
raise IntelliJConfigError(
|
|
159
227
|
f"JetBrains Copilot MCP config at '{path}' is malformed JSON ({exc}). "
|
|
@@ -30,6 +30,7 @@ import json
|
|
|
30
30
|
import os
|
|
31
31
|
from pathlib import Path
|
|
32
32
|
|
|
33
|
+
from ...models.dependency.mcp import _EXTRA_DENYLIST
|
|
33
34
|
from .copilot import CopilotClientAdapter
|
|
34
35
|
|
|
35
36
|
|
|
@@ -153,4 +154,9 @@ class OpenCodeClientAdapter(CopilotClientAdapter):
|
|
|
153
154
|
if env:
|
|
154
155
|
entry["environment"] = dict(env)
|
|
155
156
|
|
|
157
|
+
translated_keys = _EXTRA_DENYLIST
|
|
158
|
+
for key, value in copilot_entry.items():
|
|
159
|
+
if key not in translated_keys and key not in entry:
|
|
160
|
+
entry[key] = value
|
|
161
|
+
|
|
156
162
|
return entry
|
|
@@ -49,8 +49,9 @@ class VSCodeClientAdapter(MCPClientAdapter):
|
|
|
49
49
|
|
|
50
50
|
Args:
|
|
51
51
|
registry_url (str, optional): URL of the MCP registry.
|
|
52
|
-
If not provided,
|
|
53
|
-
|
|
52
|
+
If not provided, resolves the MCP_REGISTRY_URL env var,
|
|
53
|
+
then ``apm config set mcp-registry-url``, then the public
|
|
54
|
+
default (see ``registry.client.resolve_mcp_registry_url``).
|
|
54
55
|
project_root: Project root used to resolve the repository-local
|
|
55
56
|
`.vscode/mcp.json` path.
|
|
56
57
|
user_scope: Whether to resolve user-scope config paths instead of
|
|
@@ -110,7 +110,7 @@ class _CandidateResolution:
|
|
|
110
110
|
|
|
111
111
|
def detect_agent_plugin(package_root: Path) -> AgentPluginDetection | None:
|
|
112
112
|
"""Classify and interpret a native Agent Plugin from its exact root manifest."""
|
|
113
|
-
from ..
|
|
113
|
+
from ..install.primitive_classification import PluginSchemaRoute, classify_plugin_manifest
|
|
114
114
|
|
|
115
115
|
manifest_path = package_root / "plugin.json"
|
|
116
116
|
try:
|
|
@@ -124,8 +124,8 @@ def detect_agent_plugin(package_root: Path) -> AgentPluginDetection | None:
|
|
|
124
124
|
return None
|
|
125
125
|
document = dict(evidence.document)
|
|
126
126
|
try:
|
|
127
|
-
|
|
128
|
-
if route is PluginSchemaRoute.LEGACY:
|
|
127
|
+
classification = classify_plugin_manifest(document)
|
|
128
|
+
if classification.route is PluginSchemaRoute.LEGACY:
|
|
129
129
|
return None
|
|
130
130
|
schema_id = document["$schema"]
|
|
131
131
|
loader = _VERSION_LOADERS[schema_id]
|
|
@@ -175,7 +175,7 @@ def reject_agent_plugin_legacy_normalization(package_root: Path) -> None:
|
|
|
175
175
|
|
|
176
176
|
def admit_legacy_plugin_manifest(package_root: Path) -> dict[str, Any] | None:
|
|
177
177
|
"""Return one admissible schema-less legacy manifest or reject fallback."""
|
|
178
|
-
from ..
|
|
178
|
+
from ..install.primitive_classification import PluginSchemaRoute, classify_plugin_manifest
|
|
179
179
|
|
|
180
180
|
try:
|
|
181
181
|
evidence = _read_admissible_root_manifest(package_root)
|
|
@@ -186,12 +186,12 @@ def admit_legacy_plugin_manifest(package_root: Path) -> dict[str, Any] | None:
|
|
|
186
186
|
if evidence is None:
|
|
187
187
|
return None
|
|
188
188
|
try:
|
|
189
|
-
|
|
189
|
+
classification = classify_plugin_manifest(evidence.document)
|
|
190
190
|
except AgentPluginError as exc:
|
|
191
191
|
raise AgentPluginLegacyBoundaryError(
|
|
192
192
|
f"Schema-bearing plugin.json cannot enter Claude plugin normalization: {exc}"
|
|
193
193
|
) from exc
|
|
194
|
-
if route is PluginSchemaRoute.AGENT_PLUGIN:
|
|
194
|
+
if classification.route is PluginSchemaRoute.AGENT_PLUGIN:
|
|
195
195
|
raise AgentPluginLegacyBoundaryError(
|
|
196
196
|
"Agent Plugin input must be interpreted by load_agent_plugin(), "
|
|
197
197
|
"not Claude plugin normalization"
|
|
@@ -20,7 +20,11 @@ from ..agent_plugins import (
|
|
|
20
20
|
load_agent_plugin,
|
|
21
21
|
url_contains_literal_secret,
|
|
22
22
|
)
|
|
23
|
-
from ..deps.lockfile import
|
|
23
|
+
from ..deps.lockfile import (
|
|
24
|
+
LockFile,
|
|
25
|
+
resolve_lockfile_path_for_read,
|
|
26
|
+
resolve_reproducible_timestamp,
|
|
27
|
+
)
|
|
24
28
|
from ..deps.plugin_parser import synthesize_plugin_json_from_apm_yml
|
|
25
29
|
from ..models.apm_package import APMPackage
|
|
26
30
|
from ..utils.archive import (
|
|
@@ -300,8 +304,7 @@ def export_agent_plugin_bundle(
|
|
|
300
304
|
logger=None,
|
|
301
305
|
) -> PackResult:
|
|
302
306
|
"""Export the project as an Agent Plugin bundle."""
|
|
303
|
-
|
|
304
|
-
lockfile_path = get_lockfile_path(project_root)
|
|
307
|
+
lockfile_path = resolve_lockfile_path_for_read(project_root, read_only=dry_run)
|
|
305
308
|
lockfile = LockFile.read(lockfile_path)
|
|
306
309
|
if lockfile is None:
|
|
307
310
|
raise FileNotFoundError(
|
|
@@ -494,7 +497,7 @@ def export_agent_plugin_bundle(
|
|
|
494
497
|
BundleFormat.AGENT_PLUGIN.lock_value,
|
|
495
498
|
target or "all",
|
|
496
499
|
bundle_files=bundle_files,
|
|
497
|
-
packed_at=lockfile.generated_at,
|
|
500
|
+
packed_at=resolve_reproducible_timestamp(None, lockfile.generated_at),
|
|
498
501
|
)
|
|
499
502
|
write_text_lf(staged_bundle / "apm.lock.yaml", enriched_yaml)
|
|
500
503
|
|
|
@@ -29,22 +29,18 @@ import shutil
|
|
|
29
29
|
import tempfile
|
|
30
30
|
import zipfile
|
|
31
31
|
from dataclasses import dataclass, field
|
|
32
|
-
from enum import Enum
|
|
33
32
|
from pathlib import Path
|
|
34
33
|
from typing import TYPE_CHECKING, Any
|
|
35
34
|
|
|
36
35
|
import yaml
|
|
37
36
|
|
|
38
|
-
from ..agent_plugins.constants import
|
|
39
|
-
|
|
40
|
-
COM_MICROSOFT_APM_NAMESPACE,
|
|
41
|
-
PLUGIN_SCHEMA_ID,
|
|
42
|
-
)
|
|
43
|
-
from ..agent_plugins.errors import (
|
|
44
|
-
AgentPluginManifestError,
|
|
45
|
-
UnsupportedAgentPluginVersionError,
|
|
46
|
-
)
|
|
37
|
+
from ..agent_plugins.constants import COM_MICROSOFT_APM_NAMESPACE
|
|
38
|
+
from ..agent_plugins.errors import AgentPluginManifestError
|
|
47
39
|
from ..agent_plugins.io import read_json_document
|
|
40
|
+
from ..install.primitive_classification import (
|
|
41
|
+
PluginSchemaRoute,
|
|
42
|
+
classify_plugin_manifest_schema,
|
|
43
|
+
)
|
|
48
44
|
from ..utils.archive import (
|
|
49
45
|
MAX_ZIP_ENTRIES,
|
|
50
46
|
MAX_ZIP_UNCOMPRESSED,
|
|
@@ -61,48 +57,29 @@ from ..utils.yaml_io import load_yaml_str
|
|
|
61
57
|
from .formats import BundleFormat
|
|
62
58
|
|
|
63
59
|
if TYPE_CHECKING:
|
|
64
|
-
from collections.abc import Mapping
|
|
65
|
-
|
|
66
60
|
from ..agent_plugins.ir import AgentPlugin, AgentPluginDetection
|
|
67
61
|
|
|
68
62
|
_MAX_ZIP_ENTRIES = MAX_ZIP_ENTRIES
|
|
69
63
|
_MAX_ZIP_UNCOMPRESSED = MAX_ZIP_UNCOMPRESSED
|
|
70
64
|
|
|
71
65
|
|
|
72
|
-
class PluginSchemaRoute(Enum):
|
|
73
|
-
"""Admission route selected exclusively by root plugin.json."""
|
|
74
|
-
|
|
75
|
-
LEGACY = "legacy"
|
|
76
|
-
AGENT_PLUGIN = "agent_plugin"
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
def classify_plugin_manifest_schema(document: Mapping[str, Any]) -> PluginSchemaRoute:
|
|
80
|
-
"""Select native admission only for the exact supported schema identifier."""
|
|
81
|
-
if "$schema" not in document:
|
|
82
|
-
return PluginSchemaRoute.LEGACY
|
|
83
|
-
schema_id = document["$schema"]
|
|
84
|
-
if not isinstance(schema_id, str):
|
|
85
|
-
raise AgentPluginManifestError("Invalid root plugin.json: $schema must be a string")
|
|
86
|
-
if schema_id == PLUGIN_SCHEMA_ID:
|
|
87
|
-
return PluginSchemaRoute.AGENT_PLUGIN
|
|
88
|
-
if schema_id.startswith(AGENT_PLUGINS_SCHEMA_PREFIX):
|
|
89
|
-
raise UnsupportedAgentPluginVersionError(
|
|
90
|
-
f"Unsupported Agent Plugins manifest schema: {schema_id}. "
|
|
91
|
-
f"This APM version supports only {PLUGIN_SCHEMA_ID}."
|
|
92
|
-
)
|
|
93
|
-
raise AgentPluginManifestError(
|
|
94
|
-
f"Unsupported schema-bearing plugin manifest: {schema_id}. "
|
|
95
|
-
f"APM accepts schema-bearing plugin.json only with {PLUGIN_SCHEMA_ID}; "
|
|
96
|
-
"remove $schema only for a schema-less legacy plugin."
|
|
97
|
-
)
|
|
98
|
-
|
|
99
|
-
|
|
100
66
|
def route_agent_plugin_package(package_root: Path) -> AgentPluginDetection | None:
|
|
101
67
|
"""Route one materialized package through canonical Agent Plugin admission."""
|
|
102
68
|
from ..agent_plugins.loader import detect_agent_plugin
|
|
69
|
+
from ..models.validation import PackageType, detect_package_type
|
|
103
70
|
|
|
104
71
|
detection = detect_agent_plugin(package_root)
|
|
105
|
-
if detection is
|
|
72
|
+
if detection is None:
|
|
73
|
+
return None
|
|
74
|
+
package_type, _ = detect_package_type(
|
|
75
|
+
package_root,
|
|
76
|
+
agent_plugin_detection=detection,
|
|
77
|
+
)
|
|
78
|
+
if package_type != PackageType.AGENT_PLUGIN:
|
|
79
|
+
if package_type == PackageType.INVALID and detection.error is not None:
|
|
80
|
+
raise detection.error
|
|
81
|
+
return None
|
|
82
|
+
if detection.error is not None:
|
|
106
83
|
raise detection.error
|
|
107
84
|
return detection
|
|
108
85
|
|
|
@@ -5,7 +5,7 @@ from dataclasses import dataclass, field
|
|
|
5
5
|
from pathlib import Path
|
|
6
6
|
|
|
7
7
|
from ..core.target_detection import detect_target
|
|
8
|
-
from ..deps.lockfile import LockFile,
|
|
8
|
+
from ..deps.lockfile import LockFile, resolve_lockfile_path_for_read
|
|
9
9
|
from ..models.apm_package import APMPackage
|
|
10
10
|
from ..utils.archive import (
|
|
11
11
|
projected_archive_path,
|
|
@@ -67,8 +67,6 @@ def pack_bundle(
|
|
|
67
67
|
FileNotFoundError: If ``apm.lock.yaml`` is missing.
|
|
68
68
|
ValueError: If deployed files referenced in the lockfile are missing on disk.
|
|
69
69
|
"""
|
|
70
|
-
# 1. Read lockfile (migrate legacy apm.lock → apm.lock.yaml if needed)
|
|
71
|
-
migrate_lockfile_if_needed(project_root)
|
|
72
70
|
bundle_format = coerce_bundle_format(fmt)
|
|
73
71
|
|
|
74
72
|
if bundle_format is BundleFormat.AGENT_PLUGIN:
|
|
@@ -98,7 +96,7 @@ def pack_bundle(
|
|
|
98
96
|
logger=logger,
|
|
99
97
|
)
|
|
100
98
|
|
|
101
|
-
lockfile_path =
|
|
99
|
+
lockfile_path = resolve_lockfile_path_for_read(project_root, read_only=dry_run)
|
|
102
100
|
lockfile = LockFile.read(lockfile_path)
|
|
103
101
|
if lockfile is None:
|
|
104
102
|
raise FileNotFoundError(
|
|
@@ -18,8 +18,7 @@ import yaml
|
|
|
18
18
|
from ..deps.lockfile import (
|
|
19
19
|
LockedDependency,
|
|
20
20
|
LockFile,
|
|
21
|
-
|
|
22
|
-
migrate_lockfile_if_needed,
|
|
21
|
+
resolve_lockfile_path_for_read,
|
|
23
22
|
)
|
|
24
23
|
from ..models.apm_package import APMPackage, DependencyReference
|
|
25
24
|
from ..models.dependency.subsets import skill_subset_filter_tokens
|
|
@@ -826,8 +825,7 @@ def export_plugin_bundle(
|
|
|
826
825
|
:class:`PackResult` describing what was produced.
|
|
827
826
|
"""
|
|
828
827
|
# 1. Read lockfile
|
|
829
|
-
|
|
830
|
-
lockfile_path = get_lockfile_path(project_root)
|
|
828
|
+
lockfile_path = resolve_lockfile_path_for_read(project_root, read_only=dry_run)
|
|
831
829
|
lockfile = LockFile.read(lockfile_path)
|
|
832
830
|
|
|
833
831
|
# 2. Read apm.yml
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"""Plugin-native source-layout conventions."""
|
|
2
|
+
|
|
3
|
+
from collections.abc import Callable
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def _identity(name: str) -> str:
|
|
9
|
+
"""Return *name* unchanged."""
|
|
10
|
+
return name
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclass(frozen=True)
|
|
14
|
+
class PluginDirSpec:
|
|
15
|
+
"""How one plugin-native root lowers into APM primitive space."""
|
|
16
|
+
|
|
17
|
+
plugin_dir: str
|
|
18
|
+
primitive_kinds: tuple[str, ...]
|
|
19
|
+
apm_basename_fn: Callable[[str], str]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
PLUGIN_ROOT_DIRS = (
|
|
23
|
+
"agents",
|
|
24
|
+
"skills",
|
|
25
|
+
"commands",
|
|
26
|
+
"instructions",
|
|
27
|
+
"extensions",
|
|
28
|
+
"hooks",
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def find_plugin_root_sources(project_root: Path) -> list[str]:
|
|
33
|
+
"""Return plugin-native root sources that exist."""
|
|
34
|
+
sources = [
|
|
35
|
+
name
|
|
36
|
+
for name in PLUGIN_ROOT_DIRS
|
|
37
|
+
if (project_root / name).is_dir() and not (project_root / name).is_symlink()
|
|
38
|
+
]
|
|
39
|
+
if (project_root / "hooks.json").is_file():
|
|
40
|
+
sources.append("hooks.json")
|
|
41
|
+
return sources
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def plugin_command_prompt_name(name: str) -> str:
|
|
45
|
+
"""Return the APM prompt filename represented by a plugin command."""
|
|
46
|
+
if name.endswith(".prompt.md"):
|
|
47
|
+
return name
|
|
48
|
+
if name.endswith(".md"):
|
|
49
|
+
return f"{name[: -len('.md')]}.prompt.md"
|
|
50
|
+
return name
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
PLUGIN_LAYOUT: dict[str, PluginDirSpec] = {
|
|
54
|
+
"agents": PluginDirSpec("agents", ("agents",), _identity),
|
|
55
|
+
"skills": PluginDirSpec("skills", ("skills",), _identity),
|
|
56
|
+
"commands": PluginDirSpec("commands", ("commands", "prompts"), plugin_command_prompt_name),
|
|
57
|
+
"instructions": PluginDirSpec("instructions", ("instructions",), _identity),
|
|
58
|
+
"extensions": PluginDirSpec("extensions", ("canvas",), _identity),
|
|
59
|
+
"hooks": PluginDirSpec("hooks", ("hooks",), _identity),
|
|
60
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"""Verified, best-effort removal outcomes for explicit cache cleaning."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import os
|
|
6
|
+
from collections.abc import Iterable
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
from ..utils import file_ops
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def clean_cache_buckets(buckets: Iterable[Path]) -> list[str]:
|
|
13
|
+
"""Remove bucket children without following links; return all failure details.
|
|
14
|
+
|
|
15
|
+
Successful removals are not rolled back. The residual check is essential:
|
|
16
|
+
the read-only recovery callback in robust_rmtree can swallow OS errors.
|
|
17
|
+
"""
|
|
18
|
+
failures: list[str] = []
|
|
19
|
+
for bucket in buckets:
|
|
20
|
+
try:
|
|
21
|
+
if bucket.is_symlink():
|
|
22
|
+
failures.append(f"{bucket}: refusing to traverse a symlinked cache bucket")
|
|
23
|
+
continue
|
|
24
|
+
with os.scandir(bucket) as entries:
|
|
25
|
+
for entry in entries:
|
|
26
|
+
path = Path(entry.path)
|
|
27
|
+
try:
|
|
28
|
+
if entry.is_dir(follow_symlinks=False):
|
|
29
|
+
file_ops.robust_rmtree(path)
|
|
30
|
+
else:
|
|
31
|
+
path.unlink()
|
|
32
|
+
except FileNotFoundError:
|
|
33
|
+
pass
|
|
34
|
+
except OSError as exc:
|
|
35
|
+
failures.append(f"{path}: {exc}")
|
|
36
|
+
continue
|
|
37
|
+
try:
|
|
38
|
+
# lstat distinguishes a removed entry from an unreadable
|
|
39
|
+
# one and also detects dangling symlinks.
|
|
40
|
+
path.lstat()
|
|
41
|
+
except FileNotFoundError:
|
|
42
|
+
continue
|
|
43
|
+
except OSError as exc:
|
|
44
|
+
failures.append(f"{path}: {exc}")
|
|
45
|
+
else:
|
|
46
|
+
failures.append(f"{path}: entry remains after deletion")
|
|
47
|
+
except FileNotFoundError:
|
|
48
|
+
continue
|
|
49
|
+
except OSError as exc:
|
|
50
|
+
failures.append(f"{bucket}: {exc}")
|
|
51
|
+
return failures
|