apm-cli 0.32.0__tar.gz → 0.33.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.
Files changed (520) hide show
  1. {apm_cli-0.32.0/src/apm_cli.egg-info → apm_cli-0.33.0}/PKG-INFO +1 -1
  2. {apm_cli-0.32.0 → apm_cli-0.33.0}/pyproject.toml +2 -1
  3. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/adapters/client/base.py +37 -10
  4. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/adapters/client/claude.py +49 -10
  5. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/adapters/client/codex.py +63 -5
  6. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/adapters/client/copilot.py +6 -5
  7. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/adapters/client/cursor.py +49 -8
  8. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/adapters/client/opencode.py +9 -5
  9. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/cli.py +3 -0
  10. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/audit.py +106 -60
  11. apm_cli-0.33.0/src/apm_cli/commands/auth.py +512 -0
  12. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/compile/cli.py +39 -5
  13. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/deps/cli.py +24 -7
  14. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/install.py +2 -1
  15. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/compilation/build_id.py +11 -0
  16. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/compilation/claude_formatter.py +78 -30
  17. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/compilation/root_context_protection.py +42 -0
  18. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/compilation/user_root_context.py +86 -17
  19. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/core/auth.py +20 -0
  20. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/core/conflict_detector.py +19 -3
  21. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/core/host_providers.py +10 -0
  22. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/core/safe_installer.py +5 -1
  23. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/core/token_manager.py +18 -3
  24. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/lockfile.py +6 -2
  25. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/tiered_ref_resolver.py +59 -13
  26. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/drift.py +37 -12
  27. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/hook_contract.py +34 -10
  28. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/deployable_source_plan.py +50 -17
  29. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/errors.py +9 -7
  30. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/helpers/ref_reuse.py +9 -3
  31. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/helpers/ref_seed.py +6 -4
  32. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/manifest_reconcile.py +16 -7
  33. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/phases/resolve.py +1 -0
  34. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/pipeline.py +14 -3
  35. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/plan.py +24 -3
  36. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/service.py +13 -11
  37. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/services.py +2 -0
  38. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/hook_integrator.py +29 -45
  39. apm_cli-0.33.0/src/apm_cli/integration/hook_native_formats.py +261 -0
  40. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/instruction_integrator.py +75 -175
  41. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/mcp_integrator.py +26 -4
  42. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/mcp_integrator_install.py +5 -2
  43. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/skill_integrator.py +66 -70
  44. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/skill_support.py +21 -0
  45. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/targets.py +36 -15
  46. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/marketplace/builder.py +2 -2
  47. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/marketplace/resolver.py +95 -14
  48. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/marketplace/version_resolver.py +18 -2
  49. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/models/dependency/mcp.py +80 -4
  50. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/models/dependency/provider_coordinates.py +4 -2
  51. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/policy/ci_checks.py +40 -6
  52. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/policy/models.py +48 -1
  53. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/primitives/discovery.py +44 -104
  54. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/security/audit_report.py +151 -48
  55. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/security/content_scanner.py +1 -0
  56. apm_cli-0.33.0/src/apm_cli/security/file_scanner.py +580 -0
  57. apm_cli-0.33.0/src/apm_cli/security/primitive_discovery.py +189 -0
  58. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/utils/git_env.py +13 -0
  59. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/utils/path_security.py +13 -4
  60. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/utils/patterns.py +94 -3
  61. {apm_cli-0.32.0 → apm_cli-0.33.0/src/apm_cli.egg-info}/PKG-INFO +1 -1
  62. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli.egg-info/SOURCES.txt +2 -0
  63. {apm_cli-0.32.0 → apm_cli-0.33.0}/tests/test_lockfile.py +1 -0
  64. apm_cli-0.32.0/src/apm_cli/integration/hook_native_formats.py +0 -109
  65. apm_cli-0.32.0/src/apm_cli/security/file_scanner.py +0 -275
  66. {apm_cli-0.32.0 → apm_cli-0.33.0}/AUTHORS +0 -0
  67. {apm_cli-0.32.0 → apm_cli-0.33.0}/LICENSE +0 -0
  68. {apm_cli-0.32.0 → apm_cli-0.33.0}/NOTICE +0 -0
  69. {apm_cli-0.32.0 → apm_cli-0.33.0}/README.md +0 -0
  70. {apm_cli-0.32.0 → apm_cli-0.33.0}/setup.cfg +0 -0
  71. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/__init__.py +0 -0
  72. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/adapters/__init__.py +0 -0
  73. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/adapters/client/__init__.py +0 -0
  74. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/adapters/client/_mcp_runtime_args.py +0 -0
  75. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/adapters/client/antigravity.py +0 -0
  76. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/adapters/client/gemini.py +0 -0
  77. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/adapters/client/hermes.py +0 -0
  78. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/adapters/client/intellij.py +0 -0
  79. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/adapters/client/kiro.py +0 -0
  80. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/adapters/client/vscode.py +0 -0
  81. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/adapters/client/windsurf.py +0 -0
  82. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/adapters/package_manager/__init__.py +0 -0
  83. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/adapters/package_manager/base.py +0 -0
  84. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/adapters/package_manager/default_manager.py +0 -0
  85. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/adopt/__init__.py +0 -0
  86. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/adopt/discovery.py +0 -0
  87. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/adopt/manifest_edit.py +0 -0
  88. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/adopt/materialize.py +0 -0
  89. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/adopt/render.py +0 -0
  90. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/adopt/safety.py +0 -0
  91. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/agent_plugins/__init__.py +0 -0
  92. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/agent_plugins/assets.py +0 -0
  93. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/agent_plugins/constants.py +0 -0
  94. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/agent_plugins/errors.py +0 -0
  95. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/agent_plugins/io.py +0 -0
  96. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/agent_plugins/ir.py +0 -0
  97. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/agent_plugins/loader.py +0 -0
  98. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/agent_plugins/projection.py +0 -0
  99. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/agent_plugins/validation.py +0 -0
  100. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/bootstrap_mirror.py +0 -0
  101. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/bundle/__init__.py +0 -0
  102. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/bundle/agent_plugin_exporter.py +0 -0
  103. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/bundle/attest.py +0 -0
  104. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/bundle/claude_plugin_exporter.py +0 -0
  105. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/bundle/export_common.py +0 -0
  106. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/bundle/formats.py +0 -0
  107. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/bundle/local_bundle.py +0 -0
  108. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/bundle/lockfile_enrichment.py +0 -0
  109. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/bundle/packer.py +0 -0
  110. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/bundle/plugin_exporter.py +0 -0
  111. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/bundle/plugin_layout.py +0 -0
  112. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/bundle/reproducible_archive.py +0 -0
  113. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/bundle/unpacker.py +0 -0
  114. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/cache/__init__.py +0 -0
  115. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/cache/cleanup.py +0 -0
  116. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/cache/git_cache.py +0 -0
  117. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/cache/http_cache.py +0 -0
  118. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/cache/integrity.py +0 -0
  119. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/cache/locking.py +0 -0
  120. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/cache/paths.py +0 -0
  121. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/cache/url_normalize.py +0 -0
  122. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/__init__.py +0 -0
  123. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/_apm_yml_writer.py +0 -0
  124. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/_helpers.py +0 -0
  125. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/approve.py +0 -0
  126. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/cache.py +0 -0
  127. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/compile/__init__.py +0 -0
  128. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/compile/watcher.py +0 -0
  129. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/config.py +0 -0
  130. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/deps/__init__.py +0 -0
  131. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/deps/_utils.py +0 -0
  132. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/deps/why.py +0 -0
  133. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/discover.py +0 -0
  134. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/doctor.py +0 -0
  135. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/experimental.py +0 -0
  136. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/find.py +0 -0
  137. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/init.py +0 -0
  138. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/lifecycle.py +0 -0
  139. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/list_cmd.py +0 -0
  140. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/lock.py +0 -0
  141. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/marketplace/__init__.py +0 -0
  142. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/marketplace/audit.py +0 -0
  143. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/marketplace/check.py +0 -0
  144. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/marketplace/doctor.py +0 -0
  145. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/marketplace/init.py +0 -0
  146. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/marketplace/migrate.py +0 -0
  147. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/marketplace/outdated.py +0 -0
  148. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/marketplace/plugin/__init__.py +0 -0
  149. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/marketplace/plugin/add.py +0 -0
  150. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/marketplace/plugin/remove.py +0 -0
  151. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/marketplace/plugin/set.py +0 -0
  152. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/marketplace/validate.py +0 -0
  153. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/mcp.py +0 -0
  154. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/outdated.py +0 -0
  155. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/pack.py +0 -0
  156. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/plugin/__init__.py +0 -0
  157. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/plugin/init.py +0 -0
  158. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/policy.py +0 -0
  159. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/prune.py +0 -0
  160. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/publish.py +0 -0
  161. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/run.py +0 -0
  162. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/runtime.py +0 -0
  163. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/self_update.py +0 -0
  164. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/targets.py +0 -0
  165. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/uninstall/__init__.py +0 -0
  166. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/uninstall/cli.py +0 -0
  167. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/uninstall/engine.py +0 -0
  168. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/uninstall/lockfile_state.py +0 -0
  169. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/update.py +0 -0
  170. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/commands/view.py +0 -0
  171. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/compilation/__init__.py +0 -0
  172. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/compilation/agents_compiler.py +0 -0
  173. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/compilation/constants.py +0 -0
  174. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/compilation/constitution.py +0 -0
  175. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/compilation/constitution_block.py +0 -0
  176. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/compilation/context_optimizer.py +0 -0
  177. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/compilation/distributed_compiler.py +0 -0
  178. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/compilation/footer.py +0 -0
  179. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/compilation/gemini_formatter.py +0 -0
  180. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/compilation/injector.py +0 -0
  181. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/compilation/inventory.py +0 -0
  182. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/compilation/link_resolver.py +0 -0
  183. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/compilation/managed_section.py +0 -0
  184. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/compilation/output_writer.py +0 -0
  185. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/compilation/template_builder.py +0 -0
  186. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/config.py +0 -0
  187. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/constants.py +0 -0
  188. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/copilot_plugins/__init__.py +0 -0
  189. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/copilot_plugins/capability.py +0 -0
  190. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/copilot_plugins/catalog.py +0 -0
  191. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/copilot_plugins/constants.py +0 -0
  192. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/copilot_plugins/registrar.py +0 -0
  193. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/copilot_plugins/settings.py +0 -0
  194. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/core/__init__.py +0 -0
  195. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/core/_child_tls/__init__.py +0 -0
  196. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/core/_child_tls/_apm_tls.pth +0 -0
  197. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/core/_child_tls/_apm_tls_bootstrap.py +0 -0
  198. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/core/apm_yml.py +0 -0
  199. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/core/azure_cli.py +0 -0
  200. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/core/build_orchestrator.py +0 -0
  201. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/core/command_logger.py +0 -0
  202. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/core/deployment_ledger.py +0 -0
  203. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/core/deployment_state.py +0 -0
  204. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/core/docker_args.py +0 -0
  205. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/core/errors.py +0 -0
  206. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/core/experimental.py +0 -0
  207. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/core/install_audit.py +0 -0
  208. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/core/lifecycle_scripts.py +0 -0
  209. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/core/null_logger.py +0 -0
  210. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/core/operations.py +0 -0
  211. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/core/output_mode.py +0 -0
  212. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/core/plugin_manifest.py +0 -0
  213. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/core/project_name.py +0 -0
  214. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/core/scope.py +0 -0
  215. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/core/script_executors.py +0 -0
  216. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/core/script_runner.py +0 -0
  217. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/core/script_trust.py +0 -0
  218. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/core/target_catalog.py +0 -0
  219. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/core/target_detection.py +0 -0
  220. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/core/tls_trust.py +0 -0
  221. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/__init__.py +0 -0
  222. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/_shared.py +0 -0
  223. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/aggregator.py +0 -0
  224. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/apm_resolver.py +0 -0
  225. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/artifactory_entry.py +0 -0
  226. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/artifactory_orchestrator.py +0 -0
  227. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/bare_cache.py +0 -0
  228. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/clone_engine.py +0 -0
  229. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/dependency_graph.py +0 -0
  230. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/download_strategies.py +0 -0
  231. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/git_auth_env.py +0 -0
  232. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/git_file_transport.py +0 -0
  233. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/git_reference_resolver.py +0 -0
  234. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/git_remote_ops.py +0 -0
  235. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/git_semver_resolver.py +0 -0
  236. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/github_downloader.py +0 -0
  237. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/github_downloader_validation.py +0 -0
  238. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/github_rate_limit.py +0 -0
  239. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/host_backends.py +0 -0
  240. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/immutable_requirements.py +0 -0
  241. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/installed_package.py +0 -0
  242. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/outdated_ref_cache.py +0 -0
  243. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/outdated_row.py +0 -0
  244. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/package_validator.py +0 -0
  245. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/path_anchoring.py +0 -0
  246. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/plugin_parser.py +0 -0
  247. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/reachability.py +0 -0
  248. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/registry/__init__.py +0 -0
  249. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/registry/auth.py +0 -0
  250. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/registry/client.py +0 -0
  251. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/registry/config_loader.py +0 -0
  252. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/registry/extractor.py +0 -0
  253. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/registry/feature_gate.py +0 -0
  254. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/registry/outdated.py +0 -0
  255. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/registry/resolver.py +0 -0
  256. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/registry/semver.py +0 -0
  257. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/registry_proxy.py +0 -0
  258. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/revision_pins.py +0 -0
  259. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/shared_clone_cache.py +0 -0
  260. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/transport_selection.py +0 -0
  261. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/verifier.py +0 -0
  262. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/deps/why_walker.py +0 -0
  263. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/export/__init__.py +0 -0
  264. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/export/authoring.py +0 -0
  265. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/export/declared_license.py +0 -0
  266. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/export/formats.py +0 -0
  267. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/export/purl.py +0 -0
  268. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/export/sbom.py +0 -0
  269. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/export/spdx.py +0 -0
  270. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/export/spdx_data.py +0 -0
  271. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/factory.py +0 -0
  272. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/__init__.py +0 -0
  273. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/argv.py +0 -0
  274. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/artifactory_resolver.py +0 -0
  275. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/audit_replay.py +0 -0
  276. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/audit_target_roots.py +0 -0
  277. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/cache_pin.py +0 -0
  278. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/context.py +0 -0
  279. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/deployed_paths.py +0 -0
  280. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/drift.py +0 -0
  281. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/drift_render.py +0 -0
  282. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/dry_run_plan.py +0 -0
  283. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/exec_gate.py +0 -0
  284. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/finalization.py +0 -0
  285. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/gitlab_resolver.py +0 -0
  286. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/heals/__init__.py +0 -0
  287. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/heals/base.py +0 -0
  288. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/heals/branch_ref_drift.py +0 -0
  289. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/heals/buggy_lockfile_recovery.py +0 -0
  290. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/helpers/__init__.py +0 -0
  291. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/helpers/no_work.py +0 -0
  292. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/helpers/security_scan.py +0 -0
  293. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/insecure_policy.py +0 -0
  294. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/integrity.py +0 -0
  295. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/legacy_plugin_compat.py +0 -0
  296. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/local_bundle_handler.py +0 -0
  297. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/local_bundle_paths.py +0 -0
  298. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/locking.py +0 -0
  299. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/lsp/__init__.py +0 -0
  300. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/lsp/integration.py +0 -0
  301. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/manifest_helpers.py +0 -0
  302. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/mcp/__init__.py +0 -0
  303. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/mcp/args.py +0 -0
  304. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/mcp/command.py +0 -0
  305. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/mcp/conflicts.py +0 -0
  306. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/mcp/entry.py +0 -0
  307. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/mcp/integration.py +0 -0
  308. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/mcp/ownership.py +0 -0
  309. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/mcp/registry.py +0 -0
  310. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/mcp/warnings.py +0 -0
  311. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/mcp/writer.py +0 -0
  312. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/native_plugin_admission.py +0 -0
  313. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/outcome.py +0 -0
  314. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/package_resolution.py +0 -0
  315. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/package_selection.py +0 -0
  316. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/phases/__init__.py +0 -0
  317. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/phases/_redownload.py +0 -0
  318. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/phases/_skip_logic.py +0 -0
  319. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/phases/audit.py +0 -0
  320. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/phases/cleanup.py +0 -0
  321. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/phases/copilot_plugins.py +0 -0
  322. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/phases/download.py +0 -0
  323. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/phases/finalize.py +0 -0
  324. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/phases/heal.py +0 -0
  325. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/phases/integrate.py +0 -0
  326. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/phases/local_content.py +0 -0
  327. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/phases/lockfile.py +0 -0
  328. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/phases/policy_gate.py +0 -0
  329. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/phases/policy_target_check.py +0 -0
  330. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/phases/post_deps_local.py +0 -0
  331. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/phases/targets.py +0 -0
  332. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/presentation/__init__.py +0 -0
  333. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/presentation/dry_run.py +0 -0
  334. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/primitive_classification.py +0 -0
  335. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/registry_wiring.py +0 -0
  336. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/request.py +0 -0
  337. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/resolution_staging.py +0 -0
  338. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/root_redirect.py +0 -0
  339. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/service_integration.py +0 -0
  340. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/skill_path_migration.py +0 -0
  341. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/source_helpers.py +0 -0
  342. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/sources.py +0 -0
  343. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/summary.py +0 -0
  344. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/target_filter.py +0 -0
  345. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/target_hints.py +0 -0
  346. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/target_warnings.py +0 -0
  347. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/template.py +0 -0
  348. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/transaction.py +0 -0
  349. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/install/validation.py +0 -0
  350. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/__init__.py +0 -0
  351. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/_hook_dropped_targets.py +0 -0
  352. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/_shared.py +0 -0
  353. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/agent_integrator.py +0 -0
  354. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/base_integrator.py +0 -0
  355. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/canvas_integrator.py +0 -0
  356. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/cleanup.py +0 -0
  357. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/command_integrator.py +0 -0
  358. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/copilot_app_db.py +0 -0
  359. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/copilot_app_project.py +0 -0
  360. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/copilot_app_workflow_integrator.py +0 -0
  361. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/copilot_app_ws.py +0 -0
  362. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/copilot_cowork_paths.py +0 -0
  363. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/coverage.py +0 -0
  364. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/dispatch.py +0 -0
  365. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/hook_bundle.py +0 -0
  366. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/hook_command_paths.py +0 -0
  367. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/hook_command_warnings.py +0 -0
  368. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/hook_file_routing.py +0 -0
  369. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/hook_ir.py +0 -0
  370. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/hook_ownership.py +0 -0
  371. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/hook_reintegration.py +0 -0
  372. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/hook_source_selection.py +0 -0
  373. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/kiro_hook_integrator.py +0 -0
  374. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/lsp_integrator.py +0 -0
  375. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/mcp_config_view.py +0 -0
  376. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/opencode_frontmatter.py +0 -0
  377. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/prompt_integrator.py +0 -0
  378. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/skill_package_routing.py +0 -0
  379. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/skill_transformer.py +0 -0
  380. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/integration/utils.py +0 -0
  381. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/marketplace/__init__.py +0 -0
  382. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/marketplace/_git_utils.py +0 -0
  383. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/marketplace/_io.py +0 -0
  384. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/marketplace/_shared.py +0 -0
  385. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/marketplace/audit.py +0 -0
  386. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/marketplace/auth_helpers.py +0 -0
  387. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/marketplace/client.py +0 -0
  388. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/marketplace/diagnostics.py +0 -0
  389. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/marketplace/drift_check.py +0 -0
  390. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/marketplace/errors.py +0 -0
  391. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/marketplace/git_stderr.py +0 -0
  392. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/marketplace/init_template.py +0 -0
  393. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/marketplace/migration.py +0 -0
  394. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/marketplace/models.py +0 -0
  395. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/marketplace/output_mappers.py +0 -0
  396. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/marketplace/output_profiles.py +0 -0
  397. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/marketplace/ref_resolver.py +0 -0
  398. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/marketplace/registry.py +0 -0
  399. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/marketplace/semver.py +0 -0
  400. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/marketplace/shadow_detector.py +0 -0
  401. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/marketplace/source_identity.py +0 -0
  402. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/marketplace/tag_pattern.py +0 -0
  403. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/marketplace/validator.py +0 -0
  404. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/marketplace/version_check.py +0 -0
  405. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/marketplace/version_pins.py +0 -0
  406. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/marketplace/yml_editor.py +0 -0
  407. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/marketplace/yml_schema.py +0 -0
  408. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/models/__init__.py +0 -0
  409. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/models/apm_package.py +0 -0
  410. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/models/dependency/__init__.py +0 -0
  411. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/models/dependency/host_virtual.py +0 -0
  412. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/models/dependency/identity.py +0 -0
  413. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/models/dependency/lsp.py +0 -0
  414. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/models/dependency/materialization.py +0 -0
  415. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/models/dependency/object_fields.py +0 -0
  416. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/models/dependency/reference.py +0 -0
  417. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/models/dependency/registry_entry.py +0 -0
  418. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/models/dependency/selection.py +0 -0
  419. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/models/dependency/subsets.py +0 -0
  420. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/models/dependency/types.py +0 -0
  421. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/models/format_detection.py +0 -0
  422. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/models/manifest_contract.py +0 -0
  423. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/models/plugin.py +0 -0
  424. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/models/results.py +0 -0
  425. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/models/validation.py +0 -0
  426. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/output/__init__.py +0 -0
  427. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/output/formatters.py +0 -0
  428. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/output/models.py +0 -0
  429. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/output/script_formatters.py +0 -0
  430. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/policy/__init__.py +0 -0
  431. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/policy/_constraint_pinning.py +0 -0
  432. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/policy/_gitlab.py +0 -0
  433. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/policy/_help_text.py +0 -0
  434. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/policy/_shared.py +0 -0
  435. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/policy/discovery.py +0 -0
  436. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/policy/inheritance.py +0 -0
  437. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/policy/install_preflight.py +0 -0
  438. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/policy/matcher.py +0 -0
  439. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/policy/outcome_routing.py +0 -0
  440. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/policy/parser.py +0 -0
  441. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/policy/policy_checks.py +0 -0
  442. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/policy/project_config.py +0 -0
  443. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/policy/schema.py +0 -0
  444. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/primitives/__init__.py +0 -0
  445. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/primitives/models.py +0 -0
  446. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/primitives/parser.py +0 -0
  447. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/registry/__init__.py +0 -0
  448. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/registry/client.py +0 -0
  449. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/registry/integration.py +0 -0
  450. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/registry/operations.py +0 -0
  451. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/runtime/__init__.py +0 -0
  452. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/runtime/base.py +0 -0
  453. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/runtime/codex_runtime.py +0 -0
  454. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/runtime/copilot_runtime.py +0 -0
  455. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/runtime/factory.py +0 -0
  456. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/runtime/llm_runtime.py +0 -0
  457. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/runtime/manager.py +0 -0
  458. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/runtime/registry.py +0 -0
  459. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/runtime/utils.py +0 -0
  460. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/security/__init__.py +0 -0
  461. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/security/executables.py +0 -0
  462. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/security/external/__init__.py +0 -0
  463. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/security/external/base.py +0 -0
  464. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/security/external/gate.py +0 -0
  465. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/security/external/generic_sarif.py +0 -0
  466. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/security/external/options.py +0 -0
  467. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/security/external/registry.py +0 -0
  468. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/security/external/runner.py +0 -0
  469. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/security/external/sarif_ingest.py +0 -0
  470. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/security/external/skillspector.py +0 -0
  471. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/security/gate.py +0 -0
  472. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/update_policy.py +0 -0
  473. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/utils/__init__.py +0 -0
  474. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/utils/archive.py +0 -0
  475. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/utils/atomic_io.py +0 -0
  476. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/utils/console.py +0 -0
  477. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/utils/content_hash.py +0 -0
  478. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/utils/diagnostics.py +0 -0
  479. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/utils/exclude.py +0 -0
  480. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/utils/file_ops.py +0 -0
  481. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/utils/git_sparse.py +0 -0
  482. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/utils/github_host.py +0 -0
  483. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/utils/guards.py +0 -0
  484. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/utils/helpers.py +0 -0
  485. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/utils/install_tui.py +0 -0
  486. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/utils/net.py +0 -0
  487. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/utils/normalization.py +0 -0
  488. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/utils/paths.py +0 -0
  489. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/utils/perf_stats.py +0 -0
  490. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/utils/reflink.py +0 -0
  491. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/utils/short_sha.py +0 -0
  492. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/utils/staging_guard.py +0 -0
  493. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/utils/subprocess_env.py +0 -0
  494. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/utils/version_checker.py +0 -0
  495. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/utils/yaml_io.py +0 -0
  496. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/version.py +0 -0
  497. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/workflow/__init__.py +0 -0
  498. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/workflow/discovery.py +0 -0
  499. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/workflow/parser.py +0 -0
  500. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli/workflow/runner.py +0 -0
  501. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli.egg-info/dependency_links.txt +0 -0
  502. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli.egg-info/entry_points.txt +0 -0
  503. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli.egg-info/requires.txt +0 -0
  504. {apm_cli-0.32.0 → apm_cli-0.33.0}/src/apm_cli.egg-info/top_level.txt +0 -0
  505. {apm_cli-0.32.0 → apm_cli-0.33.0}/tests/test_apm_package_models.py +0 -0
  506. {apm_cli-0.32.0 → apm_cli-0.33.0}/tests/test_apm_resolver.py +0 -0
  507. {apm_cli-0.32.0 → apm_cli-0.33.0}/tests/test_codex_docker_args_fix.py +0 -0
  508. {apm_cli-0.32.0 → apm_cli-0.33.0}/tests/test_codex_empty_string_and_defaults.py +0 -0
  509. {apm_cli-0.32.0 → apm_cli-0.33.0}/tests/test_collision_integration.py +0 -0
  510. {apm_cli-0.32.0 → apm_cli-0.33.0}/tests/test_console.py +0 -0
  511. {apm_cli-0.32.0 → apm_cli-0.33.0}/tests/test_distributed_compilation.py +0 -0
  512. {apm_cli-0.32.0 → apm_cli-0.33.0}/tests/test_empty_string_and_defaults.py +0 -0
  513. {apm_cli-0.32.0 → apm_cli-0.33.0}/tests/test_enhanced_discovery.py +0 -0
  514. {apm_cli-0.32.0 → apm_cli-0.33.0}/tests/test_github_downloader.py +0 -0
  515. {apm_cli-0.32.0 → apm_cli-0.33.0}/tests/test_github_downloader_token_precedence.py +0 -0
  516. {apm_cli-0.32.0 → apm_cli-0.33.0}/tests/test_gitlab_git_transport.py +0 -0
  517. {apm_cli-0.32.0 → apm_cli-0.33.0}/tests/test_runnable_prompts.py +0 -0
  518. {apm_cli-0.32.0 → apm_cli-0.33.0}/tests/test_runtime_manager_token_precedence.py +0 -0
  519. {apm_cli-0.32.0 → apm_cli-0.33.0}/tests/test_token_manager.py +0 -0
  520. {apm_cli-0.32.0 → apm_cli-0.33.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.32.0
3
+ Version: 0.33.0
4
4
  Summary: MCP configuration tool
5
5
  Author-email: Daniel Meppiel <user@example.com>
6
6
  License: MIT License
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "apm-cli"
7
- version = "0.32.0"
7
+ version = "0.33.0"
8
8
  description = "MCP configuration tool"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -205,6 +205,7 @@ markers = [
205
205
  "slow: marks tests as slow running tests",
206
206
  "benchmark: marks performance benchmark tests (deselected by default, run with -m benchmark)",
207
207
  "windows_compat: load-bearing cross-platform regression contract family (CRLF-safe atomic writes, portable path formatting, git-executable resolution, socket/thread shutdown); runs on every OS and is additionally selected by the PR-time Windows Compatibility Gate -- NOT a requires_windows skip-gate, do not use requires_windows for this",
208
+ "trusted_executable: native trusted git/gh discovery and real consumer regressions; additionally selected on Windows Python 3.10 and 3.11",
208
209
  "requires_e2e_mode: requires APM_E2E_TESTS=1",
209
210
  "requires_github_token: requires GITHUB_APM_PAT or GITHUB_TOKEN",
210
211
  "requires_ado_pat: requires ADO_APM_PAT",
@@ -1424,7 +1424,7 @@ class MCPClientAdapter(ABC):
1424
1424
 
1425
1425
  Args:
1426
1426
  config: Mutable config dict updated in place.
1427
- remote: Registry remote entry (may contain a ``"headers"`` list).
1427
+ remote: Registry remote entry (headers may be records or a mapping).
1428
1428
  server_info: Registry server metadata used for name / URL lookup.
1429
1429
  env_overrides: Caller-supplied env-var override mapping.
1430
1430
  runtime_label: Label for diagnostic messages.
@@ -1432,18 +1432,38 @@ class MCPClientAdapter(ABC):
1432
1432
  instantiate. Passed by the caller so tests can patch the right
1433
1433
  module-level name.
1434
1434
  """
1435
+ from ...core.auth import AuthResolver
1436
+ from ...models.dependency.mcp import ManifestHeaderValue
1437
+
1435
1438
  server_name = server_info.get("name", "")
1436
1439
  is_github_server = self._is_github_server(server_name, remote.get("url", ""))
1437
1440
  local_token_injected = False
1438
- if is_github_server:
1439
- _tm = token_manager_class()
1440
- github_token = _tm.get_token_for_purpose("copilot") or os.getenv(
1441
- "GITHUB_PERSONAL_ACCESS_TOKEN"
1441
+ headers = remote.get("headers", []) or []
1442
+ if isinstance(headers, dict):
1443
+ headers = [{"name": name, "value": value} for name, value in headers.items()]
1444
+ explicit_authorization = any(
1445
+ isinstance(header, dict)
1446
+ and isinstance(header.get("name"), str)
1447
+ and header["name"].casefold() == "authorization"
1448
+ and isinstance(header.get("value"), ManifestHeaderValue)
1449
+ and bool(header.get("value"))
1450
+ for header in headers
1451
+ )
1452
+ if is_github_server and not explicit_authorization:
1453
+ resolver = AuthResolver(
1454
+ token_manager=token_manager_class(), allow_external_fallback=False
1455
+ )
1456
+ selected = resolver.resolve_github_mcp_token(
1457
+ source_only=self._supports_runtime_env_substitution
1442
1458
  )
1443
- if github_token:
1444
- config["headers"] = {"Authorization": f"Bearer {github_token}"}
1459
+ if selected:
1460
+ credential = (
1461
+ self._format_runtime_env_placeholder(selected)
1462
+ if self._supports_runtime_env_substitution
1463
+ else selected
1464
+ )
1465
+ config.setdefault("headers", {})["Authorization"] = f"Bearer {credential}"
1445
1466
  local_token_injected = True
1446
- headers = remote.get("headers", [])
1447
1467
  if headers:
1448
1468
  if "headers" not in config:
1449
1469
  config["headers"] = {}
@@ -1451,8 +1471,15 @@ class MCPClientAdapter(ABC):
1451
1471
  header_name = header.get("name", "")
1452
1472
  header_value = header.get("value", "")
1453
1473
  if header_name and header_value:
1454
- if header_name == "Authorization" and local_token_injected:
1455
- continue
1474
+ if header_name.casefold() == "authorization":
1475
+ if local_token_injected or (
1476
+ explicit_authorization
1477
+ and not isinstance(header_value, ManifestHeaderValue)
1478
+ ):
1479
+ continue
1480
+ for key in list(config["headers"]):
1481
+ if key.casefold() == "authorization":
1482
+ del config["headers"][key]
1456
1483
  resolved_value = self._resolve_env_variable(
1457
1484
  header_name, header_value, env_overrides
1458
1485
  )
@@ -63,6 +63,14 @@ class ClaudeClientAdapter(CopilotClientAdapter):
63
63
  _CONVERGED_SKILL_PREFIX = ".agents/skills/"
64
64
  _CLAUDE_SKILL_PREFIX = ".claude/skills/"
65
65
 
66
+ # Entry ``type`` values Claude Code uses for URL-addressed servers.
67
+ _REMOTE_TYPES = ("http", "sse", "streamable-http")
68
+
69
+ # Transport fields are replaced across families; a partial update can
70
+ # retain an omitted type only when it still belongs to the selected family.
71
+ _REMOTE_TRANSPORT_KEYS = frozenset({"type", "url", "headers"})
72
+ _STDIO_TRANSPORT_KEYS = frozenset({"type", "command", "args", "env", "cwd"})
73
+
66
74
  @classmethod
67
75
  def _rewrite_self_defined_skill_command(cls, command: str) -> str:
68
76
  if isinstance(command, str) and command.startswith(cls._CONVERGED_SKILL_PREFIX):
@@ -75,8 +83,13 @@ class ClaudeClientAdapter(CopilotClientAdapter):
75
83
  config["command"] = self._rewrite_self_defined_skill_command(config["command"])
76
84
  return config
77
85
 
78
- @staticmethod
79
- def _normalize_mcp_entry_for_claude_code(entry: dict) -> dict:
86
+ @classmethod
87
+ def _is_remote_mcp_entry(cls, entry: dict) -> bool:
88
+ """Return whether *entry* describes a remote (URL-addressed) server."""
89
+ return bool(entry.get("url")) or entry.get("type") in cls._REMOTE_TYPES
90
+
91
+ @classmethod
92
+ def _normalize_mcp_entry_for_claude_code(cls, entry: dict) -> dict:
80
93
  """Normalize a server entry to Claude Code's on-disk shape.
81
94
 
82
95
  For remote servers, keep ``type``/``url``/``headers`` per Claude
@@ -91,11 +104,8 @@ class ClaudeClientAdapter(CopilotClientAdapter):
91
104
  if not isinstance(entry, dict):
92
105
  return entry
93
106
  out = dict(entry)
94
- url = out.get("url")
95
- t = out.get("type")
96
- is_remote = bool(url) or t in ("http", "sse", "streamable-http")
97
107
 
98
- if is_remote:
108
+ if cls._is_remote_mcp_entry(out):
99
109
  if out.get("id") in ("", None):
100
110
  out.pop("id", None)
101
111
  if out.get("tools") == ["*"]:
@@ -110,14 +120,43 @@ class ClaudeClientAdapter(CopilotClientAdapter):
110
120
  out.pop("id", None)
111
121
  return out
112
122
 
113
- @staticmethod
114
- def _merge_mcp_server_dicts(existing_servers: dict, config_updates: dict) -> None:
123
+ @classmethod
124
+ def _retained_previous_entry(cls, prev: dict, new_cfg: dict) -> dict:
125
+ """Return *prev* without the keys of the transport *new_cfg* is not.
126
+
127
+ A redeclaration that switches transport must not leave the previous
128
+ transport's keys behind. A surviving ``url`` keeps the entry
129
+ classified as remote, so the stdio shape never wins and a stale
130
+ ``Authorization`` header stays in the Claude Code config.
131
+
132
+ The keys are selected from the update rather than from a comparison
133
+ of the two entries, so an entry already carrying both transports --
134
+ written by a release that merged them unconditionally -- is repaired
135
+ by the next install that writes it instead of matching its own mixed shape and
136
+ surviving. Keys APM does not manage (hand-authored OAuth blocks and
137
+ the like) describe no transport and are retained either way.
138
+ """
139
+ declares_transport = any(new_cfg.get(key) for key in ("type", "url", "command"))
140
+ is_remote = cls._is_remote_mcp_entry(new_cfg if declares_transport else prev)
141
+ stale = cls._STDIO_TRANSPORT_KEYS if is_remote else cls._REMOTE_TRANSPORT_KEYS
142
+ compatible_types = cls._REMOTE_TYPES if is_remote else ("local", "stdio")
143
+ # Keep a compatible type in place so repeated writes retain field order.
144
+ return {
145
+ key: value
146
+ for key, value in prev.items()
147
+ if key not in stale or (key == "type" and value in compatible_types)
148
+ }
149
+
150
+ @classmethod
151
+ def _merge_mcp_server_dicts(cls, existing_servers: dict, config_updates: dict) -> None:
115
152
  """Merge *config_updates* into *existing_servers* in place.
116
153
 
117
154
  Per-server entries are shallow-merged: ``{**old, **new}`` so keys present
118
- only on plugin- or hand-authored configs (e.g. ``type``, OAuth blocks)
155
+ only on plugin- or hand-authored configs (e.g. OAuth blocks)
119
156
  survive when an update omits them. Keys in *new* overwrite *old* on
120
157
  conflict so APM/registry installs still refresh ``command``/``args``/etc.
158
+ The previous entry first drops the keys of the transport the update
159
+ does not declare, so the merged entry describes exactly one.
121
160
  """
122
161
  for name, new_cfg in config_updates.items():
123
162
  if not isinstance(new_cfg, dict):
@@ -125,7 +164,7 @@ class ClaudeClientAdapter(CopilotClientAdapter):
125
164
  continue
126
165
  prev = existing_servers.get(name)
127
166
  if isinstance(prev, dict):
128
- merged = {**prev, **new_cfg}
167
+ merged = {**cls._retained_previous_entry(prev, new_cfg), **new_cfg}
129
168
  existing_servers[name] = merged
130
169
  else:
131
170
  existing_servers[name] = dict(new_cfg)
@@ -2,6 +2,7 @@
2
2
 
3
3
  import logging
4
4
  import os
5
+ import re
5
6
  from pathlib import Path
6
7
  from urllib.parse import urlparse
7
8
 
@@ -15,10 +16,34 @@ from ...utils.console import _rich_success, _rich_warning
15
16
  from ...utils.net import is_loopback_host
16
17
  from ...utils.path_security import PathTraversalError
17
18
  from ._mcp_runtime_args import process_v01_value_hint_arg
18
- from .base import MCPClientAdapter
19
+ from .base import _ENV_VAR_RE, MCPClientAdapter
19
20
 
20
21
  _log = logging.getLogger(__name__)
21
22
 
23
+ # Codex documents ``http_headers`` as a map of header names to STATIC values,
24
+ # so a ``${VAR}`` written there reaches the server as that literal text. An
25
+ # environment-sourced header has two dedicated fields instead:
26
+ # ``env_http_headers`` maps a header name to the variable holding its whole
27
+ # value, and ``bearer_token_env_var`` names the variable holding an
28
+ # Authorization bearer token. Codex resolves both at server start, which is
29
+ # what the declared ``${VAR}`` asks for -- this adapter does not support
30
+ # runtime substitution itself, so the placeholder survives
31
+ # ``_resolve_variable_placeholders`` untouched.
32
+ # See https://learn.chatgpt.com/docs/extend/mcp?surface=cli
33
+ _CODEX_BEARER_HEADER = "authorization"
34
+ # Reuse the canonical placeholder syntax so the two spellings APM accepts
35
+ # (``${VAR}`` and ``${env:VAR}``) cannot drift apart here. The auth scheme is
36
+ # case-insensitive per RFC 7235; Codex always writes it as ``Bearer``.
37
+ _CODEX_BEARER_VALUE_RE = re.compile(rf"(?i:Bearer) +{_ENV_VAR_RE.pattern}")
38
+ # Any reference still standing in a resolved value, deliberately wider than the
39
+ # canonical parser: a spelling it does not model, such as the shell default in
40
+ # ``${VAR:-}``, is no more static than a ``${VAR}`` Codex could resolve, and
41
+ # writing it to ``http_headers`` sends the braces to the server. Widening the
42
+ # report here, rather than the parser, keeps every other adapter's placeholder
43
+ # semantics untouched. ``${input:...}`` is excluded: input variables are
44
+ # collected elsewhere and carry their own warning.
45
+ _CODEX_UNSUPPORTED_REFERENCE_RE = re.compile(r"\$\{(?!input:)")
46
+
22
47
 
23
48
  class CodexClientAdapter(MCPClientAdapter):
24
49
  """Codex CLI implementation of MCP client adapter.
@@ -293,16 +318,49 @@ class CodexClientAdapter(MCPClientAdapter):
293
318
  "id": server_info.get("id", ""),
294
319
  }
295
320
  http_headers: dict[str, str] = {}
321
+ env_http_headers: dict[str, str] = {}
322
+ bearer_token_env_var = ""
323
+ unsupported_headers: list[str] = []
296
324
  for header in remote.get("headers", []):
297
325
  h_name = header.get("name", "")
298
326
  h_value = header.get("value", "")
299
- if h_name and h_value:
300
- http_headers[h_name] = self._resolve_variable_placeholders(
301
- h_value, env_overrides or {}, runtime_vars or {}
302
- )
327
+ if not (h_name and h_value):
328
+ continue
329
+ resolved = self._resolve_variable_placeholders(
330
+ h_value, env_overrides or {}, runtime_vars or {}
331
+ )
332
+ bearer = _CODEX_BEARER_VALUE_RE.fullmatch(resolved)
333
+ if bearer and h_name.lower() == _CODEX_BEARER_HEADER:
334
+ bearer_token_env_var = bearer.group(1)
335
+ continue
336
+ env_header = _ENV_VAR_RE.fullmatch(resolved)
337
+ if env_header:
338
+ env_http_headers[h_name] = env_header.group(1)
339
+ continue
340
+ if _CODEX_UNSUPPORTED_REFERENCE_RE.search(resolved):
341
+ unsupported_headers.append(h_name)
342
+ continue
343
+ http_headers[h_name] = resolved
344
+ if unsupported_headers:
345
+ safe_headers = ", ".join(ascii(name)[1:-1] for name in unsupported_headers)
346
+ safe_server = ascii(server_name)[1:-1]
347
+ _rich_warning(
348
+ f"Skipping header(s) {safe_headers} of MCP server "
349
+ f"'{safe_server}' for Codex CLI: Codex reads a header from the "
350
+ "environment only when the value is exactly ${VAR} or, for "
351
+ "Authorization, `Bearer ${VAR}`. Literal text around the "
352
+ "reference, or a shell-style default such as ${VAR:-}, has no "
353
+ "Codex equivalent; export the whole header value as one variable.",
354
+ symbol="warning",
355
+ )
356
+ # Scalars precede the sub-tables tomlkit renders for the dict values.
357
+ if bearer_token_env_var:
358
+ remote_config["bearer_token_env_var"] = bearer_token_env_var
303
359
  if http_headers:
304
360
  remote_config["http_headers"] = http_headers
305
361
  self._warn_input_variables(http_headers, server_name, "Codex CLI")
362
+ if env_http_headers:
363
+ remote_config["env_http_headers"] = env_http_headers
306
364
  self._merge_extra(remote_config, server_info)
307
365
  return remote_config
308
366
 
@@ -55,11 +55,12 @@ class CopilotClientAdapter(MCPClientAdapter):
55
55
  # environment and the literal value is baked into the config file
56
56
  # (legacy pre-#1152 behaviour).
57
57
  #
58
- # Subclasses (Cursor / Windsurf / OpenCode / Claude / Gemini) override
59
- # this to ``False`` until their respective config formats are individually
60
- # audited for runtime-substitution support. Critically, Claude Desktop's
61
- # config format does NOT support runtime substitution -- it MUST keep
62
- # resolving at install time.
58
+ # Subclasses (Windsurf / OpenCode / Claude / Gemini) override this to
59
+ # ``False`` until their respective config formats are individually audited
60
+ # for runtime-substitution support. Cursor has audited native
61
+ # ``${env:VAR}`` support. Critically, Claude Desktop's config format does
62
+ # NOT support runtime substitution -- it MUST keep resolving at install
63
+ # time.
63
64
  _supports_runtime_env_substitution: bool = True
64
65
 
65
66
  # Process-wide aggregation of legacy ``<VAR>`` offenders, keyed by
@@ -14,6 +14,8 @@ import os
14
14
  from pathlib import Path
15
15
 
16
16
  from ...core.token_manager import GitHubTokenManager
17
+ from ...models.dependency.mcp import TrustedEnvLiteral
18
+ from .base import _stringify_env_literal
17
19
  from .copilot import CopilotClientAdapter
18
20
 
19
21
 
@@ -29,11 +31,43 @@ class CursorClientAdapter(CopilotClientAdapter):
29
31
  target_name: str = "cursor"
30
32
  mcp_servers_key: str = "mcpServers"
31
33
 
32
- # Cursor's mcp.json runtime-substitution support has not yet been
33
- # individually audited (see #1152). Pin to the legacy install-time
34
- # resolution behaviour so this adapter is unchanged by the Copilot
35
- # security fix; revisit in a follow-up.
36
- _supports_runtime_env_substitution: bool = False
34
+ # APM normalizes Cursor env, args, and headers to ${env:NAME}, not command/url.
35
+ # Keep manifest env references native in the project-local config, so
36
+ # those referenced values are not baked into the file. Explicit mcp.env
37
+ # literals remain literal below; shared GitHub token injection is separate.
38
+ _supports_runtime_env_substitution: bool = True
39
+
40
+ def _format_runtime_env_placeholder(self, name: str) -> str:
41
+ """Return Cursor's native env-var placeholder syntax."""
42
+ return "${env:" + name + "}"
43
+
44
+ def _resolve_environment_variables(
45
+ self,
46
+ env_vars: dict[str, object] | list[dict[str, object]],
47
+ env_overrides: dict[str, str] | None = None,
48
+ ) -> dict[str, str]:
49
+ """Translate explicit env references while preserving authored literals.
50
+
51
+ APM's shared translate-mode dict resolver treats ordinary string
52
+ values as candidates for environment substitution. In Cursor's
53
+ project-local config, an explicit static value must keep its authored
54
+ value; only recognized references are rewritten for Cursor.
55
+ """
56
+ if not isinstance(env_vars, dict):
57
+ return super()._resolve_environment_variables(env_vars, env_overrides)
58
+
59
+ resolved: dict[str, str] = {}
60
+ self._last_env_placeholder_keys = set()
61
+ for name, value in env_vars.items():
62
+ if not name or value is None:
63
+ continue
64
+ if isinstance(value, TrustedEnvLiteral):
65
+ resolved[name] = value
66
+ elif isinstance(value, str):
67
+ resolved[name] = self._resolve_env_variable(name, value, env_overrides)
68
+ else:
69
+ resolved[name] = _stringify_env_literal(value)
70
+ return resolved
37
71
 
38
72
  # ------------------------------------------------------------------ #
39
73
  # Auth-header injection override (for testability)
@@ -42,14 +76,21 @@ class CursorClientAdapter(CopilotClientAdapter):
42
76
  def _apply_auth_and_headers(
43
77
  self, config, remote, server_info, env_overrides, runtime_label="Cursor"
44
78
  ):
45
- """Inject GitHub token and registry-supplied headers into *config*.
79
+ """Merge registry headers without persisting a resolved GitHub token.
46
80
 
47
81
  Overrides the parent to supply ``GitHubTokenManager`` from *this*
48
82
  module's namespace, allowing tests to patch
49
- ``apm_cli.adapters.client.cursor.GitHubTokenManager`` correctly.
83
+ ``apm_cli.adapters.client.cursor.GitHubTokenManager`` correctly. Cursor
84
+ reads project-local config, so GitHub credentials must be supplied as
85
+ runtime environment references rather than resolved during install.
50
86
  """
51
87
  self._apply_auth_and_headers_impl(
52
- config, remote, server_info, env_overrides, runtime_label, GitHubTokenManager
88
+ config,
89
+ remote,
90
+ server_info,
91
+ env_overrides,
92
+ runtime_label,
93
+ GitHubTokenManager,
53
94
  )
54
95
 
55
96
  def get_config_path(self):
@@ -29,8 +29,9 @@ already exists — OpenCode support is opt-in.
29
29
  import json
30
30
  import os
31
31
  from pathlib import Path
32
+ from typing import Any
32
33
 
33
- from ...models.dependency.mcp import _EXTRA_DENYLIST
34
+ from ...models.dependency.mcp import _EXTRA_DENYLIST, opencode_enabled_value
34
35
  from .copilot import CopilotClientAdapter
35
36
 
36
37
 
@@ -55,7 +56,7 @@ class OpenCodeClientAdapter(CopilotClientAdapter):
55
56
  """Return the path to ``opencode.json`` in the repository root."""
56
57
  return str(self.project_root / "opencode.json")
57
58
 
58
- def update_config(self, config_updates, enabled=True):
59
+ def update_config(self, config_updates, enabled: Any = True):
59
60
  """Merge *config_updates* into the ``mcp`` section of ``opencode.json``.
60
61
 
61
62
  The ``.opencode/`` directory must already exist; if it does not, this
@@ -94,7 +95,7 @@ class OpenCodeClientAdapter(CopilotClientAdapter):
94
95
  self,
95
96
  server_url,
96
97
  server_name=None,
97
- enabled=True,
98
+ enabled: Any = True,
98
99
  env_overrides=None,
99
100
  server_info_cache=None,
100
101
  runtime_vars=None,
@@ -120,7 +121,10 @@ class OpenCodeClientAdapter(CopilotClientAdapter):
120
121
  config_key = self._determine_config_key(server_url, server_name)
121
122
 
122
123
  server_config = self._format_server_config(server_info, env_overrides, runtime_vars)
123
- self.update_config({config_key: server_config}, enabled=enabled)
124
+ self.update_config(
125
+ {config_key: server_config},
126
+ enabled=opencode_enabled_value(server_info, enabled),
127
+ )
124
128
 
125
129
  print(f"Successfully configured MCP server '{config_key}' for OpenCode")
126
130
  return True
@@ -130,7 +134,7 @@ class OpenCodeClientAdapter(CopilotClientAdapter):
130
134
  return False
131
135
 
132
136
  @staticmethod
133
- def _to_opencode_format(copilot_entry: dict, enabled: bool = True) -> dict:
137
+ def _to_opencode_format(copilot_entry: dict, enabled: Any = True) -> dict:
134
138
  """Convert a Copilot-format server config to OpenCode format.
135
139
 
136
140
  Copilot: ``{"command": "npx", "args": ["-y", "pkg"], "env": {...}}``
@@ -26,6 +26,7 @@ from apm_cli.commands._helpers import (
26
26
  print_version,
27
27
  )
28
28
  from apm_cli.commands.approve import approve_cmd, deny_cmd
29
+ from apm_cli.commands.auth import auth
29
30
  from apm_cli.commands.cache import cache
30
31
  from apm_cli.commands.compile import compile as compile_cmd
31
32
  from apm_cli.commands.config import config
@@ -52,6 +53,7 @@ from apm_cli.commands.view import view as view_cmd
52
53
  _CLI_EPILOG = (
53
54
  "\b\n"
54
55
  "Common workflows:\n"
56
+ " apm auth <host> Set up credentials for a git host\n"
55
57
  " apm init Scaffold a new project\n"
56
58
  " apm install Install dependencies from apm.yml\n"
57
59
  " apm install --frozen Reproduce lockfile exactly (CI-safe)\n"
@@ -297,6 +299,7 @@ def cli(ctx, verbose: bool) -> None:
297
299
 
298
300
  # Register command groups
299
301
  cli.add_command(approve_cmd, name="approve")
302
+ cli.add_command(auth)
300
303
  cli.add_command(cache)
301
304
  cli.add_command(deny_cmd, name="deny")
302
305
  cli.add_command(deps)