agentbundle 0.57.0__tar.gz → 0.58.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agentbundle-0.57.0/agentbundle.egg-info → agentbundle-0.58.1}/PKG-INFO +15 -1
- {agentbundle-0.57.0 → agentbundle-0.58.1}/README-pypi.md +14 -0
- agentbundle-0.58.1/agentbundle/_data/_content_safety.py +419 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/file_safety.py +208 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/workspace_status_engine.py +1126 -50
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/self_host.py +8 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/file_safety.py +208 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/version.py +1 -1
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/workspace_mcp.py +286 -7
- {agentbundle-0.57.0 → agentbundle-0.58.1/agentbundle.egg-info}/PKG-INFO +15 -1
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle.egg-info/SOURCES.txt +4 -1
- {agentbundle-0.57.0 → agentbundle-0.58.1}/pyproject.toml +1 -1
- agentbundle-0.58.1/tests/test_workspace_mcp_depends_on.py +84 -0
- agentbundle-0.58.1/tests/unit/test_catalogue_tooling_file_safety.py +668 -0
- agentbundle-0.58.1/tests/unit/test_workspace_mcp_supervisor_run.py +661 -0
- agentbundle-0.57.0/tests/unit/test_catalogue_tooling_file_safety.py +0 -311
- {agentbundle-0.57.0 → agentbundle-0.58.1}/MANIFEST.in +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/README.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/__init__.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/__main__.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/__init__.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/adapter.schema.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/adapter.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/agent-plugin-extension-namespaces.schema.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/agent-plugin-extension-namespaces.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-index.schema.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-manifest.schema.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-members.txt +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/guides/_shared/reference/catalogue-authoring-standards.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/guides/_shared/reference/catalogue-ci-contract.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/manifest.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/packs/AGENTS.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/packs/CLAUDE.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/packs/README.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/packs/_example/.apm/skills/example-skill/SKILL.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/packs/_example/.apm/skills/example-skill/evals/eval_queries.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/packs/_example/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/packs/_example/README.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/packs/_example/pack.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/profiles/AGENTS.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/profiles/CLAUDE.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/profiles/README.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/profiles/_example/README.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/profiles/_example/profile.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/tests/conformance/test_gemini_admissibility.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/tests/conformance/test_pack_layout_declared_section.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/tests/conformance/test_pack_metadata.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue-scaffold/tests/conformance/test_shared_library_boundaries.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/catalogue.schema.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/close_work.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/cooling.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/distribution-routes.schema.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/distribution-routes.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/guide.schema.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/install-defaults.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/install-marker.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/knowledge-captured-observation.schema.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/marketplace-entry.schema.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/pack.schema.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/plugin-manifest.derived.schema.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/plugin-manifest.schema.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/profile.schema.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/public-contracts.txt +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/skill-manifest.schema.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/skill.schema.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/target-vocab.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/vendor/agent-plugins/1.0.0/LICENSE.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/vendor/agent-plugins/1.0.0/PROVENANCE.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/vendor/agent-plugins/1.0.0/mcp.schema.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/vendor/agent-plugins/1.0.0/plugin.schema.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/work_intake_refresh.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/_data/workspace_status_prune.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/bounded_metadata.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/__init__.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/__main__.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/adapter_root_bins.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/adapters/__init__.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/adapters/_sweep_guard.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/adapters/claude_code.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/adapters/codex.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/adapters/copilot.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/adapters/cursor.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/adapters/gemini.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/adapters/kiro.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/adapters/kiro_cli.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/adapters/kiro_ide.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/contract.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/hook_wiring_rules.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/lint_packs.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/main.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/phase_order.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/projection_io.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/projections/__init__.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/projections/codex_agent_toml.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/projections/copilot_agent_md.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/projections/copilot_hooks_json.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/projections/direct_directory.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/projections/gemini_command_toml.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/projections/hook_id.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/projections/kiro_ide_hook.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/projections/merge_into_agent_json.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/projections/merge_json.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/projections/plugin_hooks.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/projections/user_merge_json.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/recipes/composite-agents-md.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/recipes/composite-marketplace.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/recipes/marketplace.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/recipes/per-pack-agent-plugin.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/recipes/per-pack-apm-package.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/recipes/per-pack-claude-plugin.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/recipes/per-pack-overlay.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/recipes/self-host.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/route_agent_plugin.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/route_apm.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/route_claude_plugins.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/route_lookup.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/scope_rails.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/shared_libs.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/target_resolver.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/user_libs.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/build/validate.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_fetch/__init__.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_fetch/direct_http.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_fetch/jfrog_cli.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_fetch/models.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/__init__.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/archive.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/build.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/config.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/contracts_inspector.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/defaults.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/diagnostics.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/identity.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/index_generator.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/initialise.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/initialise_self_hosted.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/journey_validator.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/lint.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/manifest.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/okf_discovery.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/package.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/results.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/self_host.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/self_host_windows.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/skill_spec_lint.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/toml_emit.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/verify.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/catalogue_tooling/version_ranges.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/categories.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/cli.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/__init__.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/_common.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/_drop_warning.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/adapt.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/catalogue_build.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/catalogue_contracts.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/catalogue_index.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/catalogue_init.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/catalogue_lint.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/catalogue_package.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/catalogue_self_host.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/catalogue_sync.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/catalogue_sync_defaults.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/catalogue_tooling_stub.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/catalogue_verify.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/config.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/diff.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/docs.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/init_state.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/install.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/list_installed.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/list_packs.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/list_profiles.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/list_targets.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/oplog_cmd.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/pack_config_cmd.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/pack_evals.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/package_catalogue.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/profile.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/reconcile.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/render.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/scaffold.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/show.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/uninstall.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/upgrade.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/commands/validate.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/config.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/direct_install.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/direct_source.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/direct_source_acquisition.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/direct_source_state.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/direct_validate.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/https_catalogue.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/local_exclude.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/oplog.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/pack_inventory.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/pack_renames.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/render.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/safety.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/scaffold.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/scope.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/source_defaults.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/statelock.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/system_trust.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle/user_config.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle.egg-info/dependency_links.txt +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle.egg-info/entry_points.txt +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle.egg-info/requires.txt +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/agentbundle.egg-info/top_level.txt +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/conftest.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/setup.cfg +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/templates/install-marker.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/__init__.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/_direct_acquisition.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/_rename_fixtures.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/_support.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/__init__.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/README.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/claude-code-2.1.226-hook-events.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/claude-code-2.1.228-hook-events.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/core/.apm/agents/bar.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/core/.apm/commands/qux.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/core/.apm/hook-wiring/baz.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/core/.apm/hook-wiring/qux.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/core/.apm/hooks/baz.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/core/.apm/hooks/baz.sh +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/core/.apm/skills/example/SKILL.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/core/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/core/pack.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/governance-extras/.apm/skills/example/SKILL.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/governance-extras/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/governance-extras/pack.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/monorepo-extras/.apm/skills/example/SKILL.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/monorepo-extras/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/monorepo-extras/pack.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/product-documentation/.apm/skills/example/SKILL.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/product-documentation/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/product-documentation/pack.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/user-guide-diataxis/.apm/skills/example/SKILL.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/user-guide-diataxis/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/packs/user-guide-diataxis/pack.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/fixtures/recipes/bogus-target.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_adapter_claude_code.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_adapter_codex.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_adapter_copilot.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_adapter_cursor.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_adapter_gemini.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_adapter_kiro.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_adapter_kiro_alias.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_adapter_kiro_cli.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_adapter_kiro_ide.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_adapter_root_bins_projection.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_agent_boundary_metadata_projection.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_agent_plugin_projection.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_build_ships_seeds.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_build_validate_bundled_schema.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_contract.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_contract_scope.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_contract_v07.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_contract_v08.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_direct_directory_cleanup.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_distribution_route_contract.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_distribution_route_golden.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_distribution_route_resolution.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_end_to_end_build.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_hook_wiring_rules.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_lint_packs.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_load_pack_hook_wiring_safely.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_pack_schema.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_pack_schema_allowed_adapters.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_pack_schema_install.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_pipeline.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_plugin_hooks.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_plugin_manifest_schema.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_plugin_publication_gates.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_policy_registry_projection.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_projectable_subset.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_projection_io.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_projections_merge_json.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_route_lookup.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_scope_rails.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_security.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_self_host_check.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_self_host_fixture_guard.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_self_host_metadata_policy.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_self_host_recipe_config.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_sequential_implementer_dispatch_projection.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_shared_libs_projection.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_shared_prefix_contract.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_user_libs_projection.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_validate.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/build_pipeline/test_writers_emit_lf.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/conftest.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/contracts/test_agentbundle_show_schema.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/contracts/test_catalogue_fetch_credential_boundary.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/contracts/test_skill_schema.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/adapt/.adapt-discovery.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/adapt/values.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/blank_catalogue/.claude-plugin/marketplace.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/blank_catalogue/catalogue.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/blank_catalogue/packs/.gitkeep +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/blank_catalogue/packs/_example/.apm/skills/example-skill/SKILL.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/blank_catalogue/packs/_example/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/blank_catalogue/packs/_example/README.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/blank_catalogue/packs/_example/evals/eval_queries.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/blank_catalogue/packs/_example/pack.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/blank_catalogue/profiles/.gitkeep +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/blank_catalogue/profiles/_example/README.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/blank_catalogue/profiles/_example/profile.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/brownfield/values.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/brownfield-adapt/AGENTS.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/brownfield-adapt/AGENTS.upstream.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/brownfield-adapt/DESIGN.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/brownfield-adapt/EXPECTED_TREE.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/brownfield-adapt/docs/CHARTER.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/brownfield-adapt/docs/guides/how-to/index.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/brownfield-adapt/docs/howto/getting-started.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/brownfield-adapt-expected/AGENTS.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/brownfield-adapt-expected/docs/CHARTER.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/brownfield-adapt-user-home/.agentbundle/.adapt-discovery.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/brownfield-adapt-user-home/.agentbundle/state.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/catalogue_sync/adapter_contract_major_mismatch/pack.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/catalogue_wave4/catalogue.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/catalogue_wave4/packs/pack-with-journey/.apm/hook-wiring/example.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/catalogue_wave4/packs/pack-with-journey/.apm/skills/example-skill/SKILL.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/catalogue_wave4/packs/pack-with-journey/.apm/skills/example-skill/scripts/run.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/catalogue_wave4/packs/pack-with-journey/JOURNEY.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/catalogue_wave4/packs/pack-with-journey/pack.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/catalogue_wave4/packs/pack-without-journey/pack.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/catalogue_wave4/profiles/test-profile.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/cognitive-load-hosts.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/creds/skills/argv-flag/SKILL.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/creds/skills/argv-flag/scripts/cli.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/creds/skills/argv-flag-derived/SKILL.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/creds/skills/argv-flag-derived/scripts/cli.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/creds/skills/argv-flag-normalised/SKILL.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/creds/skills/argv-flag-normalised/scripts/cli.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/creds/skills/conforming/SKILL.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/creds/skills/conforming/scripts/cli.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/creds/skills/dotfile-grep/SKILL.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/creds/skills/dotfile-grep/scripts/leak.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/creds/skills/dotfile-with-optout/SKILL.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/creds/skills/dotfile-with-optout/scripts/legit.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/creds/skills/mcp-server-headers/SKILL.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/creds/skills/mcp-server-headers/scripts/cli.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/creds/skills/missing-dont-block/SKILL.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/direct/ac35_corpus_verdicts.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/direct/golden_state_0_5.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/distribution-routes/golden.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/distribution-routes/witness-packs/portable/.apm/skills/example/SKILL.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/distribution-routes/witness-packs/portable/pack.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/external_catalogue/.claude-plugin/marketplace.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/external_catalogue/AGENTS.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/external_catalogue/LICENSE-APACHE +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/external_catalogue/LICENSE-MIT +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/external_catalogue/agentbundle/_data/install-defaults.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/external_catalogue/catalogue.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/external_catalogue/packs/alpha/.apm/skills/example/SKILL.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/external_catalogue/packs/alpha/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/external_catalogue/packs/alpha/pack.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/external_catalogue/packs/alpha/seeds/AGENTS.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/external_catalogue/packs/beta/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/external_catalogue/packs/beta/pack.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/external_catalogue/profiles/example.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/install/catalogue/packs/alpha/.apm/agents/helper.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/install/catalogue/packs/alpha/.apm/commands/cmd.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/install/catalogue/packs/alpha/.apm/hook-wiring/run.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/install/catalogue/packs/alpha/.apm/hooks/run.sh +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/install/catalogue/packs/alpha/.apm/skills/example/SKILL.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/install/catalogue/packs/alpha/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/install/catalogue/packs/alpha/pack.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/kiro_ide_hook/ask_agent_basic.kiro.hook +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/kiro_ide_hook/run_command_with_placeholder.kiro.hook +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/lint_packs/clean/pack.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/lint_packs/clean/seeds/README.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/list-installed/golden_120col.txt +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/list-installed/golden_80col.txt +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/list_packs/catalogue/packs/alpha/pack.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/list_packs/catalogue/packs/beta/pack.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/local_scope/catalogue/packs/local-test-pack/.apm/skills/local-test/SKILL.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/local_scope/catalogue/packs/local-test-pack/pack.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/cc-user-hooks/.apm/hook-wiring/on-prompt.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/cc-user-hooks/.apm/hooks/on-prompt.sh +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/cc-user-hooks/pack.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/kiro-repo-hooks/.apm/agents/reviewer.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/kiro-repo-hooks/.apm/hook-wiring/on-spawn.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/kiro-repo-hooks/.apm/hooks/on-spawn.sh +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/kiro-repo-hooks/pack.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/kiro-user-hooks/.apm/agents/reviewer.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/kiro-user-hooks/.apm/hook-wiring/on-spawn.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/kiro-user-hooks/.apm/hooks/on-spawn.sh +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/kiro-user-hooks/pack.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/malformed-kiro-missing-attach/.apm/agents/reviewer.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/malformed-kiro-missing-attach/.apm/hook-wiring/on-spawn.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/malformed-kiro-missing-attach/.apm/hooks/on-spawn.sh +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/malformed-kiro-missing-attach/pack.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/malformed-kiro-pascal-events/.apm/agents/reviewer.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/malformed-kiro-pascal-events/.apm/hook-wiring/on-spawn.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/malformed-kiro-pascal-events/.apm/hooks/on-spawn.sh +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/malformed-kiro-pascal-events/pack.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/malformed-kiro-unknown-agent/.apm/agents/reviewer.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/malformed-kiro-unknown-agent/.apm/hook-wiring/on-spawn.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/malformed-kiro-unknown-agent/.apm/hooks/on-spawn.sh +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/packs/malformed-kiro-unknown-agent/pack.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/scaffold/test-pack/seeds/AGENTS.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/scaffold/test-pack/seeds/_agents-footer.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/scaffold/test-pack/seeds/docs/CHARTER.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/show_contract/agentbundle-show.schema.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/show_contract/catalogue.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/show_contract/installed_state.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/agents/reviewer.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/commands/deploy.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/hook-wiring/pre-commit.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/hooks/lint.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/hooks/pre-commit.sh +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/skills/work-loop/SKILL.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/pack.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/agents/reviewer.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/commands/deploy.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/hook-wiring/pre-commit.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/hooks/lint.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/hooks/pre-commit.sh +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/skills/work-loop/SKILL.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/pack.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/agents/reviewer.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/commands/deploy.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/hook-wiring/pre-commit.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/hooks/lint.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/hooks/pre-commit.sh +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/skills/work-loop/SKILL.md +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/pack.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/validate/bad_recipe_pack/pack.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/validate/malformed_pack/pack.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/validate/valid_pack/pack.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/fixtures/validate/version_mismatch_pack/pack.toml +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/__init__.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/_https_archive.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_adapt_cmd.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_adapt_dual_scope.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_adapt_preflight_detection.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_adapt_schema_migration.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_apm_install_route.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_blank_catalogue.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_brownfield_adapt_end_to_end.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_brownfield_round_trip.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_brownfield_user_home_fixture.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_build_check_drift_gates.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_build_derivation_apm.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_build_derivation_claude_plugins.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_bundled_contracts_fail_closed.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_catalogue_init.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_catalogue_init_packageable.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_catalogue_verify_adapter_compat.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_catalogue_verify_dependencies.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_catalogue_verify_external_portability.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_catalogue_verify_fixture_checks.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_catalogue_verify_marketplace.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_catalogue_verify_output_drift.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_catalogue_verify_package_preflight.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_catalogue_verify_plugin_path.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_catalogue_verify_profile_schema.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_catalogue_verify_step1.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_catalogue_wave4_index_generator.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_catalogue_wave4_integration.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_catalogue_wave4_journey_validator.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_catalogue_wave4_schema.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_cc_user_hooks_fixture.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_claude_plugins_install_route.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_config_cascade.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_credential_brokers_pack_install.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_credentials_wheel.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_direct_install.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_discovery_schema_cross_consumer.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_editable_source_detection.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_fixtures_validate.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_hook_wiring_ingress.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_adapt_chain.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_cmd.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_converters_user_scope.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_copilot_full_parity.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_core_smoke.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_default_source.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_dependencies_gate.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_dropped_primitives_warning.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_dual_scope.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_layout_is_best_effort.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_orphan_reshape.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_pack_metadata_shape.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_profile.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_profile_live.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_repo_scope_per_adapter.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_research_user_scope.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_seed_delivery.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_session_start_wiring.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_upgrade_offer.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_user_hooks.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_install_user_scope_allowed_adapters.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_jfrog_cli_contract.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_kiro_ide_hook_e2e.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_kiro_repo_hooks_fixture.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_kiro_user_hooks_fixture.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_list_packs_cmd.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_local_scope_install.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_marketplace_entry_validation.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_marketplace_manifest_regression.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_multi_pack_install.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_orphan_cleanup_respects_foreign_state.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_plugin_route_membership.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_portable_catalogue_authentication.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_recommends_cross_scope.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_reconcile.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_rename_hint_cli.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_rename_migration_e2e.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_reserved_path_filter.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_scaffold_projection.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_self_host_schema_migration.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_self_host_sweep_respects_state.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_shared_prefix_coexistence.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_show_cmd.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_tier_invariants.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_trust_fallback_tls.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_uninstall_cmd.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_uninstall_user_hooks.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_upgrade_attach_to_agent.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_upgrade_cmd.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_upgrade_user_hooks.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_version_gate_matrix.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_workspace_mcp_git_fsm.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/integration/test_zipapp.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/performance/__init__.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/performance/test_direct_family2_budget_cost.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/test_adapter_permissions_projection.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/test_workspace_mcp_elicit.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/test_workspace_mcp_event_bridge.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/test_workspace_mcp_git.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/test_workspace_mcp_git_scope.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/test_workspace_mcp_layout_override.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/test_workspace_mcp_lifecycle.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/test_workspace_mcp_stdin.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/test_workspace_mcp_tools.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/__init__.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/conftest.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_adapt_discovery_schema.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_adapter_symlink_policy.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_append_layout_section.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_architect_readme_install_command.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_bundled_contract_errors.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_archive_unit_digests.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_ci_contract.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_curation_deps.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_fetch.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_fetch_jfrog.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_init_cli_self_hosted.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_manifest_schema.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_pack_defaults.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_package_compare.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_package_include_diagnostic.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_package_refusal.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_self_hosted_export_removal.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_skill_spec_lint.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_spec_version.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_sync.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_sync_fixture_set.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_tooling_archive.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_tooling_build.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_tooling_defaults.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_tooling_foundation.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_tooling_identity.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_tooling_init.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_tooling_lint.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_tooling_package.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_tooling_self_host.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_tooling_self_hosted_init.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_tooling_source_package.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_tooling_verify.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_trust_fallback.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_unit_digests.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_wave2_schema.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_wave2_validation.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_wave3_contracts_cli.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_wave3_contracts_inspector.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_wave3_init_nextsteps.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_catalogue_wave3_offline_navigation.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_cli_catalogue_optional.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_cli_help_lists_config.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_cli_list_targets_help.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_cli_namespace_fixture.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_cli_path_normalisation.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_cli_profile_surface.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_cli_scope_flags.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_codex_agent_toml.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_codex_projection_modes.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_cognitive_load_seed_contract.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_collect_tree_symlinks.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_common_classify_seeds.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_config.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_config_cmd.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_configured_adapter.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_confirm_helper.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_contract_parity.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_contract_v0_3_schema.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_copilot_agent_md.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_copilot_hooks_json.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_copilot_user_scope_wiring.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_credbroker_lint_hardening.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_dependencies_batch.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_diff_cmd.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_direct_admission.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_direct_architecture_controls.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_direct_diagnostics.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_direct_lifecycle_facts.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_direct_source_acquisition.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_direct_source_state.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_direct_upgrade.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_direct_validate.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_footprint_ownership.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_https_catalogue.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_init_state_cmd.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_install_argparse_adapter_flag.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_install_argparse_emit_install_routes.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_install_defaults_preferred_adapter.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_install_dropped_primitives_warning.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_install_event_dropped_wirings.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_install_first_value_handoff.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_install_force_help.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_install_inband_detection.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_install_messages.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_install_messages_repo_scope.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_install_refusal_ordering.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_install_state_provenance.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_kiro_ide_hook_projection.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_kiro_ide_hook_rail.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_kiro_ide_hook_schema.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_layout_bases_anchoring.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_lint_agent_artifacts_metadata_auth.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_list_installed_cmd.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_list_installed_status.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_list_targets_cmd.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_local_exclude_git_cache.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_local_scope_schema.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_local_scope_t10_uninstall.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_local_scope_t12_show.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_local_scope_t2_resolve.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_local_scope_t3_config.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_local_scope_t4_state_path.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_local_scope_t5_list_installed.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_local_scope_t7_install_gates.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_local_scope_t8_install.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_local_scope_t9_exclude.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_marker_schema_version_parity.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_merge_into_agent_json.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_multi_adapter_disambiguator.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_nested_symlink_hardening.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_no_contracts_fallback.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_offer_upgrade_namespace.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_okf_discovery.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_org_bootstrap.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_orphan_sweep_guards.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_pack_config_api.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_pack_evals_bundled_contract.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_pack_inventory.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_pack_layout_section_schema.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_pack_renames.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_package_catalogue.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_packstate_source_provenance.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_pipeline_phase_order.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_plugin_scope_filter.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_profile_reader.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_render.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_render_cmd.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_render_table.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_resolve_state_path.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_resolve_target_adapter_user_config.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_resolve_user_scope_target_adapter.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_route_surface_parity.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_safety.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_safety_repo_scope_prefixes.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_safety_scan_per_pack_scoping.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_scaffold_cmd.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_scope.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_self_host_windows.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_shared_prefix_disclosure.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_source_conflict_guard.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_source_defaults.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_state_v01_refuse_write.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_state_v02.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_state_v0_4_schema.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_statelock.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_statelock_hardening.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_system_trust.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_target_resolver.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_toml_emitters.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_unresolved_markers.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_upgrade_bulk_all.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_upgrade_recap.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_upgrade_source_inference.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_user_config_io.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_user_config_isolation.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_user_config_path.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_user_config_source.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_user_merge_json.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_validate_attach_to_agent.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_validate_categories.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_validate_cmd.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_validate_hook_wiring_per_file_compatibility.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_values_from_shapes.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_version.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_windows_direct_suite_registration.py +0 -0
- {agentbundle-0.57.0 → agentbundle-0.58.1}/tests/unit/test_workspace_mcp_events_poller.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agentbundle
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.58.1
|
|
4
4
|
Summary: npm for your coding agent. Install packs of skills, subagents, and hooks into any repo, for every major agent.
|
|
5
5
|
Author-email: eugenelim <eugenelim@users.noreply.github.com>
|
|
6
6
|
License-Expression: Apache-2.0 OR MIT
|
|
@@ -35,6 +35,20 @@ python -m pip install agentbundle
|
|
|
35
35
|
|
|
36
36
|
Requires Python 3.11+. Runs on macOS, Linux, and Windows.
|
|
37
37
|
|
|
38
|
+
## What's new in 0.58.1
|
|
39
|
+
|
|
40
|
+
The workspace MCP bridge understands supervisor runs. While a spec has a
|
|
41
|
+
supervisor status file, `workspace_status` shows that run's id, stage, and
|
|
42
|
+
`run_active` signal. A pending human question appears only as framed untrusted
|
|
43
|
+
text that has passed a content-safety check, or as a fixed placeholder. A
|
|
44
|
+
status file that is a link, oversized, or malformed shows no run and no gate.
|
|
45
|
+
|
|
46
|
+
## What's new in 0.58.0
|
|
47
|
+
|
|
48
|
+
The shared file-safety helper gains `write_confined_regular_file`, which creates
|
|
49
|
+
or updates a file inside a root without following links and restores the
|
|
50
|
+
original bytes if a write fails.
|
|
51
|
+
|
|
38
52
|
## What's new in 0.57.0
|
|
39
53
|
|
|
40
54
|
`install` and `upgrade` now print the steps to move to a renamed pack when the
|
|
@@ -14,6 +14,20 @@ python -m pip install agentbundle
|
|
|
14
14
|
|
|
15
15
|
Requires Python 3.11+. Runs on macOS, Linux, and Windows.
|
|
16
16
|
|
|
17
|
+
## What's new in 0.58.1
|
|
18
|
+
|
|
19
|
+
The workspace MCP bridge understands supervisor runs. While a spec has a
|
|
20
|
+
supervisor status file, `workspace_status` shows that run's id, stage, and
|
|
21
|
+
`run_active` signal. A pending human question appears only as framed untrusted
|
|
22
|
+
text that has passed a content-safety check, or as a fixed placeholder. A
|
|
23
|
+
status file that is a link, oversized, or malformed shows no run and no gate.
|
|
24
|
+
|
|
25
|
+
## What's new in 0.58.0
|
|
26
|
+
|
|
27
|
+
The shared file-safety helper gains `write_confined_regular_file`, which creates
|
|
28
|
+
or updates a file inside a root without following links and restores the
|
|
29
|
+
original bytes if a write fails.
|
|
30
|
+
|
|
17
31
|
## What's new in 0.57.0
|
|
18
32
|
|
|
19
33
|
`install` and `upgrade` now print the steps to move to a renamed pack when the
|
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
"""_content_safety — content-safety guard for durable semantic writer boundaries.
|
|
2
|
+
|
|
3
|
+
Accepts a named profile and payload bytes; returns a typed ContentSafetyDecision
|
|
4
|
+
without persisting anything. Standard library only.
|
|
5
|
+
|
|
6
|
+
Every durable semantic writer and replay boundary is registered in
|
|
7
|
+
SLICE_1_WRITER_BOUNDARIES before use; a missing or unknown profile refuses
|
|
8
|
+
without persisting payload bytes. The registered writer boundary table names
|
|
9
|
+
the same set and the same profiles.
|
|
10
|
+
|
|
11
|
+
Rejected payload bytes, excerpts, and content-derived hashes never leave this
|
|
12
|
+
module; accepted free text is returned as typed UntrustedData for consumers.
|
|
13
|
+
The inert wrapper signals that the value must not be concatenated into system
|
|
14
|
+
instructions, commands, tool calls, paths, approvals, or authority.
|
|
15
|
+
|
|
16
|
+
Classification vocabulary (content-safety-policy.v1):
|
|
17
|
+
public, repository-internal — may persist as bounded Git text
|
|
18
|
+
restricted — requires a controlled reference; cannot persist
|
|
19
|
+
credential, personal — rejected immediately; producer-declared guard
|
|
20
|
+
unknown — rejected as unknown-class
|
|
21
|
+
|
|
22
|
+
Python 3.11+ standard library only. No third-party imports, no packaging, no
|
|
23
|
+
installation.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
import hashlib
|
|
27
|
+
import re
|
|
28
|
+
from dataclasses import dataclass
|
|
29
|
+
from typing import ClassVar, Final
|
|
30
|
+
|
|
31
|
+
__all__ = [
|
|
32
|
+
"ContentSafetyDecision",
|
|
33
|
+
"UntrustedData",
|
|
34
|
+
"POLICY_VERSION",
|
|
35
|
+
"BOUNDARY_PROFILES",
|
|
36
|
+
"SLICE_1_WRITER_BOUNDARIES",
|
|
37
|
+
"check_content_safety",
|
|
38
|
+
"wrap_as_untrusted",
|
|
39
|
+
]
|
|
40
|
+
|
|
41
|
+
# ── Policy identity ──────────────────────────────────────────────────────────
|
|
42
|
+
|
|
43
|
+
# Stable version identifier for this policy, matching content-safety-policy.v1.
|
|
44
|
+
POLICY_VERSION: Final[str] = "slice-1.v1"
|
|
45
|
+
|
|
46
|
+
# ── Boundary profile definitions ─────────────────────────────────────────────
|
|
47
|
+
#
|
|
48
|
+
# Per-profile size and shape limits for each content-safety boundary profile.
|
|
49
|
+
# Keys: profile names used in the semantic boundary and writer boundary tables.
|
|
50
|
+
# Every key in SLICE_1_WRITER_BOUNDARIES must map to a key here.
|
|
51
|
+
BOUNDARY_PROFILES: Final[dict[str, dict]] = {
|
|
52
|
+
# 64 KiB: allowlisted identifiers, enums, digests, numbers, repo-relative paths
|
|
53
|
+
"structured-control": {
|
|
54
|
+
"max_bytes": 64 * 1024,
|
|
55
|
+
},
|
|
56
|
+
# 64 KiB: embedded evidence; raw output is a controlled reference, never embedded
|
|
57
|
+
"evidence-embedded-record": {
|
|
58
|
+
"max_bytes": 64 * 1024,
|
|
59
|
+
},
|
|
60
|
+
# 1 MiB total, 64 KiB per free-text field: natural prose is UntrustedData
|
|
61
|
+
"review-report": {
|
|
62
|
+
"max_total_bytes": 1 * 1024 * 1024,
|
|
63
|
+
"max_free_text_bytes": 64 * 1024,
|
|
64
|
+
},
|
|
65
|
+
# 256 KiB, 1 000 conflict paths: paths are repository-relative and classified
|
|
66
|
+
"integration-diagnostic": {
|
|
67
|
+
"max_bytes": 256 * 1024,
|
|
68
|
+
},
|
|
69
|
+
# 64 KiB: raw transcripts and unbounded tool output reject
|
|
70
|
+
"knowledge-observation": {
|
|
71
|
+
"max_bytes": 64 * 1024,
|
|
72
|
+
},
|
|
73
|
+
# Existing result byte cap: uses admission and scanner policy
|
|
74
|
+
"product-addition": {},
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
# ── Writer boundary registry ──────────────────────────────────────────────────
|
|
78
|
+
#
|
|
79
|
+
# The SINGLE declared registry that every durable semantic writer and replay
|
|
80
|
+
# boundary must use. A writer that bypasses this registry or uses a profile
|
|
81
|
+
# other than the one assigned here violates the content-safety contract.
|
|
82
|
+
#
|
|
83
|
+
# The registered writer boundary table names this same set and these same
|
|
84
|
+
# profiles. The roster test asserts both agree.
|
|
85
|
+
#
|
|
86
|
+
# Policy-import writers: initial-plan-review.v1, approval-record.v1, reviewed-execution-envelope.v1
|
|
87
|
+
# Evidence-store writers: semantic-evidence-transaction.v1 (frame), evidence-receipt.v1,
|
|
88
|
+
# evidence-supersession.v1
|
|
89
|
+
# Security-event writer: security-event.v1
|
|
90
|
+
# Shadow facade writers: delivery-subject.v1, acceptance-property.v1,
|
|
91
|
+
# acceptance-verdict.v1
|
|
92
|
+
SLICE_1_WRITER_BOUNDARIES: Final[dict[str, str]] = {
|
|
93
|
+
"initial-plan-review.v1": "structured-control",
|
|
94
|
+
"approval-record.v1": "structured-control",
|
|
95
|
+
"reviewed-execution-envelope.v1": "structured-control",
|
|
96
|
+
"security-event.v1": "structured-control",
|
|
97
|
+
"semantic-evidence-transaction.v1": "structured-control",
|
|
98
|
+
"evidence-receipt.v1": "evidence-embedded-record",
|
|
99
|
+
"evidence-supersession.v1": "evidence-embedded-record",
|
|
100
|
+
"delivery-subject.v1": "structured-control",
|
|
101
|
+
"acceptance-property.v1": "structured-control",
|
|
102
|
+
"acceptance-verdict.v1": "structured-control",
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
# ── Classification vocabulary ─────────────────────────────────────────────────
|
|
106
|
+
|
|
107
|
+
# Only these two classes may persist as bounded Git text.
|
|
108
|
+
_PERSISTABLE_CLASSES: Final[frozenset[str]] = frozenset(
|
|
109
|
+
{"public", "repository-internal"}
|
|
110
|
+
)
|
|
111
|
+
_CREDENTIAL_CLASS: Final[str] = "credential"
|
|
112
|
+
_PERSONAL_CLASS: Final[str] = "personal"
|
|
113
|
+
|
|
114
|
+
# ── C0 control-character scanner ─────────────────────────────────────────────
|
|
115
|
+
#
|
|
116
|
+
# Rejects C0 control characters (0x00–0x1F) and DEL (0x7F), except:
|
|
117
|
+
# HT (0x09), LF (0x0A), CR (0x0D) — valid whitespace in text content.
|
|
118
|
+
# ESC and other C0 survivors are dangerous in terminal-captured streams.
|
|
119
|
+
_CONTROL_RE: Final[re.Pattern[str]] = re.compile(
|
|
120
|
+
r"[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]"
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
# ── Credential scanner patterns ───────────────────────────────────────────────
|
|
124
|
+
#
|
|
125
|
+
# High-confidence token shapes from the required scanner corpus.
|
|
126
|
+
# Matching any pattern returns rejected-credential without payload retention.
|
|
127
|
+
_CREDENTIAL_PATTERNS: Final[list[re.Pattern[str]]] = [
|
|
128
|
+
# GitHub personal access tokens (classic 40-char suffix form)
|
|
129
|
+
re.compile(r"ghp_[A-Za-z0-9]{36,}"),
|
|
130
|
+
# GitHub fine-grained PATs
|
|
131
|
+
re.compile(r"github_pat_[A-Za-z0-9_]{76,}"),
|
|
132
|
+
# AWS access key IDs
|
|
133
|
+
re.compile(r"AKIA[0-9A-Z]{16}"),
|
|
134
|
+
# Generic high-entropy API/secret/access-token assignments (case-insensitive)
|
|
135
|
+
re.compile(r"(?i)api[-_]?key\s*[:=]\s*[A-Za-z0-9/+_.\-]{20,}"),
|
|
136
|
+
re.compile(r"(?i)secret[-_]?key\s*[:=]\s*[A-Za-z0-9/+_.\-]{20,}"),
|
|
137
|
+
re.compile(r"(?i)access[-_]?token\s*[:=]\s*[A-Za-z0-9/+_.\-]{20,}"),
|
|
138
|
+
]
|
|
139
|
+
|
|
140
|
+
# ── Personal-data scanner patterns ────────────────────────────────────────────
|
|
141
|
+
#
|
|
142
|
+
# Direct personal identifiers from the required scanner corpus.
|
|
143
|
+
# Matching any pattern returns rejected-personal-data without payload retention.
|
|
144
|
+
_PERSONAL_DATA_PATTERNS: Final[list[re.Pattern[str]]] = [
|
|
145
|
+
# Email addresses (any domain)
|
|
146
|
+
re.compile(r"[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}"),
|
|
147
|
+
# US Social Security Numbers
|
|
148
|
+
re.compile(r"\b\d{3}-\d{2}-\d{4}\b"),
|
|
149
|
+
# US phone numbers (various formats)
|
|
150
|
+
re.compile(r"\b(?:\+1[-. ]?)?\(?\d{3}\)?[-. ]?\d{3}[-. ]?\d{4}\b"),
|
|
151
|
+
]
|
|
152
|
+
|
|
153
|
+
# ── Executable-structure scanner patterns ─────────────────────────────────────
|
|
154
|
+
#
|
|
155
|
+
# Tool-call objects, shell shebangs, and authority-shaped fields that must not
|
|
156
|
+
# persist in any semantic record. These form executable or capability-granting
|
|
157
|
+
# structures in the content stream.
|
|
158
|
+
_EXECUTABLE_PATTERNS: Final[list[re.Pattern[str]]] = [
|
|
159
|
+
# Agentic tool-call object patterns (common in LLM APIs)
|
|
160
|
+
re.compile(r'"tool_call[s]?"\s*:', re.IGNORECASE),
|
|
161
|
+
re.compile(r'"type"\s*:\s*"tool_use"', re.IGNORECASE),
|
|
162
|
+
re.compile(r'"function"\s*:\s*\{[^}]*"name"\s*:', re.IGNORECASE),
|
|
163
|
+
# Shell shebangs — interpreter invocations that must not appear in records
|
|
164
|
+
re.compile(r"^#!(?:/usr)?/(?:bin|env)\b"),
|
|
165
|
+
# Authority-shaped fields — unknown capability grants or privilege escalations
|
|
166
|
+
re.compile(r'"_(?:grant|authority|sudo|root|admin|capability)\b', re.IGNORECASE),
|
|
167
|
+
# Embedded script/frame tags
|
|
168
|
+
re.compile(r"<(?:script|iframe|object|embed)\b", re.IGNORECASE),
|
|
169
|
+
]
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
# ── Decision dataclass ────────────────────────────────────────────────────────
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
@dataclass(frozen=True)
|
|
176
|
+
class ContentSafetyDecision:
|
|
177
|
+
"""Typed content-safety decision returned by check_content_safety.
|
|
178
|
+
|
|
179
|
+
Maps to content-safety-decision.v1 schema fields.
|
|
180
|
+
|
|
181
|
+
Invariant: rejected decisions carry NO payload bytes, excerpts, or
|
|
182
|
+
content-derived hashes. Only ``accepted`` carries normalized_record_digest.
|
|
183
|
+
The dataclass raises ValueError if either half of the invariant is violated,
|
|
184
|
+
so any code that constructs a decision with a digest on rejection is caught
|
|
185
|
+
at construction time rather than silently leaking.
|
|
186
|
+
"""
|
|
187
|
+
|
|
188
|
+
source_record_id: str
|
|
189
|
+
policy_version: str
|
|
190
|
+
profile: str
|
|
191
|
+
decision_code: str
|
|
192
|
+
# Present only when decision_code == "accepted". Absent on any rejection.
|
|
193
|
+
normalized_record_digest: str | None = None
|
|
194
|
+
|
|
195
|
+
def __post_init__(self) -> None:
|
|
196
|
+
if self.decision_code != "accepted" and self.normalized_record_digest is not None:
|
|
197
|
+
raise ValueError(
|
|
198
|
+
"ContentSafetyDecision: rejected decision must not carry "
|
|
199
|
+
f"normalized_record_digest (decision_code={self.decision_code!r})"
|
|
200
|
+
)
|
|
201
|
+
if self.decision_code == "accepted" and self.normalized_record_digest is None:
|
|
202
|
+
raise ValueError(
|
|
203
|
+
"ContentSafetyDecision: accepted decision must carry "
|
|
204
|
+
"normalized_record_digest"
|
|
205
|
+
)
|
|
206
|
+
|
|
207
|
+
@property
|
|
208
|
+
def accepted(self) -> bool:
|
|
209
|
+
"""True iff decision_code is 'accepted'."""
|
|
210
|
+
return self.decision_code == "accepted"
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
# ── UntrustedData wrapper ─────────────────────────────────────────────────────
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
@dataclass(frozen=True)
|
|
217
|
+
class UntrustedData:
|
|
218
|
+
"""Typed inert-data wrapper for accepted free text.
|
|
219
|
+
|
|
220
|
+
Maps to untrusted-data.v1 schema fields.
|
|
221
|
+
|
|
222
|
+
Consumers MUST NOT concatenate .value into system instructions, commands,
|
|
223
|
+
tool calls, paths, approvals, or authority. The value field is opaque data,
|
|
224
|
+
not procedure. The four boolean properties below enforce the typed boundary:
|
|
225
|
+
they always return False because an inert wrapper is never an executable.
|
|
226
|
+
"""
|
|
227
|
+
|
|
228
|
+
record_id: str
|
|
229
|
+
field_path: str
|
|
230
|
+
policy_version: str
|
|
231
|
+
value: str
|
|
232
|
+
|
|
233
|
+
# Schema version for untrusted-data.v1 (class-level constant, not a field).
|
|
234
|
+
SCHEMA_VERSION: ClassVar[int] = 1
|
|
235
|
+
|
|
236
|
+
def can_select_tools(self) -> bool:
|
|
237
|
+
"""Always False: typed inert data cannot select tools."""
|
|
238
|
+
return False
|
|
239
|
+
|
|
240
|
+
def can_grant_authority(self) -> bool:
|
|
241
|
+
"""Always False: typed inert data cannot grant authority."""
|
|
242
|
+
return False
|
|
243
|
+
|
|
244
|
+
def can_alter_procedure(self) -> bool:
|
|
245
|
+
"""Always False: typed inert data cannot alter procedure."""
|
|
246
|
+
return False
|
|
247
|
+
|
|
248
|
+
def can_supply_executable_path(self) -> bool:
|
|
249
|
+
"""Always False: typed inert data cannot supply executable paths."""
|
|
250
|
+
return False
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
# ── Internal helpers ──────────────────────────────────────────────────────────
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
def _reject(
|
|
257
|
+
source_record_id: str,
|
|
258
|
+
policy_version: str,
|
|
259
|
+
profile: str,
|
|
260
|
+
decision_code: str,
|
|
261
|
+
) -> ContentSafetyDecision:
|
|
262
|
+
"""Construct a rejection decision.
|
|
263
|
+
|
|
264
|
+
Carries NO payload bytes, excerpts, or content-derived hashes.
|
|
265
|
+
normalized_record_digest is always absent.
|
|
266
|
+
"""
|
|
267
|
+
return ContentSafetyDecision(
|
|
268
|
+
source_record_id=source_record_id,
|
|
269
|
+
policy_version=policy_version,
|
|
270
|
+
profile=profile,
|
|
271
|
+
decision_code=decision_code,
|
|
272
|
+
normalized_record_digest=None,
|
|
273
|
+
)
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
def _accept(
|
|
277
|
+
source_record_id: str,
|
|
278
|
+
policy_version: str,
|
|
279
|
+
profile: str,
|
|
280
|
+
normalized_bytes: bytes,
|
|
281
|
+
) -> ContentSafetyDecision:
|
|
282
|
+
"""Construct an acceptance decision.
|
|
283
|
+
|
|
284
|
+
The normalized_record_digest is the SHA-256 of the normalized bytes,
|
|
285
|
+
prefixed with 'sha256:'. The caller supplies normalized bytes, not raw.
|
|
286
|
+
"""
|
|
287
|
+
digest = "sha256:" + hashlib.sha256(normalized_bytes).hexdigest()
|
|
288
|
+
return ContentSafetyDecision(
|
|
289
|
+
source_record_id=source_record_id,
|
|
290
|
+
policy_version=policy_version,
|
|
291
|
+
profile=profile,
|
|
292
|
+
decision_code="accepted",
|
|
293
|
+
normalized_record_digest=digest,
|
|
294
|
+
)
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
def _profile_max_bytes(profile_cfg: dict) -> int | None:
|
|
298
|
+
"""Return the byte cap for the given profile config, or None if uncapped."""
|
|
299
|
+
if "max_bytes" in profile_cfg:
|
|
300
|
+
return profile_cfg["max_bytes"]
|
|
301
|
+
if "max_total_bytes" in profile_cfg:
|
|
302
|
+
return profile_cfg["max_total_bytes"]
|
|
303
|
+
return None
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
# ── Public guard entry point ──────────────────────────────────────────────────
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
def check_content_safety(
|
|
310
|
+
profile: str,
|
|
311
|
+
payload: bytes,
|
|
312
|
+
*,
|
|
313
|
+
source_record_id: str,
|
|
314
|
+
classification: str = "public",
|
|
315
|
+
) -> ContentSafetyDecision:
|
|
316
|
+
"""Apply the named content-safety profile to payload bytes.
|
|
317
|
+
|
|
318
|
+
Returns a ContentSafetyDecision without persisting anything.
|
|
319
|
+
On rejection, carries NO payload bytes, excerpts, or content-derived hashes.
|
|
320
|
+
On acceptance, carries a SHA-256 digest of the normalized bytes.
|
|
321
|
+
|
|
322
|
+
Checks, in order:
|
|
323
|
+
1. Profile lookup — unknown profile: rejected-missing-profile
|
|
324
|
+
2. Classification check — credential: rejected-credential
|
|
325
|
+
personal: rejected-personal-data
|
|
326
|
+
restricted or unknown: rejected-unknown-class
|
|
327
|
+
3. UTF-8 decoding — invalid encoding: rejected-encoding
|
|
328
|
+
4. Control characters — C0 except HT/LF/CR and DEL: rejected-encoding
|
|
329
|
+
5. Size limit — over profile cap: rejected-size
|
|
330
|
+
6. Executable structure — tool-call, shebang, authority field: rejected-structure
|
|
331
|
+
7. Credential scanner — high-confidence token patterns: rejected-credential
|
|
332
|
+
8. Personal-data scanner — direct identifiers: rejected-personal-data
|
|
333
|
+
9. Accept — returns digest of CRLF-normalized UTF-8 bytes
|
|
334
|
+
|
|
335
|
+
Args:
|
|
336
|
+
profile: Named boundary profile from BOUNDARY_PROFILES.
|
|
337
|
+
payload: Raw bytes to evaluate. Never stored on rejection.
|
|
338
|
+
source_record_id: Stable identity of the source record.
|
|
339
|
+
classification: Producer-declared content class. Defaults to 'public'.
|
|
340
|
+
Only 'public' and 'repository-internal' may persist.
|
|
341
|
+
"""
|
|
342
|
+
# Step 1 — Profile lookup. An unknown profile blocks without inspecting payload.
|
|
343
|
+
profile_cfg = BOUNDARY_PROFILES.get(profile)
|
|
344
|
+
if profile_cfg is None:
|
|
345
|
+
return _reject(source_record_id, POLICY_VERSION, profile, "rejected-missing-profile")
|
|
346
|
+
|
|
347
|
+
# Step 2 — Classification check. Reject non-persistable classes immediately.
|
|
348
|
+
if classification not in _PERSISTABLE_CLASSES:
|
|
349
|
+
if classification == _CREDENTIAL_CLASS:
|
|
350
|
+
return _reject(source_record_id, POLICY_VERSION, profile, "rejected-credential")
|
|
351
|
+
if classification == _PERSONAL_CLASS:
|
|
352
|
+
return _reject(source_record_id, POLICY_VERSION, profile, "rejected-personal-data")
|
|
353
|
+
# restricted and any unknown class use the unknown-class code.
|
|
354
|
+
return _reject(source_record_id, POLICY_VERSION, profile, "rejected-unknown-class")
|
|
355
|
+
|
|
356
|
+
# Step 3 — UTF-8 encoding check. Payload must decode without error.
|
|
357
|
+
try:
|
|
358
|
+
text = payload.decode("utf-8", errors="strict")
|
|
359
|
+
except UnicodeDecodeError:
|
|
360
|
+
return _reject(source_record_id, POLICY_VERSION, profile, "rejected-encoding")
|
|
361
|
+
|
|
362
|
+
# Step 4 — Control-character check. C0 except HT/LF/CR and DEL reject.
|
|
363
|
+
if _CONTROL_RE.search(text):
|
|
364
|
+
return _reject(source_record_id, POLICY_VERSION, profile, "rejected-encoding")
|
|
365
|
+
|
|
366
|
+
# Step 5 — Size limit against the profile cap.
|
|
367
|
+
max_bytes = _profile_max_bytes(profile_cfg)
|
|
368
|
+
if max_bytes is not None and len(payload) > max_bytes:
|
|
369
|
+
return _reject(source_record_id, POLICY_VERSION, profile, "rejected-size")
|
|
370
|
+
|
|
371
|
+
# Step 6 — Executable-structure check. Tool-call objects, shebangs, and
|
|
372
|
+
# authority-shaped fields signal executable or capability-granting content.
|
|
373
|
+
for pattern in _EXECUTABLE_PATTERNS:
|
|
374
|
+
if pattern.search(text):
|
|
375
|
+
return _reject(source_record_id, POLICY_VERSION, profile, "rejected-structure")
|
|
376
|
+
|
|
377
|
+
# Step 7 — Credential scanner. High-confidence token patterns reject the
|
|
378
|
+
# whole record without retaining any payload bytes.
|
|
379
|
+
for pattern in _CREDENTIAL_PATTERNS:
|
|
380
|
+
if pattern.search(text):
|
|
381
|
+
return _reject(source_record_id, POLICY_VERSION, profile, "rejected-credential")
|
|
382
|
+
|
|
383
|
+
# Step 8 — Personal-data scanner. Direct personal identifiers reject without
|
|
384
|
+
# payload retention.
|
|
385
|
+
for pattern in _PERSONAL_DATA_PATTERNS:
|
|
386
|
+
if pattern.search(text):
|
|
387
|
+
return _reject(source_record_id, POLICY_VERSION, profile, "rejected-personal-data")
|
|
388
|
+
|
|
389
|
+
# Step 9 — Accept. Normalize CRLF→LF (matches canonical_contract normalization)
|
|
390
|
+
# and compute the SHA-256 digest of the normalized UTF-8 bytes.
|
|
391
|
+
normalized = text.replace("\r\n", "\n").replace("\r", "\n")
|
|
392
|
+
normalized_bytes = normalized.encode("utf-8")
|
|
393
|
+
return _accept(source_record_id, POLICY_VERSION, profile, normalized_bytes)
|
|
394
|
+
|
|
395
|
+
|
|
396
|
+
# ── UntrustedData constructor ─────────────────────────────────────────────────
|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
def wrap_as_untrusted(
|
|
400
|
+
record_id: str,
|
|
401
|
+
field_path: str,
|
|
402
|
+
value: str,
|
|
403
|
+
) -> UntrustedData:
|
|
404
|
+
"""Wrap accepted free text as typed inert UntrustedData.
|
|
405
|
+
|
|
406
|
+
The returned wrapper records the policy version that admitted the value
|
|
407
|
+
and the field path within the source record. Callers MUST NOT pass a value
|
|
408
|
+
that was rejected by check_content_safety; this function has no way to
|
|
409
|
+
verify that precondition and trusts the caller's decision record.
|
|
410
|
+
|
|
411
|
+
Consumers of the returned UntrustedData MUST NOT concatenate .value into
|
|
412
|
+
system instructions, commands, tool calls, paths, approvals, or authority.
|
|
413
|
+
"""
|
|
414
|
+
return UntrustedData(
|
|
415
|
+
record_id=record_id,
|
|
416
|
+
field_path=field_path,
|
|
417
|
+
policy_version=POLICY_VERSION,
|
|
418
|
+
value=value,
|
|
419
|
+
)
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import os
|
|
6
|
+
import re
|
|
6
7
|
import stat
|
|
7
8
|
from contextlib import contextmanager
|
|
8
9
|
from hashlib import sha256
|
|
@@ -482,3 +483,210 @@ def sha256_confined_regular_file(root: Path, path: Path) -> str:
|
|
|
482
483
|
for chunk in iter(lambda: handle.read(1024 * 1024), b""):
|
|
483
484
|
digest.update(chunk)
|
|
484
485
|
return digest.hexdigest()
|
|
486
|
+
|
|
487
|
+
|
|
488
|
+
_SHA256_HEX = re.compile(r"[0-9a-f]{64}")
|
|
489
|
+
|
|
490
|
+
|
|
491
|
+
def _write_open_flags() -> int:
|
|
492
|
+
"""Flags every write-path ``os.open`` adds, limited to what ``os`` has."""
|
|
493
|
+
flags = getattr(os, "O_BINARY", 0)
|
|
494
|
+
for name in ("O_NOFOLLOW", "O_CLOEXEC", "O_NONBLOCK"):
|
|
495
|
+
flags |= getattr(os, name, 0)
|
|
496
|
+
return flags
|
|
497
|
+
|
|
498
|
+
|
|
499
|
+
def _write_all(descriptor: int, data: bytes) -> None:
|
|
500
|
+
"""Write every byte of *data*, continuing after a short write."""
|
|
501
|
+
view = memoryview(data)
|
|
502
|
+
while len(view):
|
|
503
|
+
written = os.write(descriptor, view)
|
|
504
|
+
if written <= 0:
|
|
505
|
+
raise OSError("write made no progress")
|
|
506
|
+
view = view[written:]
|
|
507
|
+
|
|
508
|
+
|
|
509
|
+
def _read_all(descriptor: int) -> bytes:
|
|
510
|
+
"""Read a descriptor to end of file."""
|
|
511
|
+
chunks: list[bytes] = []
|
|
512
|
+
while True:
|
|
513
|
+
chunk = os.read(descriptor, 1024 * 1024)
|
|
514
|
+
if not chunk:
|
|
515
|
+
return b"".join(chunks)
|
|
516
|
+
chunks.append(chunk)
|
|
517
|
+
|
|
518
|
+
|
|
519
|
+
def _create_confined_file(
|
|
520
|
+
root: Path,
|
|
521
|
+
path: Path,
|
|
522
|
+
data: bytes,
|
|
523
|
+
*,
|
|
524
|
+
relative: str,
|
|
525
|
+
parent_fd: int | None,
|
|
526
|
+
leaf: str,
|
|
527
|
+
) -> None:
|
|
528
|
+
"""Create *path* exclusively; remove only the file this call created."""
|
|
529
|
+
flags = os.O_WRONLY | os.O_CREAT | os.O_EXCL | _write_open_flags()
|
|
530
|
+
try:
|
|
531
|
+
if parent_fd is None:
|
|
532
|
+
descriptor = os.open(path, flags, 0o600)
|
|
533
|
+
else:
|
|
534
|
+
descriptor = os.open(leaf, flags, 0o600, dir_fd=parent_fd)
|
|
535
|
+
except OSError as exc:
|
|
536
|
+
raise UnsafeContentError(
|
|
537
|
+
f"target cannot be created safely: {relative}"
|
|
538
|
+
) from exc
|
|
539
|
+
identity: tuple[int, int] | None = None
|
|
540
|
+
try:
|
|
541
|
+
try:
|
|
542
|
+
created = os.fstat(descriptor)
|
|
543
|
+
identity = (created.st_dev, created.st_ino)
|
|
544
|
+
_validate_regular_file_stat(created, relative)
|
|
545
|
+
if parent_fd is None:
|
|
546
|
+
# No byte is written until the created path is known to be
|
|
547
|
+
# inside the root and to be the file this call created.
|
|
548
|
+
path.resolve(strict=True).relative_to(root.resolve(strict=True))
|
|
549
|
+
named = path.lstat()
|
|
550
|
+
if (named.st_dev, named.st_ino) != identity:
|
|
551
|
+
raise UnsafeContentError(
|
|
552
|
+
f"target changed while creating: {relative}"
|
|
553
|
+
)
|
|
554
|
+
_write_all(descriptor, data)
|
|
555
|
+
os.fsync(descriptor)
|
|
556
|
+
except (UnsafeContentError, OSError, RuntimeError, ValueError) as exc:
|
|
557
|
+
_remove_created(path, parent_fd, leaf, identity)
|
|
558
|
+
if isinstance(exc, UnsafeContentError):
|
|
559
|
+
raise
|
|
560
|
+
raise UnsafeContentError(
|
|
561
|
+
f"target cannot be written safely: {relative}"
|
|
562
|
+
) from exc
|
|
563
|
+
finally:
|
|
564
|
+
os.close(descriptor)
|
|
565
|
+
|
|
566
|
+
|
|
567
|
+
def _remove_created(
|
|
568
|
+
path: Path, parent_fd: int | None, leaf: str, identity: tuple[int, int] | None
|
|
569
|
+
) -> None:
|
|
570
|
+
"""Unlink the leaf only when it still has the created file's identity."""
|
|
571
|
+
if identity is None:
|
|
572
|
+
return
|
|
573
|
+
try:
|
|
574
|
+
if parent_fd is None:
|
|
575
|
+
named = path.lstat()
|
|
576
|
+
if (named.st_dev, named.st_ino) == identity:
|
|
577
|
+
path.unlink()
|
|
578
|
+
else:
|
|
579
|
+
named = os.stat(leaf, dir_fd=parent_fd, follow_symlinks=False)
|
|
580
|
+
if (named.st_dev, named.st_ino) == identity:
|
|
581
|
+
os.unlink(leaf, dir_fd=parent_fd)
|
|
582
|
+
except OSError:
|
|
583
|
+
pass
|
|
584
|
+
|
|
585
|
+
|
|
586
|
+
def _update_confined_file(
|
|
587
|
+
root: Path,
|
|
588
|
+
path: Path,
|
|
589
|
+
data: bytes,
|
|
590
|
+
expect_sha256: str,
|
|
591
|
+
*,
|
|
592
|
+
relative: str,
|
|
593
|
+
parent_fd: int | None,
|
|
594
|
+
leaf: str,
|
|
595
|
+
) -> None:
|
|
596
|
+
"""Rewrite *path* in place when its bytes still hash to *expect_sha256*."""
|
|
597
|
+
flags = os.O_RDWR | _write_open_flags()
|
|
598
|
+
try:
|
|
599
|
+
if parent_fd is None:
|
|
600
|
+
before = path.lstat()
|
|
601
|
+
_validate_regular_file_stat(before, relative)
|
|
602
|
+
path.resolve(strict=True).relative_to(root.resolve(strict=True))
|
|
603
|
+
descriptor = os.open(path, flags)
|
|
604
|
+
else:
|
|
605
|
+
before = os.stat(leaf, dir_fd=parent_fd, follow_symlinks=False)
|
|
606
|
+
_validate_regular_file_stat(before, relative)
|
|
607
|
+
descriptor = os.open(leaf, flags, dir_fd=parent_fd)
|
|
608
|
+
except UnsafeContentError:
|
|
609
|
+
raise
|
|
610
|
+
except (OSError, RuntimeError, ValueError) as exc:
|
|
611
|
+
raise UnsafeContentError(
|
|
612
|
+
f"target cannot be opened safely: {relative}"
|
|
613
|
+
) from exc
|
|
614
|
+
try:
|
|
615
|
+
try:
|
|
616
|
+
after = os.fstat(descriptor)
|
|
617
|
+
_validate_regular_file_stat(after, relative)
|
|
618
|
+
if (before.st_dev, before.st_ino) != (after.st_dev, after.st_ino):
|
|
619
|
+
raise UnsafeContentError(f"target changed while opening: {relative}")
|
|
620
|
+
original = _read_all(descriptor)
|
|
621
|
+
except OSError as exc:
|
|
622
|
+
raise UnsafeContentError(
|
|
623
|
+
f"target cannot be read safely: {relative}"
|
|
624
|
+
) from exc
|
|
625
|
+
if sha256(original).hexdigest() != expect_sha256:
|
|
626
|
+
raise UnsafeContentError(f"target does not match its digest: {relative}")
|
|
627
|
+
try:
|
|
628
|
+
os.lseek(descriptor, 0, os.SEEK_SET)
|
|
629
|
+
_write_all(descriptor, data)
|
|
630
|
+
os.ftruncate(descriptor, len(data))
|
|
631
|
+
os.fsync(descriptor)
|
|
632
|
+
except OSError as exc:
|
|
633
|
+
try:
|
|
634
|
+
os.lseek(descriptor, 0, os.SEEK_SET)
|
|
635
|
+
_write_all(descriptor, original)
|
|
636
|
+
os.ftruncate(descriptor, len(original))
|
|
637
|
+
os.fsync(descriptor)
|
|
638
|
+
except OSError as restore_exc:
|
|
639
|
+
raise UnsafeContentError(
|
|
640
|
+
f"target write failed and was not restored: {relative}"
|
|
641
|
+
) from restore_exc
|
|
642
|
+
raise UnsafeContentError(
|
|
643
|
+
f"target cannot be written safely: {relative}"
|
|
644
|
+
) from exc
|
|
645
|
+
finally:
|
|
646
|
+
os.close(descriptor)
|
|
647
|
+
|
|
648
|
+
|
|
649
|
+
def write_confined_regular_file(
|
|
650
|
+
root: Path,
|
|
651
|
+
path: Path,
|
|
652
|
+
data: bytes,
|
|
653
|
+
*,
|
|
654
|
+
expect_sha256: str | None,
|
|
655
|
+
) -> None:
|
|
656
|
+
"""Write *data* to a confined, no-follow, single-link regular file.
|
|
657
|
+
|
|
658
|
+
``expect_sha256=None`` creates the target exclusively, so anything already
|
|
659
|
+
present (a dangling link included) is refused. Otherwise the target must
|
|
660
|
+
exist and its bytes, read from the same descriptor that is then written,
|
|
661
|
+
must hash to ``expect_sha256`` (lowercase hex); the file is rewritten in
|
|
662
|
+
place so its identity is kept, and restored from the bytes read if a write,
|
|
663
|
+
truncate or sync fails. A failed create removes only the file it created.
|
|
664
|
+
Every refusal is an ``UnsafeContentError``; a non-``bytes`` *data* or a
|
|
665
|
+
malformed digest is a ``ValueError``.
|
|
666
|
+
"""
|
|
667
|
+
if not isinstance(data, bytes):
|
|
668
|
+
raise ValueError("data must be bytes")
|
|
669
|
+
if expect_sha256 is not None and (
|
|
670
|
+
not isinstance(expect_sha256, str)
|
|
671
|
+
or _SHA256_HEX.fullmatch(expect_sha256) is None
|
|
672
|
+
):
|
|
673
|
+
raise ValueError("expect_sha256 must be 64 lowercase hex characters or None")
|
|
674
|
+
try:
|
|
675
|
+
relative = path.relative_to(root).as_posix()
|
|
676
|
+
except ValueError as exc:
|
|
677
|
+
raise UnsafeContentError("target path is outside its declared root") from exc
|
|
678
|
+
with _open_confined_parent(root, path, relative=relative) as (parent_fd, leaf):
|
|
679
|
+
if expect_sha256 is None:
|
|
680
|
+
_create_confined_file(
|
|
681
|
+
root, path, data, relative=relative, parent_fd=parent_fd, leaf=leaf
|
|
682
|
+
)
|
|
683
|
+
else:
|
|
684
|
+
_update_confined_file(
|
|
685
|
+
root,
|
|
686
|
+
path,
|
|
687
|
+
data,
|
|
688
|
+
expect_sha256,
|
|
689
|
+
relative=relative,
|
|
690
|
+
parent_fd=parent_fd,
|
|
691
|
+
leaf=leaf,
|
|
692
|
+
)
|