apm-cli 0.29.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.29.0/src/apm_cli.egg-info → apm_cli-0.29.1}/PKG-INFO +1 -1
- {apm_cli-0.29.0 → apm_cli-0.29.1}/pyproject.toml +1 -1
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/base.py +1 -4
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/codex.py +3 -2
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/copilot.py +3 -2
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/gemini.py +6 -2
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/intellij.py +69 -1
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/opencode.py +6 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/vscode.py +3 -2
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/agent_plugins/loader.py +6 -6
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/bundle/agent_plugin_exporter.py +7 -4
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/bundle/local_bundle.py +18 -41
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/bundle/packer.py +2 -4
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/bundle/plugin_exporter.py +2 -4
- apm_cli-0.29.1/src/apm_cli/bundle/plugin_layout.py +60 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/cache/git_cache.py +168 -59
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/cache/url_normalize.py +7 -3
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/_helpers.py +3 -2
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/approve.py +75 -10
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/audit.py +16 -6
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/compile/cli.py +250 -42
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/compile/watcher.py +112 -57
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/config.py +9 -1
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/deps/cli.py +4 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/experimental.py +4 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/init.py +2 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/install.py +273 -265
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/lifecycle.py +2 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/lock.py +13 -14
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/__init__.py +43 -245
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/check.py +2 -1
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/doctor.py +38 -10
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/init.py +2 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/plugin/add.py +2 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/plugin/remove.py +2 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/plugin/set.py +2 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/mcp.py +36 -29
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/pack.py +116 -19
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/plugin/init.py +2 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/prune.py +16 -1
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/publish.py +1 -1
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/uninstall/cli.py +221 -61
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/uninstall/engine.py +168 -18
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/update.py +73 -10
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/compilation/agents_compiler.py +339 -118
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/compilation/build_id.py +1 -3
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/compilation/claude_formatter.py +2 -4
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/compilation/constants.py +21 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/compilation/distributed_compiler.py +39 -37
- apm_cli-0.29.1/src/apm_cli/compilation/footer.py +20 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/compilation/gemini_formatter.py +2 -2
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/compilation/inventory.py +26 -2
- {apm_cli-0.29.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.29.0 → apm_cli-0.29.1}/src/apm_cli/compilation/template_builder.py +6 -8
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/compilation/user_root_context.py +4 -5
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/config.py +119 -25
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/apm_yml.py +70 -6
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/auth.py +246 -110
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/build_orchestrator.py +122 -27
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/command_logger.py +101 -6
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/deployment_ledger.py +86 -21
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/experimental.py +4 -14
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/host_providers.py +60 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/lifecycle_scripts.py +15 -8
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/null_logger.py +5 -2
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/scope.py +8 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/target_catalog.py +1 -1
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/target_detection.py +29 -4
- {apm_cli-0.29.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.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/apm_resolver.py +271 -54
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/artifactory_entry.py +31 -5
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/artifactory_orchestrator.py +22 -10
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/bare_cache.py +122 -46
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/clone_engine.py +180 -78
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/download_strategies.py +87 -36
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/git_auth_env.py +14 -11
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/git_file_transport.py +51 -17
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/git_reference_resolver.py +109 -47
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/git_remote_ops.py +71 -4
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/github_downloader.py +234 -130
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/github_downloader_validation.py +234 -96
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/host_backends.py +4 -3
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/lockfile.py +142 -25
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/path_anchoring.py +78 -17
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/plugin_parser.py +228 -74
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/reachability.py +16 -2
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/auth.py +31 -5
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/client.py +56 -2
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/config_loader.py +8 -4
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/feature_gate.py +8 -4
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/outdated.py +1 -1
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/resolver.py +10 -13
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/revision_pins.py +55 -10
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/tiered_ref_resolver.py +1 -1
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/transport_selection.py +192 -66
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/drift.py +3 -11
- {apm_cli-0.29.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.29.0 → apm_cli-0.29.1}/src/apm_cli/install/context.py +1 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/deployed_paths.py +14 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/drift.py +53 -31
- {apm_cli-0.29.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.29.0 → apm_cli-0.29.1}/src/apm_cli/install/errors.py +14 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/exec_gate.py +9 -24
- apm_cli-0.29.1/src/apm_cli/install/finalization.py +19 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/helpers/ref_reuse.py +188 -38
- apm_cli-0.29.1/src/apm_cli/install/legacy_plugin_compat.py +264 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/local_bundle_handler.py +99 -35
- 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.29.0 → apm_cli-0.29.1}/src/apm_cli/install/manifest_reconcile.py +122 -26
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/command.py +109 -18
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/conflicts.py +2 -9
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/integration.py +23 -15
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/ownership.py +23 -1
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/registry.py +85 -62
- {apm_cli-0.29.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.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/integrate.py +3 -6
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/local_content.py +2 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/lockfile.py +12 -1
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/resolve.py +107 -112
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/targets.py +33 -28
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/pipeline.py +12 -21
- 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.29.0 → apm_cli-0.29.1}/src/apm_cli/install/registry_wiring.py +7 -3
- apm_cli-0.29.1/src/apm_cli/install/resolution_staging.py +356 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/service.py +1 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/service_integration.py +12 -4
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/services.py +60 -71
- apm_cli-0.29.1/src/apm_cli/install/source_helpers.py +56 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/sources.py +83 -133
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/summary.py +39 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/target_filter.py +19 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/target_hints.py +3 -1
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/template.py +13 -28
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/transaction.py +82 -24
- {apm_cli-0.29.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.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/agent_integrator.py +55 -11
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/base_integrator.py +118 -11
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/cleanup.py +14 -1
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/hook_integrator.py +34 -32
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/instruction_integrator.py +285 -123
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/lsp_integrator.py +360 -43
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/mcp_config_view.py +39 -34
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/mcp_integrator.py +217 -33
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/mcp_integrator_install.py +225 -42
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/skill_integrator.py +12 -3
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/skill_support.py +6 -1
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/targets.py +63 -13
- apm_cli-0.29.1/src/apm_cli/marketplace/_git_utils.py +12 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/builder.py +347 -97
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/client.py +77 -38
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/drift_check.py +44 -12
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/errors.py +6 -4
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/models.py +32 -41
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/ref_resolver.py +111 -43
- {apm_cli-0.29.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.29.0 → apm_cli-0.29.1}/src/apm_cli/models/apm_package.py +45 -13
- apm_cli-0.29.1/src/apm_cli/models/dependency/host_virtual.py +364 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/lsp.py +2 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/mcp.py +26 -16
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/reference.py +179 -159
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/format_detection.py +49 -23
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/results.py +2 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/validation.py +48 -17
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/policy/_gitlab.py +8 -5
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/policy/ci_checks.py +181 -32
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/policy/discovery.py +15 -34
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/policy/inheritance.py +2 -4
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/primitives/discovery.py +27 -103
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/registry/client.py +173 -25
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/registry/operations.py +75 -17
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/security/content_scanner.py +31 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/security/executables.py +241 -55
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/security/file_scanner.py +40 -3
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/security/gate.py +9 -4
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/atomic_io.py +36 -5
- {apm_cli-0.29.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.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/github_host.py +22 -87
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/patterns.py +5 -11
- apm_cli-0.29.1/src/apm_cli/utils/staging_guard.py +63 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/yaml_io.py +78 -35
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/version.py +3 -1
- {apm_cli-0.29.0 → apm_cli-0.29.1/src/apm_cli.egg-info}/PKG-INFO +1 -1
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli.egg-info/SOURCES.txt +13 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/tests/test_apm_package_models.py +39 -3
- {apm_cli-0.29.0 → apm_cli-0.29.1}/tests/test_apm_resolver.py +107 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/tests/test_github_downloader.py +153 -121
- {apm_cli-0.29.0 → apm_cli-0.29.1}/tests/test_gitlab_git_transport.py +85 -3
- {apm_cli-0.29.0 → apm_cli-0.29.1}/tests/test_lockfile.py +208 -1
- {apm_cli-0.29.0 → apm_cli-0.29.1}/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.29.1}/AUTHORS +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/LICENSE +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/NOTICE +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/README.md +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/setup.cfg +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/_mcp_runtime_args.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/antigravity.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/claude.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/cursor.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/hermes.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/kiro.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/windsurf.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/package_manager/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/package_manager/base.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/package_manager/default_manager.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/agent_plugins/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/agent_plugins/assets.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/agent_plugins/constants.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/agent_plugins/errors.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/agent_plugins/io.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/agent_plugins/ir.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/agent_plugins/projection.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/agent_plugins/validation.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/bootstrap_mirror.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/bundle/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/bundle/attest.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/bundle/claude_plugin_exporter.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/bundle/export_common.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/bundle/formats.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/bundle/lockfile_enrichment.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/bundle/reproducible_archive.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/bundle/unpacker.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/cache/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/cache/http_cache.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/cache/integrity.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/cache/locking.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/cache/paths.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/cli.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/_apm_yml_writer.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/cache.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/compile/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/deps/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/deps/_utils.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/deps/why.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/doctor.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/find.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/list_cmd.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/audit.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/migrate.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/outdated.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/plugin/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/validate.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/outdated.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/plugin/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/policy.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/run.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/runtime.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/self_update.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/targets.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/uninstall/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/uninstall/lockfile_state.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/view.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/compilation/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/compilation/constitution.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/compilation/constitution_block.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/compilation/context_optimizer.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/compilation/injector.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/compilation/link_resolver.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/compilation/managed_section.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/constants.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/copilot_plugins/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/copilot_plugins/capability.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/copilot_plugins/catalog.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/copilot_plugins/constants.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/copilot_plugins/registrar.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/copilot_plugins/settings.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/_child_tls/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/_child_tls/_apm_tls.pth +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/_child_tls/_apm_tls_bootstrap.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/azure_cli.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/conflict_detector.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/deployment_state.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/docker_args.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/errors.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/install_audit.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/operations.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/output_mode.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/plugin_manifest.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/project_name.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/safe_installer.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/script_executors.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/script_runner.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/script_trust.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/tls_trust.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/aggregator.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/dependency_graph.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/git_semver_resolver.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/github_rate_limit.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/installed_package.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/outdated_ref_cache.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/outdated_row.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/package_validator.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/extractor.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/semver.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry_proxy.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/shared_clone_cache.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/verifier.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/why_walker.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/export/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/export/authoring.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/export/declared_license.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/export/formats.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/export/purl.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/export/sbom.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/export/spdx.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/export/spdx_data.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/factory.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/hook_contract.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/argv.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/artifactory_resolver.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/cache_pin.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/deployable_source_plan.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/gitlab_resolver.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/heals/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/heals/base.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/heals/branch_ref_drift.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/heals/buggy_lockfile_recovery.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/helpers/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/helpers/no_work.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/helpers/ref_seed.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/helpers/security_scan.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/insecure_policy.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/integrity.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/lsp/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/args.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/entry.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/warnings.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/writer.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/native_plugin_admission.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/package_resolution.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/_redownload.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/_skip_logic.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/audit.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/cleanup.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/copilot_plugins.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/download.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/finalize.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/heal.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/policy_gate.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/policy_target_check.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/post_deps_local.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/plan.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/presentation/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/request.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/root_redirect.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/skill_path_migration.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/target_warnings.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/_hook_dropped_targets.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/canvas_integrator.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/command_integrator.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/copilot_app_db.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/copilot_app_project.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/copilot_app_workflow_integrator.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/copilot_app_ws.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/copilot_cowork_paths.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/coverage.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/dispatch.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/hook_bundle.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/hook_command_paths.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/hook_command_warnings.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/hook_file_routing.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/hook_ir.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/hook_native_formats.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/hook_ownership.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/hook_reintegration.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/hook_source_selection.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/kiro_hook_integrator.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/opencode_frontmatter.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/prompt_integrator.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/skill_package_routing.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/skill_transformer.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/utils.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/_io.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/_shared.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/audit.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/auth_helpers.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/diagnostics.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/git_stderr.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/init_template.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/migration.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/output_mappers.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/output_profiles.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/resolver.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/semver.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/shadow_detector.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/tag_pattern.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/validator.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/version_check.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/version_pins.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/version_resolver.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/yml_editor.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/yml_schema.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/identity.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/materialization.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/object_fields.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/provider_coordinates.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/registry_entry.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/selection.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/subsets.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/types.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/manifest_contract.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/plugin.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/output/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/output/formatters.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/output/models.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/output/script_formatters.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/policy/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/policy/_constraint_pinning.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/policy/_help_text.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/policy/_shared.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/policy/install_preflight.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/policy/matcher.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/policy/models.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/policy/outcome_routing.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/policy/parser.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/policy/policy_checks.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/policy/project_config.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/policy/schema.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/primitives/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/primitives/models.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/primitives/parser.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/registry/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/registry/integration.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/runtime/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/runtime/base.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/runtime/codex_runtime.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/runtime/copilot_runtime.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/runtime/factory.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/runtime/llm_runtime.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/runtime/manager.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/runtime/registry.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/runtime/utils.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/security/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/security/audit_report.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/security/external/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/security/external/base.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/security/external/gate.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/security/external/generic_sarif.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/security/external/options.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/security/external/registry.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/security/external/runner.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/security/external/sarif_ingest.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/security/external/skillspector.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/update_policy.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/archive.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/console.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/content_hash.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/exclude.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/file_ops.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/guards.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/helpers.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/install_tui.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/net.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/normalization.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/path_security.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/paths.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/perf_stats.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/reflink.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/short_sha.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/subprocess_env.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/version_checker.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/workflow/__init__.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/workflow/discovery.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/workflow/parser.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/workflow/runner.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli.egg-info/dependency_links.txt +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli.egg-info/entry_points.txt +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli.egg-info/requires.txt +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli.egg-info/top_level.txt +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/tests/test_codex_docker_args_fix.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/tests/test_codex_empty_string_and_defaults.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/tests/test_collision_integration.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/tests/test_console.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/tests/test_distributed_compilation.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/tests/test_empty_string_and_defaults.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/tests/test_enhanced_discovery.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/tests/test_github_downloader_token_precedence.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/tests/test_runnable_prompts.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/tests/test_runtime_manager_token_precedence.py +0 -0
- {apm_cli-0.29.0 → apm_cli-0.29.1}/tests/test_virtual_package_multi_install.py +0 -0
|
@@ -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
|
+
}
|