apm-cli 0.28.0__tar.gz → 0.29.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (522) hide show
  1. {apm_cli-0.28.0/src/apm_cli.egg-info → apm_cli-0.29.1}/PKG-INFO +4 -3
  2. {apm_cli-0.28.0 → apm_cli-0.29.1}/README.md +3 -2
  3. {apm_cli-0.28.0 → apm_cli-0.29.1}/pyproject.toml +1 -1
  4. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/base.py +4 -5
  5. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/codex.py +22 -6
  6. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/copilot.py +26 -10
  7. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/cursor.py +2 -0
  8. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/gemini.py +8 -2
  9. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/intellij.py +69 -1
  10. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/kiro.py +2 -0
  11. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/opencode.py +6 -0
  12. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/vscode.py +5 -2
  13. apm_cli-0.29.1/src/apm_cli/agent_plugins/__init__.py +146 -0
  14. apm_cli-0.29.1/src/apm_cli/agent_plugins/assets.py +368 -0
  15. apm_cli-0.29.1/src/apm_cli/agent_plugins/constants.py +23 -0
  16. apm_cli-0.29.1/src/apm_cli/agent_plugins/errors.py +162 -0
  17. apm_cli-0.29.1/src/apm_cli/agent_plugins/io.py +101 -0
  18. apm_cli-0.29.1/src/apm_cli/agent_plugins/ir.py +196 -0
  19. apm_cli-0.29.1/src/apm_cli/agent_plugins/loader.py +966 -0
  20. apm_cli-0.29.1/src/apm_cli/agent_plugins/projection.py +61 -0
  21. apm_cli-0.29.1/src/apm_cli/agent_plugins/validation.py +690 -0
  22. apm_cli-0.29.1/src/apm_cli/bundle/agent_plugin_exporter.py +524 -0
  23. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/bundle/attest.py +1 -1
  24. apm_cli-0.29.1/src/apm_cli/bundle/claude_plugin_exporter.py +32 -0
  25. apm_cli-0.29.1/src/apm_cli/bundle/export_common.py +41 -0
  26. apm_cli-0.29.1/src/apm_cli/bundle/formats.py +147 -0
  27. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/bundle/local_bundle.py +135 -18
  28. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/bundle/lockfile_enrichment.py +11 -4
  29. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/bundle/packer.py +30 -12
  30. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/bundle/plugin_exporter.py +65 -57
  31. apm_cli-0.29.1/src/apm_cli/bundle/plugin_layout.py +60 -0
  32. apm_cli-0.29.1/src/apm_cli/bundle/reproducible_archive.py +79 -0
  33. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/cache/git_cache.py +168 -59
  34. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/cache/url_normalize.py +7 -3
  35. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/_helpers.py +40 -19
  36. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/approve.py +75 -10
  37. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/audit.py +16 -6
  38. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/compile/cli.py +252 -43
  39. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/compile/watcher.py +112 -57
  40. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/config.py +9 -1
  41. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/deps/_utils.py +26 -4
  42. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/deps/cli.py +63 -2
  43. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/experimental.py +4 -0
  44. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/init.py +110 -15
  45. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/install.py +333 -331
  46. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/lifecycle.py +2 -0
  47. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/lock.py +32 -17
  48. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/__init__.py +56 -252
  49. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/check.py +31 -15
  50. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/doctor.py +38 -10
  51. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/init.py +2 -0
  52. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/plugin/add.py +2 -0
  53. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/plugin/remove.py +2 -0
  54. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/plugin/set.py +2 -0
  55. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/validate.py +15 -11
  56. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/mcp.py +44 -34
  57. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/pack.py +162 -33
  58. apm_cli-0.29.1/src/apm_cli/commands/plugin/init.py +75 -0
  59. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/prune.py +132 -8
  60. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/publish.py +1 -1
  61. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/uninstall/cli.py +378 -68
  62. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/uninstall/engine.py +352 -95
  63. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/update.py +73 -10
  64. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/compilation/agents_compiler.py +406 -132
  65. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/compilation/build_id.py +1 -3
  66. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/compilation/claude_formatter.py +2 -4
  67. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/compilation/constants.py +21 -0
  68. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/compilation/context_optimizer.py +80 -96
  69. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/compilation/distributed_compiler.py +122 -48
  70. apm_cli-0.29.1/src/apm_cli/compilation/footer.py +20 -0
  71. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/compilation/gemini_formatter.py +2 -2
  72. apm_cli-0.29.1/src/apm_cli/compilation/inventory.py +146 -0
  73. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/compilation/output_writer.py +27 -5
  74. apm_cli-0.29.1/src/apm_cli/compilation/root_context_protection.py +121 -0
  75. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/compilation/template_builder.py +6 -8
  76. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/compilation/user_root_context.py +43 -17
  77. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/config.py +119 -25
  78. apm_cli-0.29.1/src/apm_cli/copilot_plugins/__init__.py +54 -0
  79. apm_cli-0.29.1/src/apm_cli/copilot_plugins/capability.py +142 -0
  80. apm_cli-0.29.1/src/apm_cli/copilot_plugins/catalog.py +106 -0
  81. apm_cli-0.29.1/src/apm_cli/copilot_plugins/constants.py +32 -0
  82. apm_cli-0.29.1/src/apm_cli/copilot_plugins/registrar.py +659 -0
  83. apm_cli-0.29.1/src/apm_cli/copilot_plugins/settings.py +306 -0
  84. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/apm_yml.py +81 -9
  85. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/auth.py +266 -112
  86. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/build_orchestrator.py +153 -36
  87. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/command_logger.py +112 -6
  88. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/deployment_ledger.py +110 -21
  89. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/experimental.py +4 -14
  90. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/host_providers.py +60 -0
  91. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/lifecycle_scripts.py +15 -8
  92. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/null_logger.py +5 -2
  93. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/plugin_manifest.py +56 -21
  94. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/scope.py +8 -0
  95. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/script_executors.py +3 -31
  96. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/target_catalog.py +26 -5
  97. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/target_detection.py +38 -21
  98. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/token_manager.py +9 -4
  99. apm_cli-0.29.1/src/apm_cli/deps/_shared.py +244 -0
  100. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/apm_resolver.py +289 -50
  101. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/artifactory_entry.py +31 -5
  102. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/artifactory_orchestrator.py +26 -15
  103. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/bare_cache.py +126 -46
  104. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/clone_engine.py +180 -78
  105. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/download_strategies.py +87 -36
  106. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/git_auth_env.py +34 -18
  107. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/git_file_transport.py +51 -17
  108. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/git_reference_resolver.py +109 -47
  109. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/git_remote_ops.py +71 -4
  110. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/github_downloader.py +253 -151
  111. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/github_downloader_validation.py +234 -96
  112. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/host_backends.py +4 -3
  113. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/lockfile.py +171 -39
  114. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/package_validator.py +12 -6
  115. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/path_anchoring.py +78 -17
  116. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/plugin_parser.py +623 -137
  117. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/reachability.py +16 -2
  118. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/auth.py +31 -5
  119. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/client.py +56 -2
  120. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/config_loader.py +8 -4
  121. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/feature_gate.py +8 -4
  122. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/outdated.py +1 -1
  123. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/resolver.py +46 -15
  124. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/revision_pins.py +55 -10
  125. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/tiered_ref_resolver.py +1 -1
  126. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/transport_selection.py +192 -66
  127. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/drift.py +3 -11
  128. apm_cli-0.29.1/src/apm_cli/hook_contract.py +266 -0
  129. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/audit_replay.py +11 -1
  130. apm_cli-0.29.1/src/apm_cli/install/audit_target_roots.py +79 -0
  131. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/context.py +10 -0
  132. apm_cli-0.29.1/src/apm_cli/install/deployable_source_plan.py +264 -0
  133. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/deployed_paths.py +14 -0
  134. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/drift.py +108 -38
  135. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/drift_render.py +15 -0
  136. apm_cli-0.29.1/src/apm_cli/install/dry_run_plan.py +133 -0
  137. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/errors.py +14 -0
  138. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/exec_gate.py +83 -31
  139. apm_cli-0.29.1/src/apm_cli/install/finalization.py +19 -0
  140. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/helpers/ref_reuse.py +204 -45
  141. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/helpers/security_scan.py +20 -9
  142. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/integrity.py +27 -0
  143. apm_cli-0.29.1/src/apm_cli/install/legacy_plugin_compat.py +264 -0
  144. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/local_bundle_handler.py +316 -62
  145. apm_cli-0.29.1/src/apm_cli/install/local_bundle_paths.py +206 -0
  146. apm_cli-0.29.1/src/apm_cli/install/locking.py +143 -0
  147. apm_cli-0.29.1/src/apm_cli/install/lsp/integration.py +486 -0
  148. apm_cli-0.29.1/src/apm_cli/install/manifest_helpers.py +98 -0
  149. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/manifest_reconcile.py +239 -56
  150. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/command.py +109 -18
  151. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/conflicts.py +2 -9
  152. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/integration.py +114 -15
  153. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/ownership.py +27 -5
  154. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/registry.py +91 -80
  155. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/warnings.py +29 -17
  156. apm_cli-0.29.1/src/apm_cli/install/native_plugin_admission.py +207 -0
  157. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/outcome.py +59 -10
  158. apm_cli-0.29.1/src/apm_cli/install/package_selection.py +45 -0
  159. apm_cli-0.29.1/src/apm_cli/install/phases/copilot_plugins.py +198 -0
  160. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/finalize.py +16 -4
  161. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/integrate.py +26 -8
  162. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/local_content.py +2 -0
  163. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/lockfile.py +12 -1
  164. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/resolve.py +107 -112
  165. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/targets.py +33 -28
  166. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/pipeline.py +51 -66
  167. apm_cli-0.29.1/src/apm_cli/install/presentation/dry_run.py +107 -0
  168. apm_cli-0.29.1/src/apm_cli/install/primitive_classification.py +245 -0
  169. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/registry_wiring.py +7 -3
  170. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/request.py +1 -0
  171. apm_cli-0.29.1/src/apm_cli/install/resolution_staging.py +356 -0
  172. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/service.py +78 -4
  173. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/service_integration.py +12 -4
  174. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/services.py +169 -93
  175. apm_cli-0.29.1/src/apm_cli/install/source_helpers.py +56 -0
  176. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/sources.py +185 -197
  177. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/summary.py +39 -0
  178. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/target_filter.py +19 -0
  179. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/target_hints.py +3 -1
  180. apm_cli-0.29.1/src/apm_cli/install/template.py +405 -0
  181. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/transaction.py +82 -24
  182. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/validation.py +192 -190
  183. apm_cli-0.29.1/src/apm_cli/integration/_shared.py +92 -0
  184. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/agent_integrator.py +57 -12
  185. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/base_integrator.py +131 -11
  186. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/canvas_integrator.py +15 -1
  187. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/cleanup.py +14 -1
  188. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/command_integrator.py +7 -3
  189. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/hook_bundle.py +46 -12
  190. apm_cli-0.29.1/src/apm_cli/integration/hook_command_paths.py +58 -0
  191. apm_cli-0.29.1/src/apm_cli/integration/hook_command_warnings.py +25 -0
  192. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/hook_integrator.py +217 -214
  193. apm_cli-0.29.1/src/apm_cli/integration/hook_ir.py +5 -0
  194. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/hook_native_formats.py +6 -73
  195. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/hook_ownership.py +68 -15
  196. apm_cli-0.29.1/src/apm_cli/integration/hook_reintegration.py +37 -0
  197. apm_cli-0.29.1/src/apm_cli/integration/hook_source_selection.py +188 -0
  198. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/instruction_integrator.py +294 -128
  199. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/kiro_hook_integrator.py +11 -10
  200. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/lsp_integrator.py +360 -43
  201. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/mcp_config_view.py +48 -16
  202. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/mcp_integrator.py +227 -34
  203. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/mcp_integrator_install.py +225 -42
  204. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/prompt_integrator.py +9 -3
  205. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/skill_integrator.py +395 -301
  206. apm_cli-0.29.1/src/apm_cli/integration/skill_package_routing.py +49 -0
  207. apm_cli-0.29.1/src/apm_cli/integration/skill_support.py +102 -0
  208. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/targets.py +77 -13
  209. apm_cli-0.29.1/src/apm_cli/marketplace/_git_utils.py +12 -0
  210. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/builder.py +368 -98
  211. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/client.py +77 -38
  212. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/drift_check.py +44 -12
  213. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/errors.py +6 -4
  214. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/models.py +136 -70
  215. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/ref_resolver.py +111 -43
  216. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/registry.py +1 -1
  217. apm_cli-0.29.1/src/apm_cli/marketplace/source_identity.py +264 -0
  218. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/validator.py +15 -7
  219. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/yml_schema.py +30 -12
  220. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/apm_package.py +112 -49
  221. apm_cli-0.29.1/src/apm_cli/models/dependency/host_virtual.py +364 -0
  222. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/identity.py +1 -0
  223. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/lsp.py +2 -0
  224. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/mcp.py +52 -16
  225. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/reference.py +232 -179
  226. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/format_detection.py +111 -26
  227. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/results.py +2 -0
  228. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/validation.py +163 -25
  229. apm_cli-0.29.1/src/apm_cli/policy/_gitlab.py +493 -0
  230. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/policy/_help_text.py +2 -2
  231. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/policy/ci_checks.py +263 -37
  232. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/policy/discovery.py +121 -127
  233. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/policy/inheritance.py +2 -4
  234. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/primitives/discovery.py +133 -105
  235. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/registry/client.py +173 -25
  236. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/registry/operations.py +76 -18
  237. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/runtime/copilot_runtime.py +12 -6
  238. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/security/content_scanner.py +31 -0
  239. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/security/executables.py +353 -58
  240. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/security/file_scanner.py +40 -3
  241. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/security/gate.py +78 -6
  242. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/atomic_io.py +36 -5
  243. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/content_hash.py +12 -5
  244. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/diagnostics.py +2 -0
  245. apm_cli-0.29.1/src/apm_cli/utils/git_env.py +1524 -0
  246. apm_cli-0.29.1/src/apm_cli/utils/git_sparse.py +309 -0
  247. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/github_host.py +22 -87
  248. apm_cli-0.29.1/src/apm_cli/utils/net.py +58 -0
  249. apm_cli-0.29.1/src/apm_cli/utils/path_security.py +243 -0
  250. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/patterns.py +108 -14
  251. apm_cli-0.29.1/src/apm_cli/utils/staging_guard.py +63 -0
  252. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/yaml_io.py +183 -58
  253. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/version.py +3 -1
  254. {apm_cli-0.28.0 → apm_cli-0.29.1/src/apm_cli.egg-info}/PKG-INFO +4 -3
  255. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli.egg-info/SOURCES.txt +46 -0
  256. {apm_cli-0.28.0 → apm_cli-0.29.1}/tests/test_apm_package_models.py +39 -3
  257. {apm_cli-0.28.0 → apm_cli-0.29.1}/tests/test_apm_resolver.py +107 -0
  258. {apm_cli-0.28.0 → apm_cli-0.29.1}/tests/test_github_downloader.py +153 -121
  259. {apm_cli-0.28.0 → apm_cli-0.29.1}/tests/test_gitlab_git_transport.py +85 -3
  260. {apm_cli-0.28.0 → apm_cli-0.29.1}/tests/test_lockfile.py +208 -1
  261. {apm_cli-0.28.0 → apm_cli-0.29.1}/tests/test_token_manager.py +14 -2
  262. apm_cli-0.28.0/src/apm_cli/bundle/plugin_layout.py +0 -24
  263. apm_cli-0.28.0/src/apm_cli/commands/plugin/init.py +0 -44
  264. apm_cli-0.28.0/src/apm_cli/deps/_shared.py +0 -40
  265. apm_cli-0.28.0/src/apm_cli/install/local_bundle_paths.py +0 -89
  266. apm_cli-0.28.0/src/apm_cli/install/lsp/integration.py +0 -180
  267. apm_cli-0.28.0/src/apm_cli/install/package_selection.py +0 -26
  268. apm_cli-0.28.0/src/apm_cli/install/presentation/dry_run.py +0 -92
  269. apm_cli-0.28.0/src/apm_cli/install/resolution_staging.py +0 -126
  270. apm_cli-0.28.0/src/apm_cli/install/template.py +0 -238
  271. apm_cli-0.28.0/src/apm_cli/integration/_shared.py +0 -71
  272. apm_cli-0.28.0/src/apm_cli/integration/hook_ir.py +0 -54
  273. apm_cli-0.28.0/src/apm_cli/marketplace/_git_utils.py +0 -19
  274. apm_cli-0.28.0/src/apm_cli/utils/git_env.py +0 -113
  275. apm_cli-0.28.0/src/apm_cli/utils/git_sparse.py +0 -62
  276. apm_cli-0.28.0/src/apm_cli/utils/path_security.py +0 -130
  277. {apm_cli-0.28.0 → apm_cli-0.29.1}/AUTHORS +0 -0
  278. {apm_cli-0.28.0 → apm_cli-0.29.1}/LICENSE +0 -0
  279. {apm_cli-0.28.0 → apm_cli-0.29.1}/NOTICE +0 -0
  280. {apm_cli-0.28.0 → apm_cli-0.29.1}/setup.cfg +0 -0
  281. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/__init__.py +0 -0
  282. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/__init__.py +0 -0
  283. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/__init__.py +0 -0
  284. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/_mcp_runtime_args.py +0 -0
  285. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/antigravity.py +0 -0
  286. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/claude.py +0 -0
  287. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/hermes.py +0 -0
  288. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/windsurf.py +0 -0
  289. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/package_manager/__init__.py +0 -0
  290. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/package_manager/base.py +0 -0
  291. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/adapters/package_manager/default_manager.py +0 -0
  292. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/bootstrap_mirror.py +0 -0
  293. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/bundle/__init__.py +0 -0
  294. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/bundle/unpacker.py +0 -0
  295. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/cache/__init__.py +0 -0
  296. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/cache/http_cache.py +0 -0
  297. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/cache/integrity.py +0 -0
  298. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/cache/locking.py +0 -0
  299. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/cache/paths.py +0 -0
  300. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/cli.py +0 -0
  301. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/__init__.py +0 -0
  302. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/_apm_yml_writer.py +0 -0
  303. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/cache.py +0 -0
  304. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/compile/__init__.py +0 -0
  305. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/deps/__init__.py +0 -0
  306. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/deps/why.py +0 -0
  307. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/doctor.py +0 -0
  308. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/find.py +0 -0
  309. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/list_cmd.py +0 -0
  310. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/audit.py +0 -0
  311. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/migrate.py +0 -0
  312. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/outdated.py +0 -0
  313. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/plugin/__init__.py +0 -0
  314. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/outdated.py +0 -0
  315. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/plugin/__init__.py +0 -0
  316. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/policy.py +0 -0
  317. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/run.py +0 -0
  318. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/runtime.py +0 -0
  319. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/self_update.py +0 -0
  320. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/targets.py +0 -0
  321. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/uninstall/__init__.py +0 -0
  322. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/uninstall/lockfile_state.py +0 -0
  323. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/commands/view.py +0 -0
  324. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/compilation/__init__.py +0 -0
  325. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/compilation/constitution.py +0 -0
  326. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/compilation/constitution_block.py +0 -0
  327. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/compilation/injector.py +0 -0
  328. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/compilation/link_resolver.py +0 -0
  329. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/compilation/managed_section.py +0 -0
  330. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/constants.py +0 -0
  331. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/__init__.py +0 -0
  332. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/_child_tls/__init__.py +0 -0
  333. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/_child_tls/_apm_tls.pth +0 -0
  334. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/_child_tls/_apm_tls_bootstrap.py +0 -0
  335. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/azure_cli.py +0 -0
  336. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/conflict_detector.py +0 -0
  337. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/deployment_state.py +0 -0
  338. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/docker_args.py +0 -0
  339. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/errors.py +0 -0
  340. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/install_audit.py +0 -0
  341. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/operations.py +0 -0
  342. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/output_mode.py +0 -0
  343. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/project_name.py +0 -0
  344. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/safe_installer.py +0 -0
  345. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/script_runner.py +0 -0
  346. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/script_trust.py +0 -0
  347. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/core/tls_trust.py +0 -0
  348. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/__init__.py +0 -0
  349. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/aggregator.py +0 -0
  350. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/dependency_graph.py +0 -0
  351. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/git_semver_resolver.py +0 -0
  352. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/github_rate_limit.py +0 -0
  353. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/installed_package.py +0 -0
  354. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/outdated_ref_cache.py +0 -0
  355. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/outdated_row.py +0 -0
  356. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/__init__.py +0 -0
  357. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/extractor.py +0 -0
  358. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/semver.py +0 -0
  359. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry_proxy.py +0 -0
  360. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/shared_clone_cache.py +0 -0
  361. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/verifier.py +0 -0
  362. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/deps/why_walker.py +0 -0
  363. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/export/__init__.py +0 -0
  364. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/export/authoring.py +0 -0
  365. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/export/declared_license.py +0 -0
  366. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/export/formats.py +0 -0
  367. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/export/purl.py +0 -0
  368. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/export/sbom.py +0 -0
  369. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/export/spdx.py +0 -0
  370. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/export/spdx_data.py +0 -0
  371. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/factory.py +0 -0
  372. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/__init__.py +0 -0
  373. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/argv.py +0 -0
  374. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/artifactory_resolver.py +0 -0
  375. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/cache_pin.py +0 -0
  376. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/gitlab_resolver.py +0 -0
  377. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/heals/__init__.py +0 -0
  378. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/heals/base.py +0 -0
  379. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/heals/branch_ref_drift.py +0 -0
  380. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/heals/buggy_lockfile_recovery.py +0 -0
  381. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/helpers/__init__.py +0 -0
  382. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/helpers/no_work.py +0 -0
  383. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/helpers/ref_seed.py +0 -0
  384. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/insecure_policy.py +0 -0
  385. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/lsp/__init__.py +0 -0
  386. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/__init__.py +0 -0
  387. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/args.py +0 -0
  388. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/entry.py +0 -0
  389. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/writer.py +0 -0
  390. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/package_resolution.py +0 -0
  391. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/__init__.py +0 -0
  392. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/_redownload.py +0 -0
  393. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/_skip_logic.py +0 -0
  394. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/audit.py +0 -0
  395. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/cleanup.py +0 -0
  396. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/download.py +0 -0
  397. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/heal.py +0 -0
  398. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/policy_gate.py +0 -0
  399. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/policy_target_check.py +0 -0
  400. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/post_deps_local.py +0 -0
  401. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/plan.py +0 -0
  402. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/presentation/__init__.py +0 -0
  403. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/root_redirect.py +0 -0
  404. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/skill_path_migration.py +0 -0
  405. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/install/target_warnings.py +0 -0
  406. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/__init__.py +0 -0
  407. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/_hook_dropped_targets.py +0 -0
  408. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/copilot_app_db.py +0 -0
  409. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/copilot_app_project.py +0 -0
  410. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/copilot_app_workflow_integrator.py +0 -0
  411. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/copilot_app_ws.py +0 -0
  412. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/copilot_cowork_paths.py +0 -0
  413. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/coverage.py +0 -0
  414. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/dispatch.py +0 -0
  415. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/hook_file_routing.py +0 -0
  416. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/opencode_frontmatter.py +0 -0
  417. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/skill_transformer.py +0 -0
  418. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/integration/utils.py +0 -0
  419. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/__init__.py +0 -0
  420. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/_io.py +0 -0
  421. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/_shared.py +0 -0
  422. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/audit.py +0 -0
  423. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/auth_helpers.py +0 -0
  424. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/diagnostics.py +0 -0
  425. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/git_stderr.py +0 -0
  426. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/init_template.py +0 -0
  427. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/migration.py +0 -0
  428. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/output_mappers.py +0 -0
  429. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/output_profiles.py +0 -0
  430. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/resolver.py +0 -0
  431. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/semver.py +0 -0
  432. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/shadow_detector.py +0 -0
  433. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/tag_pattern.py +0 -0
  434. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/version_check.py +0 -0
  435. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/version_pins.py +0 -0
  436. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/version_resolver.py +0 -0
  437. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/yml_editor.py +0 -0
  438. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/__init__.py +0 -0
  439. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/__init__.py +0 -0
  440. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/materialization.py +0 -0
  441. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/object_fields.py +0 -0
  442. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/provider_coordinates.py +0 -0
  443. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/registry_entry.py +0 -0
  444. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/selection.py +0 -0
  445. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/subsets.py +0 -0
  446. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/types.py +0 -0
  447. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/manifest_contract.py +0 -0
  448. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/models/plugin.py +0 -0
  449. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/output/__init__.py +0 -0
  450. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/output/formatters.py +0 -0
  451. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/output/models.py +0 -0
  452. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/output/script_formatters.py +0 -0
  453. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/policy/__init__.py +0 -0
  454. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/policy/_constraint_pinning.py +0 -0
  455. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/policy/_shared.py +0 -0
  456. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/policy/install_preflight.py +0 -0
  457. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/policy/matcher.py +0 -0
  458. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/policy/models.py +0 -0
  459. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/policy/outcome_routing.py +0 -0
  460. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/policy/parser.py +0 -0
  461. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/policy/policy_checks.py +0 -0
  462. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/policy/project_config.py +0 -0
  463. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/policy/schema.py +0 -0
  464. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/primitives/__init__.py +0 -0
  465. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/primitives/models.py +0 -0
  466. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/primitives/parser.py +0 -0
  467. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/registry/__init__.py +0 -0
  468. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/registry/integration.py +0 -0
  469. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/runtime/__init__.py +0 -0
  470. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/runtime/base.py +0 -0
  471. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/runtime/codex_runtime.py +0 -0
  472. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/runtime/factory.py +0 -0
  473. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/runtime/llm_runtime.py +0 -0
  474. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/runtime/manager.py +0 -0
  475. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/runtime/registry.py +0 -0
  476. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/runtime/utils.py +0 -0
  477. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/security/__init__.py +0 -0
  478. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/security/audit_report.py +0 -0
  479. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/security/external/__init__.py +0 -0
  480. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/security/external/base.py +0 -0
  481. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/security/external/gate.py +0 -0
  482. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/security/external/generic_sarif.py +0 -0
  483. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/security/external/options.py +0 -0
  484. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/security/external/registry.py +0 -0
  485. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/security/external/runner.py +0 -0
  486. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/security/external/sarif_ingest.py +0 -0
  487. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/security/external/skillspector.py +0 -0
  488. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/update_policy.py +0 -0
  489. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/__init__.py +0 -0
  490. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/archive.py +0 -0
  491. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/console.py +0 -0
  492. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/exclude.py +0 -0
  493. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/file_ops.py +0 -0
  494. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/guards.py +0 -0
  495. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/helpers.py +0 -0
  496. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/install_tui.py +0 -0
  497. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/normalization.py +0 -0
  498. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/paths.py +0 -0
  499. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/perf_stats.py +0 -0
  500. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/reflink.py +0 -0
  501. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/short_sha.py +0 -0
  502. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/subprocess_env.py +0 -0
  503. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/utils/version_checker.py +0 -0
  504. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/workflow/__init__.py +0 -0
  505. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/workflow/discovery.py +0 -0
  506. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/workflow/parser.py +0 -0
  507. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli/workflow/runner.py +0 -0
  508. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli.egg-info/dependency_links.txt +0 -0
  509. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli.egg-info/entry_points.txt +0 -0
  510. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli.egg-info/requires.txt +0 -0
  511. {apm_cli-0.28.0 → apm_cli-0.29.1}/src/apm_cli.egg-info/top_level.txt +0 -0
  512. {apm_cli-0.28.0 → apm_cli-0.29.1}/tests/test_codex_docker_args_fix.py +0 -0
  513. {apm_cli-0.28.0 → apm_cli-0.29.1}/tests/test_codex_empty_string_and_defaults.py +0 -0
  514. {apm_cli-0.28.0 → apm_cli-0.29.1}/tests/test_collision_integration.py +0 -0
  515. {apm_cli-0.28.0 → apm_cli-0.29.1}/tests/test_console.py +0 -0
  516. {apm_cli-0.28.0 → apm_cli-0.29.1}/tests/test_distributed_compilation.py +0 -0
  517. {apm_cli-0.28.0 → apm_cli-0.29.1}/tests/test_empty_string_and_defaults.py +0 -0
  518. {apm_cli-0.28.0 → apm_cli-0.29.1}/tests/test_enhanced_discovery.py +0 -0
  519. {apm_cli-0.28.0 → apm_cli-0.29.1}/tests/test_github_downloader_token_precedence.py +0 -0
  520. {apm_cli-0.28.0 → apm_cli-0.29.1}/tests/test_runnable_prompts.py +0 -0
  521. {apm_cli-0.28.0 → apm_cli-0.29.1}/tests/test_runtime_manager_token_precedence.py +0 -0
  522. {apm_cli-0.28.0 → apm_cli-0.29.1}/tests/test_virtual_package_multi_install.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: apm-cli
