apm-cli 0.29.0__tar.gz → 0.30.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 (519) hide show
  1. {apm_cli-0.29.0/src/apm_cli.egg-info → apm_cli-0.30.0}/PKG-INFO +19 -7
  2. {apm_cli-0.29.0 → apm_cli-0.30.0}/README.md +18 -6
  3. {apm_cli-0.29.0 → apm_cli-0.30.0}/pyproject.toml +2 -1
  4. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/client/base.py +1 -4
  5. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/client/codex.py +3 -2
  6. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/client/copilot.py +3 -2
  7. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/client/gemini.py +6 -2
  8. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/client/intellij.py +69 -1
  9. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/client/opencode.py +6 -0
  10. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/client/vscode.py +3 -2
  11. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/agent_plugins/loader.py +6 -6
  12. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/bundle/agent_plugin_exporter.py +7 -4
  13. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/bundle/local_bundle.py +18 -41
  14. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/bundle/packer.py +2 -4
  15. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/bundle/plugin_exporter.py +2 -4
  16. apm_cli-0.30.0/src/apm_cli/bundle/plugin_layout.py +60 -0
  17. apm_cli-0.30.0/src/apm_cli/cache/cleanup.py +51 -0
  18. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/cache/git_cache.py +209 -76
  19. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/cache/http_cache.py +12 -7
  20. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/cache/url_normalize.py +7 -3
  21. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/_helpers.py +3 -2
  22. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/approve.py +75 -10
  23. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/audit.py +16 -6
  24. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/cache.py +41 -26
  25. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/compile/cli.py +250 -42
  26. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/compile/watcher.py +112 -57
  27. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/config.py +31 -4
  28. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/deps/cli.py +4 -0
  29. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/experimental.py +4 -0
  30. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/init.py +2 -0
  31. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/install.py +273 -265
  32. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/lifecycle.py +2 -0
  33. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/lock.py +13 -14
  34. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/marketplace/__init__.py +43 -245
  35. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/marketplace/check.py +2 -1
  36. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/marketplace/doctor.py +38 -10
  37. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/marketplace/init.py +2 -0
  38. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/marketplace/plugin/add.py +2 -0
  39. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/marketplace/plugin/remove.py +2 -0
  40. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/marketplace/plugin/set.py +2 -0
  41. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/mcp.py +36 -29
  42. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/pack.py +116 -19
  43. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/plugin/init.py +2 -0
  44. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/prune.py +29 -1
  45. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/publish.py +1 -1
  46. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/self_update.py +18 -4
  47. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/uninstall/cli.py +272 -78
  48. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/uninstall/engine.py +255 -92
  49. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/update.py +73 -10
  50. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/compilation/agents_compiler.py +339 -118
  51. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/compilation/build_id.py +1 -3
  52. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/compilation/claude_formatter.py +2 -4
  53. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/compilation/constants.py +21 -0
  54. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/compilation/context_optimizer.py +3 -5
  55. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/compilation/distributed_compiler.py +39 -37
  56. apm_cli-0.30.0/src/apm_cli/compilation/footer.py +20 -0
  57. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/compilation/gemini_formatter.py +2 -2
  58. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/compilation/inventory.py +26 -2
  59. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/compilation/output_writer.py +27 -5
  60. apm_cli-0.30.0/src/apm_cli/compilation/root_context_protection.py +121 -0
  61. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/compilation/template_builder.py +6 -8
  62. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/compilation/user_root_context.py +4 -5
  63. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/config.py +119 -25
  64. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/apm_yml.py +70 -6
  65. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/auth.py +246 -110
  66. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/build_orchestrator.py +122 -27
  67. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/command_logger.py +101 -6
  68. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/deployment_ledger.py +86 -21
  69. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/experimental.py +4 -14
  70. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/host_providers.py +60 -0
  71. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/lifecycle_scripts.py +15 -8
  72. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/null_logger.py +5 -2
  73. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/scope.py +8 -0
  74. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/target_catalog.py +1 -1
  75. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/target_detection.py +29 -4
  76. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/token_manager.py +9 -4
  77. apm_cli-0.30.0/src/apm_cli/deps/_shared.py +244 -0
  78. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/apm_resolver.py +271 -54
  79. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/artifactory_entry.py +31 -5
  80. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/artifactory_orchestrator.py +22 -10
  81. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/bare_cache.py +122 -46
  82. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/clone_engine.py +180 -78
  83. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/download_strategies.py +87 -36
  84. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/git_auth_env.py +14 -11
  85. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/git_file_transport.py +51 -17
  86. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/git_reference_resolver.py +109 -47
  87. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/git_remote_ops.py +71 -4
  88. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/github_downloader.py +234 -130
  89. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/github_downloader_validation.py +234 -96
  90. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/github_rate_limit.py +15 -0
  91. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/host_backends.py +4 -3
  92. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/lockfile.py +142 -25
  93. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/path_anchoring.py +78 -17
  94. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/plugin_parser.py +228 -74
  95. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/reachability.py +16 -2
  96. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/registry/auth.py +31 -5
  97. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/registry/client.py +56 -2
  98. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/registry/config_loader.py +8 -4
  99. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/registry/feature_gate.py +8 -4
  100. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/registry/outdated.py +1 -1
  101. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/registry/resolver.py +10 -13
  102. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/revision_pins.py +55 -10
  103. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/tiered_ref_resolver.py +1 -1
  104. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/transport_selection.py +192 -66
  105. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/drift.py +3 -11
  106. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/audit_replay.py +11 -1
  107. apm_cli-0.30.0/src/apm_cli/install/audit_target_roots.py +79 -0
  108. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/context.py +1 -0
  109. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/deployed_paths.py +14 -0
  110. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/drift.py +53 -31
  111. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/drift_render.py +15 -0
  112. apm_cli-0.30.0/src/apm_cli/install/dry_run_plan.py +133 -0
  113. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/errors.py +14 -0
  114. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/exec_gate.py +9 -24
  115. apm_cli-0.30.0/src/apm_cli/install/finalization.py +19 -0
  116. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/helpers/ref_reuse.py +188 -38
  117. apm_cli-0.30.0/src/apm_cli/install/legacy_plugin_compat.py +264 -0
  118. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/local_bundle_handler.py +99 -35
  119. apm_cli-0.30.0/src/apm_cli/install/local_bundle_paths.py +206 -0
  120. apm_cli-0.30.0/src/apm_cli/install/locking.py +143 -0
  121. apm_cli-0.30.0/src/apm_cli/install/lsp/integration.py +486 -0
  122. apm_cli-0.30.0/src/apm_cli/install/manifest_helpers.py +98 -0
  123. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/manifest_reconcile.py +122 -26
  124. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/mcp/command.py +109 -18
  125. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/mcp/conflicts.py +2 -9
  126. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/mcp/integration.py +23 -15
  127. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/mcp/ownership.py +23 -1
  128. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/mcp/registry.py +85 -62
  129. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/outcome.py +59 -10
  130. apm_cli-0.30.0/src/apm_cli/install/package_selection.py +45 -0
  131. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/phases/integrate.py +3 -6
  132. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/phases/local_content.py +2 -0
  133. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/phases/lockfile.py +12 -1
  134. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/phases/resolve.py +107 -112
  135. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/phases/targets.py +33 -28
  136. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/pipeline.py +12 -21
  137. apm_cli-0.30.0/src/apm_cli/install/presentation/dry_run.py +107 -0
  138. apm_cli-0.30.0/src/apm_cli/install/primitive_classification.py +245 -0
  139. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/registry_wiring.py +7 -3
  140. apm_cli-0.30.0/src/apm_cli/install/resolution_staging.py +356 -0
  141. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/service.py +1 -0
  142. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/service_integration.py +12 -4
  143. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/services.py +60 -71
  144. apm_cli-0.30.0/src/apm_cli/install/source_helpers.py +56 -0
  145. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/sources.py +83 -133
  146. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/summary.py +39 -0
  147. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/target_filter.py +19 -0
  148. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/target_hints.py +3 -1
  149. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/template.py +13 -28
  150. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/transaction.py +82 -24
  151. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/validation.py +192 -190
  152. apm_cli-0.30.0/src/apm_cli/integration/_shared.py +92 -0
  153. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/agent_integrator.py +55 -11
  154. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/base_integrator.py +118 -11
  155. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/cleanup.py +14 -1
  156. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/hook_integrator.py +34 -32
  157. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/instruction_integrator.py +285 -123
  158. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/lsp_integrator.py +360 -43
  159. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/mcp_config_view.py +39 -34
  160. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/mcp_integrator.py +217 -33
  161. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/mcp_integrator_install.py +225 -42
  162. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/skill_integrator.py +12 -3
  163. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/skill_support.py +6 -1
  164. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/targets.py +63 -13
  165. apm_cli-0.30.0/src/apm_cli/marketplace/_git_utils.py +12 -0
  166. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/builder.py +347 -97
  167. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/client.py +77 -38
  168. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/drift_check.py +44 -12
  169. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/errors.py +6 -4
  170. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/models.py +32 -41
  171. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/ref_resolver.py +111 -43
  172. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/registry.py +1 -1
  173. apm_cli-0.30.0/src/apm_cli/marketplace/source_identity.py +264 -0
  174. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/apm_package.py +45 -13
  175. apm_cli-0.30.0/src/apm_cli/models/dependency/host_virtual.py +364 -0
  176. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/dependency/lsp.py +2 -0
  177. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/dependency/mcp.py +26 -16
  178. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/dependency/reference.py +179 -159
  179. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/format_detection.py +49 -23
  180. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/results.py +2 -0
  181. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/validation.py +48 -17
  182. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/policy/_gitlab.py +8 -5
  183. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/policy/ci_checks.py +181 -32
  184. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/policy/discovery.py +16 -37
  185. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/policy/inheritance.py +2 -4
  186. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/policy/policy_checks.py +28 -6
  187. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/policy/project_config.py +12 -4
  188. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/primitives/discovery.py +27 -103
  189. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/registry/client.py +173 -25
  190. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/registry/operations.py +75 -17
  191. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/security/content_scanner.py +31 -0
  192. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/security/executables.py +241 -55
  193. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/security/file_scanner.py +40 -3
  194. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/security/gate.py +9 -4
  195. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/atomic_io.py +36 -5
  196. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/diagnostics.py +2 -0
  197. apm_cli-0.30.0/src/apm_cli/utils/git_env.py +1524 -0
  198. apm_cli-0.30.0/src/apm_cli/utils/git_sparse.py +309 -0
  199. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/github_host.py +22 -87
  200. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/patterns.py +5 -11
  201. apm_cli-0.30.0/src/apm_cli/utils/staging_guard.py +63 -0
  202. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/version_checker.py +131 -18
  203. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/yaml_io.py +78 -35
  204. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/version.py +3 -1
  205. {apm_cli-0.29.0 → apm_cli-0.30.0/src/apm_cli.egg-info}/PKG-INFO +19 -7
  206. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli.egg-info/SOURCES.txt +14 -0
  207. {apm_cli-0.29.0 → apm_cli-0.30.0}/tests/test_apm_package_models.py +39 -3
  208. {apm_cli-0.29.0 → apm_cli-0.30.0}/tests/test_apm_resolver.py +107 -0
  209. {apm_cli-0.29.0 → apm_cli-0.30.0}/tests/test_github_downloader.py +153 -121
  210. {apm_cli-0.29.0 → apm_cli-0.30.0}/tests/test_gitlab_git_transport.py +85 -3
  211. {apm_cli-0.29.0 → apm_cli-0.30.0}/tests/test_lockfile.py +208 -1
  212. {apm_cli-0.29.0 → apm_cli-0.30.0}/tests/test_token_manager.py +14 -2
  213. apm_cli-0.29.0/src/apm_cli/bundle/plugin_layout.py +0 -24
  214. apm_cli-0.29.0/src/apm_cli/deps/_shared.py +0 -64
  215. apm_cli-0.29.0/src/apm_cli/install/local_bundle_paths.py +0 -93
  216. apm_cli-0.29.0/src/apm_cli/install/lsp/integration.py +0 -253
  217. apm_cli-0.29.0/src/apm_cli/install/package_selection.py +0 -26
  218. apm_cli-0.29.0/src/apm_cli/install/presentation/dry_run.py +0 -92
  219. apm_cli-0.29.0/src/apm_cli/install/resolution_staging.py +0 -135
  220. apm_cli-0.29.0/src/apm_cli/integration/_shared.py +0 -71
  221. apm_cli-0.29.0/src/apm_cli/marketplace/_git_utils.py +0 -19
  222. apm_cli-0.29.0/src/apm_cli/utils/git_env.py +0 -113
  223. apm_cli-0.29.0/src/apm_cli/utils/git_sparse.py +0 -62
  224. {apm_cli-0.29.0 → apm_cli-0.30.0}/AUTHORS +0 -0
  225. {apm_cli-0.29.0 → apm_cli-0.30.0}/LICENSE +0 -0
  226. {apm_cli-0.29.0 → apm_cli-0.30.0}/NOTICE +0 -0
  227. {apm_cli-0.29.0 → apm_cli-0.30.0}/setup.cfg +0 -0
  228. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/__init__.py +0 -0
  229. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/__init__.py +0 -0
  230. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/client/__init__.py +0 -0
  231. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/client/_mcp_runtime_args.py +0 -0
  232. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/client/antigravity.py +0 -0
  233. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/client/claude.py +0 -0
  234. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/client/cursor.py +0 -0
  235. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/client/hermes.py +0 -0
  236. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/client/kiro.py +0 -0
  237. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/client/windsurf.py +0 -0
  238. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/package_manager/__init__.py +0 -0
  239. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/package_manager/base.py +0 -0
  240. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/adapters/package_manager/default_manager.py +0 -0
  241. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/agent_plugins/__init__.py +0 -0
  242. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/agent_plugins/assets.py +0 -0
  243. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/agent_plugins/constants.py +0 -0
  244. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/agent_plugins/errors.py +0 -0
  245. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/agent_plugins/io.py +0 -0
  246. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/agent_plugins/ir.py +0 -0
  247. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/agent_plugins/projection.py +0 -0
  248. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/agent_plugins/validation.py +0 -0
  249. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/bootstrap_mirror.py +0 -0
  250. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/bundle/__init__.py +0 -0
  251. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/bundle/attest.py +0 -0
  252. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/bundle/claude_plugin_exporter.py +0 -0
  253. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/bundle/export_common.py +0 -0
  254. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/bundle/formats.py +0 -0
  255. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/bundle/lockfile_enrichment.py +0 -0
  256. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/bundle/reproducible_archive.py +0 -0
  257. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/bundle/unpacker.py +0 -0
  258. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/cache/__init__.py +0 -0
  259. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/cache/integrity.py +0 -0
  260. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/cache/locking.py +0 -0
  261. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/cache/paths.py +0 -0
  262. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/cli.py +0 -0
  263. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/__init__.py +0 -0
  264. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/_apm_yml_writer.py +0 -0
  265. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/compile/__init__.py +0 -0
  266. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/deps/__init__.py +0 -0
  267. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/deps/_utils.py +0 -0
  268. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/deps/why.py +0 -0
  269. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/doctor.py +0 -0
  270. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/find.py +0 -0
  271. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/list_cmd.py +0 -0
  272. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/marketplace/audit.py +0 -0
  273. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/marketplace/migrate.py +0 -0
  274. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/marketplace/outdated.py +0 -0
  275. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/marketplace/plugin/__init__.py +0 -0
  276. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/marketplace/validate.py +0 -0
  277. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/outdated.py +0 -0
  278. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/plugin/__init__.py +0 -0
  279. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/policy.py +0 -0
  280. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/run.py +0 -0
  281. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/runtime.py +0 -0
  282. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/targets.py +0 -0
  283. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/uninstall/__init__.py +0 -0
  284. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/uninstall/lockfile_state.py +0 -0
  285. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/commands/view.py +0 -0
  286. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/compilation/__init__.py +0 -0
  287. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/compilation/constitution.py +0 -0
  288. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/compilation/constitution_block.py +0 -0
  289. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/compilation/injector.py +0 -0
  290. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/compilation/link_resolver.py +0 -0
  291. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/compilation/managed_section.py +0 -0
  292. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/constants.py +0 -0
  293. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/copilot_plugins/__init__.py +0 -0
  294. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/copilot_plugins/capability.py +0 -0
  295. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/copilot_plugins/catalog.py +0 -0
  296. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/copilot_plugins/constants.py +0 -0
  297. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/copilot_plugins/registrar.py +0 -0
  298. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/copilot_plugins/settings.py +0 -0
  299. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/__init__.py +0 -0
  300. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/_child_tls/__init__.py +0 -0
  301. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/_child_tls/_apm_tls.pth +0 -0
  302. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/_child_tls/_apm_tls_bootstrap.py +0 -0
  303. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/azure_cli.py +0 -0
  304. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/conflict_detector.py +0 -0
  305. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/deployment_state.py +0 -0
  306. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/docker_args.py +0 -0
  307. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/errors.py +0 -0
  308. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/install_audit.py +0 -0
  309. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/operations.py +0 -0
  310. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/output_mode.py +0 -0
  311. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/plugin_manifest.py +0 -0
  312. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/project_name.py +0 -0
  313. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/safe_installer.py +0 -0
  314. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/script_executors.py +0 -0
  315. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/script_runner.py +0 -0
  316. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/script_trust.py +0 -0
  317. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/core/tls_trust.py +0 -0
  318. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/__init__.py +0 -0
  319. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/aggregator.py +0 -0
  320. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/dependency_graph.py +0 -0
  321. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/git_semver_resolver.py +0 -0
  322. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/installed_package.py +0 -0
  323. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/outdated_ref_cache.py +0 -0
  324. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/outdated_row.py +0 -0
  325. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/package_validator.py +0 -0
  326. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/registry/__init__.py +0 -0
  327. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/registry/extractor.py +0 -0
  328. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/registry/semver.py +0 -0
  329. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/registry_proxy.py +0 -0
  330. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/shared_clone_cache.py +0 -0
  331. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/verifier.py +0 -0
  332. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/deps/why_walker.py +0 -0
  333. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/export/__init__.py +0 -0
  334. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/export/authoring.py +0 -0
  335. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/export/declared_license.py +0 -0
  336. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/export/formats.py +0 -0
  337. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/export/purl.py +0 -0
  338. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/export/sbom.py +0 -0
  339. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/export/spdx.py +0 -0
  340. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/export/spdx_data.py +0 -0
  341. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/factory.py +0 -0
  342. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/hook_contract.py +0 -0
  343. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/__init__.py +0 -0
  344. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/argv.py +0 -0
  345. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/artifactory_resolver.py +0 -0
  346. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/cache_pin.py +0 -0
  347. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/deployable_source_plan.py +0 -0
  348. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/gitlab_resolver.py +0 -0
  349. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/heals/__init__.py +0 -0
  350. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/heals/base.py +0 -0
  351. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/heals/branch_ref_drift.py +0 -0
  352. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/heals/buggy_lockfile_recovery.py +0 -0
  353. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/helpers/__init__.py +0 -0
  354. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/helpers/no_work.py +0 -0
  355. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/helpers/ref_seed.py +0 -0
  356. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/helpers/security_scan.py +0 -0
  357. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/insecure_policy.py +0 -0
  358. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/integrity.py +0 -0
  359. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/lsp/__init__.py +0 -0
  360. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/mcp/__init__.py +0 -0
  361. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/mcp/args.py +0 -0
  362. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/mcp/entry.py +0 -0
  363. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/mcp/warnings.py +0 -0
  364. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/mcp/writer.py +0 -0
  365. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/native_plugin_admission.py +0 -0
  366. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/package_resolution.py +0 -0
  367. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/phases/__init__.py +0 -0
  368. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/phases/_redownload.py +0 -0
  369. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/phases/_skip_logic.py +0 -0
  370. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/phases/audit.py +0 -0
  371. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/phases/cleanup.py +0 -0
  372. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/phases/copilot_plugins.py +0 -0
  373. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/phases/download.py +0 -0
  374. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/phases/finalize.py +0 -0
  375. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/phases/heal.py +0 -0
  376. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/phases/policy_gate.py +0 -0
  377. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/phases/policy_target_check.py +0 -0
  378. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/phases/post_deps_local.py +0 -0
  379. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/plan.py +0 -0
  380. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/presentation/__init__.py +0 -0
  381. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/request.py +0 -0
  382. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/root_redirect.py +0 -0
  383. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/skill_path_migration.py +0 -0
  384. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/install/target_warnings.py +0 -0
  385. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/__init__.py +0 -0
  386. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/_hook_dropped_targets.py +0 -0
  387. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/canvas_integrator.py +0 -0
  388. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/command_integrator.py +0 -0
  389. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/copilot_app_db.py +0 -0
  390. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/copilot_app_project.py +0 -0
  391. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/copilot_app_workflow_integrator.py +0 -0
  392. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/copilot_app_ws.py +0 -0
  393. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/copilot_cowork_paths.py +0 -0
  394. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/coverage.py +0 -0
  395. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/dispatch.py +0 -0
  396. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/hook_bundle.py +0 -0
  397. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/hook_command_paths.py +0 -0
  398. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/hook_command_warnings.py +0 -0
  399. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/hook_file_routing.py +0 -0
  400. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/hook_ir.py +0 -0
  401. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/hook_native_formats.py +0 -0
  402. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/hook_ownership.py +0 -0
  403. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/hook_reintegration.py +0 -0
  404. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/hook_source_selection.py +0 -0
  405. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/kiro_hook_integrator.py +0 -0
  406. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/opencode_frontmatter.py +0 -0
  407. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/prompt_integrator.py +0 -0
  408. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/skill_package_routing.py +0 -0
  409. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/skill_transformer.py +0 -0
  410. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/integration/utils.py +0 -0
  411. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/__init__.py +0 -0
  412. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/_io.py +0 -0
  413. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/_shared.py +0 -0
  414. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/audit.py +0 -0
  415. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/auth_helpers.py +0 -0
  416. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/diagnostics.py +0 -0
  417. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/git_stderr.py +0 -0
  418. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/init_template.py +0 -0
  419. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/migration.py +0 -0
  420. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/output_mappers.py +0 -0
  421. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/output_profiles.py +0 -0
  422. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/resolver.py +0 -0
  423. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/semver.py +0 -0
  424. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/shadow_detector.py +0 -0
  425. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/tag_pattern.py +0 -0
  426. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/validator.py +0 -0
  427. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/version_check.py +0 -0
  428. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/version_pins.py +0 -0
  429. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/version_resolver.py +0 -0
  430. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/yml_editor.py +0 -0
  431. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/marketplace/yml_schema.py +0 -0
  432. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/__init__.py +0 -0
  433. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/dependency/__init__.py +0 -0
  434. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/dependency/identity.py +0 -0
  435. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/dependency/materialization.py +0 -0
  436. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/dependency/object_fields.py +0 -0
  437. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/dependency/provider_coordinates.py +0 -0
  438. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/dependency/registry_entry.py +0 -0
  439. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/dependency/selection.py +0 -0
  440. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/dependency/subsets.py +0 -0
  441. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/dependency/types.py +0 -0
  442. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/manifest_contract.py +0 -0
  443. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/models/plugin.py +0 -0
  444. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/output/__init__.py +0 -0
  445. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/output/formatters.py +0 -0
  446. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/output/models.py +0 -0
  447. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/output/script_formatters.py +0 -0
  448. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/policy/__init__.py +0 -0
  449. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/policy/_constraint_pinning.py +0 -0
  450. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/policy/_help_text.py +0 -0
  451. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/policy/_shared.py +0 -0
  452. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/policy/install_preflight.py +0 -0
  453. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/policy/matcher.py +0 -0
  454. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/policy/models.py +0 -0
  455. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/policy/outcome_routing.py +0 -0
  456. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/policy/parser.py +0 -0
  457. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/policy/schema.py +0 -0
  458. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/primitives/__init__.py +0 -0
  459. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/primitives/models.py +0 -0
  460. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/primitives/parser.py +0 -0
  461. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/registry/__init__.py +0 -0
  462. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/registry/integration.py +0 -0
  463. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/runtime/__init__.py +0 -0
  464. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/runtime/base.py +0 -0
  465. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/runtime/codex_runtime.py +0 -0
  466. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/runtime/copilot_runtime.py +0 -0
  467. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/runtime/factory.py +0 -0
  468. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/runtime/llm_runtime.py +0 -0
  469. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/runtime/manager.py +0 -0
  470. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/runtime/registry.py +0 -0
  471. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/runtime/utils.py +0 -0
  472. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/security/__init__.py +0 -0
  473. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/security/audit_report.py +0 -0
  474. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/security/external/__init__.py +0 -0
  475. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/security/external/base.py +0 -0
  476. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/security/external/gate.py +0 -0
  477. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/security/external/generic_sarif.py +0 -0
  478. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/security/external/options.py +0 -0
  479. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/security/external/registry.py +0 -0
  480. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/security/external/runner.py +0 -0
  481. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/security/external/sarif_ingest.py +0 -0
  482. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/security/external/skillspector.py +0 -0
  483. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/update_policy.py +0 -0
  484. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/__init__.py +0 -0
  485. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/archive.py +0 -0
  486. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/console.py +0 -0
  487. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/content_hash.py +0 -0
  488. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/exclude.py +0 -0
  489. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/file_ops.py +0 -0
  490. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/guards.py +0 -0
  491. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/helpers.py +0 -0
  492. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/install_tui.py +0 -0
  493. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/net.py +0 -0
  494. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/normalization.py +0 -0
  495. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/path_security.py +0 -0
  496. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/paths.py +0 -0
  497. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/perf_stats.py +0 -0
  498. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/reflink.py +0 -0
  499. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/short_sha.py +0 -0
  500. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/utils/subprocess_env.py +0 -0
  501. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/workflow/__init__.py +0 -0
  502. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/workflow/discovery.py +0 -0
  503. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/workflow/parser.py +0 -0
  504. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli/workflow/runner.py +0 -0
  505. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli.egg-info/dependency_links.txt +0 -0
  506. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli.egg-info/entry_points.txt +0 -0
  507. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli.egg-info/requires.txt +0 -0
  508. {apm_cli-0.29.0 → apm_cli-0.30.0}/src/apm_cli.egg-info/top_level.txt +0 -0
  509. {apm_cli-0.29.0 → apm_cli-0.30.0}/tests/test_codex_docker_args_fix.py +0 -0
  510. {apm_cli-0.29.0 → apm_cli-0.30.0}/tests/test_codex_empty_string_and_defaults.py +0 -0
  511. {apm_cli-0.29.0 → apm_cli-0.30.0}/tests/test_collision_integration.py +0 -0
  512. {apm_cli-0.29.0 → apm_cli-0.30.0}/tests/test_console.py +0 -0
  513. {apm_cli-0.29.0 → apm_cli-0.30.0}/tests/test_distributed_compilation.py +0 -0
  514. {apm_cli-0.29.0 → apm_cli-0.30.0}/tests/test_empty_string_and_defaults.py +0 -0
  515. {apm_cli-0.29.0 → apm_cli-0.30.0}/tests/test_enhanced_discovery.py +0 -0
  516. {apm_cli-0.29.0 → apm_cli-0.30.0}/tests/test_github_downloader_token_precedence.py +0 -0
  517. {apm_cli-0.29.0 → apm_cli-0.30.0}/tests/test_runnable_prompts.py +0 -0
  518. {apm_cli-0.29.0 → apm_cli-0.30.0}/tests/test_runtime_manager_token_precedence.py +0 -0
  519. {apm_cli-0.29.0 → apm_cli-0.30.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.29.0
3
+ Version: 0.30.0
4
4
  Summary: MCP configuration tool
5
5
  Author-email: Daniel Meppiel <user@example.com>
6
6
  License: MIT License
@@ -170,7 +170,16 @@ apm-policy.yml governs what gets installed; your agent harness governs what runs
170
170
 
171
171
  ## Get Started
172
172
 
173
- #### Linux / macOS
173
+ #### macOS with Homebrew
174
+
175
+ ```bash
176
+ brew install apm
177
+ ```
178
+
179
+ No custom tap is required. Homebrew manages installation and updates:
180
+ use `brew upgrade apm`, not `apm self-update`.
181
+
182
+ #### Linux / macOS without Homebrew
174
183
 
175
184
  ```bash
176
185
  curl -sSL https://aka.ms/apm-unix | sh
@@ -182,17 +191,17 @@ curl -sSL https://aka.ms/apm-unix | sh
182
191
  irm https://aka.ms/apm-windows | iex
183
192
  ```
184
193
 
185
- Native release binaries are published for macOS, Linux, and Windows x86_64. `apm self-update` reuses the matching platform installer.
194
+ Native release binaries are published for macOS, Linux, and Windows x86_64.
195
+ For standalone installations, `apm self-update` reuses the matching platform installer.
196
+ You do not need Homebrew to use APM.
186
197
 
187
198
  <details>
188
- <summary>Other install methods</summary>
199
+ <summary>Other install methods: pip and Scoop</summary>
189
200
 
190
201
  #### Linux / macOS
191
202
 
192
203
  ```bash
193
- # Homebrew
194
- brew install microsoft/apm/apm
195
- # pip
204
+ # pip (Python 3.10+)
196
205
  pip install apm-cli
197
206
  ```
198
207
 
@@ -208,6 +217,9 @@ pip install apm-cli
208
217
 
209
218
  </details>
210
219
 
220
+ Already using the Microsoft Homebrew tap? See the
221
+ [migration guide](https://microsoft.github.io/apm/getting-started/installation/#migrate-from-the-microsoft-tap).
222
+
211
223
  Then start adding packages:
212
224
 
213
225
  ```bash
@@ -98,7 +98,16 @@ apm-policy.yml governs what gets installed; your agent harness governs what runs
98
98
 
99
99
  ## Get Started
100
100
 
101
- #### Linux / macOS
101
+ #### macOS with Homebrew
102
+
103
+ ```bash
104
+ brew install apm
105
+ ```
106
+
107
+ No custom tap is required. Homebrew manages installation and updates:
108
+ use `brew upgrade apm`, not `apm self-update`.
109
+
110
+ #### Linux / macOS without Homebrew
102
111
 
103
112
  ```bash
104
113
  curl -sSL https://aka.ms/apm-unix | sh
@@ -110,17 +119,17 @@ curl -sSL https://aka.ms/apm-unix | sh
110
119
  irm https://aka.ms/apm-windows | iex
111
120
  ```
112
121
 
113
- Native release binaries are published for macOS, Linux, and Windows x86_64. `apm self-update` reuses the matching platform installer.
122
+ Native release binaries are published for macOS, Linux, and Windows x86_64.
123
+ For standalone installations, `apm self-update` reuses the matching platform installer.
124
+ You do not need Homebrew to use APM.
114
125
 
115
126
  <details>
116
- <summary>Other install methods</summary>
127
+ <summary>Other install methods: pip and Scoop</summary>
117
128
 
118
129
  #### Linux / macOS
119
130
 
120
131
  ```bash
121
- # Homebrew
122
- brew install microsoft/apm/apm
123
- # pip
132
+ # pip (Python 3.10+)
124
133
  pip install apm-cli
125
134
  ```
126
135
 
@@ -136,6 +145,9 @@ pip install apm-cli
136
145
 
137
146
  </details>
138
147
 
148
+ Already using the Microsoft Homebrew tap? See the
149
+ [migration guide](https://microsoft.github.io/apm/getting-started/installation/#migrate-from-the-microsoft-tap).
150
+
139
151
  Then start adding packages:
140
152
 
141
153
  ```bash
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "apm-cli"
7
- version = "0.29.0"
7
+ version = "0.30.0"
8
8
  description = "MCP configuration tool"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -219,4 +219,5 @@ markers = [
219
219
  "req: binds a test to one or more OpenAPM req-XXX ids (spec-conformance suite)",
220
220
  "lifecycle_smoke: promoted to the required PR-time Lifecycle Smoke (Linux) job -- see ci.yml's lifecycle-smoke job and docs/src/content/docs/contributing/integration-testing.md",
221
221
  "lifecycle_merge_group: unique lifecycle contracts retained in the full merge-group integration suite",
222
+ "xdist_group(name): assigns HOME-mutating tests to one pytest-xdist loadgroup for process-level serialization",
222
223
  ]
@@ -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, TrustedEnvLiteral
10
+ from ...models.dependency.mcp import _EXTRA_DENYLIST, TrustedEnvLiteral
11
11
  from ...utils.console import _rich_error, _rich_warning
12
12
 
13
13
  _INPUT_VAR_RE = re.compile(r"\$\{input:([^}]+)\}")
@@ -185,9 +185,6 @@ def _docker_image_repository(reference: str) -> str:
185
185
  # not be injectable via passthrough. Enforced unconditionally per adapter path
186
186
  # (NOT guarded by "key absent from config"), so it also closes paths that do not
187
187
  # pre-set the key. Security boundary for PR #1765 / issue #1670.
188
- _EXTRA_DENYLIST = _RESERVED_EXTRA_KEYS | frozenset({"http_headers"})
189
-
190
-
191
188
  @dataclass(frozen=True)
192
189
  class _MCPLauncherArgumentGroup:
193
190
  """One atomic registry argument and its rendered argv values."""
@@ -42,8 +42,9 @@ class CodexClientAdapter(MCPClientAdapter):
42
42
 
43
43
  Args:
44
44
  registry_url (str, optional): URL of the MCP registry.
45
- If not provided, uses the MCP_REGISTRY_URL environment variable
46
- 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``).
47
48
  project_root: Project root used to resolve project-local Codex
48
49
  config paths.
49
50
  user_scope: Whether the adapter should resolve user-scope Codex
@@ -92,8 +92,9 @@ class CopilotClientAdapter(MCPClientAdapter):
92
92
 
93
93
  Args:
94
94
  registry_url (str, optional): URL of the MCP registry.
95
- If not provided, uses the MCP_REGISTRY_URL environment variable
96
- 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``).
97
98
  project_root: Project root context passed through to the base
