xrefkit 0.7.4__tar.gz → 0.7.6__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.
- {xrefkit-0.7.4/xrefkit.egg-info → xrefkit-0.7.6}/PKG-INFO +1 -1
- {xrefkit-0.7.4 → xrefkit-0.7.6}/pyproject.toml +1 -1
- xrefkit-0.7.6/tests/test_package_skill_run.py +101 -0
- xrefkit-0.7.6/tests/test_packaged_native_governance.py +54 -0
- xrefkit-0.7.6/tests/test_project_management_materialization.py +39 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_skill_release_compatibility.py +25 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/__init__.py +1 -1
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/catalog.py +21 -3
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/models/package_manifest.py +9 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/operations_cli.py +1 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/skillrun.py +66 -15
- {xrefkit-0.7.4 → xrefkit-0.7.6/xrefkit.egg-info}/PKG-INFO +1 -1
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit.egg-info/SOURCES.txt +3 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/LICENSE +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/README.md +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/setup.cfg +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_artifact_selected_family.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_attention_pet.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_attention_pet_client_protocol.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_attention_pet_codex_session.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_attention_pet_fit.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_azure_connection.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_azure_import.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_azure_recovery.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_azure_update_candidate.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_azure_writer.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_boundary_analysis.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_brownfield_csharp_structure_definitions.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_brownfield_file_editing_protocol.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_business_intake_conversation_definitions.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_business_intake_definition.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_calibration_lint.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_catalog_preparation_definition.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_check_skill_knowledge_xids.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_ci_workflow_invariants.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_cli.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_code_constraint_definition.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_collect_analyzer_sarif.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_compact_skill_logs.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_constraint_derivation_family_definition.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_constraint_derivation_selected_family.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_contribution_adoption_bytes.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_contribution_returns.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_convert_to_xrefkit_skill.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_cs_scope_probe.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_csharp_commonality.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_csharp_naming_profile.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_ctx.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_cutover_readiness.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_dashboard.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_database_batch_definition_migration.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_decision_trace.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_design_business_intake_selected_family.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_design_planning_definition_migration.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_dotnet_definition_candidate.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_editorial_family_definition.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_editorial_intake_definition.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_editorial_selected_family.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_embedded_startup_pack.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_error_policy_audit.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_error_policy_locator.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_execution_binding.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_existing_skill_definition_batch.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_final_skilldefinition_batch.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_flow_selected_family.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_fm_multiroot.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_gate.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_gateway.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_gateway_mcp.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_gateway_skill_adapter.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_gateway_work_items.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_goal_desired_state.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_governance_entry.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_host_precheck.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_human_evaluation.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_implementation_flow_definition.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_implementation_review_selected_family.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_inbound_uploads.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_instruction_workflow.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_knowledge_relations_validator.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_language_review_definition.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_legacy_guidance.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_legacy_migration.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_legacy_resources.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_mcp_package_routing.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_mcp_setup.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_mcp_subagent_startup.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_mcp_subagent_startup_integration.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_ontology_assessment_validator.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_os_family_definition.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_os_knowledge_family_definition.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_os_selected_family.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_ownership.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_packmeta.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_plan_markdown.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_plan_observation.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_project_quality_baseline.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_qa_report_definition.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_reporting_profiles.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_reporting_quality.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_repository_skill_adoption.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_repository_startup_pack.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_resource_provider.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_runtime_contracts.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_sarif_to_locator.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_security_definition_migration.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_site_release_metadata.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_skill_definition.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_skill_definition_governance.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_skill_definition_mcp.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_skill_definition_runtime.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_skill_edits.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_skill_maturity_return.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_skill_runtime_audit.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_skillmeta.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_skills_sync.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_source_analysis_fragments.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_structure_catalog.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_subagent_startup.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_subagent_startup_boundaries.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_wbs.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_work_management.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_work_packages.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_workflow_family_definition.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_xref.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_xrefkit_instance.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_xrefkit_tools.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_xrefkit_v2_discovery.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_xrefkit_v2_models.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_xrefkit_v2_pipeline.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/__main__.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/attention_pet/__init__.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/attention_pet/__main__.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/attention_pet/client.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/attention_pet/client_protocol.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/attention_pet/codex_session.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/attention_pet/evaluator.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/attention_pet/model.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/attention_pet/presentation.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/attention_pet/profiles.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/attention_pet/scenarios.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/attention_pet/server.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/attention_pet/store.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/azure_connection.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/azure_import.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/azure_recovery.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/azure_update_candidate.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/azure_writer.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/boundary_analysis.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/catalog_cli.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/cli.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/contracts.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/ctx.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/dashboard.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/decision_trace.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/discovery.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/execution_binding.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/execution_binding_cli.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/gate.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/gateway.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/goalstate.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/governance_entry.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/governance_entry_cli.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/hashing.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/host_precheck.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/import_skill.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/instance.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/loaders.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/__init__.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/audit.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/bootstrap.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/cli.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/client_cache.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/client_flow.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/context_registry.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/context_token.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/contracts.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/contribution_adoption.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/contribution_returns.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/dist.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/gateway.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/governed_overlays.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/inbound_uploads.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/knowledge_edits.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/legacy_guidance.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/legacy_migration.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/legacy_resources.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/ownership.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/repository.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/schemas.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/server.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/setup.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/skill_edits.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/skill_maturity.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/startup_contract_pack.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/subagent_startup.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/update_gate_intake.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp_tools.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/models/__init__.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/models/common.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/models/effective_bundle.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/models/human_evaluation.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/models/local_manifest.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/models/run_log.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/models/server_config.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/models/skill_definition.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/ownership.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/packmeta.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/plan_markdown.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/plan_observation.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/registry.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/reporting.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/reporting_profiles.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/repository_skills.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resolver.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resource_provider.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/attention_pet/client-state.schema.json +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/attention_pet/pet.css +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/attention_pet/pet.html +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/attention_pet/pet.js +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/base/contracts.json +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/base/current.json +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/base/generations/7a682a5272907354/contracts.json +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/base/generations/7a682a5272907354/model_body.md +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/base/generations/9929294385ccb7b0/contracts.json +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/base/generations/9929294385ccb7b0/model_body.md +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/base/model_body.md +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/base/startup_sources/000_agent_entry.md +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/base/startup_sources/011_startup_xref_routing.md +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/base/startup_sources/015_shared_memory_operations.md +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/base/startup_sources/016_uncertainty_protocol.md +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/base/startup_sources/017_base_and_xref_layering.md +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/base/startup_sources/053_context_direction_security_guard.md +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/base/startup_sources/yomiyasu_LICENSE.txt +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/migration/docs/guides/062_legacy_flow_skill_migration_guide.md +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/migration/knowledge/operations/130_legacy_flow_skill_migration_rules.md +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/migration/knowledge/organization/160_context_direction_guard_rules.md +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/migration/skills/os/legacy_flow_skill_migration/SKILL.v1.md +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/migration/skills/os/legacy_flow_skill_migration/references/legacy_flow_skill_migration_template.md +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/migration/skills/repository_adoption.json +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/migration/tools/migrate_legacy_flow_skill.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/runlog.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/skill_definition.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/skill_definition_catalog.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/skill_definition_governance.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/skillmeta.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/skills_sync.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/structure_catalog.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/subagent_startup.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/tools/__init__.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/tools/__main__.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/v2_cli.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/wbs.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/work_management.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/work_management_view.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/workspace.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/xref.py +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit.egg-info/dependency_links.txt +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit.egg-info/entry_points.txt +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit.egg-info/requires.txt +0 -0
- {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
@pytest.mark.parametrize(
|
|
5
|
+
("module", "reference", "xid"),
|
|
6
|
+
[
|
|
7
|
+
("xrefkit_skills_csharp", "xrefkit.skills.csharp::csharp.review", "xid-skill-csharp-review"),
|
|
8
|
+
("xrefkit_skills_brownfield", "xrefkit.skills.brownfield::brownfield.workflow", "xid-skill-brownfield-workflow"),
|
|
9
|
+
("xrefkit_skills_batch_regression", "xrefkit.skills.batch_regression::batch.impact_regression", "xid-skill-batch-impact-regression"),
|
|
10
|
+
],
|
|
11
|
+
)
|
|
12
|
+
def test_installed_package_run_binds_over_mcp(tmp_path, module, reference, xid):
|
|
13
|
+
import json
|
|
14
|
+
import os
|
|
15
|
+
import subprocess
|
|
16
|
+
import sys
|
|
17
|
+
import tempfile
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
|
|
20
|
+
pytest.importorskip(module)
|
|
21
|
+
anyio = pytest.importorskip("anyio")
|
|
22
|
+
pytest.importorskip("mcp")
|
|
23
|
+
from mcp.client.session import ClientSession
|
|
24
|
+
from mcp.client.stdio import StdioServerParameters, stdio_client
|
|
25
|
+
|
|
26
|
+
repo = Path(__file__).resolve().parents[1]
|
|
27
|
+
cli = [sys.executable, "-m", "xrefkit"]
|
|
28
|
+
|
|
29
|
+
env = {**os.environ, "PYTHONPATH": str(repo)}
|
|
30
|
+
|
|
31
|
+
def run_cli(*args):
|
|
32
|
+
return subprocess.check_output(
|
|
33
|
+
cli + list(args), cwd=tmp_path, env=env, encoding="utf-8"
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
args = [
|
|
37
|
+
"skill", "run",
|
|
38
|
+
"--package-skill", reference,
|
|
39
|
+
"--task", "Verify package run startup and MCP binding",
|
|
40
|
+
"--capability", "integration verification", "--tuning", "XRefKit package startup",
|
|
41
|
+
"--responsibility", "Verify run creation and correlation",
|
|
42
|
+
"--execution-mode", "subagent_required", "--json",
|
|
43
|
+
]
|
|
44
|
+
run = json.loads(run_cli(*args))
|
|
45
|
+
assert run["skill_id"] == reference.split("::")[1]
|
|
46
|
+
log_path = Path(run["run_log"])
|
|
47
|
+
assert log_path.is_relative_to(tmp_path)
|
|
48
|
+
assert Path(run["skill_doc"]).is_file()
|
|
49
|
+
log = log_path.read_text(encoding="utf-8")
|
|
50
|
+
assert "maturity: `unassessed`" in log
|
|
51
|
+
assert f"package_skill_xid: `{xid}`" in log
|
|
52
|
+
assert "package_skill_sha256:" in log
|
|
53
|
+
|
|
54
|
+
rejected = subprocess.run(
|
|
55
|
+
cli + [arg for arg in args if arg not in {"--capability", "integration verification"}],
|
|
56
|
+
cwd=tmp_path, env=env, capture_output=True, encoding="utf-8",
|
|
57
|
+
)
|
|
58
|
+
assert rejected.returncode == 1
|
|
59
|
+
assert json.loads(rejected.stdout)["run_id"] is None
|
|
60
|
+
|
|
61
|
+
async def scenario():
|
|
62
|
+
server = StdioServerParameters(
|
|
63
|
+
command=sys.executable,
|
|
64
|
+
args=[
|
|
65
|
+
"-m", "xrefkit.mcp.server", "--repo", str(repo),
|
|
66
|
+
"--audit-log", str(tmp_path / "mcp-audit.jsonl"),
|
|
67
|
+
],
|
|
68
|
+
cwd=str(repo),
|
|
69
|
+
)
|
|
70
|
+
with tempfile.TemporaryFile(mode="w+", encoding="utf-8") as stderr:
|
|
71
|
+
async with stdio_client(server, errlog=stderr) as (read, write):
|
|
72
|
+
async with ClientSession(read, write) as session:
|
|
73
|
+
await session.initialize()
|
|
74
|
+
startup = await session.call_tool("get_startup_context", {})
|
|
75
|
+
assert not startup.isError, startup.content
|
|
76
|
+
binding = await session.call_tool(
|
|
77
|
+
"bind_skill_run",
|
|
78
|
+
{"run_id": run["run_id"], "skill_id": run["skill_id"]},
|
|
79
|
+
)
|
|
80
|
+
assert not binding.isError, binding.content
|
|
81
|
+
bound = binding.structuredContent
|
|
82
|
+
assert bound["run_id"] == run["run_id"]
|
|
83
|
+
assert bound["skill_id"] == run["skill_id"]
|
|
84
|
+
assert "xrefkit skill correlate" in bound["client_record_command"]
|
|
85
|
+
run_cli(
|
|
86
|
+
"skill", "correlate", "--log", str(log_path),
|
|
87
|
+
"--run-id", bound["run_id"],
|
|
88
|
+
"--mcp-session-id", bound["mcp_session_id"],
|
|
89
|
+
"--repository-fingerprint", bound["repository_fingerprint"],
|
|
90
|
+
)
|
|
91
|
+
assert bound["mcp_session_id"] in log_path.read_text(encoding="utf-8")
|
|
92
|
+
requirements = await session.call_tool(
|
|
93
|
+
"get_skill_requirements", {"skill_id": run["skill_id"]}
|
|
94
|
+
)
|
|
95
|
+
assert not requirements.isError, requirements.content
|
|
96
|
+
assert not requirements.structuredContent["missing"]
|
|
97
|
+
skill = await session.call_tool("get_skill", {"skill_id": run["skill_id"]})
|
|
98
|
+
assert not skill.isError, skill.content
|
|
99
|
+
assert skill.structuredContent["skill_id"] == run["skill_id"]
|
|
100
|
+
|
|
101
|
+
anyio.run(scenario)
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import hashlib
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
import pytest
|
|
6
|
+
import yaml
|
|
7
|
+
|
|
8
|
+
from xrefkit.discovery import DiscoveredSkillPackage
|
|
9
|
+
from xrefkit.loaders import load_package_manifest
|
|
10
|
+
from xrefkit.mcp.catalog import _build_package_skills
|
|
11
|
+
from xrefkit.models.package_manifest import ProvidedSkill
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def fixture(tmp_path):
|
|
15
|
+
root=Path(__file__).resolve().parents[1]
|
|
16
|
+
source=root/'skills/packs/project-management/progress_rules_setup/SKILL.v1.md'
|
|
17
|
+
(tmp_path/'skill.md').write_bytes(source.read_bytes())
|
|
18
|
+
gov=json.loads((root/'governance/skills/progress_rules_setup.json').read_text())
|
|
19
|
+
gov['definition_content_hash']=hashlib.sha256(source.read_bytes()).hexdigest()
|
|
20
|
+
(tmp_path/'governance.json').write_text(json.dumps(gov))
|
|
21
|
+
manifest={'package_id':'test.native','package_type':'skill_package','version':'0.1.0',
|
|
22
|
+
'requires':{'xrefkit_core':'>=2.0.0 <3.0.0'},'contract':{},
|
|
23
|
+
'provides':{'skills':[{'id':'progress_rules_setup','xid':'91F7D3B6A204','path':'skill.md','governance_path':'governance.json'}]}}
|
|
24
|
+
(tmp_path/'package_manifest.yaml').write_text(yaml.safe_dump(manifest))
|
|
25
|
+
return DiscoveredSkillPackage('test',tmp_path,tmp_path/'package_manifest.yaml',load_package_manifest(tmp_path/'package_manifest.yaml'))
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def test_bound_native_draft_and_live_hash_check(tmp_path):
|
|
29
|
+
package=fixture(tmp_path)
|
|
30
|
+
assert _build_package_skills(package)[0].maturity=='draft'
|
|
31
|
+
(tmp_path/'skill.md').write_bytes((tmp_path/'skill.md').read_bytes()+b'\nchanged\n')
|
|
32
|
+
with pytest.raises(ValueError,match='content_hash'):
|
|
33
|
+
_build_package_skills(package)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def test_omitted_governance_preserves_existing_unassessed_behavior(tmp_path):
|
|
37
|
+
package=fixture(tmp_path)
|
|
38
|
+
package.manifest.provides.skills[0].governance_path=None
|
|
39
|
+
assert _build_package_skills(package)[0].maturity=='unassessed'
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def test_legacy_governance_field_is_rejected():
|
|
43
|
+
with pytest.raises(ValueError,match='native Markdown'):
|
|
44
|
+
ProvidedSkill(id='legacy',xid='legacy.xid',path='legacy.yaml',governance_path='gov.json')
|
|
45
|
+
|
|
46
|
+
def test_packaged_draft_ranking_is_not_runnable(tmp_path):
|
|
47
|
+
from xrefkit.mcp.catalog import XRefCatalog
|
|
48
|
+
package=fixture(tmp_path)
|
|
49
|
+
catalog=XRefCatalog(tmp_path,'test','test',[],discovered_packages=(package,))
|
|
50
|
+
ranked=catalog.rank_skills_for_purpose('confirm progress rules and destinations')
|
|
51
|
+
row=next(r for r in ranked if r['skill_id']=='progress_rules_setup')
|
|
52
|
+
assert row['maturity']=='draft'
|
|
53
|
+
assert row['execution_readiness']['runnable'] is False
|
|
54
|
+
assert 'draft' in row['execution_readiness']['governance_block_reason']
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import shutil
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
import pytest
|
|
6
|
+
|
|
7
|
+
from tools.materialize_project_management_package import generate, main, PACKAGE
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def test_approved_bytes_cannot_be_rebound_after_link_transform(tmp_path):
|
|
11
|
+
root=Path(__file__).resolve().parents[1]
|
|
12
|
+
for rel in ['skills','governance','docs']:
|
|
13
|
+
# Source links resolve against the actual tree; copy only governed inputs,
|
|
14
|
+
# then use the real remaining targets through a full temporary fixture.
|
|
15
|
+
shutil.copytree(root/rel,tmp_path/rel)
|
|
16
|
+
gp=tmp_path/'governance/skills/requirements_discovery_coordination.json'
|
|
17
|
+
record=json.loads(gp.read_text())
|
|
18
|
+
record['maturity']='trial'
|
|
19
|
+
record['promotion']['decision']='approved'
|
|
20
|
+
gp.write_text(json.dumps(record))
|
|
21
|
+
with pytest.raises(ValueError,match='separate package governance'):
|
|
22
|
+
generate(tmp_path)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def test_stale_extra_managed_asset_is_rejected(tmp_path,monkeypatch):
|
|
26
|
+
target=tmp_path/PACKAGE/'skills'
|
|
27
|
+
target.mkdir(parents=True)
|
|
28
|
+
(target/'retired.md').write_text('stale')
|
|
29
|
+
monkeypatch.setattr('tools.materialize_project_management_package.generate',lambda root:{})
|
|
30
|
+
monkeypatch.setattr('sys.argv',['materialize','--root',str(tmp_path),'--check'])
|
|
31
|
+
with pytest.raises(SystemExit,match='unexpected managed asset'):
|
|
32
|
+
main()
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def test_embedded_migration_adoption_matches_raw_bytes():
|
|
36
|
+
from xrefkit.repository_skills import load_repository_adoption
|
|
37
|
+
import xrefkit
|
|
38
|
+
root=Path(xrefkit.__file__).parent/'resources/migration'
|
|
39
|
+
assert load_repository_adoption(root)['entries']
|
|
@@ -91,6 +91,31 @@ def test_real_resolver_probe_passes_representative_fixture(tmp_path, monkeypatch
|
|
|
91
91
|
assert installed.verify_installed("demo", "official.demo", "0.6.1")["skills"] == ["demo.skill"]
|
|
92
92
|
|
|
93
93
|
|
|
94
|
+
def test_native_probe_uses_bound_catalog_and_rejects_changed_governance(tmp_path, monkeypatch):
|
|
95
|
+
from test_packaged_native_governance import fixture
|
|
96
|
+
from xrefkit import discovery
|
|
97
|
+
candidate = fixture(tmp_path)
|
|
98
|
+
monkeypatch.setattr(discovery, "discover_skill_packages", lambda: [candidate])
|
|
99
|
+
monkeypatch.setattr(installed.metadata, "version", lambda name: "0.7.5")
|
|
100
|
+
monkeypatch.setattr(installed.metadata, "distribution", lambda name: SimpleNamespace(
|
|
101
|
+
version="0.1.0", entry_points=[SimpleNamespace(group="xrefkit.skill_packages", name="test")]))
|
|
102
|
+
# This minimal fixture method uses repository links, so first replace it with
|
|
103
|
+
# an equivalent native method with no external file dependency and rebind draft.
|
|
104
|
+
path = tmp_path / "skill.md"
|
|
105
|
+
text = path.read_text().split("## Method", 1)[0] + "## Method\nInspect requested target.\n"
|
|
106
|
+
path.write_text(text)
|
|
107
|
+
import hashlib
|
|
108
|
+
gp = tmp_path / "governance.json"
|
|
109
|
+
record = json.loads(gp.read_text())
|
|
110
|
+
record["definition_content_hash"] = hashlib.sha256(path.read_bytes()).hexdigest()
|
|
111
|
+
gp.write_text(json.dumps(record))
|
|
112
|
+
assert installed.verify_installed("demo", "test.native", "0.7.5")["skills"] == ["progress_rules_setup"]
|
|
113
|
+
record["definition_content_hash"] = "0" * 64
|
|
114
|
+
gp.write_text(json.dumps(record))
|
|
115
|
+
with pytest.raises(ValueError, match="content_hash"):
|
|
116
|
+
installed.verify_installed("demo", "test.native", "0.7.5")
|
|
117
|
+
|
|
118
|
+
|
|
94
119
|
def test_real_protocol_rejection_stops_installed_probe(tmp_path, monkeypatch):
|
|
95
120
|
root, manifest, _ = contract_fixture(tmp_path, monkeypatch)
|
|
96
121
|
manifest["requires"]["xrefkit_core"] = ">=3.0.0"
|
|
@@ -1055,8 +1055,8 @@ class XRefCatalog:
|
|
|
1055
1055
|
]
|
|
1056
1056
|
# Declared preconditions travel with the ranking so the client can
|
|
1057
1057
|
# filter to Skills runnable in the current state (084 M4). Empty
|
|
1058
|
-
# until metas adopt preconditions;
|
|
1059
|
-
#
|
|
1058
|
+
# until metas adopt preconditions; known adoption and packaged
|
|
1059
|
+
# governance restrictions also constrain readiness below.
|
|
1060
1060
|
readiness = {
|
|
1061
1061
|
"runnable": not missing_tools,
|
|
1062
1062
|
"missing_tool_contracts": missing_tools,
|
|
@@ -1071,6 +1071,11 @@ class XRefCatalog:
|
|
|
1071
1071
|
"repository_adopted": skill.repository_adoption["effective_adopted"],
|
|
1072
1072
|
"historical_repository_adopted": skill.repository_adoption["adopted"],
|
|
1073
1073
|
})
|
|
1074
|
+
if skill.package_id and skill.maturity_governance and skill.maturity in {"draft", "deprecated"}:
|
|
1075
|
+
readiness.update({
|
|
1076
|
+
"runnable": False,
|
|
1077
|
+
"governance_block_reason": f"Packaged Skill maturity {skill.maturity} prohibits execution",
|
|
1078
|
+
})
|
|
1074
1079
|
if score <= 0:
|
|
1075
1080
|
continue
|
|
1076
1081
|
results.append(
|
|
@@ -2343,12 +2348,24 @@ def _build_package_skills(package: DiscoveredSkillPackage) -> list[SkillCatalogE
|
|
|
2343
2348
|
worklist_policy="required",
|
|
2344
2349
|
)
|
|
2345
2350
|
knowledge_needs = [dict(item) for item in meta["knowledge_needs"]]
|
|
2351
|
+
maturity_governance = None
|
|
2352
|
+
if provided.governance_path is not None:
|
|
2353
|
+
from ..skill_definition_governance import (
|
|
2354
|
+
governance_projection, load_governance_record, match_definition,
|
|
2355
|
+
)
|
|
2356
|
+
governance_path = (package_root / provided.governance_path).resolve()
|
|
2357
|
+
if not governance_path.is_relative_to(package_root):
|
|
2358
|
+
raise ValueError("package Skill governance path escapes package root")
|
|
2359
|
+
record = load_governance_record(governance_path)
|
|
2360
|
+
match_definition(record, definition)
|
|
2361
|
+
maturity_governance = governance_projection(record)
|
|
2362
|
+
maturity_governance["record_ref"]["path"] = governance_path.relative_to(package_root).as_posix()
|
|
2346
2363
|
entries.append(
|
|
2347
2364
|
SkillCatalogEntry(
|
|
2348
2365
|
skill_id=meta["skill_id"],
|
|
2349
2366
|
title=first_heading(method, meta["skill_id"]),
|
|
2350
2367
|
summary=meta["summary"],
|
|
2351
|
-
maturity="unassessed",
|
|
2368
|
+
maturity=maturity_governance["maturity"] if maturity_governance else "unassessed",
|
|
2352
2369
|
intent=list(meta["applies_when"]),
|
|
2353
2370
|
target_artifacts=list(meta["outputs"]),
|
|
2354
2371
|
applies_when=list(meta["applies_when"]),
|
|
@@ -2378,6 +2395,7 @@ def _build_package_skills(package: DiscoveredSkillPackage) -> list[SkillCatalogE
|
|
|
2378
2395
|
definition_format="skill_definition_v1",
|
|
2379
2396
|
definition_xid=meta["xid"],
|
|
2380
2397
|
definition_content_hash=definition["content_hash"],
|
|
2398
|
+
maturity_governance=maturity_governance,
|
|
2381
2399
|
)
|
|
2382
2400
|
)
|
|
2383
2401
|
continue
|
|
@@ -35,12 +35,21 @@ class ProvidedAsset(StrictModel):
|
|
|
35
35
|
|
|
36
36
|
|
|
37
37
|
class ProvidedSkill(ProvidedAsset):
|
|
38
|
+
governance_path: str | None = None
|
|
38
39
|
contract_role: str | None = None
|
|
39
40
|
required_outputs: list[str] = Field(default_factory=list)
|
|
40
41
|
required_knowledge: list[str] = Field(default_factory=list)
|
|
41
42
|
required_review_axes: list[str] = Field(default_factory=list)
|
|
42
43
|
must_not: list[str] = Field(default_factory=list)
|
|
43
44
|
|
|
45
|
+
@model_validator(mode="after")
|
|
46
|
+
def _validate_governance_path(self) -> "ProvidedSkill":
|
|
47
|
+
if self.governance_path is not None:
|
|
48
|
+
validate_non_empty(self.governance_path, "governance_path")
|
|
49
|
+
if not self.path.lower().endswith(".md"):
|
|
50
|
+
raise ValueError("governance_path requires a native Markdown SkillDefinition")
|
|
51
|
+
return self
|
|
52
|
+
|
|
44
53
|
@field_validator("required_outputs", "required_knowledge", "required_review_axes", "must_not")
|
|
45
54
|
@classmethod
|
|
46
55
|
def _validate_string_list(cls, values: list[str]) -> list[str]:
|
|
@@ -413,6 +413,7 @@ def _build_parser() -> argparse.ArgumentParser:
|
|
|
413
413
|
p_skill_run_source = p_skill_run.add_mutually_exclusive_group(required=True)
|
|
414
414
|
p_skill_run_source.add_argument("--meta", help="Relative path to the legacy Skill meta.md to run")
|
|
415
415
|
p_skill_run_source.add_argument("--definition", help="Explicit SkillDefinition document to run without a legacy meta source")
|
|
416
|
+
p_skill_run_source.add_argument("--package-skill", help="Explicit installed Skill Package reference (package_id::skill_id)")
|
|
416
417
|
p_skill_run.add_argument(
|
|
417
418
|
"--governance",
|
|
418
419
|
default=None,
|
|
@@ -660,7 +660,7 @@ def _render_log(
|
|
|
660
660
|
]
|
|
661
661
|
)
|
|
662
662
|
definition_lines = "".join(
|
|
663
|
-
f"-
|
|
663
|
+
f"- {key if key.startswith('package_') else 'definition_' + key}: `{value}`\n"
|
|
664
664
|
for key, value in (definition_identity or {}).items()
|
|
665
665
|
)
|
|
666
666
|
runtime_responsibility = role_responsibilities.get("executor") or "not declared"
|
|
@@ -2929,15 +2929,50 @@ def update_token_usage(args) -> SkillRunResult:
|
|
|
2929
2929
|
return SkillRunResult(ok=True, skill_id=_log_skill_id(text), skill_doc=None, run_log=str(log_path), errors=[])
|
|
2930
2930
|
|
|
2931
2931
|
|
|
2932
|
+
def _resolve_package_run_source(reference: str) -> tuple[Path, str, dict[str, str]]:
|
|
2933
|
+
from xrefkit.discovery import enabled_discovered_packages
|
|
2934
|
+
from xrefkit.hashing import sha256_file
|
|
2935
|
+
from xrefkit.workspace import build_registry
|
|
2936
|
+
|
|
2937
|
+
package_id, separator, skill_id = reference.partition("::")
|
|
2938
|
+
if not separator or not package_id or not skill_id:
|
|
2939
|
+
raise ValueError("--package-skill requires package_id::skill_id")
|
|
2940
|
+
packages = enabled_discovered_packages(enabled_package_ids={package_id})
|
|
2941
|
+
if len(packages) != 1:
|
|
2942
|
+
raise ValueError(f"expected one installed package for {package_id}, found {len(packages)}")
|
|
2943
|
+
package = packages[0]
|
|
2944
|
+
provided = next((item for item in package.manifest.provides.skills if item.id == skill_id), None)
|
|
2945
|
+
if provided is None:
|
|
2946
|
+
raise ValueError(f"package does not provide Skill: {reference}")
|
|
2947
|
+
if not provided.path.endswith(".skill.yaml"):
|
|
2948
|
+
raise ValueError("--package-skill requires a split YAML Skill; use --definition with packaged governance for Markdown")
|
|
2949
|
+
|
|
2950
|
+
registry = build_registry(package_manifests=[package.manifest_path])
|
|
2951
|
+
record = registry.skills.require(skill_id)
|
|
2952
|
+
if record.package_id != package_id or record.xid != provided.xid:
|
|
2953
|
+
raise ValueError(f"package Skill identity mismatch: {reference}")
|
|
2954
|
+
entry = (record.root / record.definition.entry.path).resolve()
|
|
2955
|
+
identity = {
|
|
2956
|
+
"format": "legacy_split_v1",
|
|
2957
|
+
"package_id": package_id,
|
|
2958
|
+
"package_version": package.manifest.version,
|
|
2959
|
+
"package_skill_xid": record.xid,
|
|
2960
|
+
"package_skill_path": record.path.relative_to(record.root).as_posix(),
|
|
2961
|
+
"package_skill_sha256": sha256_file(record.path),
|
|
2962
|
+
}
|
|
2963
|
+
return entry, skill_id, identity
|
|
2964
|
+
|
|
2965
|
+
|
|
2932
2966
|
def run_skill(args) -> SkillRunResult:
|
|
2933
2967
|
root = Path(args.root).resolve()
|
|
2934
2968
|
definition_arg = getattr(args, "definition", None)
|
|
2935
2969
|
governance_arg = getattr(args, "governance", None)
|
|
2936
2970
|
meta_arg = getattr(args, "meta", None)
|
|
2937
|
-
|
|
2938
|
-
|
|
2971
|
+
package_arg = getattr(args, "package_skill", None)
|
|
2972
|
+
if sum(bool(source) for source in (definition_arg, meta_arg, package_arg)) != 1:
|
|
2973
|
+
return SkillRunResult(ok=False, skill_id=None, skill_doc=None, run_log=None, errors=["exactly one of --meta, --definition, or --package-skill is required"])
|
|
2939
2974
|
try:
|
|
2940
|
-
adoption = load_repository_adoption(root)
|
|
2975
|
+
adoption = None if package_arg else load_repository_adoption(root)
|
|
2941
2976
|
adapter = repository_skill(root, definition_arg or meta_arg, adoption) if adoption else None
|
|
2942
2977
|
except (ValueError, OSError) as exc:
|
|
2943
2978
|
return SkillRunResult(ok=False, skill_id=None, skill_doc=None, run_log=None, errors=[str(exc)])
|
|
@@ -2946,15 +2981,26 @@ def run_skill(args) -> SkillRunResult:
|
|
|
2946
2981
|
return SkillRunResult(ok=False, skill_id=adapter["skill_id"], skill_doc=None, run_log=None,
|
|
2947
2982
|
errors=["draft or deprecated repository Skills are not adopted and cannot execute"])
|
|
2948
2983
|
definition_arg = adapter["definition_path"]
|
|
2949
|
-
if
|
|
2984
|
+
if package_arg and governance_arg:
|
|
2985
|
+
return SkillRunResult(ok=False, skill_id=None, skill_doc=None, run_log=None,
|
|
2986
|
+
errors=["--governance requires a Markdown SkillDefinition"])
|
|
2987
|
+
if not (definition_arg or package_arg) and (governance_arg or any(
|
|
2950
2988
|
getattr(args, key, None)
|
|
2951
2989
|
for key in ("capability", "tuning", "responsibility", "execution_mode")
|
|
2952
2990
|
)):
|
|
2953
2991
|
return SkillRunResult(
|
|
2954
2992
|
ok=False, skill_id=None, skill_doc=None, run_log=None,
|
|
2955
|
-
errors=["--governance, --capability, --tuning, --responsibility, and --execution-mode
|
|
2993
|
+
errors=["--governance, --capability, --tuning, --responsibility, and --execution-mode require --definition or --package-skill"],
|
|
2956
2994
|
)
|
|
2957
|
-
|
|
2995
|
+
definition_identity = None
|
|
2996
|
+
if package_arg:
|
|
2997
|
+
try:
|
|
2998
|
+
meta_path, package_skill_id, definition_identity = _resolve_package_run_source(package_arg)
|
|
2999
|
+
except (ImportError, KeyError, OSError, ValueError) as exc:
|
|
3000
|
+
return SkillRunResult(ok=False, skill_id=None, skill_doc=None, run_log=None, errors=[str(exc)])
|
|
3001
|
+
else:
|
|
3002
|
+
meta_path = (root / (definition_arg or meta_arg)).resolve()
|
|
3003
|
+
instruction_bound = bool(definition_arg or package_arg)
|
|
2958
3004
|
task, task_errors = _read_task(args)
|
|
2959
3005
|
if task_errors:
|
|
2960
3006
|
return SkillRunResult(ok=False, skill_id=None, skill_doc=None, run_log=None, errors=task_errors)
|
|
@@ -2964,7 +3010,6 @@ def run_skill(args) -> SkillRunResult:
|
|
|
2964
3010
|
source_name = "definition" if definition_arg else "meta"
|
|
2965
3011
|
return SkillRunResult(ok=False, skill_id=None, skill_doc=None, run_log=None, errors=[f"{source_name} not found: {meta_path}"])
|
|
2966
3012
|
|
|
2967
|
-
definition_identity = None
|
|
2968
3013
|
if definition_arg:
|
|
2969
3014
|
try:
|
|
2970
3015
|
definition = load_skill_definition(meta_path)
|
|
@@ -3018,6 +3063,12 @@ def run_skill(args) -> SkillRunResult:
|
|
|
3018
3063
|
"governance_sha256": str(governance["_content_hash"]),
|
|
3019
3064
|
"promotion_decision": str(governance["promotion"]["decision"]),
|
|
3020
3065
|
})
|
|
3066
|
+
elif package_arg:
|
|
3067
|
+
parsed = {"skill_id": package_skill_id}
|
|
3068
|
+
skill_id = package_skill_id
|
|
3069
|
+
definition_maturity = "unassessed"
|
|
3070
|
+
|
|
3071
|
+
if instruction_bound:
|
|
3021
3072
|
runtime = {key: str(getattr(args, key, "") or
|
|
3022
3073
|
(adapter["runtime"][key]["value"] if adapter else "") or "").strip()
|
|
3023
3074
|
for key in RUNTIME_FIELDS}
|
|
@@ -3058,7 +3109,7 @@ def run_skill(args) -> SkillRunResult:
|
|
|
3058
3109
|
domain_knowledge=domain_knowledge,
|
|
3059
3110
|
)
|
|
3060
3111
|
maturity, _ = _resolve_maturity(parsed)
|
|
3061
|
-
maturity = (str(parsed.get("maturity") or "unassessed") if
|
|
3112
|
+
maturity = (str(parsed.get("maturity") or "unassessed") if instruction_bound else (maturity or "stable"))
|
|
3062
3113
|
|
|
3063
3114
|
if maturity == "draft":
|
|
3064
3115
|
return SkillRunResult(
|
|
@@ -3080,8 +3131,8 @@ def run_skill(args) -> SkillRunResult:
|
|
|
3080
3131
|
)
|
|
3081
3132
|
|
|
3082
3133
|
validation_level = "trial" if maturity == "trial" else "stable"
|
|
3083
|
-
validation = validate_skill_meta(meta_path, check_level=validation_level) if not
|
|
3084
|
-
if
|
|
3134
|
+
validation = validate_skill_meta(meta_path, check_level=validation_level) if not instruction_bound else None
|
|
3135
|
+
if instruction_bound:
|
|
3085
3136
|
blocking_errors = []
|
|
3086
3137
|
elif maturity == "trial":
|
|
3087
3138
|
allowed_trial_errors = {"trial-or-higher skills must include at least one observation_refs entry"}
|
|
@@ -3147,7 +3198,7 @@ def run_skill(args) -> SkillRunResult:
|
|
|
3147
3198
|
errors=[f"skill_doc not found: {skill_doc_path}"],
|
|
3148
3199
|
)
|
|
3149
3200
|
os_contract = resolve_os_contract(parsed.get("os_contract"))
|
|
3150
|
-
if
|
|
3201
|
+
if instruction_bound:
|
|
3151
3202
|
os_contract = dict(REQUIRED_OS_CONTRACT)
|
|
3152
3203
|
if maturity == "trial":
|
|
3153
3204
|
merged_os_contract = dict(REQUIRED_OS_CONTRACT)
|
|
@@ -3226,8 +3277,8 @@ def run_skill(args) -> SkillRunResult:
|
|
|
3226
3277
|
node_id=getattr(args, "node_id", None),
|
|
3227
3278
|
skill_id=skill_id,
|
|
3228
3279
|
maturity=maturity,
|
|
3229
|
-
meta_path=Path("-") if
|
|
3230
|
-
skill_doc=skill_doc_path.relative_to(root),
|
|
3280
|
+
meta_path=Path("-") if instruction_bound else meta_path.relative_to(root),
|
|
3281
|
+
skill_doc=skill_doc_path if package_arg else skill_doc_path.relative_to(root),
|
|
3231
3282
|
execution_mode=execution_mode,
|
|
3232
3283
|
guard_policy=guard_policy,
|
|
3233
3284
|
capability_layering=capability_layering,
|
|
@@ -3244,7 +3295,7 @@ def run_skill(args) -> SkillRunResult:
|
|
|
3244
3295
|
domain_knowledge=domain_knowledge,
|
|
3245
3296
|
decision_trace_checkpoint=checkpoint,
|
|
3246
3297
|
definition_identity=definition_identity,
|
|
3247
|
-
runtime_binding_source="instruction_derived" if
|
|
3298
|
+
runtime_binding_source="instruction_derived" if instruction_bound else "legacy_meta_compatibility",
|
|
3248
3299
|
compact=True,
|
|
3249
3300
|
)
|
|
3250
3301
|
kickoff = None
|
|
@@ -78,9 +78,12 @@ tests/test_os_family_definition.py
|
|
|
78
78
|
tests/test_os_knowledge_family_definition.py
|
|
79
79
|
tests/test_os_selected_family.py
|
|
80
80
|
tests/test_ownership.py
|
|
81
|
+
tests/test_package_skill_run.py
|
|
82
|
+
tests/test_packaged_native_governance.py
|
|
81
83
|
tests/test_packmeta.py
|
|
82
84
|
tests/test_plan_markdown.py
|
|
83
85
|
tests/test_plan_observation.py
|
|
86
|
+
tests/test_project_management_materialization.py
|
|
84
87
|
tests/test_project_quality_baseline.py
|
|
85
88
|
tests/test_qa_report_definition.py
|
|
86
89
|
tests/test_reporting_profiles.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|