apm-cli 0.33.0__tar.gz → 0.34.0__tar.gz

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