98
99
  adapter for scope-aware operations.
99
100
  user_scope: Whether the adapter should resolve user-scope config
@@ -31,6 +31,7 @@ import logging
31
31
  import os
32
32
  from pathlib import Path
33
33
 
34
+ from ...utils.atomic_io import atomic_write_text
34
35
  from ...utils.console import _rich_error, _rich_success
35
36
  from .copilot import CopilotClientAdapter
36
37
 
@@ -102,8 +103,11 @@ class GeminiClientAdapter(CopilotClientAdapter):
102
103
  "Creating %s for %s user configuration", config_path.parent, self.target_name
103
104
  )
104
105
  config_path.parent.mkdir(parents=True, exist_ok=True)
105
- 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):
@@ -91,6 +91,74 @@ def _legacy_intellij_config_dir() -> Path | None:
91
91
  return root.joinpath(*_CONFIG_SUFFIX)
92
92
 
93
93
 
94
+ def _strip_jsonc_comments(raw: str) -> str:
95
+ """Strip JSONC comments while preserving string contents and line layout."""
96
+ chars = list(raw)
97
+ in_string = False
98
+ escaped = False
99
+ i = 0
100
+ while i < len(chars):
101
+ ch = chars[i]
102
+ if in_string:
103
+ if escaped:
104
+ escaped = False
105
+ elif ch == "\\":
106
+ escaped = True
107
+ elif ch == '"':
108
+ in_string = False
109
+ i += 1
110
+ continue
111
+ if ch == '"':
112
+ in_string = True
113
+ i += 1
114
+ continue
115
+ if ch == "/" and i + 1 < len(chars) and chars[i + 1] == "/":
116
+ j = i
117
+ while j < len(chars) and chars[j] not in "\r\n":
118
+ chars[j] = " "
119
+ j += 1
120
+ i = j
121
+ continue
122
+ if ch == "/" and i + 1 < len(chars) and chars[i + 1] == "*":
123
+ end = raw.find("*/", i + 2)
124
+ if end == -1:
125
+ return raw
126
+ for j in range(i, end + 2):
127
+ if chars[j] not in "\r\n":
128
+ chars[j] = " "
129
+ i = end + 2
130
+ continue
131
+ i += 1
132
+ return "".join(chars)
133
+
134
+
135
+ def _strip_jsonc_trailing_commas(raw: str) -> str:
136
+ """Blank trailing commas outside strings so strict JSON parsing accepts JSONC."""
137
+ chars = list(raw)
138
+ in_string = False
139
+ escaped = False
140
+ for index, char in enumerate(chars):
141
+ if in_string:
142
+ if escaped:
143
+ escaped = False
144
+ elif char == "\\":
145
+ escaped = True
146
+ elif char == '"':
147
+ in_string = False
148
+ continue
149
+ if char == '"':
150
+ in_string = True
151
+ continue
152
+ if char != ",":
153
+ continue
154
+ next_index = index + 1
155
+ while next_index < len(chars) and chars[next_index].isspace():
156
+ next_index += 1
157
+ if next_index < len(chars) and chars[next_index] in "}]":
158
+ chars[index] = " "
159
+ return "".join(chars)
160
+
161
+
94
162
  def _config_without_servers(
95
163
  config: dict,
96
164
  names: set[str],
@@ -153,7 +221,7 @@ class IntelliJClientAdapter(CopilotClientAdapter):
153
221
  "Check its permissions and UTF-8 encoding, then rerun apm install."
154
222
  ) from exc
