agentbundle 0.58.0__tar.gz → 0.59.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.58.0/agentbundle.egg-info → agentbundle-0.59.1}/PKG-INFO +20 -1
- {agentbundle-0.58.0 → agentbundle-0.59.1}/README-pypi.md +19 -0
- agentbundle-0.59.1/agentbundle/_data/_content_safety.py +419 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/cooling.py +79 -2
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/work_intake_refresh.py +242 -177
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/workspace_status_engine.py +516 -96
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/self_host.py +10 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/version.py +1 -1
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/workspace_mcp.py +285 -149
- {agentbundle-0.58.0 → agentbundle-0.59.1/agentbundle.egg-info}/PKG-INFO +20 -1
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle.egg-info/SOURCES.txt +3 -1
- {agentbundle-0.58.0 → agentbundle-0.59.1}/pyproject.toml +1 -1
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_policy_registry_projection.py +2 -2
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_self_host_check.py +42 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_skill_spec_lint.py +1 -1
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_workspace_mcp_events_poller.py +2 -3
- agentbundle-0.59.1/tests/unit/test_workspace_mcp_supervisor_run.py +653 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/MANIFEST.in +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/README.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/__init__.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/__main__.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/__init__.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/adapter.schema.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/adapter.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/agent-plugin-extension-namespaces.schema.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/agent-plugin-extension-namespaces.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-index.schema.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-manifest.schema.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-members.txt +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/guides/_shared/reference/catalogue-authoring-standards.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/guides/_shared/reference/catalogue-ci-contract.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/manifest.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/packs/AGENTS.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/packs/CLAUDE.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/packs/README.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/packs/_example/.apm/skills/example-skill/SKILL.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/packs/_example/.apm/skills/example-skill/evals/eval_queries.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/packs/_example/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/packs/_example/README.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/packs/_example/pack.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/profiles/AGENTS.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/profiles/CLAUDE.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/profiles/README.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/profiles/_example/README.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/profiles/_example/profile.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/tests/conformance/test_gemini_admissibility.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/tests/conformance/test_pack_layout_declared_section.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/tests/conformance/test_pack_metadata.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue-scaffold/tests/conformance/test_shared_library_boundaries.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/catalogue.schema.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/close_work.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/distribution-routes.schema.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/distribution-routes.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/file_safety.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/guide.schema.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/install-defaults.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/install-marker.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/knowledge-captured-observation.schema.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/marketplace-entry.schema.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/pack.schema.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/plugin-manifest.derived.schema.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/plugin-manifest.schema.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/profile.schema.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/public-contracts.txt +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/skill-manifest.schema.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/skill.schema.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/target-vocab.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/vendor/agent-plugins/1.0.0/LICENSE.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/vendor/agent-plugins/1.0.0/PROVENANCE.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/vendor/agent-plugins/1.0.0/mcp.schema.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/vendor/agent-plugins/1.0.0/plugin.schema.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/_data/workspace_status_prune.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/bounded_metadata.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/__init__.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/__main__.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/adapter_root_bins.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/adapters/__init__.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/adapters/_sweep_guard.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/adapters/claude_code.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/adapters/codex.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/adapters/copilot.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/adapters/cursor.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/adapters/gemini.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/adapters/kiro.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/adapters/kiro_cli.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/adapters/kiro_ide.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/contract.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/hook_wiring_rules.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/lint_packs.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/main.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/phase_order.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/projection_io.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/projections/__init__.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/projections/codex_agent_toml.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/projections/copilot_agent_md.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/projections/copilot_hooks_json.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/projections/direct_directory.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/projections/gemini_command_toml.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/projections/hook_id.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/projections/kiro_ide_hook.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/projections/merge_into_agent_json.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/projections/merge_json.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/projections/plugin_hooks.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/projections/user_merge_json.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/recipes/composite-agents-md.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/recipes/composite-marketplace.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/recipes/marketplace.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/recipes/per-pack-agent-plugin.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/recipes/per-pack-apm-package.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/recipes/per-pack-claude-plugin.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/recipes/per-pack-overlay.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/recipes/self-host.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/route_agent_plugin.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/route_apm.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/route_claude_plugins.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/route_lookup.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/scope_rails.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/shared_libs.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/target_resolver.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/user_libs.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/build/validate.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_fetch/__init__.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_fetch/direct_http.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_fetch/jfrog_cli.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_fetch/models.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/__init__.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/archive.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/build.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/config.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/contracts_inspector.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/defaults.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/diagnostics.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/file_safety.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/identity.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/index_generator.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/initialise.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/initialise_self_hosted.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/journey_validator.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/lint.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/manifest.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/okf_discovery.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/package.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/results.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/self_host.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/self_host_windows.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/skill_spec_lint.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/toml_emit.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/verify.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/catalogue_tooling/version_ranges.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/categories.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/cli.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/__init__.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/_common.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/_drop_warning.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/adapt.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/catalogue_build.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/catalogue_contracts.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/catalogue_index.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/catalogue_init.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/catalogue_lint.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/catalogue_package.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/catalogue_self_host.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/catalogue_sync.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/catalogue_sync_defaults.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/catalogue_tooling_stub.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/catalogue_verify.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/config.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/diff.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/docs.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/init_state.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/install.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/list_installed.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/list_packs.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/list_profiles.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/list_targets.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/oplog_cmd.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/pack_config_cmd.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/pack_evals.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/package_catalogue.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/profile.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/reconcile.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/render.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/scaffold.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/show.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/uninstall.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/upgrade.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/commands/validate.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/config.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/direct_install.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/direct_source.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/direct_source_acquisition.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/direct_source_state.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/direct_validate.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/https_catalogue.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/local_exclude.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/oplog.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/pack_inventory.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/pack_renames.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/render.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/safety.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/scaffold.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/scope.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/source_defaults.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/statelock.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/system_trust.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle/user_config.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle.egg-info/dependency_links.txt +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle.egg-info/entry_points.txt +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle.egg-info/requires.txt +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/agentbundle.egg-info/top_level.txt +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/conftest.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/setup.cfg +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/templates/install-marker.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/__init__.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/_direct_acquisition.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/_rename_fixtures.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/_support.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/__init__.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/README.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/claude-code-2.1.226-hook-events.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/claude-code-2.1.228-hook-events.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/core/.apm/agents/bar.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/core/.apm/commands/qux.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/core/.apm/hook-wiring/baz.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/core/.apm/hook-wiring/qux.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/core/.apm/hooks/baz.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/core/.apm/hooks/baz.sh +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/core/.apm/skills/example/SKILL.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/core/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/core/pack.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/governance-extras/.apm/skills/example/SKILL.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/governance-extras/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/governance-extras/pack.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/monorepo-extras/.apm/skills/example/SKILL.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/monorepo-extras/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/monorepo-extras/pack.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/product-documentation/.apm/skills/example/SKILL.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/product-documentation/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/product-documentation/pack.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/user-guide-diataxis/.apm/skills/example/SKILL.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/user-guide-diataxis/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/packs/user-guide-diataxis/pack.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/fixtures/recipes/bogus-target.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_adapter_claude_code.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_adapter_codex.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_adapter_copilot.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_adapter_cursor.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_adapter_gemini.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_adapter_kiro.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_adapter_kiro_alias.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_adapter_kiro_cli.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_adapter_kiro_ide.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_adapter_root_bins_projection.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_agent_boundary_metadata_projection.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_agent_plugin_projection.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_build_ships_seeds.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_build_validate_bundled_schema.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_contract.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_contract_scope.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_contract_v07.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_contract_v08.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_direct_directory_cleanup.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_distribution_route_contract.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_distribution_route_golden.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_distribution_route_resolution.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_end_to_end_build.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_hook_wiring_rules.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_lint_packs.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_load_pack_hook_wiring_safely.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_pack_schema.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_pack_schema_allowed_adapters.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_pack_schema_install.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_pipeline.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_plugin_hooks.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_plugin_manifest_schema.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_plugin_publication_gates.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_projectable_subset.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_projection_io.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_projections_merge_json.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_route_lookup.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_scope_rails.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_security.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_self_host_fixture_guard.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_self_host_metadata_policy.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_self_host_recipe_config.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_sequential_implementer_dispatch_projection.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_shared_libs_projection.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_shared_prefix_contract.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_user_libs_projection.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_validate.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/build_pipeline/test_writers_emit_lf.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/conftest.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/contracts/test_agentbundle_show_schema.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/contracts/test_catalogue_fetch_credential_boundary.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/contracts/test_skill_schema.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/adapt/.adapt-discovery.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/adapt/values.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/blank_catalogue/.claude-plugin/marketplace.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/blank_catalogue/catalogue.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/blank_catalogue/packs/.gitkeep +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/blank_catalogue/packs/_example/.apm/skills/example-skill/SKILL.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/blank_catalogue/packs/_example/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/blank_catalogue/packs/_example/README.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/blank_catalogue/packs/_example/evals/eval_queries.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/blank_catalogue/packs/_example/pack.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/blank_catalogue/profiles/.gitkeep +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/blank_catalogue/profiles/_example/README.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/blank_catalogue/profiles/_example/profile.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/brownfield/values.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/brownfield-adapt/AGENTS.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/brownfield-adapt/AGENTS.upstream.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/brownfield-adapt/DESIGN.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/brownfield-adapt/EXPECTED_TREE.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/brownfield-adapt/docs/CHARTER.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/brownfield-adapt/docs/guides/how-to/index.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/brownfield-adapt/docs/howto/getting-started.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/brownfield-adapt-expected/AGENTS.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/brownfield-adapt-expected/docs/CHARTER.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/brownfield-adapt-user-home/.agentbundle/.adapt-discovery.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/brownfield-adapt-user-home/.agentbundle/state.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/catalogue_sync/adapter_contract_major_mismatch/pack.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/catalogue_wave4/catalogue.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/catalogue_wave4/packs/pack-with-journey/.apm/hook-wiring/example.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/catalogue_wave4/packs/pack-with-journey/.apm/skills/example-skill/SKILL.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/catalogue_wave4/packs/pack-with-journey/.apm/skills/example-skill/scripts/run.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/catalogue_wave4/packs/pack-with-journey/JOURNEY.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/catalogue_wave4/packs/pack-with-journey/pack.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/catalogue_wave4/packs/pack-without-journey/pack.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/catalogue_wave4/profiles/test-profile.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/cognitive-load-hosts.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/creds/skills/argv-flag/SKILL.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/creds/skills/argv-flag/scripts/cli.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/creds/skills/argv-flag-derived/SKILL.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/creds/skills/argv-flag-derived/scripts/cli.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/creds/skills/argv-flag-normalised/SKILL.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/creds/skills/argv-flag-normalised/scripts/cli.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/creds/skills/conforming/SKILL.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/creds/skills/conforming/scripts/cli.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/creds/skills/dotfile-grep/SKILL.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/creds/skills/dotfile-grep/scripts/leak.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/creds/skills/dotfile-with-optout/SKILL.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/creds/skills/dotfile-with-optout/scripts/legit.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/creds/skills/mcp-server-headers/SKILL.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/creds/skills/mcp-server-headers/scripts/cli.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/creds/skills/missing-dont-block/SKILL.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/direct/ac35_corpus_verdicts.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/direct/golden_state_0_5.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/distribution-routes/golden.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/distribution-routes/witness-packs/portable/.apm/skills/example/SKILL.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/distribution-routes/witness-packs/portable/pack.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/external_catalogue/.claude-plugin/marketplace.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/external_catalogue/AGENTS.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/external_catalogue/LICENSE-APACHE +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/external_catalogue/LICENSE-MIT +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/external_catalogue/agentbundle/_data/install-defaults.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/external_catalogue/catalogue.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/external_catalogue/packs/alpha/.apm/skills/example/SKILL.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/external_catalogue/packs/alpha/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/external_catalogue/packs/alpha/pack.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/external_catalogue/packs/alpha/seeds/AGENTS.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/external_catalogue/packs/beta/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/external_catalogue/packs/beta/pack.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/external_catalogue/profiles/example.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/install/catalogue/packs/alpha/.apm/agents/helper.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/install/catalogue/packs/alpha/.apm/commands/cmd.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/install/catalogue/packs/alpha/.apm/hook-wiring/run.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/install/catalogue/packs/alpha/.apm/hooks/run.sh +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/install/catalogue/packs/alpha/.apm/skills/example/SKILL.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/install/catalogue/packs/alpha/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/install/catalogue/packs/alpha/pack.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/kiro_ide_hook/ask_agent_basic.kiro.hook +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/kiro_ide_hook/run_command_with_placeholder.kiro.hook +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/lint_packs/clean/pack.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/lint_packs/clean/seeds/README.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/list-installed/golden_120col.txt +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/list-installed/golden_80col.txt +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/list_packs/catalogue/packs/alpha/pack.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/list_packs/catalogue/packs/beta/pack.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/local_scope/catalogue/packs/local-test-pack/.apm/skills/local-test/SKILL.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/local_scope/catalogue/packs/local-test-pack/pack.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/cc-user-hooks/.apm/hook-wiring/on-prompt.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/cc-user-hooks/.apm/hooks/on-prompt.sh +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/cc-user-hooks/pack.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/kiro-repo-hooks/.apm/agents/reviewer.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/kiro-repo-hooks/.apm/hook-wiring/on-spawn.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/kiro-repo-hooks/.apm/hooks/on-spawn.sh +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/kiro-repo-hooks/pack.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/kiro-user-hooks/.apm/agents/reviewer.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/kiro-user-hooks/.apm/hook-wiring/on-spawn.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/kiro-user-hooks/.apm/hooks/on-spawn.sh +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/kiro-user-hooks/pack.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/malformed-kiro-missing-attach/.apm/agents/reviewer.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/malformed-kiro-missing-attach/.apm/hook-wiring/on-spawn.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/malformed-kiro-missing-attach/.apm/hooks/on-spawn.sh +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/malformed-kiro-missing-attach/pack.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/malformed-kiro-pascal-events/.apm/agents/reviewer.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/malformed-kiro-pascal-events/.apm/hook-wiring/on-spawn.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/malformed-kiro-pascal-events/.apm/hooks/on-spawn.sh +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/malformed-kiro-pascal-events/pack.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/malformed-kiro-unknown-agent/.apm/agents/reviewer.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/malformed-kiro-unknown-agent/.apm/hook-wiring/on-spawn.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/malformed-kiro-unknown-agent/.apm/hooks/on-spawn.sh +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/packs/malformed-kiro-unknown-agent/pack.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/scaffold/test-pack/seeds/AGENTS.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/scaffold/test-pack/seeds/_agents-footer.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/scaffold/test-pack/seeds/docs/CHARTER.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/show_contract/agentbundle-show.schema.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/show_contract/catalogue.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/show_contract/installed_state.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/agents/reviewer.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/commands/deploy.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/hook-wiring/pre-commit.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/hooks/lint.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/hooks/pre-commit.sh +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/.apm/skills/work-loop/SKILL.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v1/packs/core/pack.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/agents/reviewer.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/commands/deploy.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/hook-wiring/pre-commit.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/hooks/lint.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/hooks/pre-commit.sh +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/.apm/skills/work-loop/SKILL.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v2/packs/core/pack.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/agents/reviewer.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/commands/deploy.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/hook-wiring/pre-commit.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/hooks/lint.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/hooks/pre-commit.sh +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/.apm/skills/work-loop/SKILL.md +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/.claude-plugin/plugin.json +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/upgrade/catalogue_v3/packs/core/pack.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/validate/bad_recipe_pack/pack.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/validate/malformed_pack/pack.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/validate/valid_pack/pack.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/fixtures/validate/version_mismatch_pack/pack.toml +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/__init__.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/_https_archive.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_adapt_cmd.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_adapt_dual_scope.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_adapt_preflight_detection.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_adapt_schema_migration.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_apm_install_route.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_blank_catalogue.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_brownfield_adapt_end_to_end.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_brownfield_round_trip.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_brownfield_user_home_fixture.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_build_check_drift_gates.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_build_derivation_apm.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_build_derivation_claude_plugins.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_bundled_contracts_fail_closed.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_catalogue_init.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_catalogue_init_packageable.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_catalogue_verify_adapter_compat.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_catalogue_verify_dependencies.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_catalogue_verify_external_portability.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_catalogue_verify_fixture_checks.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_catalogue_verify_marketplace.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_catalogue_verify_output_drift.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_catalogue_verify_package_preflight.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_catalogue_verify_plugin_path.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_catalogue_verify_profile_schema.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_catalogue_verify_step1.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_catalogue_wave4_index_generator.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_catalogue_wave4_integration.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_catalogue_wave4_journey_validator.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_catalogue_wave4_schema.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_cc_user_hooks_fixture.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_claude_plugins_install_route.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_config_cascade.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_credential_brokers_pack_install.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_credentials_wheel.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_direct_install.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_discovery_schema_cross_consumer.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_editable_source_detection.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_fixtures_validate.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_hook_wiring_ingress.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_adapt_chain.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_cmd.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_converters_user_scope.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_copilot_full_parity.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_core_smoke.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_default_source.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_dependencies_gate.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_dropped_primitives_warning.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_dual_scope.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_layout_is_best_effort.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_orphan_reshape.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_pack_metadata_shape.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_profile.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_profile_live.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_repo_scope_per_adapter.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_research_user_scope.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_seed_delivery.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_session_start_wiring.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_upgrade_offer.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_user_hooks.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_install_user_scope_allowed_adapters.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_jfrog_cli_contract.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_kiro_ide_hook_e2e.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_kiro_repo_hooks_fixture.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_kiro_user_hooks_fixture.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_list_packs_cmd.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_local_scope_install.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_marketplace_entry_validation.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_marketplace_manifest_regression.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_multi_pack_install.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_orphan_cleanup_respects_foreign_state.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_plugin_route_membership.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_portable_catalogue_authentication.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_recommends_cross_scope.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_reconcile.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_rename_hint_cli.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_rename_migration_e2e.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_reserved_path_filter.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_scaffold_projection.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_self_host_schema_migration.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_self_host_sweep_respects_state.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_shared_prefix_coexistence.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_show_cmd.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_tier_invariants.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_trust_fallback_tls.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_uninstall_cmd.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_uninstall_user_hooks.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_upgrade_attach_to_agent.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_upgrade_cmd.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_upgrade_user_hooks.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_version_gate_matrix.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_workspace_mcp_git_fsm.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/integration/test_zipapp.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/performance/__init__.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/performance/test_direct_family2_budget_cost.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/test_adapter_permissions_projection.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/test_workspace_mcp_depends_on.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/test_workspace_mcp_elicit.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/test_workspace_mcp_event_bridge.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/test_workspace_mcp_git.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/test_workspace_mcp_git_scope.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/test_workspace_mcp_layout_override.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/test_workspace_mcp_lifecycle.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/test_workspace_mcp_stdin.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/test_workspace_mcp_tools.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/__init__.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/conftest.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_adapt_discovery_schema.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_adapter_symlink_policy.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_append_layout_section.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_architect_readme_install_command.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_bundled_contract_errors.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_archive_unit_digests.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_ci_contract.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_curation_deps.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_fetch.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_fetch_jfrog.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_init_cli_self_hosted.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_manifest_schema.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_pack_defaults.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_package_compare.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_package_include_diagnostic.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_package_refusal.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_self_hosted_export_removal.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_spec_version.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_sync.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_sync_fixture_set.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_tooling_archive.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_tooling_build.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_tooling_defaults.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_tooling_file_safety.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_tooling_foundation.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_tooling_identity.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_tooling_init.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_tooling_lint.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_tooling_package.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_tooling_self_host.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_tooling_self_hosted_init.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_tooling_source_package.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_tooling_verify.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_trust_fallback.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_unit_digests.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_wave2_schema.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_wave2_validation.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_wave3_contracts_cli.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_wave3_contracts_inspector.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_wave3_init_nextsteps.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_catalogue_wave3_offline_navigation.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_cli_catalogue_optional.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_cli_help_lists_config.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_cli_list_targets_help.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_cli_namespace_fixture.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_cli_path_normalisation.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_cli_profile_surface.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_cli_scope_flags.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_codex_agent_toml.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_codex_projection_modes.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_cognitive_load_seed_contract.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_collect_tree_symlinks.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_common_classify_seeds.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_config.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_config_cmd.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_configured_adapter.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_confirm_helper.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_contract_parity.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_contract_v0_3_schema.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_copilot_agent_md.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_copilot_hooks_json.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_copilot_user_scope_wiring.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_credbroker_lint_hardening.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_dependencies_batch.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_diff_cmd.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_direct_admission.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_direct_architecture_controls.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_direct_diagnostics.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_direct_lifecycle_facts.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_direct_source_acquisition.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_direct_source_state.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_direct_upgrade.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_direct_validate.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_footprint_ownership.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_https_catalogue.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_init_state_cmd.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_install_argparse_adapter_flag.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_install_argparse_emit_install_routes.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_install_defaults_preferred_adapter.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_install_dropped_primitives_warning.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_install_event_dropped_wirings.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_install_first_value_handoff.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_install_force_help.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_install_inband_detection.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_install_messages.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_install_messages_repo_scope.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_install_refusal_ordering.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_install_state_provenance.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_kiro_ide_hook_projection.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_kiro_ide_hook_rail.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_kiro_ide_hook_schema.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_layout_bases_anchoring.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_lint_agent_artifacts_metadata_auth.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_list_installed_cmd.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_list_installed_status.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_list_targets_cmd.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_local_exclude_git_cache.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_local_scope_schema.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_local_scope_t10_uninstall.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_local_scope_t12_show.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_local_scope_t2_resolve.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_local_scope_t3_config.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_local_scope_t4_state_path.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_local_scope_t5_list_installed.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_local_scope_t7_install_gates.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_local_scope_t8_install.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_local_scope_t9_exclude.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_marker_schema_version_parity.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_merge_into_agent_json.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_multi_adapter_disambiguator.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_nested_symlink_hardening.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_no_contracts_fallback.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_offer_upgrade_namespace.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_okf_discovery.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_org_bootstrap.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_orphan_sweep_guards.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_pack_config_api.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_pack_evals_bundled_contract.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_pack_inventory.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_pack_layout_section_schema.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_pack_renames.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_package_catalogue.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_packstate_source_provenance.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_pipeline_phase_order.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_plugin_scope_filter.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_profile_reader.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_render.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_render_cmd.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_render_table.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_resolve_state_path.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_resolve_target_adapter_user_config.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_resolve_user_scope_target_adapter.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_route_surface_parity.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_safety.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_safety_repo_scope_prefixes.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_safety_scan_per_pack_scoping.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_scaffold_cmd.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_scope.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_self_host_windows.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_shared_prefix_disclosure.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_source_conflict_guard.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_source_defaults.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_state_v01_refuse_write.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_state_v02.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_state_v0_4_schema.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_statelock.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_statelock_hardening.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_system_trust.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_target_resolver.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_toml_emitters.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_unresolved_markers.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_upgrade_bulk_all.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_upgrade_recap.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_upgrade_source_inference.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_user_config_io.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_user_config_isolation.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_user_config_path.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_user_config_source.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_user_merge_json.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_validate_attach_to_agent.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_validate_categories.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_validate_cmd.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_validate_hook_wiring_per_file_compatibility.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_values_from_shapes.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_version.py +0 -0
- {agentbundle-0.58.0 → agentbundle-0.59.1}/tests/unit/test_windows_direct_suite_registration.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agentbundle
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.59.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,25 @@ 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.59.1
|
|
39
|
+
|
|
40
|
+
`catalogue self-host` keeps a repository's root `AGENT_RULES.md`, so routing
|
|
41
|
+
rows an adopter adds survive regeneration.
|
|
42
|
+
|
|
43
|
+
## What's new in 0.59.0
|
|
44
|
+
|
|
45
|
+
The workspace bridge now reads a supervisor run's status file only. The old
|
|
46
|
+
engine-state fallback is removed, so a spec directory with no supervisor status
|
|
47
|
+
shows no run and no pending gate, and `gate_question` is a framed object or null.
|
|
48
|
+
|
|
49
|
+
## What's new in 0.58.1
|
|
50
|
+
|
|
51
|
+
The workspace MCP bridge understands supervisor runs. While a spec has a
|
|
52
|
+
supervisor status file, `workspace_status` shows that run's id, stage, and
|
|
53
|
+
`run_active` signal. A pending human question appears only as framed untrusted
|
|
54
|
+
text that has passed a content-safety check, or as a fixed placeholder. A
|
|
55
|
+
status file that is a link, oversized, or malformed shows no run and no gate.
|
|
56
|
+
|
|
38
57
|
## What's new in 0.58.0
|
|
39
58
|
|
|
40
59
|
The shared file-safety helper gains `write_confined_regular_file`, which creates
|
|
@@ -14,6 +14,25 @@ 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.59.1
|
|
18
|
+
|
|
19
|
+
`catalogue self-host` keeps a repository's root `AGENT_RULES.md`, so routing
|
|
20
|
+
rows an adopter adds survive regeneration.
|
|
21
|
+
|
|
22
|
+
## What's new in 0.59.0
|
|
23
|
+
|
|
24
|
+
The workspace bridge now reads a supervisor run's status file only. The old
|
|
25
|
+
engine-state fallback is removed, so a spec directory with no supervisor status
|
|
26
|
+
shows no run and no pending gate, and `gate_question` is a framed object or null.
|
|
27
|
+
|
|
28
|
+
## What's new in 0.58.1
|
|
29
|
+
|
|
30
|
+
The workspace MCP bridge understands supervisor runs. While a spec has a
|
|
31
|
+
supervisor status file, `workspace_status` shows that run's id, stage, and
|
|
32
|
+
`run_active` signal. A pending human question appears only as framed untrusted
|
|
33
|
+
text that has passed a content-safety check, or as a fixed placeholder. A
|
|
34
|
+
status file that is a link, oversized, or malformed shows no run and no gate.
|
|
35
|
+
|
|
17
36
|
## What's new in 0.58.0
|
|
18
37
|
|
|
19
38
|
The shared file-safety helper gains `write_confined_regular_file`, which creates
|
|
@@ -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
|
+
)
|
|
@@ -8,7 +8,7 @@ import re
|
|
|
8
8
|
import stat
|
|
9
9
|
import sys
|
|
10
10
|
from contextlib import suppress
|
|
11
|
-
from dataclasses import dataclass
|
|
11
|
+
from dataclasses import dataclass, replace
|
|
12
12
|
from datetime import date, datetime, timedelta
|
|
13
13
|
from pathlib import Path
|
|
14
14
|
from typing import Any, TypeGuard
|
|
@@ -40,6 +40,13 @@ REFUSAL_CODES = frozenset(
|
|
|
40
40
|
}
|
|
41
41
|
)
|
|
42
42
|
|
|
43
|
+
_PARENT_RE = re.compile(r"^docs/product/briefs/[a-z0-9][a-z0-9-]{0,127}\.md$")
|
|
44
|
+
_BRIEF_SLUG_RE = re.compile(r"^[a-z0-9][a-z0-9-]{0,127}$")
|
|
45
|
+
_SPEC_LOCATOR_RE = re.compile(r"^docs/specs/[^/]+/spec\.md$")
|
|
46
|
+
_BRIEF_HEADER_RE = re.compile(r"^- \*\*Brief:\*\*(.*)$")
|
|
47
|
+
_HTML_COMMENT_RE = re.compile(r"<!--.*?-->", re.DOTALL)
|
|
48
|
+
MAX_SPEC_BYTES = 1_000_000
|
|
49
|
+
_BRIEFS_DIRECTORY = ("docs", "product", "briefs")
|
|
43
50
|
_DELIVERY_ID_RE = re.compile(r"^[a-z0-9][a-z0-9-]{0,127}$")
|
|
44
51
|
_DIGEST_RE = re.compile(r"^sha256:[0-9a-f]{64}$")
|
|
45
52
|
_EVIDENCE_RE = re.compile(r"^(?:commit:[0-9a-f]{40}|pr:[0-9]+|run:[0-9]+)$")
|
|
@@ -90,6 +97,7 @@ class CoolingRecord:
|
|
|
90
97
|
authority: tuple[tuple[str, tuple[tuple[str, str], ...]], ...]
|
|
91
98
|
confirmation_proof: str
|
|
92
99
|
exception: tuple[tuple[str, str], ...] | None = None
|
|
100
|
+
parent: str | None = None
|
|
93
101
|
|
|
94
102
|
@classmethod
|
|
95
103
|
def from_payload(cls, payload: dict[str, object]) -> "CoolingRecord":
|
|
@@ -123,6 +131,7 @@ class CoolingRecord:
|
|
|
123
131
|
tuple((key, str(value)) for key, value in exception.items())
|
|
124
132
|
if exception is not None else None
|
|
125
133
|
),
|
|
134
|
+
parent=None if payload.get("parent") is None else str(payload["parent"]),
|
|
126
135
|
)
|
|
127
136
|
|
|
128
137
|
def as_payload(self) -> dict[str, object]:
|
|
@@ -145,6 +154,8 @@ class CoolingRecord:
|
|
|
145
154
|
}
|
|
146
155
|
if self.exception is not None:
|
|
147
156
|
payload["exception"] = dict(self.exception)
|
|
157
|
+
if self.parent is not None:
|
|
158
|
+
payload["parent"] = self.parent
|
|
148
159
|
return payload
|
|
149
160
|
|
|
150
161
|
|
|
@@ -302,7 +313,7 @@ def validate_payload(payload: object) -> CoolingResult:
|
|
|
302
313
|
"""Validate the closed lifecycle shape without raising on untrusted input."""
|
|
303
314
|
if (
|
|
304
315
|
not isinstance(payload, dict)
|
|
305
|
-
or set(payload) - (_REQUIRED | {"exception"})
|
|
316
|
+
or set(payload) - (_REQUIRED | {"exception", "parent"})
|
|
306
317
|
or not set(payload) >= _REQUIRED
|
|
307
318
|
):
|
|
308
319
|
return CoolingResult(code="record-invalid")
|
|
@@ -347,6 +358,10 @@ def validate_payload(payload: object) -> CoolingResult:
|
|
|
347
358
|
return CoolingResult(code="record-invalid")
|
|
348
359
|
if _zone(payload["timezone"]) is None:
|
|
349
360
|
return CoolingResult(code="record-invalid")
|
|
361
|
+
if "parent" in payload and payload["parent"] != "none" and not _matches(
|
|
362
|
+
_PARENT_RE, payload["parent"]
|
|
363
|
+
):
|
|
364
|
+
return CoolingResult(code="record-invalid")
|
|
350
365
|
has_exception = "exception" in payload
|
|
351
366
|
if (payload["disposition"] == "retain-exception") != has_exception:
|
|
352
367
|
return CoolingResult(code="record-invalid")
|
|
@@ -698,6 +713,63 @@ def _resolve_destination(root: Path, candidates: object) -> Path | str:
|
|
|
698
713
|
return "unsafe-target"
|
|
699
714
|
|
|
700
715
|
|
|
716
|
+
def _brief_file_exists(root: Path, slug: str) -> bool:
|
|
717
|
+
"""Report whether `docs/product/briefs/<slug>.md` is a listed regular file.
|
|
718
|
+
|
|
719
|
+
The three directories must be real, and the name must appear in the
|
|
720
|
+
directory listing byte-for-byte, so a case variant or a link never counts.
|
|
721
|
+
"""
|
|
722
|
+
file_safety = _close_work().file_safety()
|
|
723
|
+
directory = root.joinpath(*_BRIEFS_DIRECTORY)
|
|
724
|
+
name = f"{slug}.md"
|
|
725
|
+
try:
|
|
726
|
+
file_safety.validate_confined_directory(root, directory)
|
|
727
|
+
if name not in {entry.name for entry in directory.iterdir()}:
|
|
728
|
+
return False
|
|
729
|
+
return stat.S_ISREG(os.lstat(directory / name).st_mode)
|
|
730
|
+
except (OSError, ValueError):
|
|
731
|
+
return False
|
|
732
|
+
|
|
733
|
+
|
|
734
|
+
def _derive_parent(root: Path, locator: str) -> str | None:
|
|
735
|
+
"""Read a spec's `Brief:` header and return a `parent` value, or None.
|
|
736
|
+
|
|
737
|
+
None means the scope stays unknown, so every unreadable or unrecognised
|
|
738
|
+
input fails closed. Only the preamble before the first `##` heading is read.
|
|
739
|
+
"""
|
|
740
|
+
try:
|
|
741
|
+
root = Path(root)
|
|
742
|
+
raw = _close_work().file_safety().read_confined_regular_file(
|
|
743
|
+
root, root / locator, max_bytes=MAX_SPEC_BYTES
|
|
744
|
+
)
|
|
745
|
+
text = raw.decode("utf-8")
|
|
746
|
+
except (ImportError, OSError, ValueError, RecursionError):
|
|
747
|
+
return None
|
|
748
|
+
values: list[str] = []
|
|
749
|
+
for line in text.splitlines():
|
|
750
|
+
if line.startswith("## "):
|
|
751
|
+
break
|
|
752
|
+
found = _BRIEF_HEADER_RE.match(line)
|
|
753
|
+
if found:
|
|
754
|
+
values.append(_HTML_COMMENT_RE.sub("", found.group(1)).strip())
|
|
755
|
+
if not values:
|
|
756
|
+
return "none"
|
|
757
|
+
if len(values) != 1:
|
|
758
|
+
return None
|
|
759
|
+
value = values[0]
|
|
760
|
+
if value in {"", "none"}:
|
|
761
|
+
return "none"
|
|
762
|
+
if value.startswith("brief:"):
|
|
763
|
+
slug = value[len("brief:"):]
|
|
764
|
+
path = f"docs/product/briefs/{slug}.md"
|
|
765
|
+
else:
|
|
766
|
+
path = value
|
|
767
|
+
slug = path[len("docs/product/briefs/"):-len(".md")]
|
|
768
|
+
if not _PARENT_RE.fullmatch(path) or not _BRIEF_SLUG_RE.fullmatch(slug):
|
|
769
|
+
return None
|
|
770
|
+
return path if _brief_file_exists(root, slug) else None
|
|
771
|
+
|
|
772
|
+
|
|
701
773
|
def enrol(
|
|
702
774
|
*,
|
|
703
775
|
root: Path,
|
|
@@ -721,6 +793,11 @@ def enrol(
|
|
|
721
793
|
destination = _resolve_destination(root, candidates)
|
|
722
794
|
if isinstance(destination, str):
|
|
723
795
|
return CoolingResult(code=destination)
|
|
796
|
+
if record.parent is None and _SPEC_LOCATOR_RE.fullmatch(record.locator):
|
|
797
|
+
# Read before the write: a cooled spec body is never read afterwards.
|
|
798
|
+
derived = _derive_parent(root, record.locator)
|
|
799
|
+
if derived is not None:
|
|
800
|
+
record = replace(record, parent=derived)
|
|
724
801
|
try:
|
|
725
802
|
return _write_record(root, destination, record, authority_binding)
|
|
726
803
|
except (ImportError, OSError, ValueError):
|