apm-cli 0.28.0__tar.gz → 0.29.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.28.0/src/apm_cli.egg-info → apm_cli-0.29.1}/PKG-INFO +4 -3
- {apm_cli-0.28.0 → apm_cli-0.29.1}/README.md +3 -2
- {apm_cli-0.28.0 → apm_cli-0.29.1}/pyproject.toml +1 -1
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/base.py +4 -5
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/codex.py +22 -6
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/copilot.py +26 -10
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/cursor.py +2 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/gemini.py +8 -2
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/intellij.py +69 -1
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/kiro.py +2 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/opencode.py +6 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/vscode.py +5 -2
- apm_cli-0.29.1/src/apm_cli/agent_plugins/__init__.py +146 -0
- apm_cli-0.29.1/src/apm_cli/agent_plugins/assets.py +368 -0
- apm_cli-0.29.1/src/apm_cli/agent_plugins/constants.py +23 -0
- apm_cli-0.29.1/src/apm_cli/agent_plugins/errors.py +162 -0
- apm_cli-0.29.1/src/apm_cli/agent_plugins/io.py +101 -0
- apm_cli-0.29.1/src/apm_cli/agent_plugins/ir.py +196 -0
- apm_cli-0.29.1/src/apm_cli/agent_plugins/loader.py +966 -0
- apm_cli-0.29.1/src/apm_cli/agent_plugins/projection.py +61 -0
- apm_cli-0.29.1/src/apm_cli/agent_plugins/validation.py +690 -0
- apm_cli-0.29.1/src/apm_cli/bundle/agent_plugin_exporter.py +524 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/bundle/attest.py +1 -1
- apm_cli-0.29.1/src/apm_cli/bundle/claude_plugin_exporter.py +32 -0
- apm_cli-0.29.1/src/apm_cli/bundle/export_common.py +41 -0
- apm_cli-0.29.1/src/apm_cli/bundle/formats.py +147 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/bundle/local_bundle.py +135 -18
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/bundle/lockfile_enrichment.py +11 -4
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/bundle/packer.py +30 -12
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/bundle/plugin_exporter.py +65 -57
- apm_cli-0.29.1/src/apm_cli/bundle/plugin_layout.py +60 -0
- apm_cli-0.29.1/src/apm_cli/bundle/reproducible_archive.py +79 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/cache/git_cache.py +168 -59
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/cache/url_normalize.py +7 -3
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/_helpers.py +40 -19
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/approve.py +75 -10
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/audit.py +16 -6
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/compile/cli.py +252 -43
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/compile/watcher.py +112 -57
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/config.py +9 -1
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/deps/_utils.py +26 -4
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/deps/cli.py +63 -2
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/experimental.py +4 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/init.py +110 -15
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/install.py +333 -331
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/lifecycle.py +2 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/lock.py +32 -17
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/__init__.py +56 -252
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/check.py +31 -15
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/doctor.py +38 -10
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/init.py +2 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/plugin/add.py +2 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/plugin/remove.py +2 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/plugin/set.py +2 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/validate.py +15 -11
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/mcp.py +44 -34
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/pack.py +162 -33
- apm_cli-0.29.1/src/apm_cli/commands/plugin/init.py +75 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/prune.py +132 -8
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/publish.py +1 -1
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/uninstall/cli.py +378 -68
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/uninstall/engine.py +352 -95
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/update.py +73 -10
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/compilation/agents_compiler.py +406 -132
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/compilation/build_id.py +1 -3
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/compilation/claude_formatter.py +2 -4
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/compilation/constants.py +21 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/compilation/context_optimizer.py +80 -96
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/compilation/distributed_compiler.py +122 -48
- apm_cli-0.29.1/src/apm_cli/compilation/footer.py +20 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/compilation/gemini_formatter.py +2 -2
- apm_cli-0.29.1/src/apm_cli/compilation/inventory.py +146 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/compilation/output_writer.py +27 -5
- apm_cli-0.29.1/src/apm_cli/compilation/root_context_protection.py +121 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/compilation/template_builder.py +6 -8
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/compilation/user_root_context.py +43 -17
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/config.py +119 -25
- apm_cli-0.29.1/src/apm_cli/copilot_plugins/__init__.py +54 -0
- apm_cli-0.29.1/src/apm_cli/copilot_plugins/capability.py +142 -0
- apm_cli-0.29.1/src/apm_cli/copilot_plugins/catalog.py +106 -0
- apm_cli-0.29.1/src/apm_cli/copilot_plugins/constants.py +32 -0
- apm_cli-0.29.1/src/apm_cli/copilot_plugins/registrar.py +659 -0
- apm_cli-0.29.1/src/apm_cli/copilot_plugins/settings.py +306 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/apm_yml.py +81 -9
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/auth.py +266 -112
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/build_orchestrator.py +153 -36
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/command_logger.py +112 -6
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/deployment_ledger.py +110 -21
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/experimental.py +4 -14
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/host_providers.py +60 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/lifecycle_scripts.py +15 -8
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/null_logger.py +5 -2
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/plugin_manifest.py +56 -21
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/scope.py +8 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/script_executors.py +3 -31
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/target_catalog.py +26 -5
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/target_detection.py +38 -21
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/token_manager.py +9 -4
- apm_cli-0.29.1/src/apm_cli/deps/_shared.py +244 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/apm_resolver.py +289 -50
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/artifactory_entry.py +31 -5
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/artifactory_orchestrator.py +26 -15
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/bare_cache.py +126 -46
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/clone_engine.py +180 -78
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/download_strategies.py +87 -36
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/git_auth_env.py +34 -18
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/git_file_transport.py +51 -17
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/git_reference_resolver.py +109 -47
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/git_remote_ops.py +71 -4
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/github_downloader.py +253 -151
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/github_downloader_validation.py +234 -96
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/host_backends.py +4 -3
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/lockfile.py +171 -39
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/package_validator.py +12 -6
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/path_anchoring.py +78 -17
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/plugin_parser.py +623 -137
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/reachability.py +16 -2
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/auth.py +31 -5
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/client.py +56 -2
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/config_loader.py +8 -4
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/feature_gate.py +8 -4
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/outdated.py +1 -1
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/resolver.py +46 -15
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/revision_pins.py +55 -10
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/tiered_ref_resolver.py +1 -1
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/transport_selection.py +192 -66
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/drift.py +3 -11
- apm_cli-0.29.1/src/apm_cli/hook_contract.py +266 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/audit_replay.py +11 -1
- apm_cli-0.29.1/src/apm_cli/install/audit_target_roots.py +79 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/context.py +10 -0
- apm_cli-0.29.1/src/apm_cli/install/deployable_source_plan.py +264 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/deployed_paths.py +14 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/drift.py +108 -38
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/drift_render.py +15 -0
- apm_cli-0.29.1/src/apm_cli/install/dry_run_plan.py +133 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/errors.py +14 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/exec_gate.py +83 -31
- apm_cli-0.29.1/src/apm_cli/install/finalization.py +19 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/helpers/ref_reuse.py +204 -45
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/helpers/security_scan.py +20 -9
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/integrity.py +27 -0
- apm_cli-0.29.1/src/apm_cli/install/legacy_plugin_compat.py +264 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/local_bundle_handler.py +316 -62
- apm_cli-0.29.1/src/apm_cli/install/local_bundle_paths.py +206 -0
- apm_cli-0.29.1/src/apm_cli/install/locking.py +143 -0
- apm_cli-0.29.1/src/apm_cli/install/lsp/integration.py +486 -0
- apm_cli-0.29.1/src/apm_cli/install/manifest_helpers.py +98 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/manifest_reconcile.py +239 -56
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/command.py +109 -18
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/conflicts.py +2 -9
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/integration.py +114 -15
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/ownership.py +27 -5
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/registry.py +91 -80
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/warnings.py +29 -17
- apm_cli-0.29.1/src/apm_cli/install/native_plugin_admission.py +207 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/outcome.py +59 -10
- apm_cli-0.29.1/src/apm_cli/install/package_selection.py +45 -0
- apm_cli-0.29.1/src/apm_cli/install/phases/copilot_plugins.py +198 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/finalize.py +16 -4
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/integrate.py +26 -8
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/local_content.py +2 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/lockfile.py +12 -1
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/resolve.py +107 -112
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/targets.py +33 -28
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/pipeline.py +51 -66
- apm_cli-0.29.1/src/apm_cli/install/presentation/dry_run.py +107 -0
- apm_cli-0.29.1/src/apm_cli/install/primitive_classification.py +245 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/registry_wiring.py +7 -3
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/request.py +1 -0
- apm_cli-0.29.1/src/apm_cli/install/resolution_staging.py +356 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/service.py +78 -4
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/service_integration.py +12 -4
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/services.py +169 -93
- apm_cli-0.29.1/src/apm_cli/install/source_helpers.py +56 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/sources.py +185 -197
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/summary.py +39 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/target_filter.py +19 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/target_hints.py +3 -1
- apm_cli-0.29.1/src/apm_cli/install/template.py +405 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/transaction.py +82 -24
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/validation.py +192 -190
- apm_cli-0.29.1/src/apm_cli/integration/_shared.py +92 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/agent_integrator.py +57 -12
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/base_integrator.py +131 -11
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/canvas_integrator.py +15 -1
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/cleanup.py +14 -1
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/command_integrator.py +7 -3
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/hook_bundle.py +46 -12
- apm_cli-0.29.1/src/apm_cli/integration/hook_command_paths.py +58 -0
- apm_cli-0.29.1/src/apm_cli/integration/hook_command_warnings.py +25 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/hook_integrator.py +217 -214
- apm_cli-0.29.1/src/apm_cli/integration/hook_ir.py +5 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/hook_native_formats.py +6 -73
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/hook_ownership.py +68 -15
- apm_cli-0.29.1/src/apm_cli/integration/hook_reintegration.py +37 -0
- apm_cli-0.29.1/src/apm_cli/integration/hook_source_selection.py +188 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/instruction_integrator.py +294 -128
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/kiro_hook_integrator.py +11 -10
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/lsp_integrator.py +360 -43
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/mcp_config_view.py +48 -16
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/mcp_integrator.py +227 -34
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/mcp_integrator_install.py +225 -42
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/prompt_integrator.py +9 -3
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/skill_integrator.py +395 -301
- apm_cli-0.29.1/src/apm_cli/integration/skill_package_routing.py +49 -0
- apm_cli-0.29.1/src/apm_cli/integration/skill_support.py +102 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/targets.py +77 -13
- apm_cli-0.29.1/src/apm_cli/marketplace/_git_utils.py +12 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/builder.py +368 -98
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/client.py +77 -38
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/drift_check.py +44 -12
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/errors.py +6 -4
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/models.py +136 -70
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/ref_resolver.py +111 -43
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/registry.py +1 -1
- apm_cli-0.29.1/src/apm_cli/marketplace/source_identity.py +264 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/validator.py +15 -7
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/yml_schema.py +30 -12
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/apm_package.py +112 -49
- apm_cli-0.29.1/src/apm_cli/models/dependency/host_virtual.py +364 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/identity.py +1 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/lsp.py +2 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/mcp.py +52 -16
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/reference.py +232 -179
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/format_detection.py +111 -26
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/results.py +2 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/validation.py +163 -25
- apm_cli-0.29.1/src/apm_cli/policy/_gitlab.py +493 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/policy/_help_text.py +2 -2
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/policy/ci_checks.py +263 -37
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/policy/discovery.py +121 -127
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/policy/inheritance.py +2 -4
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/primitives/discovery.py +133 -105
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/registry/client.py +173 -25
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/registry/operations.py +76 -18
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/runtime/copilot_runtime.py +12 -6
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/security/content_scanner.py +31 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/security/executables.py +353 -58
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/security/file_scanner.py +40 -3
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/security/gate.py +78 -6
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/atomic_io.py +36 -5
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/content_hash.py +12 -5
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/diagnostics.py +2 -0
- apm_cli-0.29.1/src/apm_cli/utils/git_env.py +1524 -0
- apm_cli-0.29.1/src/apm_cli/utils/git_sparse.py +309 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/github_host.py +22 -87
- apm_cli-0.29.1/src/apm_cli/utils/net.py +58 -0
- apm_cli-0.29.1/src/apm_cli/utils/path_security.py +243 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/patterns.py +108 -14
- apm_cli-0.29.1/src/apm_cli/utils/staging_guard.py +63 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/yaml_io.py +183 -58
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/version.py +3 -1
- {apm_cli-0.28.0 → apm_cli-0.29.1/src/apm_cli.egg-info}/PKG-INFO +4 -3
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli.egg-info/SOURCES.txt +46 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/tests/test_apm_package_models.py +39 -3
- {apm_cli-0.28.0 → apm_cli-0.29.1}/tests/test_apm_resolver.py +107 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/tests/test_github_downloader.py +153 -121
- {apm_cli-0.28.0 → apm_cli-0.29.1}/tests/test_gitlab_git_transport.py +85 -3
- {apm_cli-0.28.0 → apm_cli-0.29.1}/tests/test_lockfile.py +208 -1
- {apm_cli-0.28.0 → apm_cli-0.29.1}/tests/test_token_manager.py +14 -2
- apm_cli-0.28.0/src/apm_cli/bundle/plugin_layout.py +0 -24
- apm_cli-0.28.0/src/apm_cli/commands/plugin/init.py +0 -44
- apm_cli-0.28.0/src/apm_cli/deps/_shared.py +0 -40
- apm_cli-0.28.0/src/apm_cli/install/local_bundle_paths.py +0 -89
- apm_cli-0.28.0/src/apm_cli/install/lsp/integration.py +0 -180
- apm_cli-0.28.0/src/apm_cli/install/package_selection.py +0 -26
- apm_cli-0.28.0/src/apm_cli/install/presentation/dry_run.py +0 -92
- apm_cli-0.28.0/src/apm_cli/install/resolution_staging.py +0 -126
- apm_cli-0.28.0/src/apm_cli/install/template.py +0 -238
- apm_cli-0.28.0/src/apm_cli/integration/_shared.py +0 -71
- apm_cli-0.28.0/src/apm_cli/integration/hook_ir.py +0 -54
- apm_cli-0.28.0/src/apm_cli/marketplace/_git_utils.py +0 -19
- apm_cli-0.28.0/src/apm_cli/utils/git_env.py +0 -113
- apm_cli-0.28.0/src/apm_cli/utils/git_sparse.py +0 -62
- apm_cli-0.28.0/src/apm_cli/utils/path_security.py +0 -130
- {apm_cli-0.28.0 → apm_cli-0.29.1}/AUTHORS +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/LICENSE +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/NOTICE +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/setup.cfg +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/_mcp_runtime_args.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/antigravity.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/claude.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/hermes.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/windsurf.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/package_manager/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/package_manager/base.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/package_manager/default_manager.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/bootstrap_mirror.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/bundle/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/bundle/unpacker.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/cache/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/cache/http_cache.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/cache/integrity.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/cache/locking.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/cache/paths.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/cli.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/_apm_yml_writer.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/cache.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/compile/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/deps/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/deps/why.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/doctor.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/find.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/list_cmd.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/audit.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/migrate.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/outdated.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/plugin/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/outdated.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/plugin/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/policy.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/run.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/runtime.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/self_update.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/targets.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/uninstall/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/uninstall/lockfile_state.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/view.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/compilation/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/compilation/constitution.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/compilation/constitution_block.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/compilation/injector.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/compilation/link_resolver.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/compilation/managed_section.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/constants.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/_child_tls/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/_child_tls/_apm_tls.pth +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/_child_tls/_apm_tls_bootstrap.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/azure_cli.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/conflict_detector.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/deployment_state.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/docker_args.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/errors.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/install_audit.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/operations.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/output_mode.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/project_name.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/safe_installer.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/script_runner.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/script_trust.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/tls_trust.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/aggregator.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/dependency_graph.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/git_semver_resolver.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/github_rate_limit.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/installed_package.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/outdated_ref_cache.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/outdated_row.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/extractor.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/semver.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry_proxy.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/shared_clone_cache.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/verifier.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/why_walker.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/export/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/export/authoring.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/export/declared_license.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/export/formats.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/export/purl.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/export/sbom.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/export/spdx.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/export/spdx_data.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/factory.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/argv.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/artifactory_resolver.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/cache_pin.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/gitlab_resolver.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/heals/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/heals/base.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/heals/branch_ref_drift.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/heals/buggy_lockfile_recovery.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/helpers/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/helpers/no_work.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/helpers/ref_seed.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/insecure_policy.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/lsp/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/args.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/entry.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/writer.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/package_resolution.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/_redownload.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/_skip_logic.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/audit.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/cleanup.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/download.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/heal.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/policy_gate.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/policy_target_check.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/post_deps_local.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/plan.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/presentation/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/root_redirect.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/skill_path_migration.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/target_warnings.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/_hook_dropped_targets.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/copilot_app_db.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/copilot_app_project.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/copilot_app_workflow_integrator.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/copilot_app_ws.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/copilot_cowork_paths.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/coverage.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/dispatch.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/hook_file_routing.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/opencode_frontmatter.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/skill_transformer.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/utils.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/_io.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/_shared.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/audit.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/auth_helpers.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/diagnostics.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/git_stderr.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/init_template.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/migration.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/output_mappers.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/output_profiles.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/resolver.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/semver.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/shadow_detector.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/tag_pattern.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/version_check.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/version_pins.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/version_resolver.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/yml_editor.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/materialization.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/object_fields.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/provider_coordinates.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/registry_entry.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/selection.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/subsets.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/types.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/manifest_contract.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/plugin.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/output/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/output/formatters.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/output/models.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/output/script_formatters.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/policy/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/policy/_constraint_pinning.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/policy/_shared.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/policy/install_preflight.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/policy/matcher.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/policy/models.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/policy/outcome_routing.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/policy/parser.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/policy/policy_checks.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/policy/project_config.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/policy/schema.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/primitives/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/primitives/models.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/primitives/parser.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/registry/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/registry/integration.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/runtime/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/runtime/base.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/runtime/codex_runtime.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/runtime/factory.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/runtime/llm_runtime.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/runtime/manager.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/runtime/registry.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/runtime/utils.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/security/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/security/audit_report.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/security/external/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/security/external/base.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/security/external/gate.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/security/external/generic_sarif.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/security/external/options.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/security/external/registry.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/security/external/runner.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/security/external/sarif_ingest.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/security/external/skillspector.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/update_policy.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/archive.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/console.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/exclude.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/file_ops.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/guards.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/helpers.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/install_tui.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/normalization.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/paths.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/perf_stats.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/reflink.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/short_sha.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/subprocess_env.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/version_checker.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/workflow/__init__.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/workflow/discovery.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/workflow/parser.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/workflow/runner.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli.egg-info/dependency_links.txt +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli.egg-info/entry_points.txt +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli.egg-info/requires.txt +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli.egg-info/top_level.txt +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/tests/test_codex_docker_args_fix.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/tests/test_codex_empty_string_and_defaults.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/tests/test_collision_integration.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/tests/test_console.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/tests/test_distributed_compilation.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/tests/test_empty_string_and_defaults.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/tests/test_enhanced_discovery.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/tests/test_github_downloader_token_precedence.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/tests/test_runnable_prompts.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/tests/test_runtime_manager_token_precedence.py +0 -0
- {apm_cli-0.28.0 → apm_cli-0.29.1}/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.29.1
|
|
4
4
|
Summary: MCP configuration tool
|
|
5
5
|
Author-email: Daniel Meppiel <user@example.com>
|
|
6
6
|
License: MIT License
|
|
@@ -78,7 +78,7 @@ Think `package.json`, `requirements.txt`, or `Cargo.toml` — but for AI agent c
|
|
|
78
78
|
|
|
79
79
|
GitHub Copilot | Claude Code | Grok Build | Cursor | OpenCode | Codex | Gemini | Windsurf | Kiro
|
|
80
80
|
|
|
81
|
-
**[Documentation](https://microsoft.github.io/apm/)** · **[Quick Start](https://microsoft.github.io/apm/getting-started/quick-start/)** · **[CLI Reference](https://microsoft.github.io/apm/reference/cli-commands/)** · **[Roadmap](https://github.com/
|
|
81
|
+
**[Documentation](https://microsoft.github.io/apm/)** · **[Quick Start](https://microsoft.github.io/apm/getting-started/quick-start/)** · **[CLI Reference](https://microsoft.github.io/apm/reference/cli-commands/)** · **[v0.29 Roadmap](https://github.com/microsoft/apm/milestone/17)**
|
|
82
82
|
|
|
83
83
|
---
|
|
84
84
|
|
|
@@ -239,7 +239,8 @@ Use agentrc to author high-quality instructions, then package them with APM to s
|
|
|
239
239
|
|
|
240
240
|
Created by [@danielmeppiel](https://github.com/danielmeppiel). Maintained by [@danielmeppiel](https://github.com/danielmeppiel) and [@sergio-sisternes-epam](https://github.com/sergio-sisternes-epam).
|
|
241
241
|
|
|
242
|
-
- [Roadmap
|
|
242
|
+
- [v0.29 Roadmap](https://github.com/microsoft/apm/milestone/17)
|
|
243
|
+
- [Discussions](https://github.com/microsoft/apm/discussions)
|
|
243
244
|
- [Contributing](CONTRIBUTING.md)
|
|
244
245
|
- [AI Native Development guide](https://danielmeppiel.github.io/awesome-ai-native) — a practical learning path for AI-native development
|
|
245
246
|
|
|
@@ -6,7 +6,7 @@ Think `package.json`, `requirements.txt`, or `Cargo.toml` — but for AI agent c
|
|
|
6
6
|
|
|
7
7
|
GitHub Copilot | Claude Code | Grok Build | Cursor | OpenCode | Codex | Gemini | Windsurf | Kiro
|
|
8
8
|
|
|
9
|
-
**[Documentation](https://microsoft.github.io/apm/)** · **[Quick Start](https://microsoft.github.io/apm/getting-started/quick-start/)** · **[CLI Reference](https://microsoft.github.io/apm/reference/cli-commands/)** · **[Roadmap](https://github.com/
|
|
9
|
+
**[Documentation](https://microsoft.github.io/apm/)** · **[Quick Start](https://microsoft.github.io/apm/getting-started/quick-start/)** · **[CLI Reference](https://microsoft.github.io/apm/reference/cli-commands/)** · **[v0.29 Roadmap](https://github.com/microsoft/apm/milestone/17)**
|
|
10
10
|
|
|
11
11
|
---
|
|
12
12
|
|
|
@@ -167,7 +167,8 @@ Use agentrc to author high-quality instructions, then package them with APM to s
|
|
|
167
167
|
|
|
168
168
|
Created by [@danielmeppiel](https://github.com/danielmeppiel). Maintained by [@danielmeppiel](https://github.com/danielmeppiel) and [@sergio-sisternes-epam](https://github.com/sergio-sisternes-epam).
|
|
169
169
|
|
|
170
|
-
- [Roadmap
|
|
170
|
+
- [v0.29 Roadmap](https://github.com/microsoft/apm/milestone/17)
|
|
171
|
+
- [Discussions](https://github.com/microsoft/apm/discussions)
|
|
171
172
|
- [Contributing](CONTRIBUTING.md)
|
|
172
173
|
- [AI Native Development guide](https://danielmeppiel.github.io/awesome-ai-native) — a practical learning path for AI-native development
|
|
173
174
|
|
|
@@ -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."""
|
|
@@ -1087,7 +1084,9 @@ class MCPClientAdapter(ABC):
|
|
|
1087
1084
|
if not isinstance(raw_value, str):
|
|
1088
1085
|
translated[name] = raw_value
|
|
1089
1086
|
continue
|
|
1090
|
-
if
|
|
1087
|
+
if isinstance(raw_value, TrustedEnvLiteral):
|
|
1088
|
+
translated[name] = raw_value
|
|
1089
|
+
elif _has_env_placeholder(raw_value):
|
|
1091
1090
|
self._last_legacy_angle_vars.update(_extract_legacy_angle_vars(raw_value))
|
|
1092
1091
|
translated[name] = self._translate_env_placeholder_for_runtime(raw_value)
|
|
1093
1092
|
placeholder_keys.extend(
|
|
@@ -12,6 +12,7 @@ from ...registry.client import SimpleRegistryClient
|
|
|
12
12
|
from ...registry.integration import RegistryIntegration
|
|
13
13
|
from ...utils.atomic_io import atomic_write_text
|
|
14
14
|
from ...utils.console import _rich_success, _rich_warning
|
|
15
|
+
from ...utils.net import is_loopback_host
|
|
15
16
|
from ...utils.path_security import PathTraversalError
|
|
16
17
|
from ._mcp_runtime_args import process_v01_value_hint_arg
|
|
17
18
|
from .base import MCPClientAdapter
|
|
@@ -41,8 +42,9 @@ class CodexClientAdapter(MCPClientAdapter):
|
|
|
41
42
|
|
|
42
43
|
Args:
|
|
43
44
|
registry_url (str, optional): URL of the MCP registry.
|
|
44
|
-
If not provided,
|
|
45
|
-
|
|
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``).
|
|
46
48
|
project_root: Project root used to resolve project-local Codex
|
|
47
49
|
config paths.
|
|
48
50
|
user_scope: Whether the adapter should resolve user-scope Codex
|
|
@@ -216,6 +218,8 @@ class CodexClientAdapter(MCPClientAdapter):
|
|
|
216
218
|
raw = server_info.get("_raw_stdio")
|
|
217
219
|
if raw:
|
|
218
220
|
config["command"] = raw["command"]
|
|
221
|
+
if raw.get("cwd") is not None:
|
|
222
|
+
config["cwd"] = raw["cwd"]
|
|
219
223
|
resolved_env_for_args: dict = {}
|
|
220
224
|
if raw.get("env"):
|
|
221
225
|
resolved_env_for_args = self._resolve_environment_variables(
|
|
@@ -239,7 +243,8 @@ class CodexClientAdapter(MCPClientAdapter):
|
|
|
239
243
|
# Precedence on Codex when a server publishes BOTH a remote and a stdio
|
|
240
244
|
# package: prefer the stdio package (falls through to the packages branch
|
|
241
245
|
# below). The remote-only branch here handles the streamable-http path
|
|
242
|
-
# and rejects SSE / non-https / empty-url remotes
|
|
246
|
+
# and rejects SSE / non-https (except loopback http) / empty-url remotes
|
|
247
|
+
# with explicit warnings.
|
|
243
248
|
remotes = server_info.get("remotes", [])
|
|
244
249
|
packages = server_info.get("packages", [])
|
|
245
250
|
if remotes and not packages:
|
|
@@ -263,11 +268,22 @@ class CodexClientAdapter(MCPClientAdapter):
|
|
|
263
268
|
)
|
|
264
269
|
return None
|
|
265
270
|
|
|
266
|
-
|
|
267
|
-
|
|
271
|
+
try:
|
|
272
|
+
parsed_remote = urlparse(remote_url)
|
|
273
|
+
scheme = parsed_remote.scheme.lower()
|
|
274
|
+
insecure_loopback = scheme == "http" and is_loopback_host(parsed_remote.hostname)
|
|
275
|
+
except ValueError:
|
|
276
|
+
scheme = ""
|
|
277
|
+
insecure_loopback = False
|
|
278
|
+
# Codex CLI itself accepts plain-http loopback URLs (its docs use
|
|
279
|
+
# http://localhost examples), and local dev servers rarely carry
|
|
280
|
+
# certs -- so loopback http is allowed. Any other non-https host is
|
|
281
|
+
# still rejected to avoid cleartext bearer tokens in transit.
|
|
282
|
+
if scheme != "https" and not insecure_loopback:
|
|
268
283
|
_rich_warning(
|
|
269
284
|
f"Skipping MCP server '{server_name}' for Codex CLI: remote URL "
|
|
270
|
-
f"must use https:// (got {scheme or 'no scheme'})."
|
|
285
|
+
f"must use https:// (got {scheme or 'no scheme'}). "
|
|
286
|
+
"Plain http is allowed for loopback addresses only.",
|
|
271
287
|
symbol="warning",
|
|
272
288
|
)
|
|
273
289
|
return None
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"""GitHub Copilot CLI implementation of MCP client adapter.
|
|
2
2
|
|
|
3
|
-
This adapter implements the Copilot
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
This adapter implements the Copilot-specific handling of MCP server configuration.
|
|
4
|
+
At project scope it targets .github/mcp.json (read by Copilot CLI); at user scope
|
|
5
|
+
it targets the global ~/.copilot/mcp-config.json file.
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
8
|
import json
|
|
@@ -13,6 +13,7 @@ from typing import ClassVar
|
|
|
13
13
|
import click
|
|
14
14
|
|
|
15
15
|
from ...core.token_manager import GitHubTokenManager
|
|
16
|
+
from ...models.dependency.mcp import TrustedEnvLiteral
|
|
16
17
|
from ...registry.client import SimpleRegistryClient
|
|
17
18
|
from ...registry.integration import RegistryIntegration
|
|
18
19
|
from ...utils.console import _rich_warning
|
|
@@ -91,8 +92,9 @@ class CopilotClientAdapter(MCPClientAdapter):
|
|
|
91
92
|
|
|
92
93
|
Args:
|
|
93
94
|
registry_url (str, optional): URL of the MCP registry.
|
|
94
|
-
If not provided,
|
|
95
|
-
|
|
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``).
|
|
96
98
|
project_root: Project root context passed through to the base
|
|
97
99
|
adapter for scope-aware operations.
|
|
98
100
|
user_scope: Whether the adapter should resolve user-scope config
|
|
@@ -103,13 +105,23 @@ class CopilotClientAdapter(MCPClientAdapter):
|
|
|
103
105
|
self.registry_integration = RegistryIntegration(registry_url)
|
|
104
106
|
|
|
105
107
|
def get_config_path(self):
|
|
106
|
-
"""Get the path to the Copilot
|
|
108
|
+
"""Get the path to the Copilot MCP configuration file.
|
|
109
|
+
|
|
110
|
+
At user scope returns the global Copilot CLI config so MCP servers are
|
|
111
|
+
available across all projects. At project scope returns the per-repo
|
|
112
|
+
.github/mcp.json path that Copilot CLI reads since deprecating
|
|
113
|
+
.vscode/mcp.json.
|
|
107
114
|
|
|
108
115
|
Returns:
|
|
109
|
-
str: Path to
|
|
116
|
+
str: Path to the MCP configuration file.
|
|
110
117
|
"""
|
|
111
|
-
|
|
112
|
-
|
|
118
|
+
if self.user_scope:
|
|
119
|
+
configured_home = os.environ.get("COPILOT_HOME", "").strip()
|
|
120
|
+
copilot_home = (
|
|
121
|
+
Path(configured_home).expanduser() if configured_home else Path.home() / ".copilot"
|
|
122
|
+
)
|
|
123
|
+
return str(copilot_home / "mcp-config.json")
|
|
124
|
+
return str(self.project_root / ".github" / "mcp.json")
|
|
113
125
|
|
|
114
126
|
def update_config(self, config_updates):
|
|
115
127
|
"""Update the Copilot CLI MCP configuration.
|
|
@@ -423,6 +435,8 @@ class CopilotClientAdapter(MCPClientAdapter):
|
|
|
423
435
|
raw = server_info.get("_raw_stdio")
|
|
424
436
|
if raw:
|
|
425
437
|
config["command"] = raw["command"]
|
|
438
|
+
if raw.get("cwd") is not None:
|
|
439
|
+
config["cwd"] = raw["cwd"]
|
|
426
440
|
resolved_env_for_args = {}
|
|
427
441
|
if raw.get("env"):
|
|
428
442
|
resolved_env_for_args = self._resolve_environment_variables(
|
|
@@ -723,7 +737,9 @@ class CopilotClientAdapter(MCPClientAdapter):
|
|
|
723
737
|
if not isinstance(raw_value, str):
|
|
724
738
|
translated[name] = _stringify_env_literal(raw_value)
|
|
725
739
|
continue
|
|
726
|
-
if
|
|
740
|
+
if isinstance(raw_value, TrustedEnvLiteral):
|
|
741
|
+
translated[name] = raw_value
|
|
742
|
+
elif _has_env_placeholder(raw_value):
|
|
727
743
|
self._last_legacy_angle_vars.update(_extract_legacy_angle_vars(raw_value))
|
|
728
744
|
translated[name] = self._translate_env_placeholder_for_runtime(raw_value)
|
|
729
745
|
for match in _ENV_VAR_RE.finditer(translated[name]):
|
|
@@ -134,6 +134,8 @@ class CursorClientAdapter(CopilotClientAdapter):
|
|
|
134
134
|
if raw:
|
|
135
135
|
config["type"] = "stdio"
|
|
136
136
|
config["command"] = raw["command"]
|
|
137
|
+
if raw.get("cwd") is not None:
|
|
138
|
+
config["cwd"] = raw["cwd"]
|
|
137
139
|
resolved_env_for_args: dict = {}
|
|
138
140
|
if raw.get("env"):
|
|
139
141
|
resolved_env_for_args = self._resolve_environment_variables(
|
|
@@ -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):
|
|
@@ -148,6 +152,8 @@ class GeminiClientAdapter(CopilotClientAdapter):
|
|
|
148
152
|
raw = server_info.get("_raw_stdio")
|
|
149
153
|
if raw:
|
|
150
154
|
config["command"] = raw["command"]
|
|
155
|
+
if raw.get("cwd") is not None:
|
|
156
|
+
config["cwd"] = raw["cwd"]
|
|
151
157
|
resolved_env_for_args: dict = {}
|
|
152
158
|
if raw.get("env"):
|
|
153
159
|
resolved_env_for_args = self._resolve_environment_variables(
|
|
@@ -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}). "
|
|
@@ -116,6 +116,8 @@ class KiroClientAdapter(CopilotClientAdapter):
|
|
|
116
116
|
raw = server_info.get("_raw_stdio")
|
|
117
117
|
if raw:
|
|
118
118
|
config: dict[str, Any] = {"command": raw["command"]}
|
|
119
|
+
if raw.get("cwd") is not None:
|
|
120
|
+
config["cwd"] = raw["cwd"]
|
|
119
121
|
resolved_env_for_args: dict[str, Any] = {}
|
|
120
122
|
if raw.get("env"):
|
|
121
123
|
resolved_env_for_args = self._resolve_environment_variables(
|
|
@@ -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
|
|
@@ -277,6 +278,8 @@ class VSCodeClientAdapter(MCPClientAdapter):
|
|
|
277
278
|
"command": raw["command"],
|
|
278
279
|
"args": raw["args"],
|
|
279
280
|
}
|
|
281
|
+
if raw.get("cwd") is not None:
|
|
282
|
+
server_config["cwd"] = raw["cwd"]
|
|
280
283
|
if raw.get("env"):
|
|
281
284
|
# Translate bare ${VAR} -> ${env:VAR} so VS Code's runtime env
|
|
282
285
|
# interpolation resolves them at server-start. ${input:...}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"""Agent Plugins v1 contract helpers."""
|
|
2
|
+
|
|
3
|
+
from .assets import AssetInventoryError, open_verified_asset
|
|
4
|
+
from .constants import (
|
|
5
|
+
AGENT_PLUGINS_SCHEMA_PREFIX,
|
|
6
|
+
AGENT_PLUGINS_SITE_COMMIT,
|
|
7
|
+
AGENT_PLUGINS_SPEC_COMMIT,
|
|
8
|
+
AGENT_PLUGINS_SPEC_SHA256,
|
|
9
|
+
AGENT_PLUGINS_VERSION,
|
|
10
|
+
COM_MICROSOFT_APM_NAMESPACE,
|
|
11
|
+
COM_MICROSOFT_APM_SCHEMA_VERSION,
|
|
12
|
+
MAX_COMPONENT_ASSET_BYTES,
|
|
13
|
+
MAX_COMPONENT_ASSET_ENTRIES,
|
|
14
|
+
MCP_SCHEMA_ID,
|
|
15
|
+
MCP_SCHEMA_SHA256,
|
|
16
|
+
PLUGIN_SCHEMA_ID,
|
|
17
|
+
PLUGIN_SCHEMA_SHA256,
|
|
18
|
+
SUPPORTED_MCP_SCHEMA_IDS,
|
|
19
|
+
SUPPORTED_PLUGIN_SCHEMA_IDS,
|
|
20
|
+
)
|
|
21
|
+
from .errors import (
|
|
22
|
+
AgentPluginDeploymentBoundaryError,
|
|
23
|
+
AgentPluginError,
|
|
24
|
+
AgentPluginLegacyBoundaryError,
|
|
25
|
+
AgentPluginManifestAuthorityError,
|
|
26
|
+
AgentPluginManifestError,
|
|
27
|
+
NotAgentPluginError,
|
|
28
|
+
UnsupportedAgentPluginVersionError,
|
|
29
|
+
)
|
|
30
|
+
from .io import MAX_JSON_BYTES, read_json_document
|
|
31
|
+
from .ir import (
|
|
32
|
+
AgentPlugin,
|
|
33
|
+
AgentPluginAsset,
|
|
34
|
+
AgentPluginComponents,
|
|
35
|
+
AgentPluginDetection,
|
|
36
|
+
AgentPluginDiagnostic,
|
|
37
|
+
AgentPluginExecutable,
|
|
38
|
+
AgentPluginIdentity,
|
|
39
|
+
AgentPluginMcpServer,
|
|
40
|
+
AgentPluginSkill,
|
|
41
|
+
ApmConfiguration,
|
|
42
|
+
ApmExtensionData,
|
|
43
|
+
DiagnosticSeverity,
|
|
44
|
+
FrozenJsonArray,
|
|
45
|
+
FrozenJsonObject,
|
|
46
|
+
FrozenJsonValue,
|
|
47
|
+
JsonValue,
|
|
48
|
+
McpServerType,
|
|
49
|
+
SourceProvenance,
|
|
50
|
+
thaw_frozen_json,
|
|
51
|
+
)
|
|
52
|
+
from .loader import (
|
|
53
|
+
admit_legacy_plugin_manifest,
|
|
54
|
+
detect_agent_plugin,
|
|
55
|
+
load_agent_plugin,
|
|
56
|
+
reject_agent_plugin_legacy_normalization,
|
|
57
|
+
)
|
|
58
|
+
from .validation import (
|
|
59
|
+
ValidationResult,
|
|
60
|
+
args_contain_literal_secret,
|
|
61
|
+
contains_literal_secret_fields,
|
|
62
|
+
is_agent_plugin_schema_id,
|
|
63
|
+
schema_version_from_id,
|
|
64
|
+
supports_mcp_schema_id,
|
|
65
|
+
supports_plugin_schema_id,
|
|
66
|
+
url_contains_literal_secret,
|
|
67
|
+
validate_mcp_config_document,
|
|
68
|
+
validate_mcp_config_file,
|
|
69
|
+
validate_plugin_manifest_document,
|
|
70
|
+
validate_plugin_manifest_file,
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def __getattr__(name: str) -> object:
|
|
75
|
+
"""Lazily expose compatibility projection without a models import cycle."""
|
|
76
|
+
if name != "project_agent_plugin_package":
|
|
77
|
+
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
|
78
|
+
from .projection import project_agent_plugin_package
|
|
79
|
+
|
|
80
|
+
return project_agent_plugin_package
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
__all__ = [
|
|
84
|
+
"AGENT_PLUGINS_SCHEMA_PREFIX",
|
|
85
|
+
"AGENT_PLUGINS_SITE_COMMIT",
|
|
86
|
+
"AGENT_PLUGINS_SPEC_COMMIT",
|
|
87
|
+
"AGENT_PLUGINS_SPEC_SHA256",
|
|
88
|
+
"AGENT_PLUGINS_VERSION",
|
|
89
|
+
"COM_MICROSOFT_APM_NAMESPACE",
|
|
90
|
+
"COM_MICROSOFT_APM_SCHEMA_VERSION",
|
|
91
|
+
"MAX_COMPONENT_ASSET_BYTES",
|
|
92
|
+
"MAX_COMPONENT_ASSET_ENTRIES",
|
|
93
|
+
"MAX_JSON_BYTES",
|
|
94
|
+
"MCP_SCHEMA_ID",
|
|
95
|
+
"MCP_SCHEMA_SHA256",
|
|
96
|
+
"PLUGIN_SCHEMA_ID",
|
|
97
|
+
"PLUGIN_SCHEMA_SHA256",
|
|
98
|
+
"SUPPORTED_MCP_SCHEMA_IDS",
|
|
99
|
+
"SUPPORTED_PLUGIN_SCHEMA_IDS",
|
|
100
|
+
"AgentPlugin",
|
|
101
|
+
"AgentPluginAsset",
|
|
102
|
+
"AgentPluginComponents",
|
|
103
|
+
"AgentPluginDeploymentBoundaryError",
|
|
104
|
+
"AgentPluginDetection",
|
|
105
|
+
"AgentPluginDiagnostic",
|
|
106
|
+
"AgentPluginError",
|
|
107
|
+
"AgentPluginExecutable",
|
|
108
|
+
"AgentPluginIdentity",
|
|
109
|
+
"AgentPluginLegacyBoundaryError",
|
|
110
|
+
"AgentPluginManifestAuthorityError",
|
|
111
|
+
"AgentPluginManifestError",
|
|
112
|
+
"AgentPluginMcpServer",
|
|
113
|
+
"AgentPluginSkill",
|
|
114
|
+
"ApmConfiguration",
|
|
115
|
+
"ApmExtensionData",
|
|
116
|
+
"AssetInventoryError",
|
|
117
|
+
"DiagnosticSeverity",
|
|
118
|
+
"FrozenJsonArray",
|
|
119
|
+
"FrozenJsonObject",
|
|
120
|
+
"FrozenJsonValue",
|
|
121
|
+
"JsonValue",
|
|
122
|
+
"McpServerType",
|
|
123
|
+
"NotAgentPluginError",
|
|
124
|
+
"SourceProvenance",
|
|
125
|
+
"UnsupportedAgentPluginVersionError",
|
|
126
|
+
"ValidationResult",
|
|
127
|
+
"admit_legacy_plugin_manifest",
|
|
128
|
+
"args_contain_literal_secret",
|
|
129
|
+
"contains_literal_secret_fields",
|
|
130
|
+
"detect_agent_plugin",
|
|
131
|
+
"is_agent_plugin_schema_id",
|
|
132
|
+
"load_agent_plugin",
|
|
133
|
+
"open_verified_asset",
|
|
134
|
+
"project_agent_plugin_package",
|
|
135
|
+
"read_json_document",
|
|
136
|
+
"reject_agent_plugin_legacy_normalization",
|
|
137
|
+
"schema_version_from_id",
|
|
138
|
+
"supports_mcp_schema_id",
|
|
139
|
+
"supports_plugin_schema_id",
|
|
140
|
+
"thaw_frozen_json",
|
|
141
|
+
"url_contains_literal_secret",
|
|
142
|
+
"validate_mcp_config_document",
|
|
143
|
+
"validate_mcp_config_file",
|
|
144
|
+
"validate_plugin_manifest_document",
|
|
145
|
+
"validate_plugin_manifest_file",
|
|
146
|
+
]
|