155
223
  try:
156
- config = json.loads(raw)
224
+ config = json.loads(_strip_jsonc_trailing_commas(_strip_jsonc_comments(raw)))
157
225
  except json.JSONDecodeError as exc:
158
226
  raise IntelliJConfigError(
159
227
  f"JetBrains Copilot MCP config at '{path}' is malformed JSON ({exc}). "
@@ -30,6 +30,7 @@ import json
30
30
  import os
31
31
  from pathlib import Path
32
32
 
33
+ from ...models.dependency.mcp import _EXTRA_DENYLIST
33
34
  from .copilot import CopilotClientAdapter
34
35
 
35
36
 
@@ -153,4 +154,9 @@ class OpenCodeClientAdapter(CopilotClientAdapter):
153
154
  if env:
154
155
  entry["environment"] = dict(env)
155
156
 
157
+ translated_keys = _EXTRA_DENYLIST
158
+ for key, value in copilot_entry.items():
159
+ if key not in translated_keys and key not in entry:
160
+ entry[key] = value
161
+
156
162
  return entry
@@ -49,8 +49,9 @@ class VSCodeClientAdapter(MCPClientAdapter):
49
49
 
50
50
  Args:
51
51
  registry_url (str, optional): URL of the MCP registry.
52
- If not provided, 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
@@ -110,7 +110,7 @@ class _CandidateResolution:
110
110
 
111
111
  def detect_agent_plugin(package_root: Path) -> AgentPluginDetection | None:
112
112
  """Classify and interpret a native Agent Plugin from its exact root manifest."""
113
- from ..bundle.local_bundle import PluginSchemaRoute, classify_plugin_manifest_schema
113
+ from ..install.primitive_classification import PluginSchemaRoute, classify_plugin_manifest
114
114
 
115
115
  manifest_path = package_root / "plugin.json"
116
116
  try:
@@ -124,8 +124,8 @@ def detect_agent_plugin(package_root: Path) -> AgentPluginDetection | None:
124
124
  return None
125
125
  document = dict(evidence.document)
126
126
  try:
127
- route = classify_plugin_manifest_schema(document)
128
- if route is PluginSchemaRoute.LEGACY:
127
+ classification = classify_plugin_manifest(document)
128
+ if classification.route is PluginSchemaRoute.LEGACY:
129
129
  return None
130
130
  schema_id = document["$schema"]
131
131
  loader = _VERSION_LOADERS[schema_id]
@@ -175,7 +175,7 @@ def reject_agent_plugin_legacy_normalization(package_root: Path) -> None:
175
175
 
176
176
  def admit_legacy_plugin_manifest(package_root: Path) -> dict[str, Any] | None:
177
177
  """Return one admissible schema-less legacy manifest or reject fallback."""
178
- from ..bundle.local_bundle import PluginSchemaRoute, classify_plugin_manifest_schema
178
+ from ..install.primitive_classification import PluginSchemaRoute, classify_plugin_manifest
179
179
 
180
180
  try:
181
181
  evidence = _read_admissible_root_manifest(package_root)
@@ -186,12 +186,12 @@ def admit_legacy_plugin_manifest(package_root: Path) -> dict[str, Any] | None:
186
186
  if evidence is None:
187
187
  return None
188
188
  try:
189
- route = classify_plugin_manifest_schema(evidence.document)
189
+ classification = classify_plugin_manifest(evidence.document)
190
190
  except AgentPluginError as exc:
191
191
  raise AgentPluginLegacyBoundaryError(
192
192
  f"Schema-bearing plugin.json cannot enter Claude plugin normalization: {exc}"
193
193
  ) from exc
194
- if route is PluginSchemaRoute.AGENT_PLUGIN:
194
+ if classification.route is PluginSchemaRoute.AGENT_PLUGIN:
195
195
  raise AgentPluginLegacyBoundaryError(
196
196
  "Agent Plugin input must be interpreted by load_agent_plugin(), "
197
197
  "not Claude plugin normalization"
@@ -20,7 +20,11 @@ from ..agent_plugins import (
20
20
  load_agent_plugin,
21
21
  url_contains_literal_secret,
22
22
  )
23
- from ..deps.lockfile import LockFile, get_lockfile_path, migrate_lockfile_if_needed
23
+ from ..deps.lockfile import (
24
+ LockFile,
25
+ resolve_lockfile_path_for_read,
26
+ resolve_reproducible_timestamp,
27
+ )
24
28
  from ..deps.plugin_parser import synthesize_plugin_json_from_apm_yml
25
29
  from ..models.apm_package import APMPackage
26
30
  from ..utils.archive import (
@@ -300,8 +304,7 @@ def export_agent_plugin_bundle(
300
304
  logger=None,
301
305
  ) -> PackResult:
302
306
  """Export the project as an Agent Plugin bundle."""
303
- migrate_lockfile_if_needed(project_root)
304
- lockfile_path = get_lockfile_path(project_root)
307
+ lockfile_path = resolve_lockfile_path_for_read(project_root, read_only=dry_run)
305
308
  lockfile = LockFile.read(lockfile_path)
306
309
  if lockfile is None:
307
310
  raise FileNotFoundError(
@@ -494,7 +497,7 @@ def export_agent_plugin_bundle(
494
497
  BundleFormat.AGENT_PLUGIN.lock_value,
495
498
  target or "all",
496
499
  bundle_files=bundle_files,
497
- packed_at=lockfile.generated_at,
500
+ packed_at=resolve_reproducible_timestamp(None, lockfile.generated_at),
498
501
  )
499
502
  write_text_lf(staged_bundle / "apm.lock.yaml", enriched_yaml)
500
503
 
@@ -29,22 +29,18 @@ import shutil
29
29
  import tempfile
30
30
  import zipfile
31
31
  from dataclasses import dataclass, field
32
- from enum import Enum
33
32
  from pathlib import Path
34
33
  from typing import TYPE_CHECKING, Any
35
34
 
36
35
  import yaml
37
36
 
38
- from ..agent_plugins.constants import (
39
- AGENT_PLUGINS_SCHEMA_PREFIX,
40
- COM_MICROSOFT_APM_NAMESPACE,
41
- PLUGIN_SCHEMA_ID,
42
- )
43
- from ..agent_plugins.errors import (
44
- AgentPluginManifestError,
45
- UnsupportedAgentPluginVersionError,
46
- )
37
+ from ..agent_plugins.constants import COM_MICROSOFT_APM_NAMESPACE
38
+ from ..agent_plugins.errors import AgentPluginManifestError
47
39
  from ..agent_plugins.io import read_json_document
40
+ from ..install.primitive_classification import (
41
+ PluginSchemaRoute,
42
+ classify_plugin_manifest_schema,
43
+ )
48
44
  from ..utils.archive import (
49
45
  MAX_ZIP_ENTRIES,
50
46
  MAX_ZIP_UNCOMPRESSED,
@@ -61,48 +57,29 @@ from ..utils.yaml_io import load_yaml_str
61
57
  from .formats import BundleFormat
62
58
 
63
59
  if TYPE_CHECKING:
64
- from collections.abc import Mapping
65
-
66
60
  from ..agent_plugins.ir import AgentPlugin, AgentPluginDetection
67
61
 
68
62
  _MAX_ZIP_ENTRIES = MAX_ZIP_ENTRIES
69
63
  _MAX_ZIP_UNCOMPRESSED = MAX_ZIP_UNCOMPRESSED
70
64
 
71
65
 
72
- class PluginSchemaRoute(Enum):
73
- """Admission route selected exclusively by root plugin.json."""
74
-
75
- LEGACY = "legacy"
76
- AGENT_PLUGIN = "agent_plugin"
77
-
78
-
79
- def classify_plugin_manifest_schema(document: Mapping[str, Any]) -> PluginSchemaRoute:
80
- """Select native admission only for the exact supported schema identifier."""
81
- if "$schema" not in document:
82
- return PluginSchemaRoute.LEGACY
83
- schema_id = document["$schema"]
84
- if not isinstance(schema_id, str):
85
- raise AgentPluginManifestError("Invalid root plugin.json: $schema must be a string")
86
- if schema_id == PLUGIN_SCHEMA_ID:
87
- return PluginSchemaRoute.AGENT_PLUGIN
88
- if schema_id.startswith(AGENT_PLUGINS_SCHEMA_PREFIX):
89
- raise UnsupportedAgentPluginVersionError(
90
- f"Unsupported Agent Plugins manifest schema: {schema_id}. "
91
- f"This APM version supports only {PLUGIN_SCHEMA_ID}."
92
- )
93
- raise AgentPluginManifestError(
94
- f"Unsupported schema-bearing plugin manifest: {schema_id}. "
95
- f"APM accepts schema-bearing plugin.json only with {PLUGIN_SCHEMA_ID}; "
96
- "remove $schema only for a schema-less legacy plugin."
97
- )
98
-
99
-
100
66
  def route_agent_plugin_package(package_root: Path) -> AgentPluginDetection | None:
101
67
  """Route one materialized package through canonical Agent Plugin admission."""
102
68
  from ..agent_plugins.loader import detect_agent_plugin
69
+ from ..models.validation import PackageType, detect_package_type
103
70
 
104
71
  detection = detect_agent_plugin(package_root)
105
- if detection is not None and detection.error is not None:
72
+ if detection is None:
73
+ return None
74
+ package_type, _ = detect_package_type(
75
+ package_root,
76
+ agent_plugin_detection=detection,
77
+ )
78
+ if package_type != PackageType.AGENT_PLUGIN:
79
+ if package_type == PackageType.INVALID and detection.error is not None:
80
+ raise detection.error
81
+ return None
82
+ if detection.error is not None:
106
83
  raise detection.error
107
84
  return detection
108
85
 
@@ -5,7 +5,7 @@ from dataclasses import dataclass, field
5
5
  from pathlib import Path
6
6
 
7
7
  from ..core.target_detection import detect_target
8
- from ..deps.lockfile import LockFile, get_lockfile_path, migrate_lockfile_if_needed
8
+ from ..deps.lockfile import LockFile, resolve_lockfile_path_for_read
9
9
  from ..models.apm_package import APMPackage
10
10
  from ..utils.archive import (
11
11
  projected_archive_path,
@@ -67,8 +67,6 @@ def pack_bundle(
67
67
  FileNotFoundError: If ``apm.lock.yaml`` is missing.
68
68
  ValueError: If deployed files referenced in the lockfile are missing on disk.
69
69
  """
70
- # 1. Read lockfile (migrate legacy apm.lock → apm.lock.yaml if needed)
71
- migrate_lockfile_if_needed(project_root)
72
70
  bundle_format = coerce_bundle_format(fmt)
73
71
 
74
72
  if bundle_format is BundleFormat.AGENT_PLUGIN:
@@ -98,7 +96,7 @@ def pack_bundle(
98
96
  logger=logger,
99
97
  )
100
98
 
101
- lockfile_path = get_lockfile_path(project_root)
99
+ lockfile_path = resolve_lockfile_path_for_read(project_root, read_only=dry_run)
102
100
  lockfile = LockFile.read(lockfile_path)
103
101
  if lockfile is None:
104
102
  raise FileNotFoundError(
@@ -18,8 +18,7 @@ import yaml
18
18
  from ..deps.lockfile import (
19
19
  LockedDependency,
20
20
  LockFile,
21
- get_lockfile_path,
22
- migrate_lockfile_if_needed,
21
+ resolve_lockfile_path_for_read,
23
22
  )
24
23
  from ..models.apm_package import APMPackage, DependencyReference
25
24
  from ..models.dependency.subsets import skill_subset_filter_tokens
@@ -826,8 +825,7 @@ def export_plugin_bundle(
826
825
  :class:`PackResult` describing what was produced.
827
826
  """
828
827
  # 1. Read lockfile
829
- migrate_lockfile_if_needed(project_root)
830
- lockfile_path = get_lockfile_path(project_root)
828
+ lockfile_path = resolve_lockfile_path_for_read(project_root, read_only=dry_run)
831
829
  lockfile = LockFile.read(lockfile_path)
832
830
 
833
831
  # 2. Read apm.yml
@@ -0,0 +1,60 @@
1
+ """Plugin-native source-layout conventions."""
2
+
3
+ from collections.abc import Callable
4
+ from dataclasses import dataclass
5
+ from pathlib import Path
6
+
7
+
8
+ def _identity(name: str) -> str:
9
+ """Return *name* unchanged."""
10
+ return name
11
+
12
+
13
+ @dataclass(frozen=True)
14
+ class PluginDirSpec:
15
+ """How one plugin-native root lowers into APM primitive space."""
16
+
17
+ plugin_dir: str
18
+ primitive_kinds: tuple[str, ...]
19
+ apm_basename_fn: Callable[[str], str]
20
+
21
+
22
+ PLUGIN_ROOT_DIRS = (
23
+ "agents",
24
+ "skills",
25
+ "commands",
26
+ "instructions",
27
+ "extensions",
28
+ "hooks",
29
+ )
30
+
31
+
32
+ def find_plugin_root_sources(project_root: Path) -> list[str]:
33
+ """Return plugin-native root sources that exist."""
34
+ sources = [
35
+ name
36
+ for name in PLUGIN_ROOT_DIRS
37
+ if (project_root / name).is_dir() and not (project_root / name).is_symlink()
38
+ ]
39
+ if (project_root / "hooks.json").is_file():
40
+ sources.append("hooks.json")
41
+ return sources
42
+
43
+
44
+ def plugin_command_prompt_name(name: str) -> str:
45
+ """Return the APM prompt filename represented by a plugin command."""
46
+ if name.endswith(".prompt.md"):
47
+ return name
48
+ if name.endswith(".md"):
49
+ return f"{name[: -len('.md')]}.prompt.md"
50
+ return name
51
+
52
+
53
+ PLUGIN_LAYOUT: dict[str, PluginDirSpec] = {
54
+ "agents": PluginDirSpec("agents", ("agents",), _identity),
55
+ "skills": PluginDirSpec("skills", ("skills",), _identity),
56
+ "commands": PluginDirSpec("commands", ("commands", "prompts"), plugin_command_prompt_name),
57
+ "instructions": PluginDirSpec("instructions", ("instructions",), _identity),
58
+ "extensions": PluginDirSpec("extensions", ("canvas",), _identity),
59
+ "hooks": PluginDirSpec("hooks", ("hooks",), _identity),
60
+ }
@@ -0,0 +1,51 @@
1
+ """Verified, best-effort removal outcomes for explicit cache cleaning."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import os
6
+ from collections.abc import Iterable
7
+ from pathlib import Path
8
+
9
+ from ..utils import file_ops
10
+
11
+
12
+ def clean_cache_buckets(buckets: Iterable[Path]) -> list[str]:
13
+ """Remove bucket children without following links; return all failure details.
14
+
15
+ Successful removals are not rolled back. The residual check is essential:
16
+ the read-only recovery callback in robust_rmtree can swallow OS errors.
17
+ """
18
+ failures: list[str] = []
19
+ for bucket in buckets:
20
+ try:
21
+ if bucket.is_symlink():
22
+ failures.append(f"{bucket}: refusing to traverse a symlinked cache bucket")
23
+ continue
24
+ with os.scandir(bucket) as entries:
25
+ for entry in entries:
26
+ path = Path(entry.path)
27
+ try:
28
+ if entry.is_dir(follow_symlinks=False):
29
+ file_ops.robust_rmtree(path)
30
+ else:
31
+ path.unlink()
32
+ except FileNotFoundError:
33
+ pass
34
+ except OSError as exc:
35
+ failures.append(f"{path}: {exc}")
36
+ continue
37
+ try:
38
+ # lstat distinguishes a removed entry from an unreadable
39
+ # one and also detects dangling symlinks.
40
+ path.lstat()
41
+ except FileNotFoundError:
42
+ continue
43
+ except OSError as exc:
44
+ failures.append(f"{path}: {exc}")
45
+ else:
46
+ failures.append(f"{path}: entry remains after deletion")
47
+ except FileNotFoundError:
48
+ continue
49
+ except OSError as exc:
50
+ failures.append(f"{bucket}: {exc}")
51
+ return failures