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.
- {acpkit-0.6.0 → acpkit-0.7.0}/.agents/skills/acpkit-sdk/SKILL.md +325 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/.agents/skills/acpkit-sdk/resources/intro.md +92 -0
- acpkit-0.7.0/.github/workflows/codecov.yml +30 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/.gitignore +8 -3
- acpkit-0.7.0/CONTRIBUTING.md +117 -0
- acpkit-0.7.0/COVERAGE +2 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/PKG-INFO +26 -1
- {acpkit-0.6.0 → acpkit-0.7.0}/README.md +25 -0
- acpkit-0.7.0/VERSION +1 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/docs/api/acpkit.md +8 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/docs/api/pydantic_acp.md +24 -0
- acpkit-0.7.0/docs/compatibility-matrix-template.md +246 -0
- acpkit-0.7.0/docs/host-backends.md +302 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/docs/index.md +2 -0
- acpkit-0.7.0/docs/integration-audit.md +136 -0
- acpkit-0.7.0/docs/integration-readiness.md +70 -0
- acpkit-0.7.0/docs/integration-testing.md +277 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/docs/llms-full.txt +584 -18
- {acpkit-0.6.0 → acpkit-0.7.0}/docs/llms.txt +3 -0
- acpkit-0.7.0/docs/projection-cookbook.md +222 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/docs/pydantic-acp/adapter-config.md +8 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/docs/pydantic-acp/plans-thinking-approvals.md +14 -0
- acpkit-0.7.0/docs/pydantic-acp/prompt-resources.md +214 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/docs/pydantic-acp.md +5 -3
- {acpkit-0.6.0 → acpkit-0.7.0}/examples/pydantic/strong_agent.py +93 -17
- {acpkit-0.6.0 → acpkit-0.7.0}/examples/pydantic/strong_agent_v2.py +158 -17
- {acpkit-0.6.0 → acpkit-0.7.0}/mkdocs.yml +6 -0
- acpkit-0.7.0/packages/adapters/pydantic-acp/VERSION +1 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/__init__.py +37 -0
- acpkit-0.7.0/packages/adapters/pydantic-acp/src/pydantic_acp/_projection_risk.py +48 -0
- acpkit-0.7.0/packages/adapters/pydantic-acp/src/pydantic_acp/_projection_text.py +118 -0
- {acpkit-0.6.0/src/acpkit → acpkit-0.7.0/packages/adapters/pydantic-acp/src/pydantic_acp}/_version.py +1 -1
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/mcp.py +12 -1
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/config.py +5 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/hook_projection.py +3 -3
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/host/__init__.py +12 -0
- acpkit-0.7.0/packages/adapters/pydantic-acp/src/pydantic_acp/host/_policy_commands.py +82 -0
- acpkit-0.7.0/packages/adapters/pydantic-acp/src/pydantic_acp/host/_policy_paths.py +28 -0
- acpkit-0.7.0/packages/adapters/pydantic-acp/src/pydantic_acp/host/context.py +69 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/host/filesystem.py +15 -0
- acpkit-0.7.0/packages/adapters/pydantic-acp/src/pydantic_acp/host/policy.py +409 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/host/terminal.py +22 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/projection.py +26 -10
- acpkit-0.7.0/packages/adapters/pydantic-acp/src/pydantic_acp/projection_helpers.py +24 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/providers.py +16 -2
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_native_plan_runtime.py +25 -3
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_prompt_execution.py +25 -10
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_prompt_runtime.py +5 -5
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/adapter.py +32 -4
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/prompts.py +107 -4
- acpkit-0.7.0/packages/adapters/pydantic-acp/src/pydantic_acp/testing/__init__.py +11 -0
- acpkit-0.7.0/packages/adapters/pydantic-acp/src/pydantic_acp/testing/fakes.py +246 -0
- acpkit-0.7.0/packages/adapters/pydantic-acp/src/pydantic_acp/testing/harness.py +162 -0
- acpkit-0.7.0/packages/helpers/codex-auth-helper/VERSION +1 -0
- {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
- {acpkit-0.6.0 → acpkit-0.7.0}/scripts/generate_llms_docs.py +6 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/src/acpkit/__init__.py +5 -0
- acpkit-0.7.0/src/acpkit/_compatibility_schema.py +111 -0
- {acpkit-0.6.0/packages/helpers/codex-auth-helper/src/codex_auth_helper → acpkit-0.7.0/src/acpkit}/_version.py +1 -1
- acpkit-0.7.0/src/acpkit/compatibility.py +15 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/tests/conftest.py +12 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/tests/pydantic/support.py +2 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/tests/pydantic/test_adapter_helpers.py +68 -3
- {acpkit-0.6.0 → acpkit-0.7.0}/tests/pydantic/test_bridge_mcp.py +40 -0
- acpkit-0.7.0/tests/pydantic/test_host_policy.py +247 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/tests/pydantic/test_low_level_helpers.py +176 -4
- acpkit-0.7.0/tests/pydantic/test_projection_helpers.py +126 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/tests/pydantic/test_runtime.py +4 -0
- acpkit-0.7.0/tests/pydantic/test_testing_fakes.py +165 -0
- acpkit-0.7.0/tests/pydantic/test_testing_harness.py +118 -0
- acpkit-0.7.0/tests/test_compatibility_manifest.py +103 -0
- acpkit-0.6.0/CONTRIBUTING.md +0 -41
- acpkit-0.6.0/COVERAGE +0 -2
- acpkit-0.6.0/VERSION +0 -1
- acpkit-0.6.0/docs/host-backends.md +0 -109
- acpkit-0.6.0/packages/adapters/pydantic-acp/VERSION +0 -1
- acpkit-0.6.0/packages/adapters/pydantic-acp/src/pydantic_acp/host/context.py +0 -40
- acpkit-0.6.0/packages/helpers/codex-auth-helper/VERSION +0 -1
- {acpkit-0.6.0 → acpkit-0.7.0}/.agents/skills/acpkit-sdk/agents/openai.yaml +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/.agents/skills/acpkit-sdk/scripts/list_examples.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/.agents/skills/acpkit-sdk/scripts/list_public_exports.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/.cursorrules +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/.editorconfig +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/.github/dependabot.yml +0 -0
- /acpkit-0.6.0/.github/workflows/monorepo-ci.yml → /acpkit-0.7.0/.github/workflows/ci.yml +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/.github/workflows/docs.yml +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/.github/workflows/publish.yml +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/.github/workflows/test.yml +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/.pre-commit-config.yaml +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/.python-version +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/CODE_OF_CONDUCT.md +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/LICENSE +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/Makefile +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/SECURITY.md +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/context7.json +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/docs/.partials/index-header.html +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/docs/about/index.md +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/docs/api/codex_auth_helper.md +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/docs/bridges.md +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/docs/cli.md +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/docs/examples/factory.md +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/docs/examples/index.md +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/docs/examples/minimal.md +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/docs/examples/providers.md +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/docs/examples/workspace-agent.md +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/docs/getting-started/installation.md +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/docs/getting-started/quickstart.md +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/docs/helpers.md +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/docs/providers.md +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/docs/pydantic-acp/runtime-controls.md +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/docs/pydantic-acp/session-state.md +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/docs/stylesheets/tweaks.css +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/docs/testing.md +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/examples/__init__.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/examples/pydantic/.gitignore +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/examples/pydantic/README.md +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/examples/pydantic/__init__.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/examples/pydantic/approvals.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/examples/pydantic/bridges.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/examples/pydantic/factory_agent.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/examples/pydantic/hook_projection.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/examples/pydantic/host_context.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/examples/pydantic/providers.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/examples/pydantic/static_agent.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/README.md +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/pyproject.toml +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/_slash_commands.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/agent_source.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/agent_types.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/approvals.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/awaitables.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/__init__.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/_hook_capability.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/base.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/history_processor.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/hooks.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/prepare_tools.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/thinking.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/builders/__init__.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/builders/agent.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/models.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/py.typed +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/__init__.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_adapter_prompt.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_agent_state.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_prompt_model_runtime.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_session_lifecycle.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_session_model_runtime.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_session_runtime.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_session_surface_runtime.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/bridge_manager.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/hook_introspection.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/server.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/session_surface.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/slash_commands.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/serialization.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/session/__init__.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/session/state.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/adapters/pydantic-acp/src/pydantic_acp/session/store.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/helpers/codex-auth-helper/.gitignore +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/helpers/codex-auth-helper/LICENSE +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/helpers/codex-auth-helper/README.md +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/helpers/codex-auth-helper/pyproject.toml +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/__init__.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/__init__.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/config.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/manager.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/state.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/store.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/client.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/factory.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/model.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/py.typed +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/pyproject.toml +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/pyrightconfig.json +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/scripts/check_pypi_versions.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/scripts/demo_mcp_server.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/scripts/mock_hook_audit.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/scripts/mock_hook_snapshot.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/scripts/run_if_major_change.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/scripts/save_coverage_summary.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/src/acpkit/__main__.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/src/acpkit/adapters.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/src/acpkit/cli.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/src/acpkit/py.typed +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/src/acpkit/runtime.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/tests/__init__.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/tests/codex_auth_helper/__init__.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/tests/codex_auth_helper/support.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/tests/codex_auth_helper/test_factory.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/tests/pydantic/__init__.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/tests/pydantic/test_approvals.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/tests/pydantic/test_bridge_builder.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/tests/pydantic/test_bridge_hooks.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/tests/pydantic/test_bridge_prepare_tools.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/tests/pydantic/test_bridge_thinking.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/tests/pydantic/test_hook_introspection.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/tests/pydantic/test_host.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/tests/pydantic/test_models.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/tests/pydantic/test_projection.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/tests/pydantic/test_slash_commands.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/tests/pydantic/test_sources.py +0 -0
- {acpkit-0.6.0 → acpkit-0.7.0}/tests/test_acpkit_cli.py +0 -0
- {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 }}
|
|
@@ -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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: acpkit
|
|
3
|
-
Version: 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
|
+
[](https://github.com/vcoderun/acpkit/actions/workflows/ci.yml) [](https://codecov.io/gh/vcoderun/acpkit) [](https://pypi.org/project/acpkit/) [](https://pypi.org/project/acpkit/) [](https://github.com/vcoderun/acpkit/releases) [](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.
|