apm-cli 0.33.0__tar.gz → 0.34.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {apm_cli-0.33.0/src/apm_cli.egg-info → apm_cli-0.34.0}/PKG-INFO +11 -11
- {apm_cli-0.33.0 → apm_cli-0.34.0}/README.md +10 -10
- {apm_cli-0.33.0 → apm_cli-0.34.0}/pyproject.toml +2 -1
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/adapters/client/base.py +68 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/adapters/client/claude.py +20 -2
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/adapters/client/cursor.py +45 -27
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/adapters/client/opencode.py +50 -17
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/bundle/lockfile_enrichment.py +22 -19
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/cli.py +19 -3
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/_helpers.py +31 -4
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/compile/cli.py +3 -1
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/install.py +29 -12
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/prune.py +5 -1
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/targets.py +31 -16
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/uninstall/engine.py +2 -4
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/uninstall/lockfile_state.py +1 -1
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/compilation/agents_compiler.py +74 -57
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/compilation/build_id.py +24 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/compilation/root_context_protection.py +66 -1
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/core/auth.py +109 -10
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/core/command_logger.py +8 -2
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/core/deployment_ledger.py +115 -18
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/core/deployment_state.py +3 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/core/script_executors.py +10 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/core/target_catalog.py +69 -55
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/core/target_detection.py +29 -22
- apm_cli-0.34.0/src/apm_cli/core/tls_trust.py +625 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/bare_cache.py +12 -2
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/git_reference_resolver.py +3 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/git_remote_ops.py +66 -38
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/installed_package.py +19 -2
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/lockfile.py +78 -1
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/audit_replay.py +3 -2
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/deployed_paths.py +42 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/drift.py +20 -56
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/drift_render.py +47 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/errors.py +22 -5
- apm_cli-0.34.0/src/apm_cli/install/helpers/no_work.py +96 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/manifest_reconcile.py +42 -17
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/mcp/command.py +37 -2
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/mcp/integration.py +26 -14
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/mcp/ownership.py +6 -2
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/phases/integrate.py +29 -1
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/phases/lockfile.py +2 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/phases/post_deps_local.py +10 -2
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/phases/targets.py +5 -1
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/pipeline.py +7 -2
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/presentation/dry_run.py +13 -4
- apm_cli-0.34.0/src/apm_cli/install/project_package.py +26 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/service.py +152 -29
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/services.py +28 -49
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/sources.py +20 -3
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/target_filter.py +105 -1
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/validation.py +30 -13
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/agent_integrator.py +156 -2
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/cleanup.py +14 -11
- apm_cli-0.34.0/src/apm_cli/integration/hook_cursor_preflight.py +249 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/hook_integrator.py +88 -72
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/hook_native_formats.py +190 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/hook_ownership.py +32 -9
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/mcp_integrator.py +53 -14
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/mcp_integrator_install.py +59 -9
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/skill_integrator.py +26 -36
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/skill_support.py +4 -1
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/targets.py +314 -250
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/marketplace/builder.py +104 -43
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/marketplace/client.py +56 -16
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/marketplace/output_mappers.py +135 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/marketplace/output_profiles.py +9 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/marketplace/ref_resolver.py +23 -6
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/marketplace/yml_schema.py +42 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/models/apm_package.py +107 -2
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/models/dependency/materialization.py +20 -1
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/policy/ci_checks.py +32 -7
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/primitives/models.py +32 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/primitives/parser.py +9 -1
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/registry/operations.py +26 -6
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/runtime/manager.py +11 -3
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/security/external/options.py +89 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/security/external/skillspector.py +17 -2
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/utils/git_env.py +22 -2
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/utils/github_host.py +48 -13
- {apm_cli-0.33.0 → apm_cli-0.34.0/src/apm_cli.egg-info}/PKG-INFO +11 -11
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli.egg-info/SOURCES.txt +2 -0
- apm_cli-0.33.0/src/apm_cli/core/tls_trust.py +0 -343
- apm_cli-0.33.0/src/apm_cli/install/helpers/no_work.py +0 -34
- {apm_cli-0.33.0 → apm_cli-0.34.0}/AUTHORS +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/LICENSE +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/NOTICE +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/setup.cfg +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/adapters/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/adapters/client/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/adapters/client/_mcp_runtime_args.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/adapters/client/antigravity.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/adapters/client/codex.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/adapters/client/copilot.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/adapters/client/gemini.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/adapters/client/hermes.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/adapters/client/intellij.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/adapters/client/kiro.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/adapters/client/vscode.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/adapters/client/windsurf.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/adapters/package_manager/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/adapters/package_manager/base.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/adapters/package_manager/default_manager.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/adopt/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/adopt/discovery.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/adopt/manifest_edit.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/adopt/materialize.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/adopt/render.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/adopt/safety.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/agent_plugins/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/agent_plugins/assets.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/agent_plugins/constants.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/agent_plugins/errors.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/agent_plugins/io.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/agent_plugins/ir.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/agent_plugins/loader.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/agent_plugins/projection.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/agent_plugins/validation.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/bootstrap_mirror.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/bundle/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/bundle/agent_plugin_exporter.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/bundle/attest.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/bundle/claude_plugin_exporter.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/bundle/export_common.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/bundle/formats.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/bundle/local_bundle.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/bundle/packer.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/bundle/plugin_exporter.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/bundle/plugin_layout.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/bundle/reproducible_archive.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/bundle/unpacker.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/cache/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/cache/cleanup.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/cache/git_cache.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/cache/http_cache.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/cache/integrity.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/cache/locking.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/cache/paths.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/cache/url_normalize.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/_apm_yml_writer.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/approve.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/audit.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/auth.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/cache.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/compile/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/compile/watcher.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/config.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/deps/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/deps/_utils.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/deps/cli.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/deps/why.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/discover.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/doctor.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/experimental.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/find.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/init.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/lifecycle.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/list_cmd.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/lock.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/marketplace/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/marketplace/audit.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/marketplace/check.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/marketplace/doctor.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/marketplace/init.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/marketplace/migrate.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/marketplace/outdated.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/marketplace/plugin/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/marketplace/plugin/add.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/marketplace/plugin/remove.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/marketplace/plugin/set.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/marketplace/validate.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/mcp.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/outdated.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/pack.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/plugin/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/plugin/init.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/policy.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/publish.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/run.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/runtime.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/self_update.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/uninstall/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/uninstall/cli.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/update.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/commands/view.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/compilation/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/compilation/claude_formatter.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/compilation/constants.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/compilation/constitution.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/compilation/constitution_block.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/compilation/context_optimizer.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/compilation/distributed_compiler.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/compilation/footer.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/compilation/gemini_formatter.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/compilation/injector.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/compilation/inventory.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/compilation/link_resolver.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/compilation/managed_section.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/compilation/output_writer.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/compilation/template_builder.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/compilation/user_root_context.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/config.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/constants.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/copilot_plugins/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/copilot_plugins/capability.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/copilot_plugins/catalog.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/copilot_plugins/constants.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/copilot_plugins/registrar.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/copilot_plugins/settings.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/core/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/core/_child_tls/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/core/_child_tls/_apm_tls.pth +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/core/_child_tls/_apm_tls_bootstrap.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/core/apm_yml.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/core/azure_cli.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/core/build_orchestrator.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/core/conflict_detector.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/core/docker_args.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/core/errors.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/core/experimental.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/core/host_providers.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/core/install_audit.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/core/lifecycle_scripts.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/core/null_logger.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/core/operations.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/core/output_mode.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/core/plugin_manifest.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/core/project_name.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/core/safe_installer.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/core/scope.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/core/script_runner.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/core/script_trust.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/core/token_manager.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/_shared.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/aggregator.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/apm_resolver.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/artifactory_entry.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/artifactory_orchestrator.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/clone_engine.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/dependency_graph.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/download_strategies.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/git_auth_env.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/git_file_transport.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/git_semver_resolver.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/github_downloader.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/github_downloader_validation.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/github_rate_limit.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/host_backends.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/immutable_requirements.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/outdated_ref_cache.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/outdated_row.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/package_validator.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/path_anchoring.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/plugin_parser.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/reachability.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/registry/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/registry/auth.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/registry/client.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/registry/config_loader.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/registry/extractor.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/registry/feature_gate.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/registry/outdated.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/registry/resolver.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/registry/semver.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/registry_proxy.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/revision_pins.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/shared_clone_cache.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/tiered_ref_resolver.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/transport_selection.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/verifier.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/deps/why_walker.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/drift.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/export/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/export/authoring.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/export/declared_license.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/export/formats.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/export/purl.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/export/sbom.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/export/spdx.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/export/spdx_data.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/factory.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/hook_contract.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/argv.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/artifactory_resolver.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/audit_target_roots.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/cache_pin.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/context.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/deployable_source_plan.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/dry_run_plan.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/exec_gate.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/finalization.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/gitlab_resolver.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/heals/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/heals/base.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/heals/branch_ref_drift.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/heals/buggy_lockfile_recovery.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/helpers/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/helpers/ref_reuse.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/helpers/ref_seed.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/helpers/security_scan.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/insecure_policy.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/integrity.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/legacy_plugin_compat.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/local_bundle_handler.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/local_bundle_paths.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/locking.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/lsp/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/lsp/integration.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/manifest_helpers.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/mcp/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/mcp/args.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/mcp/conflicts.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/mcp/entry.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/mcp/registry.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/mcp/warnings.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/mcp/writer.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/native_plugin_admission.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/outcome.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/package_resolution.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/package_selection.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/phases/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/phases/_redownload.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/phases/_skip_logic.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/phases/audit.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/phases/cleanup.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/phases/copilot_plugins.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/phases/download.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/phases/finalize.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/phases/heal.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/phases/local_content.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/phases/policy_gate.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/phases/policy_target_check.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/phases/resolve.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/plan.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/presentation/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/primitive_classification.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/registry_wiring.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/request.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/resolution_staging.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/root_redirect.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/service_integration.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/skill_path_migration.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/source_helpers.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/summary.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/target_hints.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/target_warnings.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/template.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/install/transaction.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/_hook_dropped_targets.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/_shared.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/base_integrator.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/canvas_integrator.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/command_integrator.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/copilot_app_db.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/copilot_app_project.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/copilot_app_workflow_integrator.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/copilot_app_ws.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/copilot_cowork_paths.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/coverage.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/dispatch.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/hook_bundle.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/hook_command_paths.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/hook_command_warnings.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/hook_file_routing.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/hook_ir.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/hook_reintegration.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/hook_source_selection.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/instruction_integrator.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/kiro_hook_integrator.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/lsp_integrator.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/mcp_config_view.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/opencode_frontmatter.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/prompt_integrator.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/skill_package_routing.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/skill_transformer.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/integration/utils.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/marketplace/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/marketplace/_git_utils.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/marketplace/_io.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/marketplace/_shared.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/marketplace/audit.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/marketplace/auth_helpers.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/marketplace/diagnostics.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/marketplace/drift_check.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/marketplace/errors.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/marketplace/git_stderr.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/marketplace/init_template.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/marketplace/migration.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/marketplace/models.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/marketplace/registry.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/marketplace/resolver.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/marketplace/semver.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/marketplace/shadow_detector.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/marketplace/source_identity.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/marketplace/tag_pattern.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/marketplace/validator.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/marketplace/version_check.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/marketplace/version_pins.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/marketplace/version_resolver.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/marketplace/yml_editor.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/models/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/models/dependency/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/models/dependency/host_virtual.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/models/dependency/identity.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/models/dependency/lsp.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/models/dependency/mcp.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/models/dependency/object_fields.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/models/dependency/provider_coordinates.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/models/dependency/reference.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/models/dependency/registry_entry.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/models/dependency/selection.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/models/dependency/subsets.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/models/dependency/types.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/models/format_detection.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/models/manifest_contract.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/models/plugin.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/models/results.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/models/validation.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/output/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/output/formatters.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/output/models.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/output/script_formatters.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/policy/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/policy/_constraint_pinning.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/policy/_gitlab.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/policy/_help_text.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/policy/_shared.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/policy/discovery.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/policy/inheritance.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/policy/install_preflight.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/policy/matcher.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/policy/models.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/policy/outcome_routing.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/policy/parser.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/policy/policy_checks.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/policy/project_config.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/policy/schema.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/primitives/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/primitives/discovery.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/registry/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/registry/client.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/registry/integration.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/runtime/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/runtime/base.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/runtime/codex_runtime.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/runtime/copilot_runtime.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/runtime/factory.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/runtime/llm_runtime.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/runtime/registry.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/runtime/utils.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/security/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/security/audit_report.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/security/content_scanner.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/security/executables.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/security/external/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/security/external/base.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/security/external/gate.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/security/external/generic_sarif.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/security/external/registry.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/security/external/runner.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/security/external/sarif_ingest.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/security/file_scanner.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/security/gate.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/security/primitive_discovery.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/update_policy.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/utils/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/utils/archive.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/utils/atomic_io.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/utils/console.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/utils/content_hash.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/utils/diagnostics.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/utils/exclude.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/utils/file_ops.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/utils/git_sparse.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/utils/guards.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/utils/helpers.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/utils/install_tui.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/utils/net.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/utils/normalization.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/utils/path_security.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/utils/paths.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/utils/patterns.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/utils/perf_stats.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/utils/reflink.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/utils/short_sha.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/utils/staging_guard.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/utils/subprocess_env.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/utils/version_checker.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/utils/yaml_io.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/version.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/workflow/__init__.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/workflow/discovery.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/workflow/parser.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli/workflow/runner.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli.egg-info/dependency_links.txt +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli.egg-info/entry_points.txt +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli.egg-info/requires.txt +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/src/apm_cli.egg-info/top_level.txt +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/tests/test_apm_package_models.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/tests/test_apm_resolver.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/tests/test_codex_docker_args_fix.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/tests/test_codex_empty_string_and_defaults.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/tests/test_collision_integration.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/tests/test_console.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/tests/test_distributed_compilation.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/tests/test_empty_string_and_defaults.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/tests/test_enhanced_discovery.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/tests/test_github_downloader.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/tests/test_github_downloader_token_precedence.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/tests/test_gitlab_git_transport.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/tests/test_lockfile.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/tests/test_runnable_prompts.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/tests/test_runtime_manager_token_precedence.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/tests/test_token_manager.py +0 -0
- {apm_cli-0.33.0 → apm_cli-0.34.0}/tests/test_virtual_package_multi_install.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: apm-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.34.0
|
|
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/
|
|
81
|
+
**[Documentation](https://microsoft.github.io/apm/)** · **[Quick Start](https://microsoft.github.io/apm/quickstart/)** · **[CLI Reference](https://microsoft.github.io/apm/reference/)** · **[Roadmap](https://github.com/orgs/microsoft/projects/2304/views/5)**
|
|
82
82
|
|
|
83
83
|
---
|
|
84
84
|
|
|
@@ -140,11 +140,11 @@ One command, no configuration -- VS Code and GitHub Copilot read the file automa
|
|
|
140
140
|
One `apm.yml` describes every primitive your agents need — instructions, skills, prompts, agents, hooks, plugins, MCP servers — and `apm install` reproduces the exact same setup across every client on every machine. `apm.lock.yaml` pins the resolved tree the way `package-lock.json` does for npm.
|
|
141
141
|
|
|
142
142
|
- **[One manifest for everything](https://microsoft.github.io/apm/reference/primitive-types/)** -- declared once, deployed across Copilot, Claude, Grok Build, Cursor, OpenCode, Codex, Gemini, Windsurf, Kiro
|
|
143
|
-
- **[Install from anywhere](https://microsoft.github.io/apm/
|
|
144
|
-
- **[Transitive dependencies](https://microsoft.github.io/apm/
|
|
145
|
-
- **[Author plugins](https://microsoft.github.io/apm/
|
|
146
|
-
- **[Marketplaces](https://microsoft.github.io/apm/
|
|
147
|
-
- **[Pack & distribute](https://microsoft.github.io/apm/
|
|
143
|
+
- **[Install from anywhere](https://microsoft.github.io/apm/consumer/install-packages/)** — GitHub, GitLab, Bitbucket, Azure DevOps, GitHub Enterprise, Gitea, Gogs, any git host
|
|
144
|
+
- **[Transitive dependencies](https://microsoft.github.io/apm/consumer/install-packages/#transitive-dependencies-and-the-lockfile)** — packages can depend on packages; APM resolves the full tree
|
|
145
|
+
- **[Author plugins](https://microsoft.github.io/apm/producer/)** — build Copilot, Claude, and Cursor plugins with dependency management, then export standard `plugin.json`
|
|
146
|
+
- **[Marketplaces](https://microsoft.github.io/apm/consumer/installing-from-marketplaces/)** — install plugins from curated registries in one command, deployed across all targets and locked
|
|
147
|
+
- **[Pack & distribute](https://microsoft.github.io/apm/producer/pack-a-bundle/)** — `apm pack` bundles your configuration as a zipped package or a standalone plugin
|
|
148
148
|
- **[CI/CD ready](https://github.com/microsoft/apm-action)** — GitHub Action for automated workflows
|
|
149
149
|
|
|
150
150
|
### 2. Secure by default
|
|
@@ -152,10 +152,10 @@ One `apm.yml` describes every primitive your agents need — instructions, skill
|
|
|
152
152
|
Agent context is executable in effect — a prompt is a program for an LLM. APM treats it that way. Every install scans for hidden Unicode that can hijack agent behavior; the lockfile pins integrity hashes; transitive MCP servers are gated by trust prompts.
|
|
153
153
|
|
|
154
154
|
- **[Content security](https://microsoft.github.io/apm/enterprise/security/)** — `apm install` blocks compromised packages before agents read them; `apm audit` runs the same checks on demand
|
|
155
|
-
- **[Lockfile integrity](https://microsoft.github.io/apm/
|
|
155
|
+
- **[Lockfile integrity](https://microsoft.github.io/apm/reference/lockfile-spec/)** — `apm.lock` records resolved sources and content hashes for full provenance
|
|
156
156
|
- **[SBOM export](https://microsoft.github.io/apm/reference/cli/lock/)** — `apm lock export --format cyclonedx|spdx` emits a standard inventory of what reached disk, straight from the lockfile — provenance for procurement, not a compliance attestation
|
|
157
|
-
- **[Drift detection](https://microsoft.github.io/apm/
|
|
158
|
-
- **[MCP trust boundaries](https://microsoft.github.io/apm/
|
|
157
|
+
- **[Drift detection](https://microsoft.github.io/apm/enterprise/drift-detection/)** — `apm audit` rebuilds your agent context in scratch and diffs it against your working tree to catch hand-edits before they ship
|
|
158
|
+
- **[MCP trust boundaries](https://microsoft.github.io/apm/consumer/install-mcp-servers/)** — transitive MCP servers require explicit consent
|
|
159
159
|
|
|
160
160
|
### 3. Governed by policy
|
|
161
161
|
|
|
@@ -244,7 +244,7 @@ Or add an MCP server (wired into Copilot, Claude, Cursor, Codex, OpenCode, Gemin
|
|
|
244
244
|
apm install --mcp io.github.github/github-mcp-server --transport http # connects over HTTPS
|
|
245
245
|
```
|
|
246
246
|
|
|
247
|
-
See the **[Getting Started guide](https://microsoft.github.io/apm/
|
|
247
|
+
See the **[Getting Started guide](https://microsoft.github.io/apm/quickstart/)** for the full walkthrough.
|
|
248
248
|
|
|
249
249
|
## Works with agentrc
|
|
250
250
|
|
|
@@ -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/
|
|
9
|
+
**[Documentation](https://microsoft.github.io/apm/)** · **[Quick Start](https://microsoft.github.io/apm/quickstart/)** · **[CLI Reference](https://microsoft.github.io/apm/reference/)** · **[Roadmap](https://github.com/orgs/microsoft/projects/2304/views/5)**
|
|
10
10
|
|
|
11
11
|
---
|
|
12
12
|
|
|
@@ -68,11 +68,11 @@ One command, no configuration -- VS Code and GitHub Copilot read the file automa
|
|
|
68
68
|
One `apm.yml` describes every primitive your agents need — instructions, skills, prompts, agents, hooks, plugins, MCP servers — and `apm install` reproduces the exact same setup across every client on every machine. `apm.lock.yaml` pins the resolved tree the way `package-lock.json` does for npm.
|
|
69
69
|
|
|
70
70
|
- **[One manifest for everything](https://microsoft.github.io/apm/reference/primitive-types/)** -- declared once, deployed across Copilot, Claude, Grok Build, Cursor, OpenCode, Codex, Gemini, Windsurf, Kiro
|
|
71
|
-
- **[Install from anywhere](https://microsoft.github.io/apm/
|
|
72
|
-
- **[Transitive dependencies](https://microsoft.github.io/apm/
|
|
73
|
-
- **[Author plugins](https://microsoft.github.io/apm/
|
|
74
|
-
- **[Marketplaces](https://microsoft.github.io/apm/
|
|
75
|
-
- **[Pack & distribute](https://microsoft.github.io/apm/
|
|
71
|
+
- **[Install from anywhere](https://microsoft.github.io/apm/consumer/install-packages/)** — GitHub, GitLab, Bitbucket, Azure DevOps, GitHub Enterprise, Gitea, Gogs, any git host
|
|
72
|
+
- **[Transitive dependencies](https://microsoft.github.io/apm/consumer/install-packages/#transitive-dependencies-and-the-lockfile)** — packages can depend on packages; APM resolves the full tree
|
|
73
|
+
- **[Author plugins](https://microsoft.github.io/apm/producer/)** — build Copilot, Claude, and Cursor plugins with dependency management, then export standard `plugin.json`
|
|
74
|
+
- **[Marketplaces](https://microsoft.github.io/apm/consumer/installing-from-marketplaces/)** — install plugins from curated registries in one command, deployed across all targets and locked
|
|
75
|
+
- **[Pack & distribute](https://microsoft.github.io/apm/producer/pack-a-bundle/)** — `apm pack` bundles your configuration as a zipped package or a standalone plugin
|
|
76
76
|
- **[CI/CD ready](https://github.com/microsoft/apm-action)** — GitHub Action for automated workflows
|
|
77
77
|
|
|
78
78
|
### 2. Secure by default
|
|
@@ -80,10 +80,10 @@ One `apm.yml` describes every primitive your agents need — instructions, skill
|
|
|
80
80
|
Agent context is executable in effect — a prompt is a program for an LLM. APM treats it that way. Every install scans for hidden Unicode that can hijack agent behavior; the lockfile pins integrity hashes; transitive MCP servers are gated by trust prompts.
|
|
81
81
|
|
|
82
82
|
- **[Content security](https://microsoft.github.io/apm/enterprise/security/)** — `apm install` blocks compromised packages before agents read them; `apm audit` runs the same checks on demand
|
|
83
|
-
- **[Lockfile integrity](https://microsoft.github.io/apm/
|
|
83
|
+
- **[Lockfile integrity](https://microsoft.github.io/apm/reference/lockfile-spec/)** — `apm.lock` records resolved sources and content hashes for full provenance
|
|
84
84
|
- **[SBOM export](https://microsoft.github.io/apm/reference/cli/lock/)** — `apm lock export --format cyclonedx|spdx` emits a standard inventory of what reached disk, straight from the lockfile — provenance for procurement, not a compliance attestation
|
|
85
|
-
- **[Drift detection](https://microsoft.github.io/apm/
|
|
86
|
-
- **[MCP trust boundaries](https://microsoft.github.io/apm/
|
|
85
|
+
- **[Drift detection](https://microsoft.github.io/apm/enterprise/drift-detection/)** — `apm audit` rebuilds your agent context in scratch and diffs it against your working tree to catch hand-edits before they ship
|
|
86
|
+
- **[MCP trust boundaries](https://microsoft.github.io/apm/consumer/install-mcp-servers/)** — transitive MCP servers require explicit consent
|
|
87
87
|
|
|
88
88
|
### 3. Governed by policy
|
|
89
89
|
|
|
@@ -172,7 +172,7 @@ Or add an MCP server (wired into Copilot, Claude, Cursor, Codex, OpenCode, Gemin
|
|
|
172
172
|
apm install --mcp io.github.github/github-mcp-server --transport http # connects over HTTPS
|
|
173
173
|
```
|
|
174
174
|
|
|
175
|
-
See the **[Getting Started guide](https://microsoft.github.io/apm/
|
|
175
|
+
See the **[Getting Started guide](https://microsoft.github.io/apm/quickstart/)** for the full walkthrough.
|
|
176
176
|
|
|
177
177
|
## Works with agentrc
|
|
178
178
|
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "apm-cli"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.34.0"
|
|
8
8
|
description = "MCP configuration tool"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -212,6 +212,7 @@ markers = [
|
|
|
212
212
|
"requires_ado_bearer: requires az CLI logged in + APM_TEST_ADO_BEARER=1",
|
|
213
213
|
"requires_network_integration: requires APM_RUN_INTEGRATION_TESTS=1",
|
|
214
214
|
"requires_windows: requires a Windows host",
|
|
215
|
+
"requires_windows_native_standard_user: requires the disposable Windows runner's verified non-admin token and symlink denial",
|
|
215
216
|
"requires_apm_binary: requires built apm binary on PATH (or APM_BINARY_PATH)",
|
|
216
217
|
"requires_runtime_codex: requires codex runtime installed",
|
|
217
218
|
"requires_runtime_copilot: requires GitHub Copilot CLI runtime installed",
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"""Base adapter interface for MCP clients."""
|
|
2
2
|
|
|
3
|
+
import json
|
|
3
4
|
import os
|
|
4
5
|
import re
|
|
5
6
|
from abc import ABC, abstractmethod
|
|
@@ -8,7 +9,9 @@ from pathlib import Path
|
|
|
8
9
|
from typing import Any, ClassVar
|
|
9
10
|
|
|
10
11
|
from ...models.dependency.mcp import _EXTRA_DENYLIST, TrustedEnvLiteral
|
|
12
|
+
from ...utils.atomic_io import atomic_write_text
|
|
11
13
|
from ...utils.console import _rich_error, _rich_warning
|
|
14
|
+
from ...utils.path_security import has_symlink_component
|
|
12
15
|
|
|
13
16
|
_INPUT_VAR_RE = re.compile(r"\$\{input:([^}]+)\}")
|
|
14
17
|
|
|
@@ -396,6 +399,71 @@ class MCPClientAdapter(ABC):
|
|
|
396
399
|
"""Get the current MCP configuration."""
|
|
397
400
|
pass
|
|
398
401
|
|
|
402
|
+
def validate_config_for_install(self) -> bool:
|
|
403
|
+
"""Allow adapters to refuse unsafe configs before existing-server shortcuts."""
|
|
404
|
+
return True
|
|
405
|
+
|
|
406
|
+
def _read_json_config_for_update(self, config_path: Path) -> dict | None:
|
|
407
|
+
"""Return the JSON object at *config_path* before a merge-and-write.
|
|
408
|
+
|
|
409
|
+
A missing or blank file yields ``{}``. Returns ``None`` after a
|
|
410
|
+
warning when rewriting the file could lose data, so the caller skips
|
|
411
|
+
the write: the existing content is not a JSON object (for example
|
|
412
|
+
JSONC comments), or a user-scope path runs through a symlink, which
|
|
413
|
+
stale cleanup refuses to rewrite later.
|
|
414
|
+
"""
|
|
415
|
+
if self.user_scope and has_symlink_component(Path.home(), config_path):
|
|
416
|
+
_rich_warning(
|
|
417
|
+
f"Skipped {config_path}: APM does not write MCP config through "
|
|
418
|
+
"symlinks. Replace the symlink or configure this server manually.",
|
|
419
|
+
symbol="warning",
|
|
420
|
+
)
|
|
421
|
+
return None
|
|
422
|
+
try:
|
|
423
|
+
raw = config_path.read_text(encoding="utf-8")
|
|
424
|
+
except FileNotFoundError:
|
|
425
|
+
return {}
|
|
426
|
+
except (OSError, UnicodeError) as exc:
|
|
427
|
+
_rich_warning(
|
|
428
|
+
f"Could not read {config_path}: {exc} -- skipping config write; "
|
|
429
|
+
"fix the file's permissions or encoding, or add this server manually",
|
|
430
|
+
symbol="warning",
|
|
431
|
+
)
|
|
432
|
+
return None
|
|
433
|
+
if not raw.strip():
|
|
434
|
+
return {}
|
|
435
|
+
try:
|
|
436
|
+
config = json.loads(raw)
|
|
437
|
+
except json.JSONDecodeError:
|
|
438
|
+
config = None
|
|
439
|
+
if not isinstance(config, dict):
|
|
440
|
+
_rich_warning(
|
|
441
|
+
f"Could not parse {config_path} as a JSON object -- skipping config "
|
|
442
|
+
"write to avoid data loss (comments and trailing commas are not "
|
|
443
|
+
"preserved); fix the file or add this server manually",
|
|
444
|
+
symbol="warning",
|
|
445
|
+
)
|
|
446
|
+
return None
|
|
447
|
+
if self.mcp_servers_key in config and not isinstance(config[self.mcp_servers_key], dict):
|
|
448
|
+
_rich_warning(
|
|
449
|
+
f"Could not parse {config_path}: {self.mcp_servers_key} must be "
|
|
450
|
+
"a JSON object -- skipping config write to avoid data loss; "
|
|
451
|
+
"fix the file or add this server manually",
|
|
452
|
+
symbol="warning",
|
|
453
|
+
)
|
|
454
|
+
return None
|
|
455
|
+
return config
|
|
456
|
+
|
|
457
|
+
@staticmethod
|
|
458
|
+
def _write_json_config(config_path: Path, config: dict) -> None:
|
|
459
|
+
"""Atomically write *config* as JSON and keep the file owner-only.
|
|
460
|
+
|
|
461
|
+
Entries can carry env values resolved at install time.
|
|
462
|
+
"""
|
|
463
|
+
config_path.parent.mkdir(parents=True, exist_ok=True)
|
|
464
|
+
atomic_write_text(config_path, json.dumps(config, indent=2), new_file_mode=0o600)
|
|
465
|
+
os.chmod(config_path, 0o600)
|
|
466
|
+
|
|
399
467
|
@abstractmethod
|
|
400
468
|
def configure_mcp_server(
|
|
401
469
|
self,
|
|
@@ -184,7 +184,12 @@ class ClaudeClientAdapter(CopilotClientAdapter):
|
|
|
184
184
|
def _project_mcp_path(self) -> Path:
|
|
185
185
|
return self.project_root / ".mcp.json"
|
|
186
186
|
|
|
187
|
-
|
|
187
|
+
@classmethod
|
|
188
|
+
def resolve_user_claude_unresolved_path(cls) -> Path:
|
|
189
|
+
"""Return the un-normalized path for user-scope Claude Code config.
|
|
190
|
+
|
|
191
|
+
Used for symlink pre-checks before canonical resolution.
|
|
192
|
+
"""
|
|
188
193
|
config_dir = os.environ.get("CLAUDE_CONFIG_DIR", "").strip()
|
|
189
194
|
if config_dir:
|
|
190
195
|
config_path = Path(config_dir).expanduser()
|
|
@@ -193,9 +198,22 @@ class ClaudeClientAdapter(CopilotClientAdapter):
|
|
|
193
198
|
"CLAUDE_CONFIG_DIR must be an absolute path for user-scope MCP "
|
|
194
199
|
"config; set an absolute path or unset it to use ~/.claude.json."
|
|
195
200
|
)
|
|
196
|
-
return config_path
|
|
201
|
+
return config_path / ".claude.json"
|
|
197
202
|
return Path.home() / ".claude.json"
|
|
198
203
|
|
|
204
|
+
@classmethod
|
|
205
|
+
def resolve_user_claude_json_path(cls, unresolved_path: Path | None = None) -> Path:
|
|
206
|
+
"""Resolve the selected destination, optionally reusing a checked path."""
|
|
207
|
+
path = (
|
|
208
|
+
unresolved_path
|
|
209
|
+
if unresolved_path is not None
|
|
210
|
+
else cls.resolve_user_claude_unresolved_path()
|
|
211
|
+
)
|
|
212
|
+
return path.parent.resolve(strict=False) / path.name
|
|
213
|
+
|
|
214
|
+
def _user_claude_json_path(self) -> Path:
|
|
215
|
+
return self.resolve_user_claude_json_path()
|
|
216
|
+
|
|
199
217
|
def _should_write_project(self) -> bool:
|
|
200
218
|
return (self.project_root / ".claude").is_dir()
|
|
201
219
|
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
"""Cursor IDE implementation of MCP client adapter.
|
|
2
2
|
|
|
3
3
|
Cursor uses the standard ``mcpServers`` JSON format at ``.cursor/mcp.json``
|
|
4
|
-
(repo-local)
|
|
5
|
-
|
|
6
|
-
Copilot-only fields (``tools``, ``id``).
|
|
4
|
+
(repo-local) or ``~/.cursor/mcp.json`` (user scope). Unlike the Copilot
|
|
5
|
+
adapter, this adapter emits Cursor-native transport discriminators
|
|
6
|
+
(``type: stdio`` / ``type: http``) and omits Copilot-only fields (``tools``, ``id``).
|
|
7
7
|
|
|
8
|
-
APM only writes to ``.cursor/mcp.json`` when the ``.cursor/`` directory
|
|
9
|
-
already exists -- Cursor support is opt-in.
|
|
8
|
+
At project scope APM only writes to ``.cursor/mcp.json`` when the ``.cursor/`` directory already exists -- Cursor support is opt-in.
|
|
10
9
|
"""
|
|
11
10
|
|
|
12
11
|
import json
|
|
@@ -27,7 +26,7 @@ class CursorClientAdapter(CopilotClientAdapter):
|
|
|
27
26
|
emit Cursor-native transport discriminators instead of Copilot-only fields.
|
|
28
27
|
"""
|
|
29
28
|
|
|
30
|
-
supports_user_scope: bool =
|
|
29
|
+
supports_user_scope: bool = True
|
|
31
30
|
target_name: str = "cursor"
|
|
32
31
|
mcp_servers_key: str = "mcpServers"
|
|
33
32
|
|
|
@@ -93,44 +92,62 @@ class CursorClientAdapter(CopilotClientAdapter):
|
|
|
93
92
|
GitHubTokenManager,
|
|
94
93
|
)
|
|
95
94
|
|
|
95
|
+
@staticmethod
|
|
96
|
+
def config_path_for(project_root: Path, user_scope: bool) -> Path:
|
|
97
|
+
"""Return the Cursor MCP config path for a scope.
|
|
98
|
+
|
|
99
|
+
``~/.cursor/mcp.json`` at user scope, else ``.cursor/mcp.json`` under
|
|
100
|
+
*project_root*. Static so stale cleanup can locate the file without
|
|
101
|
+
constructing an adapter.
|
|
102
|
+
"""
|
|
103
|
+
root = Path.home() if user_scope else Path(project_root)
|
|
104
|
+
return root / ".cursor" / "mcp.json"
|
|
105
|
+
|
|
96
106
|
def get_config_path(self):
|
|
97
|
-
"""Return the
|
|
107
|
+
"""Return the project or user-scope Cursor MCP config path.
|
|
98
108
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
writes here when the directory already exists.
|
|
109
|
+
The project ``.cursor/`` directory is *not* created automatically.
|
|
110
|
+
User-scope installs write to ``~/.cursor/mcp.json`` from any cwd.
|
|
102
111
|
"""
|
|
103
|
-
|
|
104
|
-
return str(cursor_dir / "mcp.json")
|
|
112
|
+
return str(self.config_path_for(self.project_root, self.user_scope))
|
|
105
113
|
|
|
106
114
|
# ------------------------------------------------------------------ #
|
|
107
|
-
# Config read / write --
|
|
115
|
+
# Config read / write -- project scope never creates ``.cursor/``
|
|
108
116
|
# ------------------------------------------------------------------ #
|
|
109
117
|
|
|
118
|
+
def validate_config_for_install(self) -> bool:
|
|
119
|
+
"""Refuse unsafe user configs even when no server write would be needed."""
|
|
120
|
+
return (
|
|
121
|
+
not self.user_scope
|
|
122
|
+
or self._read_json_config_for_update(Path(self.get_config_path())) is not None
|
|
123
|
+
)
|
|
124
|
+
|
|
110
125
|
def update_config(self, config_updates):
|
|
111
126
|
"""Merge *config_updates* into the ``mcpServers`` section.
|
|
112
127
|
|
|
113
|
-
The ``.cursor/`` directory must already exist
|
|
114
|
-
|
|
128
|
+
The project ``.cursor/`` directory must already exist. User-scope
|
|
129
|
+
installs create ``~/.cursor/`` when needed. Returns ``False`` without
|
|
130
|
+
writing when the existing file cannot be rewritten safely.
|
|
115
131
|
"""
|
|
116
132
|
config_path = Path(self.get_config_path())
|
|
117
133
|
|
|
118
|
-
#
|
|
119
|
-
if not config_path.parent.
|
|
120
|
-
return
|
|
134
|
+
# Project scope is opt-in; the user-scope directory can be created.
|
|
135
|
+
if not self.user_scope and not config_path.parent.is_dir():
|
|
136
|
+
return None
|
|
121
137
|
|
|
122
|
-
current_config = self.
|
|
138
|
+
current_config = self._read_json_config_for_update(config_path)
|
|
139
|
+
if current_config is None:
|
|
140
|
+
return False
|
|
123
141
|
if "mcpServers" not in current_config:
|
|
124
142
|
current_config["mcpServers"] = {}
|
|
125
143
|
|
|
126
144
|
current_config["mcpServers"].update(config_updates)
|
|
127
145
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
os.chmod(config_path, 0o600)
|
|
146
|
+
self._write_json_config(config_path, current_config)
|
|
147
|
+
return True
|
|
131
148
|
|
|
132
149
|
def get_current_config(self):
|
|
133
|
-
"""Read the current
|
|
150
|
+
"""Read the current Cursor MCP config contents."""
|
|
134
151
|
config_path = self.get_config_path()
|
|
135
152
|
|
|
136
153
|
if not os.path.exists(config_path):
|
|
@@ -255,7 +272,7 @@ class CursorClientAdapter(CopilotClientAdapter):
|
|
|
255
272
|
server_info_cache=None,
|
|
256
273
|
runtime_vars=None,
|
|
257
274
|
):
|
|
258
|
-
"""Configure an MCP server in Cursor's
|
|
275
|
+
"""Configure an MCP server in Cursor's project or user-scope ``mcp.json``.
|
|
259
276
|
|
|
260
277
|
Delegates entirely to the parent implementation but prints a
|
|
261
278
|
Cursor-specific success message.
|
|
@@ -264,9 +281,9 @@ class CursorClientAdapter(CopilotClientAdapter):
|
|
|
264
281
|
print("Error: server_url cannot be empty")
|
|
265
282
|
return False
|
|
266
283
|
|
|
267
|
-
#
|
|
284
|
+
# Project scope is opt-in; global installs work from any directory.
|
|
268
285
|
cursor_dir = self.project_root / ".cursor"
|
|
269
|
-
if not cursor_dir.
|
|
286
|
+
if not self.user_scope and not cursor_dir.is_dir():
|
|
270
287
|
return True # nothing to do, not an error
|
|
271
288
|
|
|
272
289
|
try:
|
|
@@ -277,7 +294,8 @@ class CursorClientAdapter(CopilotClientAdapter):
|
|
|
277
294
|
config_key = self._determine_config_key(server_url, server_name)
|
|
278
295
|
|
|
279
296
|
server_config = self._format_server_config(server_info, env_overrides, runtime_vars)
|
|
280
|
-
self.update_config({config_key: server_config})
|
|
297
|
+
if self.update_config({config_key: server_config}) is False:
|
|
298
|
+
return False
|
|
281
299
|
|
|
282
300
|
print(f"Successfully configured MCP server '{config_key}' for Cursor")
|
|
283
301
|
return True
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"""OpenCode implementation of MCP client adapter.
|
|
2
2
|
|
|
3
|
-
OpenCode uses ``opencode.json`` at the project root
|
|
3
|
+
OpenCode uses ``opencode.json`` at the project root or
|
|
4
|
+
``~/.config/opencode/opencode.json`` at user scope, with an ``mcp`` key.
|
|
4
5
|
The schema differs from VSCode/Cursor:
|
|
5
6
|
|
|
6
7
|
.. code-block:: json
|
|
@@ -22,8 +23,8 @@ Key differences from Copilot/Cursor:
|
|
|
22
23
|
- Command format: single array ``command`` (not ``command`` + ``args``)
|
|
23
24
|
- Env key: ``environment`` (not ``env``)
|
|
24
25
|
|
|
25
|
-
APM only writes to ``opencode.json`` when the
|
|
26
|
-
already exists
|
|
26
|
+
At project scope APM only writes to ``opencode.json`` when the
|
|
27
|
+
``.opencode/`` directory already exists -- OpenCode support is opt-in.
|
|
27
28
|
"""
|
|
28
29
|
|
|
29
30
|
import json
|
|
@@ -39,12 +40,12 @@ class OpenCodeClientAdapter(CopilotClientAdapter):
|
|
|
39
40
|
"""OpenCode MCP client adapter.
|
|
40
41
|
|
|
41
42
|
Converts the standard Copilot config format into OpenCode's schema
|
|
42
|
-
and writes to
|
|
43
|
+
and writes to the project or user-scope ``opencode.json``.
|
|
43
44
|
"""
|
|
44
45
|
|
|
45
|
-
supports_user_scope: bool =
|
|
46
|
+
supports_user_scope: bool = True
|
|
46
47
|
target_name: str = "opencode"
|
|
47
|
-
mcp_servers_key: str = "
|
|
48
|
+
mcp_servers_key: str = "mcp"
|
|
48
49
|
|
|
49
50
|
# OpenCode's config runtime-substitution support has not yet been
|
|
50
51
|
# individually audited (see #1152). Pin to legacy install-time
|
|
@@ -52,33 +53,56 @@ class OpenCodeClientAdapter(CopilotClientAdapter):
|
|
|
52
53
|
# revisit in a follow-up.
|
|
53
54
|
_supports_runtime_env_substitution: bool = False
|
|
54
55
|
|
|
56
|
+
@staticmethod
|
|
57
|
+
def config_path_for(project_root: Path, user_scope: bool) -> Path:
|
|
58
|
+
"""Return the OpenCode config path for a scope.
|
|
59
|
+
|
|
60
|
+
``~/.config/opencode/opencode.json`` at user scope, else
|
|
61
|
+
``opencode.json`` under *project_root*. Static so stale cleanup can
|
|
62
|
+
locate the file without constructing an adapter.
|
|
63
|
+
"""
|
|
64
|
+
if user_scope:
|
|
65
|
+
return Path.home() / ".config" / "opencode" / "opencode.json"
|
|
66
|
+
return Path(project_root) / "opencode.json"
|
|
67
|
+
|
|
55
68
|
def get_config_path(self):
|
|
56
|
-
"""Return the
|
|
57
|
-
return str(self.project_root
|
|
69
|
+
"""Return the project or user-scope OpenCode config path."""
|
|
70
|
+
return str(self.config_path_for(self.project_root, self.user_scope))
|
|
58
71
|
|
|
59
72
|
def update_config(self, config_updates, enabled: Any = True):
|
|
60
73
|
"""Merge *config_updates* into the ``mcp`` section of ``opencode.json``.
|
|
61
74
|
|
|
62
|
-
The ``.opencode/`` directory must already exist
|
|
63
|
-
|
|
75
|
+
The project ``.opencode/`` directory must already exist. User-scope
|
|
76
|
+
installs create ``~/.config/opencode/`` when needed. Returns
|
|
77
|
+
``False`` without writing when the existing file cannot be rewritten
|
|
78
|
+
safely.
|
|
64
79
|
|
|
65
80
|
Translates Copilot-format entries (``command``/``args``/``env``) into
|
|
66
81
|
OpenCode format (``command`` array / ``environment``).
|
|
67
82
|
"""
|
|
68
83
|
opencode_dir = self.project_root / ".opencode"
|
|
69
|
-
if not opencode_dir.is_dir():
|
|
70
|
-
return
|
|
84
|
+
if not self.user_scope and not opencode_dir.is_dir():
|
|
85
|
+
return None
|
|
71
86
|
|
|
72
87
|
config_path = Path(self.get_config_path())
|
|
73
|
-
current_config = self.
|
|
88
|
+
current_config = self._read_json_config_for_update(config_path)
|
|
89
|
+
if current_config is None:
|
|
90
|
+
return False
|
|
74
91
|
if "mcp" not in current_config:
|
|
75
92
|
current_config["mcp"] = {}
|
|
76
93
|
|
|
77
94
|
for name, copilot_entry in config_updates.items():
|
|
78
95
|
current_config["mcp"][name] = self._to_opencode_format(copilot_entry, enabled=enabled)
|
|
79
96
|
|
|
80
|
-
|
|
81
|
-
|
|
97
|
+
self._write_json_config(config_path, current_config)
|
|
98
|
+
return True
|
|
99
|
+
|
|
100
|
+
def validate_config_for_install(self) -> bool:
|
|
101
|
+
"""Refuse unsafe user configs even when no server write would be needed."""
|
|
102
|
+
return (
|
|
103
|
+
not self.user_scope
|
|
104
|
+
or self._read_json_config_for_update(Path(self.get_config_path())) is not None
|
|
105
|
+
)
|
|
82
106
|
|
|
83
107
|
def get_current_config(self):
|
|
84
108
|
"""Read the current ``opencode.json`` contents."""
|
|
@@ -91,6 +115,13 @@ class OpenCodeClientAdapter(CopilotClientAdapter):
|
|
|
91
115
|
except (OSError, json.JSONDecodeError):
|
|
92
116
|
return {}
|
|
93
117
|
|
|
118
|
+
def render_server_config(self, server_info: dict) -> dict:
|
|
119
|
+
"""Render the ``mcp`` entry APM writes, for exact baseline comparisons."""
|
|
120
|
+
return self._to_opencode_format(
|
|
121
|
+
super().render_server_config(server_info),
|
|
122
|
+
enabled=opencode_enabled_value(server_info),
|
|
123
|
+
)
|
|
124
|
+
|
|
94
125
|
def configure_mcp_server(
|
|
95
126
|
self,
|
|
96
127
|
server_url,
|
|
@@ -110,7 +141,7 @@ class OpenCodeClientAdapter(CopilotClientAdapter):
|
|
|
110
141
|
return False
|
|
111
142
|
|
|
112
143
|
opencode_dir = self.project_root / ".opencode"
|
|
113
|
-
if not opencode_dir.is_dir():
|
|
144
|
+
if not self.user_scope and not opencode_dir.is_dir():
|
|
114
145
|
return False
|
|
115
146
|
|
|
116
147
|
try:
|
|
@@ -121,10 +152,12 @@ class OpenCodeClientAdapter(CopilotClientAdapter):
|
|
|
121
152
|
config_key = self._determine_config_key(server_url, server_name)
|
|
122
153
|
|
|
123
154
|
server_config = self._format_server_config(server_info, env_overrides, runtime_vars)
|
|
124
|
-
self.update_config(
|
|
155
|
+
written = self.update_config(
|
|
125
156
|
{config_key: server_config},
|
|
126
157
|
enabled=opencode_enabled_value(server_info, enabled),
|
|
127
158
|
)
|
|
159
|
+
if written is False:
|
|
160
|
+
return False
|
|
128
161
|
|
|
129
162
|
print(f"Successfully configured MCP server '{config_key}' for OpenCode")
|
|
130
163
|
return True
|
|
@@ -19,13 +19,16 @@ from .formats import BundleFormat, coerce_bundle_format
|
|
|
19
19
|
# Windsurf agents still collapse into .windsurf/skills/ because the target
|
|
20
20
|
# has no distinct agent envelope.
|
|
21
21
|
_CROSS_TARGET_MAPS: dict[str, dict[str, str]] = {
|
|
22
|
+
"agent-skills": {
|
|
23
|
+
".github/skills/": ".agents/skills/",
|
|
24
|
+
},
|
|
22
25
|
"claude": {
|
|
23
26
|
".github/skills/": ".claude/skills/",
|
|
24
27
|
".github/agents/": ".claude/agents/",
|
|
25
28
|
},
|
|
26
|
-
"
|
|
27
|
-
".
|
|
28
|
-
".
|
|
29
|
+
"codex": {
|
|
30
|
+
".github/skills/": ".agents/skills/",
|
|
31
|
+
".github/agents/": ".codex/agents/",
|
|
29
32
|
},
|
|
30
33
|
"copilot": {
|
|
31
34
|
".claude/skills/": ".github/skills/",
|
|
@@ -35,33 +38,33 @@ _CROSS_TARGET_MAPS: dict[str, dict[str, str]] = {
|
|
|
35
38
|
".github/skills/": ".agents/skills/",
|
|
36
39
|
".github/agents/": ".cursor/agents/",
|
|
37
40
|
},
|
|
38
|
-
"
|
|
39
|
-
".github/skills/": "
|
|
40
|
-
".github/agents/": ".opencode/agents/",
|
|
41
|
-
},
|
|
42
|
-
"codex": {
|
|
43
|
-
".github/skills/": ".agents/skills/",
|
|
44
|
-
".github/agents/": ".codex/agents/",
|
|
45
|
-
},
|
|
46
|
-
"windsurf": {
|
|
47
|
-
".github/skills/": ".agents/skills/",
|
|
48
|
-
".github/agents/": ".windsurf/skills/",
|
|
49
|
-
},
|
|
50
|
-
"grok-cloud": {
|
|
51
|
-
".github/skills/": ".grok/skills/",
|
|
41
|
+
"grok-bot": {
|
|
42
|
+
".github/skills/": "agent-data/workflows/",
|
|
52
43
|
},
|
|
53
44
|
"grok-build": {
|
|
54
45
|
".github/skills/": ".grok/skills/",
|
|
55
46
|
".github/agents/": ".grok/agents/",
|
|
56
47
|
},
|
|
57
|
-
"
|
|
48
|
+
"grok-cloud": {
|
|
49
|
+
".github/skills/": ".grok/skills/",
|
|
50
|
+
},
|
|
51
|
+
"hermes": {
|
|
58
52
|
".github/skills/": ".agents/skills/",
|
|
59
53
|
},
|
|
60
54
|
"openclaw": {
|
|
61
55
|
".github/skills/": ".agents/skills/",
|
|
62
56
|
},
|
|
63
|
-
"
|
|
57
|
+
"opencode": {
|
|
64
58
|
".github/skills/": ".agents/skills/",
|
|
59
|
+
".github/agents/": ".opencode/agents/",
|
|
60
|
+
},
|
|
61
|
+
"vscode": {
|
|
62
|
+
".claude/skills/": ".github/skills/",
|
|
63
|
+
".claude/agents/": ".github/agents/",
|
|
64
|
+
},
|
|
65
|
+
"windsurf": {
|
|
66
|
+
".github/skills/": ".agents/skills/",
|
|
67
|
+
".github/agents/": ".windsurf/skills/",
|
|
65
68
|
},
|
|
66
69
|
}
|
|
67
70
|
|
|
@@ -14,9 +14,20 @@ import warnings
|
|
|
14
14
|
|
|
15
15
|
import click
|
|
16
16
|
|
|
17
|
-
from apm_cli.core.tls_trust import
|
|
17
|
+
from apm_cli.core.tls_trust import (
|
|
18
|
+
TLSConfigurationError,
|
|
19
|
+
configure_process_tls_trust,
|
|
20
|
+
log_tls_trust_status,
|
|
21
|
+
)
|
|
18
22
|
|
|
19
|
-
|
|
23
|
+
_TLS_BOOTSTRAP_ERROR: TLSConfigurationError | None = None
|
|
24
|
+
try:
|
|
25
|
+
configure_process_tls_trust()
|
|
26
|
+
except TLSConfigurationError as exc:
|
|
27
|
+
# Command modules may create Sessions at import time but do not perform
|
|
28
|
+
# network I/O. Preserve early TLS ordering, then surface a concise Click
|
|
29
|
+
# error before any command callback can make a request.
|
|
30
|
+
_TLS_BOOTSTRAP_ERROR = exc
|
|
20
31
|
|
|
21
32
|
from apm_cli.commands._helpers import (
|
|
22
33
|
ERROR,
|
|
@@ -261,6 +272,12 @@ def _configure_logging(verbose: bool = False) -> None:
|
|
|
261
272
|
@click.pass_context
|
|
262
273
|
def cli(ctx, verbose: bool) -> None:
|
|
263
274
|
"""Main entry point for the APM CLI."""
|
|
275
|
+
if _TLS_BOOTSTRAP_ERROR is not None:
|
|
276
|
+
raise click.ClickException(
|
|
277
|
+
f"{_TLS_BOOTSTRAP_ERROR}. "
|
|
278
|
+
"Check the APM_EXTRA_CA_BUNDLE setting, or unset it and retry. "
|
|
279
|
+
"See https://microsoft.github.io/apm/troubleshooting/ssl-issues/"
|
|
280
|
+
)
|
|
264
281
|
ctx.ensure_object(dict)
|
|
265
282
|
ctx.obj["verbose"] = verbose
|
|
266
283
|
from apm_cli.core.output_mode import configure_output_mode, detect_output_mode
|
|
@@ -476,7 +493,6 @@ def main():
|
|
|
476
493
|
"""Main entry point for the CLI."""
|
|
477
494
|
_configure_logging() # honours APM_LOG_LEVEL env var; --verbose upgrades in cli()
|
|
478
495
|
_configure_encoding()
|
|
479
|
-
configure_process_tls_trust()
|
|
480
496
|
try:
|
|
481
497
|
cli(obj={})
|
|
482
498
|
except Exception as e:
|