3
- Version: 0.28.0
3
+ Version: 0.29.1
4
4
  Summary: MCP configuration tool
5
5
  Author-email: Daniel Meppiel <user@example.com>
6
6
  License: MIT License
@@ -78,7 +78,7 @@ Think `package.json`, `requirements.txt`, or `Cargo.toml` — but for AI agent c
78
78
 
79
79
  GitHub Copilot | Claude Code | Grok Build | Cursor | OpenCode | Codex | Gemini | Windsurf | Kiro
80
80
 
81
- **[Documentation](https://microsoft.github.io/apm/)** · **[Quick Start](https://microsoft.github.io/apm/getting-started/quick-start/)** · **[CLI Reference](https://microsoft.github.io/apm/reference/cli-commands/)** · **[Roadmap](https://github.com/orgs/microsoft/projects/2304)**
81
+ **[Documentation](https://microsoft.github.io/apm/)** · **[Quick Start](https://microsoft.github.io/apm/getting-started/quick-start/)** · **[CLI Reference](https://microsoft.github.io/apm/reference/cli-commands/)** · **[v0.29 Roadmap](https://github.com/microsoft/apm/milestone/17)**
82
82
 
83
83
  ---
84
84
 
@@ -239,7 +239,8 @@ Use agentrc to author high-quality instructions, then package them with APM to s
239
239
 
240
240
  Created by [@danielmeppiel](https://github.com/danielmeppiel). Maintained by [@danielmeppiel](https://github.com/danielmeppiel) and [@sergio-sisternes-epam](https://github.com/sergio-sisternes-epam).
241
241
 
242
- - [Roadmap & Discussions](https://github.com/microsoft/apm/discussions/116)
242
+ - [v0.29 Roadmap](https://github.com/microsoft/apm/milestone/17)
243
+ - [Discussions](https://github.com/microsoft/apm/discussions)
243
244
  - [Contributing](CONTRIBUTING.md)
244
245
  - [AI Native Development guide](https://danielmeppiel.github.io/awesome-ai-native) — a practical learning path for AI-native development
245
246
 
@@ -6,7 +6,7 @@ Think `package.json`, `requirements.txt`, or `Cargo.toml` — but for AI agent c
6
6
 
7
7
  GitHub Copilot | Claude Code | Grok Build | Cursor | OpenCode | Codex | Gemini | Windsurf | Kiro
8
8
 
9
- **[Documentation](https://microsoft.github.io/apm/)** · **[Quick Start](https://microsoft.github.io/apm/getting-started/quick-start/)** · **[CLI Reference](https://microsoft.github.io/apm/reference/cli-commands/)** · **[Roadmap](https://github.com/orgs/microsoft/projects/2304)**
9
+ **[Documentation](https://microsoft.github.io/apm/)** · **[Quick Start](https://microsoft.github.io/apm/getting-started/quick-start/)** · **[CLI Reference](https://microsoft.github.io/apm/reference/cli-commands/)** · **[v0.29 Roadmap](https://github.com/microsoft/apm/milestone/17)**
10
10
 
11
11
  ---
12
12
 
@@ -167,7 +167,8 @@ Use agentrc to author high-quality instructions, then package them with APM to s
167
167
 
168
168
  Created by [@danielmeppiel](https://github.com/danielmeppiel). Maintained by [@danielmeppiel](https://github.com/danielmeppiel) and [@sergio-sisternes-epam](https://github.com/sergio-sisternes-epam).
169
169
 
170
- - [Roadmap & Discussions](https://github.com/microsoft/apm/discussions/116)
170
+ - [v0.29 Roadmap](https://github.com/microsoft/apm/milestone/17)
171
+ - [Discussions](https://github.com/microsoft/apm/discussions)
171
172
  - [Contributing](CONTRIBUTING.md)
172
173
  - [AI Native Development guide](https://danielmeppiel.github.io/awesome-ai-native) — a practical learning path for AI-native development
173
174
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "apm-cli"
7
- version = "0.28.0"
7
+ version = "0.29.1"
8
8
  description = "MCP configuration tool"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -7,7 +7,7 @@ from dataclasses import dataclass
7
7
  from pathlib import Path
8
8
  from typing import Any, ClassVar
9
9
 
10
- from ...models.dependency.mcp import _RESERVED_EXTRA_KEYS
10
+ from ...models.dependency.mcp import _EXTRA_DENYLIST, TrustedEnvLiteral
11
11
  from ...utils.console import _rich_error, _rich_warning
12
12
 
13
13
  _INPUT_VAR_RE = re.compile(r"\$\{input:([^}]+)\}")
@@ -185,9 +185,6 @@ def _docker_image_repository(reference: str) -> str:
185
185
  # not be injectable via passthrough. Enforced unconditionally per adapter path
186
186
  # (NOT guarded by "key absent from config"), so it also closes paths that do not
187
187
  # pre-set the key. Security boundary for PR #1765 / issue #1670.
188
- _EXTRA_DENYLIST = _RESERVED_EXTRA_KEYS | frozenset({"http_headers"})
189
-
190
-
191
188
  @dataclass(frozen=True)
192
189
  class _MCPLauncherArgumentGroup:
193
190
  """One atomic registry argument and its rendered argv values."""
@@ -1087,7 +1084,9 @@ class MCPClientAdapter(ABC):
1087
1084
  if not isinstance(raw_value, str):
1088
1085
  translated[name] = raw_value
1089
1086
  continue
1090
- if _has_env_placeholder(raw_value):
1087
+ if isinstance(raw_value, TrustedEnvLiteral):
1088
+ translated[name] = raw_value
1089
+ elif _has_env_placeholder(raw_value):
1091
1090
  self._last_legacy_angle_vars.update(_extract_legacy_angle_vars(raw_value))
1092
1091
  translated[name] = self._translate_env_placeholder_for_runtime(raw_value)
1093
1092
  placeholder_keys.extend(
@@ -12,6 +12,7 @@ from ...registry.client import SimpleRegistryClient
12
12
  from ...registry.integration import RegistryIntegration
13
13
  from ...utils.atomic_io import atomic_write_text
14
14
  from ...utils.console import _rich_success, _rich_warning
15
+ from ...utils.net import is_loopback_host
15
16
  from ...utils.path_security import PathTraversalError
16
17
  from ._mcp_runtime_args import process_v01_value_hint_arg
17
18
  from .base import MCPClientAdapter
@@ -41,8 +42,9 @@ class CodexClientAdapter(MCPClientAdapter):
41
42
 
42
43
  Args:
43
44
  registry_url (str, optional): URL of the MCP registry.
44
- If not provided, uses the MCP_REGISTRY_URL environment variable
45
- or falls back to the default GitHub registry.
45
+ If not provided, resolves the MCP_REGISTRY_URL env var,
46
+ then ``apm config set mcp-registry-url``, then the public
47
+ default (see ``registry.client.resolve_mcp_registry_url``).
46
48
  project_root: Project root used to resolve project-local Codex
47
49
  config paths.
48
50
  user_scope: Whether the adapter should resolve user-scope Codex
@@ -216,6 +218,8 @@ class CodexClientAdapter(MCPClientAdapter):
216
218
  raw = server_info.get("_raw_stdio")
217
219
  if raw:
218
220
  config["command"] = raw["command"]
221
+ if raw.get("cwd") is not None:
222
+ config["cwd"] = raw["cwd"]
219
223
  resolved_env_for_args: dict = {}
220
224
  if raw.get("env"):
221
225
  resolved_env_for_args = self._resolve_environment_variables(
@@ -239,7 +243,8 @@ class CodexClientAdapter(MCPClientAdapter):
239
243
  # Precedence on Codex when a server publishes BOTH a remote and a stdio
240
244
  # package: prefer the stdio package (falls through to the packages branch
241
245
  # below). The remote-only branch here handles the streamable-http path
242
- # and rejects SSE / non-https / empty-url remotes with explicit warnings.
246
+ # and rejects SSE / non-https (except loopback http) / empty-url remotes
247
+ # with explicit warnings.
243
248
  remotes = server_info.get("remotes", [])
244
249
  packages = server_info.get("packages", [])
245
250
  if remotes and not packages:
@@ -263,11 +268,22 @@ class CodexClientAdapter(MCPClientAdapter):
263
268
  )
264
269
  return None
265
270
 
266
- scheme = urlparse(remote_url).scheme.lower()
267
- if scheme != "https":
271
+ try:
272
+ parsed_remote = urlparse(remote_url)
273
+ scheme = parsed_remote.scheme.lower()
274
+ insecure_loopback = scheme == "http" and is_loopback_host(parsed_remote.hostname)
275
+ except ValueError:
276
+ scheme = ""
277
+ insecure_loopback = False
278
+ # Codex CLI itself accepts plain-http loopback URLs (its docs use
279
+ # http://localhost examples), and local dev servers rarely carry
280
+ # certs -- so loopback http is allowed. Any other non-https host is
281
+ # still rejected to avoid cleartext bearer tokens in transit.
282
+ if scheme != "https" and not insecure_loopback:
268
283
  _rich_warning(
269
284
  f"Skipping MCP server '{server_name}' for Codex CLI: remote URL "
270
- f"must use https:// (got {scheme or 'no scheme'}).",
285
+ f"must use https:// (got {scheme or 'no scheme'}). "
286
+ "Plain http is allowed for loopback addresses only.",
271
287
  symbol="warning",
272
288
  )
273
289
  return None
@@ -1,8 +1,8 @@
1
1
  """GitHub Copilot CLI implementation of MCP client adapter.
2
2
 
3
- This adapter implements the Copilot CLI-specific handling of MCP server configuration,
4
- targeting the global ~/.copilot/mcp-config.json file as specified in the MCP installation
5
- architecture specification.
3
+ This adapter implements the Copilot-specific handling of MCP server configuration.
4
+ At project scope it targets .github/mcp.json (read by Copilot CLI); at user scope
5
+ it targets the global ~/.copilot/mcp-config.json file.
6
6
  """
7
7
 
8
8
  import json
@@ -13,6 +13,7 @@ from typing import ClassVar
13
13
  import click
14
14
 
15
15
  from ...core.token_manager import GitHubTokenManager
16
+ from ...models.dependency.mcp import TrustedEnvLiteral
16
17
  from ...registry.client import SimpleRegistryClient
17
18
  from ...registry.integration import RegistryIntegration
18
19
  from ...utils.console import _rich_warning
@@ -91,8 +92,9 @@ class CopilotClientAdapter(MCPClientAdapter):
91
92
 
92
93
  Args:
93
94
  registry_url (str, optional): URL of the MCP registry.
94
- If not provided, uses the MCP_REGISTRY_URL environment variable
95
- or falls back to the default GitHub registry.
95
+ If not provided, resolves the MCP_REGISTRY_URL env var,
96
+ then ``apm config set mcp-registry-url``, then the public
97
+ default (see ``registry.client.resolve_mcp_registry_url``).
96
98
  project_root: Project root context passed through to the base
97
99
  adapter for scope-aware operations.
98
100
  user_scope: Whether the adapter should resolve user-scope config
@@ -103,13 +105,23 @@ class CopilotClientAdapter(MCPClientAdapter):
103
105
  self.registry_integration = RegistryIntegration(registry_url)
104
106
 
105
107
  def get_config_path(self):
106
- """Get the path to the Copilot CLI MCP configuration file.
108
+ """Get the path to the Copilot MCP configuration file.
109
+
110
+ At user scope returns the global Copilot CLI config so MCP servers are
111
+ available across all projects. At project scope returns the per-repo
112
+ .github/mcp.json path that Copilot CLI reads since deprecating
113
+ .vscode/mcp.json.
107
114
 
108
115
  Returns:
109
- str: Path to ~/.copilot/mcp-config.json
116
+ str: Path to the MCP configuration file.
110
117
  """
111
- copilot_dir = Path.home() / ".copilot"
112
- return str(copilot_dir / "mcp-config.json")
118
+ if self.user_scope:
119
+ configured_home = os.environ.get("COPILOT_HOME", "").strip()
120
+ copilot_home = (
121
+ Path(configured_home).expanduser() if configured_home else Path.home() / ".copilot"
122
+ )
123
+ return str(copilot_home / "mcp-config.json")
124
+ return str(self.project_root / ".github" / "mcp.json")
113
125
 
114
126
  def update_config(self, config_updates):
115
127
  """Update the Copilot CLI MCP configuration.
@@ -423,6 +435,8 @@ class CopilotClientAdapter(MCPClientAdapter):
423
435
  raw = server_info.get("_raw_stdio")
424
436
  if raw:
425
437
  config["command"] = raw["command"]
438
+ if raw.get("cwd") is not None:
439
+ config["cwd"] = raw["cwd"]
426
440
  resolved_env_for_args = {}
427
441
  if raw.get("env"):
428
442
  resolved_env_for_args = self._resolve_environment_variables(
@@ -723,7 +737,9 @@ class CopilotClientAdapter(MCPClientAdapter):
723
737
  if not isinstance(raw_value, str):
724
738
  translated[name] = _stringify_env_literal(raw_value)
725
739
  continue
726
- if _has_env_placeholder(raw_value):
740
+ if isinstance(raw_value, TrustedEnvLiteral):
741
+ translated[name] = raw_value
742
+ elif _has_env_placeholder(raw_value):
727
743
  self._last_legacy_angle_vars.update(_extract_legacy_angle_vars(raw_value))
728
744
  translated[name] = self._translate_env_placeholder_for_runtime(raw_value)
729
745
  for match in _ENV_VAR_RE.finditer(translated[name]):
@@ -134,6 +134,8 @@ class CursorClientAdapter(CopilotClientAdapter):
134
134
  if raw:
135
135
  config["type"] = "stdio"
136
136
  config["command"] = raw["command"]
137
+ if raw.get("cwd") is not None:
138
+ config["cwd"] = raw["cwd"]
137
139
  resolved_env_for_args: dict = {}
138
140
  if raw.get("env"):
139
141
  resolved_env_for_args = self._resolve_environment_variables(
@@ -31,6 +31,7 @@ import logging
31
31
  import os
32
32
  from pathlib import Path
33
33
 
34
+ from ...utils.atomic_io import atomic_write_text
34
35
  from ...utils.console import _rich_error, _rich_success
35
36
  from .copilot import CopilotClientAdapter
36
37
 
@@ -102,8 +103,11 @@ class GeminiClientAdapter(CopilotClientAdapter):
102
103
  "Creating %s for %s user configuration", config_path.parent, self.target_name
103
104
  )
104
105
  config_path.parent.mkdir(parents=True, exist_ok=True)
105
- with open(config_path, "w", encoding="utf-8") as f:
106
- json.dump(current_config, f, indent=2)
106
+ atomic_write_text(
107
+ config_path,
108
+ json.dumps(current_config, indent=2),
109
+ new_file_mode=0o600,
110
+ )
107
111
  os.chmod(config_path, 0o600)
108
112
 
109
113
  def get_current_config(self):
@@ -148,6 +152,8 @@ class GeminiClientAdapter(CopilotClientAdapter):
148
152
  raw = server_info.get("_raw_stdio")
149
153
  if raw:
150
154
  config["command"] = raw["command"]
155
+ if raw.get("cwd") is not None:
156
+ config["cwd"] = raw["cwd"]
151
157
  resolved_env_for_args: dict = {}
152
158
  if raw.get("env"):
153
159
  resolved_env_for_args = self._resolve_environment_variables(
@@ -91,6 +91,74 @@ def _legacy_intellij_config_dir() -> Path | None:
91
91
  return root.joinpath(*_CONFIG_SUFFIX)
92
92
 
93
93
 
94
+ def _strip_jsonc_comments(raw: str) -> str:
95
+ """Strip JSONC comments while preserving string contents and line layout."""
96
+ chars = list(raw)
97
+ in_string = False
98
+ escaped = False
99
+ i = 0
100
+ while i < len(chars):
101
+ ch = chars[i]
102
+ if in_string:
103
+ if escaped:
104
+ escaped = False
105
+ elif ch == "\\":
106
+ escaped = True
107
+ elif ch == '"':
108
+ in_string = False
109
+ i += 1
110
+ continue
111
+ if ch == '"':
112
+ in_string = True
113
+ i += 1
114
+ continue
115
+ if ch == "/" and i + 1 < len(chars) and chars[i + 1] == "/":
116
+ j = i
117
+ while j < len(chars) and chars[j] not in "\r\n":
118
+ chars[j] = " "
119
+ j += 1
120
+ i = j
121
+ continue
122
+ if ch == "/" and i + 1 < len(chars) and chars[i + 1] == "*":
123
+ end = raw.find("*/", i + 2)
124
+ if end == -1:
125
+ return raw
126
+ for j in range(i, end + 2):
127
+ if chars[j] not in "\r\n":
128
+ chars[j] = " "
129
+ i = end + 2
130
+ continue
131
+ i += 1
132
+ return "".join(chars)
133
+
134
+
135
+ def _strip_jsonc_trailing_commas(raw: str) -> str:
136
+ """Blank trailing commas outside strings so strict JSON parsing accepts JSONC."""
137
+ chars = list(raw)
138
+ in_string = False
139
+ escaped = False
140
+ for index, char in enumerate(chars):
141
+ if in_string:
142
+ if escaped:
143
+ escaped = False
144
+ elif char == "\\":
145
+ escaped = True
146
+ elif char == '"':
147
+ in_string = False
148
+ continue
149
+ if char == '"':
150
+ in_string = True
151
+ continue
152
+ if char != ",":
153
+ continue
154
+ next_index = index + 1
155
+ while next_index < len(chars) and chars[next_index].isspace():
156
+ next_index += 1
157
+ if next_index < len(chars) and chars[next_index] in "}]":
158
+ chars[index] = " "
159
+ return "".join(chars)
160
+
161
+
94
162
  def _config_without_servers(
95
163
  config: dict,
96
164
  names: set[str],
@@ -153,7 +221,7 @@ class IntelliJClientAdapter(CopilotClientAdapter):
153
221
  "Check its permissions and UTF-8 encoding, then rerun apm install."
154
222
  ) from exc
155
223
  try:
156
- config = json.loads(raw)
224
+ config = json.loads(_strip_jsonc_trailing_commas(_strip_jsonc_comments(raw)))
157
225
  except json.JSONDecodeError as exc:
158
226
  raise IntelliJConfigError(
159
227
  f"JetBrains Copilot MCP config at '{path}' is malformed JSON ({exc}). "
@@ -116,6 +116,8 @@ class KiroClientAdapter(CopilotClientAdapter):
116
116
  raw = server_info.get("_raw_stdio")
117
117
  if raw:
118
118
  config: dict[str, Any] = {"command": raw["command"]}
119
+ if raw.get("cwd") is not None:
120
+ config["cwd"] = raw["cwd"]
119
121
  resolved_env_for_args: dict[str, Any] = {}
120
122
  if raw.get("env"):
121
123
  resolved_env_for_args = self._resolve_environment_variables(
@@ -30,6 +30,7 @@ import json
30
30
  import os
31
31
  from pathlib import Path
32
32
 
33
+ from ...models.dependency.mcp import _EXTRA_DENYLIST
33
34
  from .copilot import CopilotClientAdapter
34
35
 
35
36
 
@@ -153,4 +154,9 @@ class OpenCodeClientAdapter(CopilotClientAdapter):
153
154
  if env:
154
155
  entry["environment"] = dict(env)
155
156
 
157
+ translated_keys = _EXTRA_DENYLIST
158
+ for key, value in copilot_entry.items():
159
+ if key not in translated_keys and key not in entry:
160
+ entry[key] = value
161
+
156
162
  return entry
@@ -49,8 +49,9 @@ class VSCodeClientAdapter(MCPClientAdapter):
49
49
 
50
50
  Args:
51
51
  registry_url (str, optional): URL of the MCP registry.
52
- If not provided, uses the MCP_REGISTRY_URL environment variable
53
- or falls back to the default demo registry.
52
+ If not provided, resolves the MCP_REGISTRY_URL env var,
53
+ then ``apm config set mcp-registry-url``, then the public
54
+ default (see ``registry.client.resolve_mcp_registry_url``).
54
55
  project_root: Project root used to resolve the repository-local
55
56
  `.vscode/mcp.json` path.
56
57
  user_scope: Whether to resolve user-scope config paths instead of
@@ -277,6 +278,8 @@ class VSCodeClientAdapter(MCPClientAdapter):
277
278
  "command": raw["command"],
278
279
  "args": raw["args"],
279
280
  }
281
+ if raw.get("cwd") is not None:
282
+ server_config["cwd"] = raw["cwd"]
280
283
  if raw.get("env"):
281
284
  # Translate bare ${VAR} -> ${env:VAR} so VS Code's runtime env
282
285
  # interpolation resolves them at server-start. ${input:...}
@@ -0,0 +1,146 @@
1
+ """Agent Plugins v1 contract helpers."""
2
+
3
+ from .assets import AssetInventoryError, open_verified_asset
4
+ from .constants import (
5
+ AGENT_PLUGINS_SCHEMA_PREFIX,
6
+ AGENT_PLUGINS_SITE_COMMIT,
7
+ AGENT_PLUGINS_SPEC_COMMIT,
8
+ AGENT_PLUGINS_SPEC_SHA256,
9
+ AGENT_PLUGINS_VERSION,
10
+ COM_MICROSOFT_APM_NAMESPACE,
11
+ COM_MICROSOFT_APM_SCHEMA_VERSION,
12
+ MAX_COMPONENT_ASSET_BYTES,
13
+ MAX_COMPONENT_ASSET_ENTRIES,
14
+ MCP_SCHEMA_ID,
15
+ MCP_SCHEMA_SHA256,
16
+ PLUGIN_SCHEMA_ID,
17
+ PLUGIN_SCHEMA_SHA256,
18
+ SUPPORTED_MCP_SCHEMA_IDS,
19
+ SUPPORTED_PLUGIN_SCHEMA_IDS,
20
+ )
21
+ from .errors import (
22
+ AgentPluginDeploymentBoundaryError,
23
+ AgentPluginError,
24
+ AgentPluginLegacyBoundaryError,
25
+ AgentPluginManifestAuthorityError,
26
+ AgentPluginManifestError,
27
+ NotAgentPluginError,
28
+ UnsupportedAgentPluginVersionError,
29
+ )
30
+ from .io import MAX_JSON_BYTES, read_json_document
31
+ from .ir import (
32
+ AgentPlugin,
33
+ AgentPluginAsset,
34
+ AgentPluginComponents,
35
+ AgentPluginDetection,
36
+ AgentPluginDiagnostic,
37
+ AgentPluginExecutable,
38
+ AgentPluginIdentity,
39
+ AgentPluginMcpServer,
40
+ AgentPluginSkill,
41
+ ApmConfiguration,
42
+ ApmExtensionData,
43
+ DiagnosticSeverity,
44
+ FrozenJsonArray,
45
+ FrozenJsonObject,
46
+ FrozenJsonValue,
47
+ JsonValue,
48
+ McpServerType,
49
+ SourceProvenance,
50
+ thaw_frozen_json,
51
+ )
52
+ from .loader import (
53
+ admit_legacy_plugin_manifest,
54
+ detect_agent_plugin,
55
+ load_agent_plugin,
56
+ reject_agent_plugin_legacy_normalization,
57
+ )
58
+ from .validation import (
59
+ ValidationResult,
60
+ args_contain_literal_secret,
61
+ contains_literal_secret_fields,
62
+ is_agent_plugin_schema_id,
63
+ schema_version_from_id,
64
+ supports_mcp_schema_id,
65
+ supports_plugin_schema_id,
66
+ url_contains_literal_secret,
67
+ validate_mcp_config_document,
68
+ validate_mcp_config_file,
69
+ validate_plugin_manifest_document,
70
+ validate_plugin_manifest_file,
71
+ )
72
+
73
+
74
+ def __getattr__(name: str) -> object:
75
+ """Lazily expose compatibility projection without a models import cycle."""
76
+ if name != "project_agent_plugin_package":
77
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
78
+ from .projection import project_agent_plugin_package
79
+
80
+ return project_agent_plugin_package
81
+
82
+
83
+ __all__ = [
84
+ "AGENT_PLUGINS_SCHEMA_PREFIX",
85
+ "AGENT_PLUGINS_SITE_COMMIT",
86
+ "AGENT_PLUGINS_SPEC_COMMIT",
87
+ "AGENT_PLUGINS_SPEC_SHA256",
88
+ "AGENT_PLUGINS_VERSION",
89
+ "COM_MICROSOFT_APM_NAMESPACE",
90
+ "COM_MICROSOFT_APM_SCHEMA_VERSION",
91
+ "MAX_COMPONENT_ASSET_BYTES",
92
+ "MAX_COMPONENT_ASSET_ENTRIES",
93
+ "MAX_JSON_BYTES",
94
+ "MCP_SCHEMA_ID",
95
+ "MCP_SCHEMA_SHA256",
96
+ "PLUGIN_SCHEMA_ID",
97
+ "PLUGIN_SCHEMA_SHA256",
98
+ "SUPPORTED_MCP_SCHEMA_IDS",
99
+ "SUPPORTED_PLUGIN_SCHEMA_IDS",
100
+ "AgentPlugin",
101
+ "AgentPluginAsset",
102
+ "AgentPluginComponents",
103
+ "AgentPluginDeploymentBoundaryError",
104
+ "AgentPluginDetection",
105
+ "AgentPluginDiagnostic",
106
+ "AgentPluginError",
107
+ "AgentPluginExecutable",
108
+ "AgentPluginIdentity",
109
+ "AgentPluginLegacyBoundaryError",
110
+ "AgentPluginManifestAuthorityError",
111
+ "AgentPluginManifestError",
112
+ "AgentPluginMcpServer",
113
+ "AgentPluginSkill",
114
+ "ApmConfiguration",
115
+ "ApmExtensionData",
116
+ "AssetInventoryError",
117
+ "DiagnosticSeverity",
118
+ "FrozenJsonArray",
119
+ "FrozenJsonObject",
120
+ "FrozenJsonValue",
121
+ "JsonValue",
122
+ "McpServerType",
123
+ "NotAgentPluginError",
124
+ "SourceProvenance",
125
+ "UnsupportedAgentPluginVersionError",
126
+ "ValidationResult",
127
+ "admit_legacy_plugin_manifest",
128
+ "args_contain_literal_secret",
129
+ "contains_literal_secret_fields",
130
+ "detect_agent_plugin",
131
+ "is_agent_plugin_schema_id",
132
+ "load_agent_plugin",
133
+ "open_verified_asset",
134
+ "project_agent_plugin_package",
135
+ "read_json_document",
136
+ "reject_agent_plugin_legacy_normalization",
137
+ "schema_version_from_id",
138
+ "supports_mcp_schema_id",
139
+ "supports_plugin_schema_id",
140
+ "thaw_frozen_json",
141
+ "url_contains_literal_secret",
142
+ "validate_mcp_config_document",
143
+ "validate_mcp_config_file",
144
+ "validate_plugin_manifest_document",
145
+ "validate_plugin_manifest_file",
146
+ ]