acpkit 0.6.0__tar.gz → 0.7.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 (207) hide show
  1. {acpkit-0.6.0 → acpkit-0.7.0}/.agents/skills/acpkit-sdk/SKILL.md +325 -0
  2. {acpkit-0.6.0 → acpkit-0.7.0}/.agents/skills/acpkit-sdk/resources/intro.md +92 -0
  3. acpkit-0.7.0/.github/workflows/codecov.yml +30 -0
  4. {acpkit-0.6.0 → acpkit-0.7.0}/.gitignore +8 -3
  5. acpkit-0.7.0/CONTRIBUTING.md +117 -0
  6. acpkit-0.7.0/COVERAGE +2 -0
  7. {acpkit-0.6.0 → acpkit-0.7.0}/PKG-INFO +26 -1
  8. {acpkit-0.6.0 → acpkit-0.7.0}/README.md +25 -0
  9. acpkit-0.7.0/VERSION +1 -0
  10. {acpkit-0.6.0 → acpkit-0.7.0}/docs/api/acpkit.md +8 -0
  11. {acpkit-0.6.0 → acpkit-0.7.0}/docs/api/pydantic_acp.md +24 -0
  12. acpkit-0.7.0/docs/compatibility-matrix-template.md +246 -0
  13. acpkit-0.7.0/docs/host-backends.md +302 -0
  14. {acpkit-0.6.0 → acpkit-0.7.0}/docs/index.md +2 -0
  15. acpkit-0.7.0/docs/integration-audit.md +136 -0
  16. acpkit-0.7.0/docs/integration-readiness.md +70 -0
  17. acpkit-0.7.0/docs/integration-testing.md +277 -0
  18. {acpkit-0.6.0 → acpkit-0.7.0}/docs/llms-full.txt +584 -18
  19. {acpkit-0.6.0 → acpkit-0.7.0}/docs/llms.txt +3 -0
  20. acpkit-0.7.0/docs/projection-cookbook.md +222 -0
  21. {acpkit-0.6.0 → acpkit-0.7.0}/docs/pydantic-acp/adapter-config.md +8 -0
  22. {acpkit-0.6.0 → acpkit-0.7.0}/docs/pydantic-acp/plans-thinking-approvals.md +14 -0
  23. acpkit-0.7.0/docs/pydantic-acp/prompt-resources.md +214 -0
  24. {acpkit-0.6.0 → acpkit-0.7.0}/docs/pydantic-acp.md +5 -3
  25. {acpkit-0.6.0 → acpkit-0.7.0}/examples/pydantic/strong_agent.py +93 -17
  26. {acpkit-0.6.0 → acpkit-0.7.0}/examples/pydantic/strong_agent_v2.py +158 -17
  27. {acpkit-0.6.0 → acpkit-0.7.0}/mkdocs.yml +6 -0
  28. acpkit-0.7.0/packages/adapters/pydantic-acp/VERSION +1 -0
  29. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/__init__.py +37 -0
  30. acpkit-0.7.0/packages/adapters/pydantic-acp/src/pydantic_acp/_projection_risk.py +48 -0
  31. acpkit-0.7.0/packages/adapters/pydantic-acp/src/pydantic_acp/_projection_text.py +118 -0
  32. {acpkit-0.6.0/src/acpkit → acpkit-0.7.0/packages/adapters/pydantic-acp/src/pydantic_acp}/_version.py +1 -1
  33. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/mcp.py +12 -1
  34. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/config.py +5 -0
  35. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/hook_projection.py +3 -3
  36. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/host/__init__.py +12 -0
  37. acpkit-0.7.0/packages/adapters/pydantic-acp/src/pydantic_acp/host/_policy_commands.py +82 -0
  38. acpkit-0.7.0/packages/adapters/pydantic-acp/src/pydantic_acp/host/_policy_paths.py +28 -0
  39. acpkit-0.7.0/packages/adapters/pydantic-acp/src/pydantic_acp/host/context.py +69 -0
  40. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/host/filesystem.py +15 -0
  41. acpkit-0.7.0/packages/adapters/pydantic-acp/src/pydantic_acp/host/policy.py +409 -0
  42. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/host/terminal.py +22 -0
  43. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/projection.py +26 -10
  44. acpkit-0.7.0/packages/adapters/pydantic-acp/src/pydantic_acp/projection_helpers.py +24 -0
  45. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/providers.py +16 -2
  46. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_native_plan_runtime.py +25 -3
  47. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_prompt_execution.py +25 -10
  48. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_prompt_runtime.py +5 -5
  49. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/adapter.py +32 -4
  50. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/prompts.py +107 -4
  51. acpkit-0.7.0/packages/adapters/pydantic-acp/src/pydantic_acp/testing/__init__.py +11 -0
  52. acpkit-0.7.0/packages/adapters/pydantic-acp/src/pydantic_acp/testing/fakes.py +246 -0
  53. acpkit-0.7.0/packages/adapters/pydantic-acp/src/pydantic_acp/testing/harness.py +162 -0
  54. acpkit-0.7.0/packages/helpers/codex-auth-helper/VERSION +1 -0
  55. {acpkit-0.6.0/packages/adapters/pydantic-acp/src/pydantic_acp → acpkit-0.7.0/packages/helpers/codex-auth-helper/src/codex_auth_helper}/_version.py +1 -1
  56. {acpkit-0.6.0 → acpkit-0.7.0}/scripts/generate_llms_docs.py +6 -0
  57. {acpkit-0.6.0 → acpkit-0.7.0}/src/acpkit/__init__.py +5 -0
  58. acpkit-0.7.0/src/acpkit/_compatibility_schema.py +111 -0
  59. {acpkit-0.6.0/packages/helpers/codex-auth-helper/src/codex_auth_helper → acpkit-0.7.0/src/acpkit}/_version.py +1 -1
  60. acpkit-0.7.0/src/acpkit/compatibility.py +15 -0
  61. {acpkit-0.6.0 → acpkit-0.7.0}/tests/conftest.py +12 -0
  62. {acpkit-0.6.0 → acpkit-0.7.0}/tests/pydantic/support.py +2 -0
  63. {acpkit-0.6.0 → acpkit-0.7.0}/tests/pydantic/test_adapter_helpers.py +68 -3
  64. {acpkit-0.6.0 → acpkit-0.7.0}/tests/pydantic/test_bridge_mcp.py +40 -0
  65. acpkit-0.7.0/tests/pydantic/test_host_policy.py +247 -0
  66. {acpkit-0.6.0 → acpkit-0.7.0}/tests/pydantic/test_low_level_helpers.py +176 -4
  67. acpkit-0.7.0/tests/pydantic/test_projection_helpers.py +126 -0
  68. {acpkit-0.6.0 → acpkit-0.7.0}/tests/pydantic/test_runtime.py +4 -0
  69. acpkit-0.7.0/tests/pydantic/test_testing_fakes.py +165 -0
  70. acpkit-0.7.0/tests/pydantic/test_testing_harness.py +118 -0
  71. acpkit-0.7.0/tests/test_compatibility_manifest.py +103 -0
  72. acpkit-0.6.0/CONTRIBUTING.md +0 -41
  73. acpkit-0.6.0/COVERAGE +0 -2
  74. acpkit-0.6.0/VERSION +0 -1
  75. acpkit-0.6.0/docs/host-backends.md +0 -109
  76. acpkit-0.6.0/packages/adapters/pydantic-acp/VERSION +0 -1
  77. acpkit-0.6.0/packages/adapters/pydantic-acp/src/pydantic_acp/host/context.py +0 -40
  78. acpkit-0.6.0/packages/helpers/codex-auth-helper/VERSION +0 -1
  79. {acpkit-0.6.0 → acpkit-0.7.0}/.agents/skills/acpkit-sdk/agents/openai.yaml +0 -0
  80. {acpkit-0.6.0 → acpkit-0.7.0}/.agents/skills/acpkit-sdk/scripts/list_examples.py +0 -0
  81. {acpkit-0.6.0 → acpkit-0.7.0}/.agents/skills/acpkit-sdk/scripts/list_public_exports.py +0 -0
  82. {acpkit-0.6.0 → acpkit-0.7.0}/.cursorrules +0 -0
  83. {acpkit-0.6.0 → acpkit-0.7.0}/.editorconfig +0 -0
  84. {acpkit-0.6.0 → acpkit-0.7.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  85. {acpkit-0.6.0 → acpkit-0.7.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  86. {acpkit-0.6.0 → acpkit-0.7.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  87. {acpkit-0.6.0 → acpkit-0.7.0}/.github/dependabot.yml +0 -0
  88. /acpkit-0.6.0/.github/workflows/monorepo-ci.yml → /acpkit-0.7.0/.github/workflows/ci.yml +0 -0
  89. {acpkit-0.6.0 → acpkit-0.7.0}/.github/workflows/docs.yml +0 -0
  90. {acpkit-0.6.0 → acpkit-0.7.0}/.github/workflows/publish.yml +0 -0
  91. {acpkit-0.6.0 → acpkit-0.7.0}/.github/workflows/test.yml +0 -0
  92. {acpkit-0.6.0 → acpkit-0.7.0}/.pre-commit-config.yaml +0 -0
  93. {acpkit-0.6.0 → acpkit-0.7.0}/.python-version +0 -0
  94. {acpkit-0.6.0 → acpkit-0.7.0}/CODE_OF_CONDUCT.md +0 -0
  95. {acpkit-0.6.0 → acpkit-0.7.0}/LICENSE +0 -0
  96. {acpkit-0.6.0 → acpkit-0.7.0}/Makefile +0 -0
  97. {acpkit-0.6.0 → acpkit-0.7.0}/SECURITY.md +0 -0
  98. {acpkit-0.6.0 → acpkit-0.7.0}/context7.json +0 -0
  99. {acpkit-0.6.0 → acpkit-0.7.0}/docs/.partials/index-header.html +0 -0
  100. {acpkit-0.6.0 → acpkit-0.7.0}/docs/about/index.md +0 -0
  101. {acpkit-0.6.0 → acpkit-0.7.0}/docs/api/codex_auth_helper.md +0 -0
  102. {acpkit-0.6.0 → acpkit-0.7.0}/docs/bridges.md +0 -0
  103. {acpkit-0.6.0 → acpkit-0.7.0}/docs/cli.md +0 -0
  104. {acpkit-0.6.0 → acpkit-0.7.0}/docs/examples/factory.md +0 -0
  105. {acpkit-0.6.0 → acpkit-0.7.0}/docs/examples/index.md +0 -0
  106. {acpkit-0.6.0 → acpkit-0.7.0}/docs/examples/minimal.md +0 -0
  107. {acpkit-0.6.0 → acpkit-0.7.0}/docs/examples/providers.md +0 -0
  108. {acpkit-0.6.0 → acpkit-0.7.0}/docs/examples/workspace-agent.md +0 -0
  109. {acpkit-0.6.0 → acpkit-0.7.0}/docs/getting-started/installation.md +0 -0
  110. {acpkit-0.6.0 → acpkit-0.7.0}/docs/getting-started/quickstart.md +0 -0
  111. {acpkit-0.6.0 → acpkit-0.7.0}/docs/helpers.md +0 -0
  112. {acpkit-0.6.0 → acpkit-0.7.0}/docs/providers.md +0 -0
  113. {acpkit-0.6.0 → acpkit-0.7.0}/docs/pydantic-acp/runtime-controls.md +0 -0
  114. {acpkit-0.6.0 → acpkit-0.7.0}/docs/pydantic-acp/session-state.md +0 -0
  115. {acpkit-0.6.0 → acpkit-0.7.0}/docs/stylesheets/tweaks.css +0 -0
  116. {acpkit-0.6.0 → acpkit-0.7.0}/docs/testing.md +0 -0
  117. {acpkit-0.6.0 → acpkit-0.7.0}/examples/__init__.py +0 -0
  118. {acpkit-0.6.0 → acpkit-0.7.0}/examples/pydantic/.gitignore +0 -0
  119. {acpkit-0.6.0 → acpkit-0.7.0}/examples/pydantic/README.md +0 -0
  120. {acpkit-0.6.0 → acpkit-0.7.0}/examples/pydantic/__init__.py +0 -0
  121. {acpkit-0.6.0 → acpkit-0.7.0}/examples/pydantic/approvals.py +0 -0
  122. {acpkit-0.6.0 → acpkit-0.7.0}/examples/pydantic/bridges.py +0 -0
  123. {acpkit-0.6.0 → acpkit-0.7.0}/examples/pydantic/factory_agent.py +0 -0
  124. {acpkit-0.6.0 → acpkit-0.7.0}/examples/pydantic/hook_projection.py +0 -0
  125. {acpkit-0.6.0 → acpkit-0.7.0}/examples/pydantic/host_context.py +0 -0
  126. {acpkit-0.6.0 → acpkit-0.7.0}/examples/pydantic/providers.py +0 -0
  127. {acpkit-0.6.0 → acpkit-0.7.0}/examples/pydantic/static_agent.py +0 -0
  128. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/README.md +0 -0
  129. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/pyproject.toml +0 -0
  130. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/_slash_commands.py +0 -0
  131. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/agent_source.py +0 -0
  132. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/agent_types.py +0 -0
  133. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/approvals.py +0 -0
  134. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/awaitables.py +0 -0
  135. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/__init__.py +0 -0
  136. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/_hook_capability.py +0 -0
  137. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/base.py +0 -0
  138. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/history_processor.py +0 -0
  139. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/hooks.py +0 -0
  140. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/prepare_tools.py +0 -0
  141. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/thinking.py +0 -0
  142. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/builders/__init__.py +0 -0
  143. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/builders/agent.py +0 -0
  144. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/models.py +0 -0
  145. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/py.typed +0 -0
  146. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/__init__.py +0 -0
  147. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_adapter_prompt.py +0 -0
  148. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_agent_state.py +0 -0
  149. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_prompt_model_runtime.py +0 -0
  150. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_session_lifecycle.py +0 -0
  151. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_session_model_runtime.py +0 -0
  152. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_session_runtime.py +0 -0
  153. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_session_surface_runtime.py +0 -0
  154. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/bridge_manager.py +0 -0
  155. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/hook_introspection.py +0 -0
  156. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/server.py +0 -0
  157. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/session_surface.py +0 -0
  158. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/slash_commands.py +0 -0
  159. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/serialization.py +0 -0
  160. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/session/__init__.py +0 -0
  161. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/session/state.py +0 -0
  162. {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/session/store.py +0 -0
  163. {acpkit-0.6.0 → acpkit-0.7.0}/packages/helpers/codex-auth-helper/.gitignore +0 -0
  164. {acpkit-0.6.0 → acpkit-0.7.0}/packages/helpers/codex-auth-helper/LICENSE +0 -0
  165. {acpkit-0.6.0 → acpkit-0.7.0}/packages/helpers/codex-auth-helper/README.md +0 -0
  166. {acpkit-0.6.0 → acpkit-0.7.0}/packages/helpers/codex-auth-helper/pyproject.toml +0 -0
  167. {acpkit-0.6.0 → acpkit-0.7.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/__init__.py +0 -0
  168. {acpkit-0.6.0 → acpkit-0.7.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/__init__.py +0 -0
  169. {acpkit-0.6.0 → acpkit-0.7.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/config.py +0 -0
  170. {acpkit-0.6.0 → acpkit-0.7.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/manager.py +0 -0
  171. {acpkit-0.6.0 → acpkit-0.7.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/state.py +0 -0
  172. {acpkit-0.6.0 → acpkit-0.7.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/store.py +0 -0
  173. {acpkit-0.6.0 → acpkit-0.7.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/client.py +0 -0
  174. {acpkit-0.6.0 → acpkit-0.7.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/factory.py +0 -0
  175. {acpkit-0.6.0 → acpkit-0.7.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/model.py +0 -0
  176. {acpkit-0.6.0 → acpkit-0.7.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/py.typed +0 -0
  177. {acpkit-0.6.0 → acpkit-0.7.0}/pyproject.toml +0 -0
  178. {acpkit-0.6.0 → acpkit-0.7.0}/pyrightconfig.json +0 -0
  179. {acpkit-0.6.0 → acpkit-0.7.0}/scripts/check_pypi_versions.py +0 -0
  180. {acpkit-0.6.0 → acpkit-0.7.0}/scripts/demo_mcp_server.py +0 -0
  181. {acpkit-0.6.0 → acpkit-0.7.0}/scripts/mock_hook_audit.py +0 -0
  182. {acpkit-0.6.0 → acpkit-0.7.0}/scripts/mock_hook_snapshot.py +0 -0
  183. {acpkit-0.6.0 → acpkit-0.7.0}/scripts/run_if_major_change.py +0 -0
  184. {acpkit-0.6.0 → acpkit-0.7.0}/scripts/save_coverage_summary.py +0 -0
  185. {acpkit-0.6.0 → acpkit-0.7.0}/src/acpkit/__main__.py +0 -0
  186. {acpkit-0.6.0 → acpkit-0.7.0}/src/acpkit/adapters.py +0 -0
  187. {acpkit-0.6.0 → acpkit-0.7.0}/src/acpkit/cli.py +0 -0
  188. {acpkit-0.6.0 → acpkit-0.7.0}/src/acpkit/py.typed +0 -0
  189. {acpkit-0.6.0 → acpkit-0.7.0}/src/acpkit/runtime.py +0 -0
  190. {acpkit-0.6.0 → acpkit-0.7.0}/tests/__init__.py +0 -0
  191. {acpkit-0.6.0 → acpkit-0.7.0}/tests/codex_auth_helper/__init__.py +0 -0
  192. {acpkit-0.6.0 → acpkit-0.7.0}/tests/codex_auth_helper/support.py +0 -0
  193. {acpkit-0.6.0 → acpkit-0.7.0}/tests/codex_auth_helper/test_factory.py +0 -0
  194. {acpkit-0.6.0 → acpkit-0.7.0}/tests/pydantic/__init__.py +0 -0
  195. {acpkit-0.6.0 → acpkit-0.7.0}/tests/pydantic/test_approvals.py +0 -0
  196. {acpkit-0.6.0 → acpkit-0.7.0}/tests/pydantic/test_bridge_builder.py +0 -0
  197. {acpkit-0.6.0 → acpkit-0.7.0}/tests/pydantic/test_bridge_hooks.py +0 -0
  198. {acpkit-0.6.0 → acpkit-0.7.0}/tests/pydantic/test_bridge_prepare_tools.py +0 -0
  199. {acpkit-0.6.0 → acpkit-0.7.0}/tests/pydantic/test_bridge_thinking.py +0 -0
  200. {acpkit-0.6.0 → acpkit-0.7.0}/tests/pydantic/test_hook_introspection.py +0 -0
  201. {acpkit-0.6.0 → acpkit-0.7.0}/tests/pydantic/test_host.py +0 -0
  202. {acpkit-0.6.0 → acpkit-0.7.0}/tests/pydantic/test_models.py +0 -0
  203. {acpkit-0.6.0 → acpkit-0.7.0}/tests/pydantic/test_projection.py +0 -0
  204. {acpkit-0.6.0 → acpkit-0.7.0}/tests/pydantic/test_slash_commands.py +0 -0
  205. {acpkit-0.6.0 → acpkit-0.7.0}/tests/pydantic/test_sources.py +0 -0
  206. {acpkit-0.6.0 → acpkit-0.7.0}/tests/test_acpkit_cli.py +0 -0
  207. {acpkit-0.6.0 → acpkit-0.7.0}/tests/test_native_pydantic_agent.py +0 -0
@@ -417,6 +417,215 @@ Host-backed tools:
417
417
  - ACP Kit can expose client-backed filesystem and shell helpers
418
418
  - projection maps change how tools are rendered in ACP clients without changing the underlying tool contract
419
419
 
420
+ ### HostAccessPolicy
421
+
422
+ `HostAccessPolicy` is ACP Kit's native typed guardrail surface for host-backed filesystem and terminal access.
423
+
424
+ Reach for it first when an integration has started inventing ad hoc rules such as:
425
+
426
+ - "warn for absolute paths but deny workspace escapes"
427
+ - "show one caution in the client but enforce a different rule in the backend"
428
+ - "treat command cwd and file paths as unrelated policy domains"
429
+
430
+ Use it:
431
+
432
+ - when host-backed file and terminal tools already exist
433
+ - when approvals or projection warnings need to describe the same risk model that enforcement uses
434
+ - when downstream code has started to accumulate one-off path checks
435
+
436
+ Do not reach for it:
437
+
438
+ - when the integration does not expose host-backed file or terminal tools at all
439
+ - when the problem is product-specific approval wording rather than reusable access policy
440
+
441
+ Use it when an integration needs one reusable place to decide:
442
+
443
+ - whether absolute paths should only warn or hard fail
444
+ - whether paths outside the active session cwd should warn or deny
445
+ - whether workspace-root escapes should always deny
446
+ - whether command cwd and command path arguments should follow the same policy language as file paths
447
+
448
+ Important distinction:
449
+
450
+ - `evaluate_path(...)` and `evaluate_command(...)` are for UI and approval surfaces
451
+ - `enforce_path(...)` and `enforce_command(...)` are for actual blocking before ACP host requests are sent
452
+
453
+ The evaluation objects are intentionally UI-friendly. They expose:
454
+
455
+ - `disposition`
456
+ - `headline`
457
+ - `message`
458
+ - `recommendation`
459
+ - `risks`
460
+ - `risk_codes`
461
+ - `primary_risk`
462
+ - `summary_lines()`
463
+
464
+ That means downstream integrations do not need to invent their own warning strings just to show a clear caution card.
465
+
466
+ Typical use:
467
+
468
+ ```python
469
+ from pydantic_acp import ClientHostContext, HostAccessPolicy
470
+
471
+ policy = HostAccessPolicy.strict()
472
+
473
+ host = ClientHostContext.from_session(
474
+ client=client,
475
+ session=session,
476
+ access_policy=policy,
477
+ workspace_root=session.cwd,
478
+ )
479
+ ```
480
+
481
+ Small verified evaluation example:
482
+
483
+ ```python
484
+ from pathlib import Path
485
+
486
+ from pydantic_acp import HostAccessPolicy
487
+
488
+ policy = HostAccessPolicy.strict()
489
+ evaluation = policy.evaluate_path(
490
+ '../notes.txt',
491
+ session_cwd=Path('/workspace/app'),
492
+ workspace_root=Path('/workspace/app'),
493
+ )
494
+
495
+ assert evaluation.disposition == 'deny'
496
+ assert evaluation.should_deny
497
+ assert 'outside_cwd' in evaluation.risk_codes
498
+ ```
499
+
500
+ Current presets:
501
+
502
+ - `HostAccessPolicy()` is conservative default behavior
503
+ - `HostAccessPolicy.strict()` denies more aggressively outside the active cwd
504
+ - `HostAccessPolicy.permissive()` keeps more paths executable but still surfaces risk
505
+
506
+ Current scope:
507
+
508
+ - file path evaluation
509
+ - command cwd evaluation
510
+ - heuristic detection of obvious path-like command arguments
511
+ - native backend-side deny enforcement
512
+
513
+ Current limit:
514
+
515
+ - it is not a full shell parser
516
+ - it does not automatically wire itself through every integration seam yet
517
+
518
+ Primary references:
519
+
520
+ - [Host Backends and Projections](https://vcoderun.github.io/acpkit/host-backends/)
521
+ - [Projection Cookbook](https://vcoderun.github.io/acpkit/projection-cookbook/)
522
+
523
+ ## Black-box Integration Harness
524
+
525
+ `BlackBoxHarness` exists so downstream integrations can prove the ACP boundary without rebuilding test plumbing from scratch.
526
+
527
+ Reach for it when the integration already "works" but still lacks proof for:
528
+
529
+ - approval replay
530
+ - host-backed side effects
531
+ - session reload correctness
532
+ - ACP-visible transcript truthfulness
533
+
534
+ Use it:
535
+
536
+ - after the integration already has a real adapter construction seam
537
+ - when you need one reusable way to drive approvals, prompts, reloads, and visible updates
538
+ - when a normal unit test would miss ACP-visible behavior
539
+
540
+ Do not use it:
541
+
542
+ - to inspect private helper ordering
543
+ - as a substitute for product-level end-to-end testing
544
+ - before the integration has a coherent ownership model for sessions, approvals, and host tools
545
+
546
+ Use it when you want to verify:
547
+
548
+ - session create/load behavior
549
+ - visible ACP updates
550
+ - approval roundtrips
551
+ - host-backed file or terminal flows
552
+ - replay after reload
553
+
554
+ What it gives you:
555
+
556
+ - adapter construction plus a recording ACP client in one object
557
+ - `new_session(...)`
558
+ - `load_session(...)`
559
+ - `prompt_text(...)`
560
+ - `set_mode(...)`
561
+ - `set_model(...)`
562
+ - permission response queueing helpers
563
+ - update filtering
564
+ - reconstructed agent messages
565
+
566
+ Typical use:
567
+
568
+ ```python
569
+ import asyncio
570
+
571
+ from pydantic_acp import AdapterConfig, BlackBoxHarness, FileSessionStore
572
+
573
+ harness = BlackBoxHarness.create(
574
+ agent_factory=build_agent,
575
+ config=AdapterConfig(session_store=FileSessionStore(tmp_path / 'sessions')),
576
+ )
577
+
578
+ session = asyncio.run(harness.new_session(cwd=str(tmp_path)))
579
+ harness.queue_permission_selected('allow_once')
580
+ response = asyncio.run(harness.prompt_text('Write the workspace note.'))
581
+
582
+ assert response.stop_reason == 'end_turn'
583
+ assert harness.tool_updates(session_id=session.session_id)
584
+ assert harness.agent_messages(session_id=session.session_id)
585
+ ```
586
+
587
+ Small verified example from the harness test shape:
588
+
589
+ ```python
590
+ session = asyncio.run(harness.new_session(cwd=str(tmp_path)))
591
+ harness.queue_permission_selected('allow_once')
592
+ response = asyncio.run(harness.prompt_text('Write the workspace note.'))
593
+
594
+ assert response.stop_reason == 'end_turn'
595
+ assert harness.agent_messages(session_id=session.session_id) == ['done']
596
+ ```
597
+
598
+ The harness is intentionally black-box.
599
+
600
+ Prefer asserting on:
601
+
602
+ - ACP return values
603
+ - emitted `ToolCallStart` / `ToolCallProgress` updates
604
+ - reconstructed visible messages
605
+ - persisted replay behavior
606
+ - real host-backed side effects
607
+
608
+ Do not use it to:
609
+
610
+ - inspect private helper choreography
611
+ - lock internal runtime call order
612
+ - replace product-level end-to-end tests
613
+
614
+ Good default scenario ladder for a new integration:
615
+
616
+ 1. session create -> prompt -> reload
617
+ 2. approval required -> allow once
618
+ 3. approval required -> deny once
619
+ 4. host-backed file read/write
620
+ 5. host-backed terminal execution
621
+ 6. mode switch changes behavior
622
+ 7. model switch changes session-local state
623
+
624
+ Primary references:
625
+
626
+ - [Integration Testing](https://vcoderun.github.io/acpkit/integration-testing/)
627
+ - [Examples Overview](https://vcoderun.github.io/acpkit/examples/)
628
+
420
629
  ## Projection Maps And Hook Rendering
421
630
 
422
631
  Projection maps make ACP clients see richer file or command behavior than a raw generic tool card.
@@ -430,6 +639,30 @@ Common maps:
430
639
  Use them when the client should see more structured output, but avoid pretending a tool is
431
640
  something it is not.
432
641
 
642
+ ### Projection Helper Primitives
643
+
644
+ ACP Kit now also ships small reusable projection helpers for integrations that need consistent shaping but do not want to rebuild truncation and warning logic repeatedly.
645
+
646
+ High-value helpers:
647
+
648
+ - `truncate_text(...)`
649
+ - `truncate_lines(...)`
650
+ - `single_line_summary(...)`
651
+ - `format_code_block(...)`
652
+ - `format_diff_preview(...)`
653
+ - `format_terminal_status(...)`
654
+ - `caution_for_path(...)`
655
+ - `caution_for_command(...)`
656
+
657
+ Use these helpers when:
658
+
659
+ - a chat client needs a plain-text diff preview
660
+ - command titles should stay compact and consistent
661
+ - long stdout/stderr content needs predictable truncation
662
+ - caution text should come from the same `HostAccessPolicy` evaluation model as backend enforcement
663
+
664
+ These helpers are intentionally small. They are building blocks, not a full rendering framework.
665
+
433
666
  ## Examples That Matter
434
667
 
435
668
  High-value maintained examples live under `examples/pydantic/`:
@@ -470,10 +703,101 @@ High-value docs pages:
470
703
  - [Providers](https://vcoderun.github.io/acpkit/providers/)
471
704
  - [Bridges](https://vcoderun.github.io/acpkit/bridges/)
472
705
  - [Host Backends and Projections](https://vcoderun.github.io/acpkit/host-backends/)
706
+ - [Integration Testing](https://vcoderun.github.io/acpkit/integration-testing/)
707
+ - [Projection Cookbook](https://vcoderun.github.io/acpkit/projection-cookbook/)
473
708
  - [Examples Overview](https://vcoderun.github.io/acpkit/examples/)
474
709
  - [Workspace Agent](https://vcoderun.github.io/acpkit/examples/workspace-agent/)
475
710
  - [pydantic_acp API](https://vcoderun.github.io/acpkit/api/pydantic_acp/)
476
711
 
712
+ ## Compatibility Manifest
713
+
714
+ ACP Kit now also ships a typed root-level compatibility manifest schema through `acpkit`.
715
+
716
+ Reach for it after the integration already has real seams and at least one black-box proof path.
717
+
718
+ Do not use it as a speculative roadmap scratchpad. Use it as a reviewable declaration of what is actually wired today.
719
+
720
+ Use it:
721
+
722
+ - after at least one black-box proof path exists
723
+ - when reviews need one typed declaration of supported ACP surfaces
724
+ - when docs should be generated from validated code instead of prose drift
725
+
726
+ Do not use it:
727
+
728
+ - before the integration can already demonstrate the behavior it claims
729
+ - as a replacement for proof tests
730
+ - as a vague backlog matrix with no mapping seam
731
+
732
+ Use it when a real integration needs one reviewable declaration of:
733
+
734
+ - which ACP surfaces are implemented
735
+ - which are partial
736
+ - which are intentionally not used
737
+ - which are only planned
738
+
739
+ Core types:
740
+
741
+ - `CompatibilityManifest`
742
+ - `SurfaceSupport`
743
+ - `SurfaceStatus`
744
+ - `SurfaceOwner`
745
+
746
+ Typical use:
747
+
748
+ ```python
749
+ from acpkit import CompatibilityManifest, SurfaceSupport
750
+
751
+ manifest = CompatibilityManifest(
752
+ integration_name='workspace-agent',
753
+ adapter='pydantic-acp',
754
+ surfaces={
755
+ 'session.load': SurfaceSupport(
756
+ status='implemented',
757
+ owner='adapter',
758
+ mapping='FileSessionStore + load_session',
759
+ ),
760
+ 'mode.switch': SurfaceSupport(
761
+ status='partial',
762
+ owner='bridge',
763
+ mapping='PrepareToolsBridge dynamic modes',
764
+ rationale='Only explicitly exposed runtime modes are surfaced.',
765
+ ),
766
+ 'authenticate': SurfaceSupport(
767
+ status='planned',
768
+ rationale='No auth handshake has been added yet.',
769
+ ),
770
+ },
771
+ )
772
+
773
+ manifest.validate()
774
+ ```
775
+
776
+ Minimal review rule:
777
+
778
+ - every `implemented` surface should point to one concrete mapping seam
779
+ - every `partial`, `intentionally_not_used`, and `planned` surface should explain why
780
+ - `mixed` ownership is only acceptable when the split is named explicitly
781
+
782
+ Important rule:
783
+
784
+ - do not generate this from guesses
785
+ - derive it from a real integration audit
786
+ - then validate it in tests
787
+
788
+ Recommended workflow:
789
+
790
+ 1. inventory real seams
791
+ 2. declare surfaces in code
792
+ 3. call `manifest.validate()` in tests or CI
793
+ 4. optionally publish `manifest.to_markdown()` into docs
794
+
795
+ This is not a runtime feature. It is an integration review and documentation hygiene feature.
796
+
797
+ Primary reference:
798
+
799
+ - [Compatibility Manifest Guide](https://vcoderun.github.io/acpkit/compatibility-matrix-template/)
800
+
477
801
  ## Skill-Local Routing Aids
478
802
 
479
803
  These files exist to route you quickly into the right part of the codebase or docs set when the
@@ -499,6 +823,7 @@ Use the bundled scripts instead of guessing:
499
823
  - Keep examples runnable, explicit, and strongly typed.
500
824
  - Treat adapter-owned state and host-owned state as different design choices.
501
825
  - Prefer the narrowest seam that matches the user’s need.
826
+ - Use the compatibility manifest when an integration needs one typed, reviewable ACP surface declaration instead of a loose prose matrix.
502
827
  - `FileSessionStore` uses `root=Path(...)`.
503
828
  - `FileSessionStore` is the hardened local durable store, not a distributed session backend.
504
829
  - Mode slash commands are dynamic, and mode ids must not collide with reserved names such as `model`, `thinking`, `tools`, `hooks`, or `mcp-servers`.
@@ -67,6 +67,98 @@ Use these seams intentionally:
67
67
  - native ACP plan state and `PlanProvider` are separate ownership paths
68
68
  - `HookBridge(hide_all=True)` suppresses hook listing output, not the underlying hook capability itself
69
69
  - custom `run_event_stream` hooks and wrappers must return an async iterable, not a coroutine
70
+ - `HostAccessPolicy` is the native typed guardrail surface for host-backed file and terminal access
71
+ - `BlackBoxHarness` is the reusable black-box ACP boundary test helper for downstream integrations
72
+ - projection helper primitives handle diff previews, truncation, command summaries, and guardrail-aware caution text without each integration rebuilding that shaping logic
73
+ - the compatibility manifest schema gives integrations one typed, reviewable declaration of which ACP surfaces are implemented, partial, intentionally not used, or planned
74
+
75
+ ## New Native Surfaces
76
+
77
+ ### HostAccessPolicy
78
+
79
+ Reach for `HostAccessPolicy` when an integration needs one reusable, typed place to evaluate file and command risk.
80
+
81
+ It gives you:
82
+
83
+ - `allow / warn / deny` policy decisions
84
+ - file path evaluation against session cwd and workspace root
85
+ - command cwd evaluation plus heuristic path-like argument inspection
86
+ - UI-friendly evaluation outputs such as `headline`, `message`, and `recommendation`
87
+ - backend-side `deny` enforcement before ACP host requests are sent
88
+
89
+ Minimal example:
90
+
91
+ ```python
92
+ from pathlib import Path
93
+
94
+ from pydantic_acp import HostAccessPolicy
95
+
96
+ policy = HostAccessPolicy.strict()
97
+ evaluation = policy.evaluate_path(
98
+ '../notes.txt',
99
+ session_cwd=Path('/workspace/app'),
100
+ workspace_root=Path('/workspace/app'),
101
+ )
102
+ ```
103
+
104
+ Read next:
105
+
106
+ - https://vcoderun.github.io/acpkit/host-backends/
107
+ - https://vcoderun.github.io/acpkit/projection-cookbook/
108
+
109
+ ### BlackBoxHarness
110
+
111
+ Reach for `BlackBoxHarness` when an integration needs proof, not just implementation.
112
+
113
+ It gives you a reusable way to test:
114
+
115
+ - session create/load
116
+ - prompts at the ACP boundary
117
+ - approval queueing
118
+ - visible updates
119
+ - replay after reload
120
+
121
+ Use it to prove that an ACP integration is truthful without rebuilding a recording client and update parser for every project.
122
+
123
+ Minimal example:
124
+
125
+ ```python
126
+ session = asyncio.run(harness.new_session(cwd=str(tmp_path)))
127
+ harness.queue_permission_selected('allow_once')
128
+ response = asyncio.run(harness.prompt_text('Write the workspace note.'))
129
+ ```
130
+
131
+ Read next:
132
+
133
+ - https://vcoderun.github.io/acpkit/integration-testing/
134
+
135
+ ### CompatibilityManifest
136
+
137
+ Reach for `CompatibilityManifest` after the integration already has real seams and at least one black-box proof path.
138
+
139
+ It is for reviewability, not runtime behavior. Write it in Python, validate it in tests, and optionally render it into Markdown for humans.
140
+
141
+ Minimal example:
142
+
143
+ ```python
144
+ from acpkit import CompatibilityManifest, SurfaceSupport
145
+
146
+ manifest = CompatibilityManifest(
147
+ integration_name='workspace-agent',
148
+ adapter='pydantic-acp',
149
+ surfaces={
150
+ 'session.load': SurfaceSupport(
151
+ status='implemented',
152
+ owner='adapter',
153
+ mapping='FileSessionStore + load_session',
154
+ ),
155
+ },
156
+ )
157
+ ```
158
+
159
+ Read next:
160
+
161
+ - https://vcoderun.github.io/acpkit/compatibility-matrix-template/
70
162
 
71
163
  ## Reference Files In This Skill
72
164
 
@@ -0,0 +1,30 @@
1
+ name: Run tests and upload coverage
2
+
3
+ on: push
4
+
5
+ jobs:
6
+ test:
7
+ name: Run tests and collect coverage
8
+ runs-on: ubuntu-latest
9
+ steps:
10
+ - name: Checkout
11
+ uses: actions/checkout@v6
12
+ with:
13
+ fetch-depth: 2
14
+
15
+ - name: Set up Python
16
+ uses: actions/setup-python@v6
17
+
18
+ - name: Set up uv
19
+ uses: astral-sh/setup-uv@v7
20
+
21
+ - name: Install dependencies
22
+ run: uv sync --all-extras
23
+
24
+ - name: Run tests
25
+ run: uv run pytest --cov --cov-branch --cov-report=xml
26
+
27
+ - name: Upload results to Codecov
28
+ uses: codecov/codecov-action@v6
29
+ with:
30
+ token: ${{ secrets.CODECOV_TOKEN }}
@@ -77,7 +77,12 @@ SPEC.md
77
77
  # Temporary
78
78
  tmp
79
79
  *.snapshot
80
- bump.sh
81
- local.sh
80
+ *.sh
82
81
  coverage.json
83
- acpkit-implementation-plan.md
82
+ /acprouter
83
+
84
+ # Draft Plans
85
+ *-integration.md
86
+ *-improvement.md
87
+ *-plan.md
88
+ scripts/openrouter*.py
@@ -0,0 +1,117 @@
1
+ # Contributing
2
+
3
+ ACP Kit uses `uv` for dependency management, tool execution, and workspace syncing.
4
+ Use the repo commands below instead of ad hoc `pip`, `poetry`, or one-off local flows.
5
+
6
+ ## Prerequisites
7
+
8
+ - Python `3.11+`
9
+ - `uv`
10
+ - `git`
11
+
12
+ ## Clone And Install
13
+
14
+ ```bash
15
+ git clone https://github.com/vcoderun/acpkit
16
+ cd acpkit
17
+ uv sync --all-extras
18
+ ```
19
+
20
+ `uv sync --all-extras` is the simplest contributor setup. It installs the root package,
21
+ workspace packages, test tools, docs tools, and the `pydantic-acp` adapter surface used by
22
+ most development work.
23
+
24
+ If you want a narrower environment, the minimum useful setup for code contributions is:
25
+
26
+ ```bash
27
+ uv sync --extra dev --extra pydantic
28
+ ```
29
+
30
+ For docs work without the full extras set:
31
+
32
+ ```bash
33
+ uv sync --extra dev --extra docs --extra pydantic --extra codex
34
+ ```
35
+
36
+ You usually do not need to activate `.venv` manually because the commands below use `uv run`.
37
+
38
+ ## Pre-commit
39
+
40
+ Install hooks with:
41
+
42
+ ```bash
43
+ uv run pre-commit install
44
+ ```
45
+
46
+ Run them manually with:
47
+
48
+ ```bash
49
+ uv run pre-commit run --all-files
50
+ ```
51
+
52
+ Current hook behavior:
53
+
54
+ - validates YAML and TOML files
55
+ - runs `uv run --extra dev ruff check --fix`
56
+ - checks that local package versions are ahead of the latest published PyPI versions
57
+ - runs `make check-coverage` and `make prod` only for major staged changes
58
+
59
+ If `ruff check --fix` rewrites files, re-stage them before committing.
60
+
61
+ ## Common Commands
62
+
63
+ Formatting and validation:
64
+
65
+ - `make format`: run `ruff format`
66
+ - `make check-formatted`: verify formatting with `ruff format --check`
67
+ - `make check`: run `ruff check`, `ty check`, and `basedpyright`
68
+ - `make all`: run `make format` and `make check`
69
+
70
+ Tests and coverage:
71
+
72
+ - `make tests`: run the full test suite with `pytest`
73
+ - `make check-coverage`: enforce line and branch coverage thresholds for `pydantic-acp`
74
+ - `make save-coverage`: run the same coverage job and write the summary to [COVERAGE](https://github.com/vcoderun/acpkit/blob/main/COVERAGE)
75
+ - `make check-matrix`: run lint and type checks across the supported Python version matrix
76
+
77
+ Docs:
78
+
79
+ - `make serve`: run the MkDocs dev server on `127.0.0.1:8080`
80
+ - `uv run --extra docs --extra pydantic --extra codex mkdocs build --strict`: run the strict docs build used in CI
81
+
82
+ Higher-cost validation:
83
+
84
+ - `make prod`: run `tests`, `format`, and the multi-version `check-matrix` gate
85
+
86
+ ## Recommended Local Workflow
87
+
88
+ For most changes:
89
+
90
+ 1. Sync dependencies with `uv sync --all-extras`.
91
+ 2. Make your change.
92
+ 3. Run `make format`.
93
+ 4. Run `make check`.
94
+ 5. Run `make tests`.
95
+ 6. Run `uv run pre-commit run --all-files` if you want the same hook surface before commit.
96
+
97
+ Run the stricter commands when they matter:
98
+
99
+ - If you touched `pydantic-acp` runtime, plan, approval, bridge, or projection code, run `make check-coverage`.
100
+ - If you touched docs or README-linked docs surfaces, run `uv run --extra docs --extra pydantic --extra codex mkdocs build --strict`.
101
+ - If you changed packaging, CI, or anything release-sensitive, run `make prod`.
102
+
103
+ ## Pull Requests
104
+
105
+ Before opening a pull request:
106
+
107
+ 1. Make sure your branch is up to date with `main`.
108
+ 2. Ensure `make check` and `make tests` pass.
109
+ 3. Run the stricter coverage or docs gates when your changes affect those surfaces.
110
+ 4. Commit with a clean `pre-commit` result.
111
+ 5. Push your branch and verify GitHub Actions passes.
112
+
113
+ ## Notes
114
+
115
+ - Prefer `uv run ...` over activating the environment and calling tools directly.
116
+ - Do not add new contributor instructions that depend on `pip`, `poetry`, `pdm`, or `pip-tools`.
117
+ - If you change the hook configuration, reinstall hooks with `uv run pre-commit install`.
acpkit-0.7.0/COVERAGE ADDED
@@ -0,0 +1,2 @@
1
+ Line coverage: 97.26% (4526 / 4623)
2
+ Branch coverage: 95.16% (1336 / 1404)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: acpkit
3
- Version: 0.6.0
3
+ Version: 0.7.0
4
4
  Summary: ACP Kit provides a common adapter for Agent Frameworks.
5
5
  Project-URL: Homepage, https://github.com/vcoderun/acpkit
6
6
  Project-URL: Issues, https://github.com/vcoderun/acpkit/issues
@@ -65,6 +65,8 @@ Description-Content-Type: text/markdown
65
65
 
66
66
  # ACP Kit
67
67
 
68
+ [![CI](https://github.com/vcoderun/acpkit/actions/workflows/ci.yml/badge.svg?event=push)](https://github.com/vcoderun/acpkit/actions/workflows/ci.yml) [![codecov](https://codecov.io/gh/vcoderun/acpkit/branch/main/graph/badge.svg?token=ZQL4NY4FK6)](https://codecov.io/gh/vcoderun/acpkit) [![PyPI version](https://img.shields.io/pypi/v/acpkit.svg)](https://pypi.org/project/acpkit/) [![Python versions](https://img.shields.io/pypi/pyversions/acpkit.svg)](https://pypi.org/project/acpkit/) [![GitHub release](https://img.shields.io/github/v/release/vcoderun/acpkit)](https://github.com/vcoderun/acpkit/releases) [![License](https://img.shields.io/github/license/vcoderun/acpkit)](https://github.com/vcoderun/acpkit/blob/main/LICENSE)
69
+
68
70
  ACP Kit is the adapter toolkit and monorepo for turning an existing agent surface into a truthful ACP server.
69
71
 
70
72
  - `acpkit` is the root CLI and target resolver
@@ -94,6 +96,26 @@ Operational notes:
94
96
  - dynamic mode slash commands come from configured mode ids; ids like `model`, `thinking`, `tools`, `hooks`, and `mcp-servers` are reserved
95
97
  - custom `run_event_stream` hooks must return an async iterable, not a coroutine or plain value
96
98
 
99
+ Integration quality utilities:
100
+
101
+ - `HostAccessPolicy` is the native typed guardrail surface for host-backed filesystem and terminal access
102
+ - `BlackBoxHarness` is the reusable ACP boundary proof helper for approval, host-tool, and reload flows
103
+ - `CompatibilityManifest` is the typed capability declaration for documenting which ACP surfaces an integration truly supports
104
+
105
+ Prompt resource support:
106
+
107
+ - `pydantic-acp` accepts ACP text, resource links, embedded text resources, image blocks, audio blocks, and embedded binary resources
108
+ - editor clients can attach file refs, directory refs, selected ranges, and branch diffs as prompt context instead of forcing another tool round trip
109
+ - Zed-style branch diff and selection attachments are preserved as explicit `context ref` prompt context
110
+ - plain rule text such as `@rule ...` stays plain text unless your runtime gives it extra meaning
111
+
112
+ Deeper guides:
113
+
114
+ - [Integration testing guide](https://github.com/vcoderun/acpkit/blob/main/docs/integration-testing.md)
115
+ - [Compatibility manifest guide](https://github.com/vcoderun/acpkit/blob/main/docs/compatibility-matrix-template.md)
116
+ - [Host backends and guardrails](https://github.com/vcoderun/acpkit/blob/main/docs/host-backends.md)
117
+ - [Prompt resources and context](https://github.com/vcoderun/acpkit/blob/main/docs/pydantic-acp/prompt-resources.md)
118
+
97
119
  ## Installation
98
120
 
99
121
  ```bash
@@ -107,6 +129,9 @@ uv pip install "acpkit[pydantic,launch]"
107
129
  uv pip install -e ".[dev,docs,pydantic]"
108
130
  ```
109
131
 
132
+ Contributor setup and local validation commands are documented in
133
+ [CONTRIBUTING.md](https://github.com/vcoderun/acpkit/blob/main/CONTRIBUTING.md).
134
+
110
135
  ## ACP Kit Skill
111
136
 
112
137
  This repo also ships an `acpkit-sdk` skill package for Codex.