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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (518) hide show
  1. {apm_cli-0.29.0/src/apm_cli.egg-info → apm_cli-0.29.1}/PKG-INFO +1 -1
  2. {apm_cli-0.29.0 → apm_cli-0.29.1}/pyproject.toml +1 -1
  3. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/base.py +1 -4
  4. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/codex.py +3 -2
  5. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/copilot.py +3 -2
  6. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/gemini.py +6 -2
  7. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/intellij.py +69 -1
  8. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/opencode.py +6 -0
  9. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/vscode.py +3 -2
  10. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/agent_plugins/loader.py +6 -6
  11. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/bundle/agent_plugin_exporter.py +7 -4
  12. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/bundle/local_bundle.py +18 -41
  13. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/bundle/packer.py +2 -4
  14. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/bundle/plugin_exporter.py +2 -4
  15. apm_cli-0.29.1/src/apm_cli/bundle/plugin_layout.py +60 -0
  16. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/cache/git_cache.py +168 -59
  17. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/cache/url_normalize.py +7 -3
  18. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/_helpers.py +3 -2
  19. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/approve.py +75 -10
  20. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/audit.py +16 -6
  21. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/compile/cli.py +250 -42
  22. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/compile/watcher.py +112 -57
  23. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/config.py +9 -1
  24. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/deps/cli.py +4 -0
  25. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/experimental.py +4 -0
  26. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/init.py +2 -0
  27. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/install.py +273 -265
  28. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/lifecycle.py +2 -0
  29. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/lock.py +13 -14
  30. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/__init__.py +43 -245
  31. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/check.py +2 -1
  32. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/doctor.py +38 -10
  33. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/init.py +2 -0
  34. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/plugin/add.py +2 -0
  35. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/plugin/remove.py +2 -0
  36. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/plugin/set.py +2 -0
  37. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/mcp.py +36 -29
  38. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/pack.py +116 -19
  39. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/plugin/init.py +2 -0
  40. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/prune.py +16 -1
  41. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/publish.py +1 -1
  42. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/uninstall/cli.py +221 -61
  43. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/uninstall/engine.py +168 -18
  44. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/update.py +73 -10
  45. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/compilation/agents_compiler.py +339 -118
  46. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/compilation/build_id.py +1 -3
  47. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/compilation/claude_formatter.py +2 -4
  48. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/compilation/constants.py +21 -0
  49. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/compilation/distributed_compiler.py +39 -37
  50. apm_cli-0.29.1/src/apm_cli/compilation/footer.py +20 -0
  51. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/compilation/gemini_formatter.py +2 -2
  52. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/compilation/inventory.py +26 -2
  53. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/compilation/output_writer.py +27 -5
  54. apm_cli-0.29.1/src/apm_cli/compilation/root_context_protection.py +121 -0
  55. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/compilation/template_builder.py +6 -8
  56. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/compilation/user_root_context.py +4 -5
  57. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/config.py +119 -25
  58. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/apm_yml.py +70 -6
  59. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/auth.py +246 -110
  60. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/build_orchestrator.py +122 -27
  61. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/command_logger.py +101 -6
  62. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/deployment_ledger.py +86 -21
  63. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/experimental.py +4 -14
  64. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/host_providers.py +60 -0
  65. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/lifecycle_scripts.py +15 -8
  66. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/null_logger.py +5 -2
  67. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/scope.py +8 -0
  68. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/target_catalog.py +1 -1
  69. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/target_detection.py +29 -4
  70. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/token_manager.py +9 -4
  71. apm_cli-0.29.1/src/apm_cli/deps/_shared.py +244 -0
  72. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/apm_resolver.py +271 -54
  73. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/artifactory_entry.py +31 -5
  74. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/artifactory_orchestrator.py +22 -10
  75. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/bare_cache.py +122 -46
  76. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/clone_engine.py +180 -78
  77. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/download_strategies.py +87 -36
  78. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/git_auth_env.py +14 -11
  79. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/git_file_transport.py +51 -17
  80. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/git_reference_resolver.py +109 -47
  81. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/git_remote_ops.py +71 -4
  82. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/github_downloader.py +234 -130
  83. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/github_downloader_validation.py +234 -96
  84. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/host_backends.py +4 -3
  85. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/lockfile.py +142 -25
  86. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/path_anchoring.py +78 -17
  87. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/plugin_parser.py +228 -74
  88. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/reachability.py +16 -2
  89. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/auth.py +31 -5
  90. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/client.py +56 -2
  91. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/config_loader.py +8 -4
  92. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/feature_gate.py +8 -4
  93. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/outdated.py +1 -1
  94. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/resolver.py +10 -13
  95. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/revision_pins.py +55 -10
  96. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/tiered_ref_resolver.py +1 -1
  97. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/transport_selection.py +192 -66
  98. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/drift.py +3 -11
  99. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/audit_replay.py +11 -1
  100. apm_cli-0.29.1/src/apm_cli/install/audit_target_roots.py +79 -0
  101. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/context.py +1 -0
  102. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/deployed_paths.py +14 -0
  103. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/drift.py +53 -31
  104. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/drift_render.py +15 -0
  105. apm_cli-0.29.1/src/apm_cli/install/dry_run_plan.py +133 -0
  106. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/errors.py +14 -0
  107. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/exec_gate.py +9 -24
  108. apm_cli-0.29.1/src/apm_cli/install/finalization.py +19 -0
  109. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/helpers/ref_reuse.py +188 -38
  110. apm_cli-0.29.1/src/apm_cli/install/legacy_plugin_compat.py +264 -0
  111. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/local_bundle_handler.py +99 -35
  112. apm_cli-0.29.1/src/apm_cli/install/local_bundle_paths.py +206 -0
  113. apm_cli-0.29.1/src/apm_cli/install/locking.py +143 -0
  114. apm_cli-0.29.1/src/apm_cli/install/lsp/integration.py +486 -0
  115. apm_cli-0.29.1/src/apm_cli/install/manifest_helpers.py +98 -0
  116. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/manifest_reconcile.py +122 -26
  117. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/command.py +109 -18
  118. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/conflicts.py +2 -9
  119. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/integration.py +23 -15
  120. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/ownership.py +23 -1
  121. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/registry.py +85 -62
  122. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/outcome.py +59 -10
  123. apm_cli-0.29.1/src/apm_cli/install/package_selection.py +45 -0
  124. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/integrate.py +3 -6
  125. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/local_content.py +2 -0
  126. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/lockfile.py +12 -1
  127. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/resolve.py +107 -112
  128. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/targets.py +33 -28
  129. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/pipeline.py +12 -21
  130. apm_cli-0.29.1/src/apm_cli/install/presentation/dry_run.py +107 -0
  131. apm_cli-0.29.1/src/apm_cli/install/primitive_classification.py +245 -0
  132. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/registry_wiring.py +7 -3
  133. apm_cli-0.29.1/src/apm_cli/install/resolution_staging.py +356 -0
  134. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/service.py +1 -0
  135. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/service_integration.py +12 -4
  136. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/services.py +60 -71
  137. apm_cli-0.29.1/src/apm_cli/install/source_helpers.py +56 -0
  138. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/sources.py +83 -133
  139. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/summary.py +39 -0
  140. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/target_filter.py +19 -0
  141. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/target_hints.py +3 -1
  142. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/template.py +13 -28
  143. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/transaction.py +82 -24
  144. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/validation.py +192 -190
  145. apm_cli-0.29.1/src/apm_cli/integration/_shared.py +92 -0
  146. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/agent_integrator.py +55 -11
  147. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/base_integrator.py +118 -11
  148. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/cleanup.py +14 -1
  149. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/hook_integrator.py +34 -32
  150. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/instruction_integrator.py +285 -123
  151. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/lsp_integrator.py +360 -43
  152. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/mcp_config_view.py +39 -34
  153. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/mcp_integrator.py +217 -33
  154. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/mcp_integrator_install.py +225 -42
  155. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/skill_integrator.py +12 -3
  156. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/skill_support.py +6 -1
  157. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/targets.py +63 -13
  158. apm_cli-0.29.1/src/apm_cli/marketplace/_git_utils.py +12 -0
  159. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/builder.py +347 -97
  160. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/client.py +77 -38
  161. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/drift_check.py +44 -12
  162. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/errors.py +6 -4
  163. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/models.py +32 -41
  164. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/ref_resolver.py +111 -43
  165. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/registry.py +1 -1
  166. apm_cli-0.29.1/src/apm_cli/marketplace/source_identity.py +264 -0
  167. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/apm_package.py +45 -13
  168. apm_cli-0.29.1/src/apm_cli/models/dependency/host_virtual.py +364 -0
  169. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/lsp.py +2 -0
  170. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/mcp.py +26 -16
  171. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/reference.py +179 -159
  172. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/format_detection.py +49 -23
  173. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/results.py +2 -0
  174. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/validation.py +48 -17
  175. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/policy/_gitlab.py +8 -5
  176. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/policy/ci_checks.py +181 -32
  177. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/policy/discovery.py +15 -34
  178. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/policy/inheritance.py +2 -4
  179. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/primitives/discovery.py +27 -103
  180. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/registry/client.py +173 -25
  181. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/registry/operations.py +75 -17
  182. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/security/content_scanner.py +31 -0
  183. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/security/executables.py +241 -55
  184. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/security/file_scanner.py +40 -3
  185. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/security/gate.py +9 -4
  186. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/atomic_io.py +36 -5
  187. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/diagnostics.py +2 -0
  188. apm_cli-0.29.1/src/apm_cli/utils/git_env.py +1524 -0
  189. apm_cli-0.29.1/src/apm_cli/utils/git_sparse.py +309 -0
  190. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/github_host.py +22 -87
  191. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/patterns.py +5 -11
  192. apm_cli-0.29.1/src/apm_cli/utils/staging_guard.py +63 -0
  193. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/yaml_io.py +78 -35
  194. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/version.py +3 -1
  195. {apm_cli-0.29.0 → apm_cli-0.29.1/src/apm_cli.egg-info}/PKG-INFO +1 -1
  196. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli.egg-info/SOURCES.txt +13 -0
  197. {apm_cli-0.29.0 → apm_cli-0.29.1}/tests/test_apm_package_models.py +39 -3
  198. {apm_cli-0.29.0 → apm_cli-0.29.1}/tests/test_apm_resolver.py +107 -0
  199. {apm_cli-0.29.0 → apm_cli-0.29.1}/tests/test_github_downloader.py +153 -121
  200. {apm_cli-0.29.0 → apm_cli-0.29.1}/tests/test_gitlab_git_transport.py +85 -3
  201. {apm_cli-0.29.0 → apm_cli-0.29.1}/tests/test_lockfile.py +208 -1
  202. {apm_cli-0.29.0 → apm_cli-0.29.1}/tests/test_token_manager.py +14 -2
  203. apm_cli-0.29.0/src/apm_cli/bundle/plugin_layout.py +0 -24
  204. apm_cli-0.29.0/src/apm_cli/deps/_shared.py +0 -64
  205. apm_cli-0.29.0/src/apm_cli/install/local_bundle_paths.py +0 -93
  206. apm_cli-0.29.0/src/apm_cli/install/lsp/integration.py +0 -253
  207. apm_cli-0.29.0/src/apm_cli/install/package_selection.py +0 -26
  208. apm_cli-0.29.0/src/apm_cli/install/presentation/dry_run.py +0 -92
  209. apm_cli-0.29.0/src/apm_cli/install/resolution_staging.py +0 -135
  210. apm_cli-0.29.0/src/apm_cli/integration/_shared.py +0 -71
  211. apm_cli-0.29.0/src/apm_cli/marketplace/_git_utils.py +0 -19
  212. apm_cli-0.29.0/src/apm_cli/utils/git_env.py +0 -113
  213. apm_cli-0.29.0/src/apm_cli/utils/git_sparse.py +0 -62
  214. {apm_cli-0.29.0 → apm_cli-0.29.1}/AUTHORS +0 -0
  215. {apm_cli-0.29.0 → apm_cli-0.29.1}/LICENSE +0 -0
  216. {apm_cli-0.29.0 → apm_cli-0.29.1}/NOTICE +0 -0
  217. {apm_cli-0.29.0 → apm_cli-0.29.1}/README.md +0 -0
  218. {apm_cli-0.29.0 → apm_cli-0.29.1}/setup.cfg +0 -0
  219. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/__init__.py +0 -0
  220. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/__init__.py +0 -0
  221. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/__init__.py +0 -0
  222. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/_mcp_runtime_args.py +0 -0
  223. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/antigravity.py +0 -0
  224. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/claude.py +0 -0
  225. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/cursor.py +0 -0
  226. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/hermes.py +0 -0
  227. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/kiro.py +0 -0
  228. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/client/windsurf.py +0 -0
  229. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/package_manager/__init__.py +0 -0
  230. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/package_manager/base.py +0 -0
  231. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/adapters/package_manager/default_manager.py +0 -0
  232. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/agent_plugins/__init__.py +0 -0
  233. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/agent_plugins/assets.py +0 -0
  234. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/agent_plugins/constants.py +0 -0
  235. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/agent_plugins/errors.py +0 -0
  236. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/agent_plugins/io.py +0 -0
  237. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/agent_plugins/ir.py +0 -0
  238. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/agent_plugins/projection.py +0 -0
  239. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/agent_plugins/validation.py +0 -0
  240. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/bootstrap_mirror.py +0 -0
  241. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/bundle/__init__.py +0 -0
  242. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/bundle/attest.py +0 -0
  243. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/bundle/claude_plugin_exporter.py +0 -0
  244. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/bundle/export_common.py +0 -0
  245. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/bundle/formats.py +0 -0
  246. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/bundle/lockfile_enrichment.py +0 -0
  247. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/bundle/reproducible_archive.py +0 -0
  248. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/bundle/unpacker.py +0 -0
  249. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/cache/__init__.py +0 -0
  250. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/cache/http_cache.py +0 -0
  251. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/cache/integrity.py +0 -0
  252. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/cache/locking.py +0 -0
  253. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/cache/paths.py +0 -0
  254. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/cli.py +0 -0
  255. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/__init__.py +0 -0
  256. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/_apm_yml_writer.py +0 -0
  257. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/cache.py +0 -0
  258. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/compile/__init__.py +0 -0
  259. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/deps/__init__.py +0 -0
  260. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/deps/_utils.py +0 -0
  261. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/deps/why.py +0 -0
  262. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/doctor.py +0 -0
  263. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/find.py +0 -0
  264. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/list_cmd.py +0 -0
  265. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/audit.py +0 -0
  266. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/migrate.py +0 -0
  267. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/outdated.py +0 -0
  268. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/plugin/__init__.py +0 -0
  269. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/marketplace/validate.py +0 -0
  270. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/outdated.py +0 -0
  271. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/plugin/__init__.py +0 -0
  272. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/policy.py +0 -0
  273. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/run.py +0 -0
  274. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/runtime.py +0 -0
  275. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/self_update.py +0 -0
  276. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/targets.py +0 -0
  277. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/uninstall/__init__.py +0 -0
  278. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/uninstall/lockfile_state.py +0 -0
  279. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/commands/view.py +0 -0
  280. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/compilation/__init__.py +0 -0
  281. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/compilation/constitution.py +0 -0
  282. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/compilation/constitution_block.py +0 -0
  283. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/compilation/context_optimizer.py +0 -0
  284. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/compilation/injector.py +0 -0
  285. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/compilation/link_resolver.py +0 -0
  286. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/compilation/managed_section.py +0 -0
  287. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/constants.py +0 -0
  288. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/copilot_plugins/__init__.py +0 -0
  289. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/copilot_plugins/capability.py +0 -0
  290. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/copilot_plugins/catalog.py +0 -0
  291. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/copilot_plugins/constants.py +0 -0
  292. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/copilot_plugins/registrar.py +0 -0
  293. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/copilot_plugins/settings.py +0 -0
  294. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/__init__.py +0 -0
  295. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/_child_tls/__init__.py +0 -0
  296. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/_child_tls/_apm_tls.pth +0 -0
  297. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/_child_tls/_apm_tls_bootstrap.py +0 -0
  298. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/azure_cli.py +0 -0
  299. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/conflict_detector.py +0 -0
  300. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/deployment_state.py +0 -0
  301. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/docker_args.py +0 -0
  302. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/errors.py +0 -0
  303. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/install_audit.py +0 -0
  304. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/operations.py +0 -0
  305. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/output_mode.py +0 -0
  306. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/plugin_manifest.py +0 -0
  307. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/project_name.py +0 -0
  308. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/safe_installer.py +0 -0
  309. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/script_executors.py +0 -0
  310. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/script_runner.py +0 -0
  311. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/script_trust.py +0 -0
  312. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/core/tls_trust.py +0 -0
  313. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/__init__.py +0 -0
  314. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/aggregator.py +0 -0
  315. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/dependency_graph.py +0 -0
  316. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/git_semver_resolver.py +0 -0
  317. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/github_rate_limit.py +0 -0
  318. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/installed_package.py +0 -0
  319. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/outdated_ref_cache.py +0 -0
  320. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/outdated_row.py +0 -0
  321. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/package_validator.py +0 -0
  322. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/__init__.py +0 -0
  323. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/extractor.py +0 -0
  324. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry/semver.py +0 -0
  325. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/registry_proxy.py +0 -0
  326. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/shared_clone_cache.py +0 -0
  327. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/verifier.py +0 -0
  328. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/deps/why_walker.py +0 -0
  329. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/export/__init__.py +0 -0
  330. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/export/authoring.py +0 -0
  331. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/export/declared_license.py +0 -0
  332. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/export/formats.py +0 -0
  333. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/export/purl.py +0 -0
  334. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/export/sbom.py +0 -0
  335. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/export/spdx.py +0 -0
  336. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/export/spdx_data.py +0 -0
  337. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/factory.py +0 -0
  338. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/hook_contract.py +0 -0
  339. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/__init__.py +0 -0
  340. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/argv.py +0 -0
  341. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/artifactory_resolver.py +0 -0
  342. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/cache_pin.py +0 -0
  343. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/deployable_source_plan.py +0 -0
  344. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/gitlab_resolver.py +0 -0
  345. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/heals/__init__.py +0 -0
  346. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/heals/base.py +0 -0
  347. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/heals/branch_ref_drift.py +0 -0
  348. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/heals/buggy_lockfile_recovery.py +0 -0
  349. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/helpers/__init__.py +0 -0
  350. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/helpers/no_work.py +0 -0
  351. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/helpers/ref_seed.py +0 -0
  352. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/helpers/security_scan.py +0 -0
  353. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/insecure_policy.py +0 -0
  354. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/integrity.py +0 -0
  355. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/lsp/__init__.py +0 -0
  356. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/__init__.py +0 -0
  357. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/args.py +0 -0
  358. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/entry.py +0 -0
  359. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/warnings.py +0 -0
  360. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/mcp/writer.py +0 -0
  361. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/native_plugin_admission.py +0 -0
  362. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/package_resolution.py +0 -0
  363. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/__init__.py +0 -0
  364. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/_redownload.py +0 -0
  365. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/_skip_logic.py +0 -0
  366. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/audit.py +0 -0
  367. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/cleanup.py +0 -0
  368. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/copilot_plugins.py +0 -0
  369. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/download.py +0 -0
  370. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/finalize.py +0 -0
  371. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/heal.py +0 -0
  372. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/policy_gate.py +0 -0
  373. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/policy_target_check.py +0 -0
  374. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/phases/post_deps_local.py +0 -0
  375. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/plan.py +0 -0
  376. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/presentation/__init__.py +0 -0
  377. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/request.py +0 -0
  378. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/root_redirect.py +0 -0
  379. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/skill_path_migration.py +0 -0
  380. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/install/target_warnings.py +0 -0
  381. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/__init__.py +0 -0
  382. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/_hook_dropped_targets.py +0 -0
  383. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/canvas_integrator.py +0 -0
  384. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/command_integrator.py +0 -0
  385. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/copilot_app_db.py +0 -0
  386. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/copilot_app_project.py +0 -0
  387. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/copilot_app_workflow_integrator.py +0 -0
  388. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/copilot_app_ws.py +0 -0
  389. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/copilot_cowork_paths.py +0 -0
  390. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/coverage.py +0 -0
  391. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/dispatch.py +0 -0
  392. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/hook_bundle.py +0 -0
  393. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/hook_command_paths.py +0 -0
  394. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/hook_command_warnings.py +0 -0
  395. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/hook_file_routing.py +0 -0
  396. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/hook_ir.py +0 -0
  397. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/hook_native_formats.py +0 -0
  398. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/hook_ownership.py +0 -0
  399. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/hook_reintegration.py +0 -0
  400. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/hook_source_selection.py +0 -0
  401. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/kiro_hook_integrator.py +0 -0
  402. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/opencode_frontmatter.py +0 -0
  403. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/prompt_integrator.py +0 -0
  404. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/skill_package_routing.py +0 -0
  405. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/skill_transformer.py +0 -0
  406. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/integration/utils.py +0 -0
  407. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/__init__.py +0 -0
  408. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/_io.py +0 -0
  409. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/_shared.py +0 -0
  410. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/audit.py +0 -0
  411. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/auth_helpers.py +0 -0
  412. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/diagnostics.py +0 -0
  413. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/git_stderr.py +0 -0
  414. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/init_template.py +0 -0
  415. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/migration.py +0 -0
  416. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/output_mappers.py +0 -0
  417. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/output_profiles.py +0 -0
  418. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/resolver.py +0 -0
  419. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/semver.py +0 -0
  420. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/shadow_detector.py +0 -0
  421. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/tag_pattern.py +0 -0
  422. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/validator.py +0 -0
  423. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/version_check.py +0 -0
  424. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/version_pins.py +0 -0
  425. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/version_resolver.py +0 -0
  426. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/yml_editor.py +0 -0
  427. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/marketplace/yml_schema.py +0 -0
  428. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/__init__.py +0 -0
  429. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/__init__.py +0 -0
  430. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/identity.py +0 -0
  431. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/materialization.py +0 -0
  432. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/object_fields.py +0 -0
  433. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/provider_coordinates.py +0 -0
  434. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/registry_entry.py +0 -0
  435. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/selection.py +0 -0
  436. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/subsets.py +0 -0
  437. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/dependency/types.py +0 -0
  438. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/manifest_contract.py +0 -0
  439. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/models/plugin.py +0 -0
  440. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/output/__init__.py +0 -0
  441. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/output/formatters.py +0 -0
  442. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/output/models.py +0 -0
  443. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/output/script_formatters.py +0 -0
  444. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/policy/__init__.py +0 -0
  445. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/policy/_constraint_pinning.py +0 -0
  446. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/policy/_help_text.py +0 -0
  447. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/policy/_shared.py +0 -0
  448. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/policy/install_preflight.py +0 -0
  449. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/policy/matcher.py +0 -0
  450. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/policy/models.py +0 -0
  451. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/policy/outcome_routing.py +0 -0
  452. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/policy/parser.py +0 -0
  453. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/policy/policy_checks.py +0 -0
  454. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/policy/project_config.py +0 -0
  455. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/policy/schema.py +0 -0
  456. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/primitives/__init__.py +0 -0
  457. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/primitives/models.py +0 -0
  458. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/primitives/parser.py +0 -0
  459. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/registry/__init__.py +0 -0
  460. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/registry/integration.py +0 -0
  461. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/runtime/__init__.py +0 -0
  462. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/runtime/base.py +0 -0
  463. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/runtime/codex_runtime.py +0 -0
  464. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/runtime/copilot_runtime.py +0 -0
  465. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/runtime/factory.py +0 -0
  466. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/runtime/llm_runtime.py +0 -0
  467. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/runtime/manager.py +0 -0
  468. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/runtime/registry.py +0 -0
  469. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/runtime/utils.py +0 -0
  470. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/security/__init__.py +0 -0
  471. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/security/audit_report.py +0 -0
  472. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/security/external/__init__.py +0 -0
  473. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/security/external/base.py +0 -0
  474. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/security/external/gate.py +0 -0
  475. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/security/external/generic_sarif.py +0 -0
  476. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/security/external/options.py +0 -0
  477. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/security/external/registry.py +0 -0
  478. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/security/external/runner.py +0 -0
  479. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/security/external/sarif_ingest.py +0 -0
  480. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/security/external/skillspector.py +0 -0
  481. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/update_policy.py +0 -0
  482. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/__init__.py +0 -0
  483. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/archive.py +0 -0
  484. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/console.py +0 -0
  485. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/content_hash.py +0 -0
  486. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/exclude.py +0 -0
  487. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/file_ops.py +0 -0
  488. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/guards.py +0 -0
  489. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/helpers.py +0 -0
  490. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/install_tui.py +0 -0
  491. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/net.py +0 -0
  492. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/normalization.py +0 -0
  493. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/path_security.py +0 -0
  494. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/paths.py +0 -0
  495. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/perf_stats.py +0 -0
  496. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/reflink.py +0 -0
  497. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/short_sha.py +0 -0
  498. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/subprocess_env.py +0 -0
  499. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/utils/version_checker.py +0 -0
  500. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/workflow/__init__.py +0 -0
  501. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/workflow/discovery.py +0 -0
  502. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/workflow/parser.py +0 -0
  503. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli/workflow/runner.py +0 -0
  504. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli.egg-info/dependency_links.txt +0 -0
  505. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli.egg-info/entry_points.txt +0 -0
  506. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli.egg-info/requires.txt +0 -0
  507. {apm_cli-0.29.0 → apm_cli-0.29.1}/src/apm_cli.egg-info/top_level.txt +0 -0
  508. {apm_cli-0.29.0 → apm_cli-0.29.1}/tests/test_codex_docker_args_fix.py +0 -0
  509. {apm_cli-0.29.0 → apm_cli-0.29.1}/tests/test_codex_empty_string_and_defaults.py +0 -0
  510. {apm_cli-0.29.0 → apm_cli-0.29.1}/tests/test_collision_integration.py +0 -0
  511. {apm_cli-0.29.0 → apm_cli-0.29.1}/tests/test_console.py +0 -0
  512. {apm_cli-0.29.0 → apm_cli-0.29.1}/tests/test_distributed_compilation.py +0 -0
  513. {apm_cli-0.29.0 → apm_cli-0.29.1}/tests/test_empty_string_and_defaults.py +0 -0
  514. {apm_cli-0.29.0 → apm_cli-0.29.1}/tests/test_enhanced_discovery.py +0 -0
  515. {apm_cli-0.29.0 → apm_cli-0.29.1}/tests/test_github_downloader_token_precedence.py +0 -0
  516. {apm_cli-0.29.0 → apm_cli-0.29.1}/tests/test_runnable_prompts.py +0 -0
  517. {apm_cli-0.29.0 → apm_cli-0.29.1}/tests/test_runtime_manager_token_precedence.py +0 -0
  518. {apm_cli-0.29.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.29.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
@@ -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.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, 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
+ }