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.
Files changed (261) hide show
  1. {xrefkit-0.7.4/xrefkit.egg-info → xrefkit-0.7.6}/PKG-INFO +1 -1
  2. {xrefkit-0.7.4 → xrefkit-0.7.6}/pyproject.toml +1 -1
  3. xrefkit-0.7.6/tests/test_package_skill_run.py +101 -0
  4. xrefkit-0.7.6/tests/test_packaged_native_governance.py +54 -0
  5. xrefkit-0.7.6/tests/test_project_management_materialization.py +39 -0
  6. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_skill_release_compatibility.py +25 -0
  7. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/__init__.py +1 -1
  8. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/catalog.py +21 -3
  9. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/models/package_manifest.py +9 -0
  10. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/operations_cli.py +1 -0
  11. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/skillrun.py +66 -15
  12. {xrefkit-0.7.4 → xrefkit-0.7.6/xrefkit.egg-info}/PKG-INFO +1 -1
  13. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit.egg-info/SOURCES.txt +3 -0
  14. {xrefkit-0.7.4 → xrefkit-0.7.6}/LICENSE +0 -0
  15. {xrefkit-0.7.4 → xrefkit-0.7.6}/README.md +0 -0
  16. {xrefkit-0.7.4 → xrefkit-0.7.6}/setup.cfg +0 -0
  17. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_artifact_selected_family.py +0 -0
  18. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_attention_pet.py +0 -0
  19. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_attention_pet_client_protocol.py +0 -0
  20. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_attention_pet_codex_session.py +0 -0
  21. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_attention_pet_fit.py +0 -0
  22. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_azure_connection.py +0 -0
  23. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_azure_import.py +0 -0
  24. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_azure_recovery.py +0 -0
  25. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_azure_update_candidate.py +0 -0
  26. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_azure_writer.py +0 -0
  27. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_boundary_analysis.py +0 -0
  28. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_brownfield_csharp_structure_definitions.py +0 -0
  29. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_brownfield_file_editing_protocol.py +0 -0
  30. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_business_intake_conversation_definitions.py +0 -0
  31. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_business_intake_definition.py +0 -0
  32. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_calibration_lint.py +0 -0
  33. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_catalog_preparation_definition.py +0 -0
  34. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_check_skill_knowledge_xids.py +0 -0
  35. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_ci_workflow_invariants.py +0 -0
  36. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_cli.py +0 -0
  37. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_code_constraint_definition.py +0 -0
  38. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_collect_analyzer_sarif.py +0 -0
  39. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_compact_skill_logs.py +0 -0
  40. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_constraint_derivation_family_definition.py +0 -0
  41. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_constraint_derivation_selected_family.py +0 -0
  42. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_contribution_adoption_bytes.py +0 -0
  43. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_contribution_returns.py +0 -0
  44. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_convert_to_xrefkit_skill.py +0 -0
  45. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_cs_scope_probe.py +0 -0
  46. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_csharp_commonality.py +0 -0
  47. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_csharp_naming_profile.py +0 -0
  48. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_ctx.py +0 -0
  49. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_cutover_readiness.py +0 -0
  50. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_dashboard.py +0 -0
  51. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_database_batch_definition_migration.py +0 -0
  52. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_decision_trace.py +0 -0
  53. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_design_business_intake_selected_family.py +0 -0
  54. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_design_planning_definition_migration.py +0 -0
  55. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_dotnet_definition_candidate.py +0 -0
  56. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_editorial_family_definition.py +0 -0
  57. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_editorial_intake_definition.py +0 -0
  58. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_editorial_selected_family.py +0 -0
  59. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_embedded_startup_pack.py +0 -0
  60. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_error_policy_audit.py +0 -0
  61. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_error_policy_locator.py +0 -0
  62. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_execution_binding.py +0 -0
  63. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_existing_skill_definition_batch.py +0 -0
  64. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_final_skilldefinition_batch.py +0 -0
  65. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_flow_selected_family.py +0 -0
  66. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_fm_multiroot.py +0 -0
  67. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_gate.py +0 -0
  68. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_gateway.py +0 -0
  69. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_gateway_mcp.py +0 -0
  70. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_gateway_skill_adapter.py +0 -0
  71. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_gateway_work_items.py +0 -0
  72. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_goal_desired_state.py +0 -0
  73. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_governance_entry.py +0 -0
  74. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_host_precheck.py +0 -0
  75. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_human_evaluation.py +0 -0
  76. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_implementation_flow_definition.py +0 -0
  77. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_implementation_review_selected_family.py +0 -0
  78. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_inbound_uploads.py +0 -0
  79. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_instruction_workflow.py +0 -0
  80. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_knowledge_relations_validator.py +0 -0
  81. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_language_review_definition.py +0 -0
  82. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_legacy_guidance.py +0 -0
  83. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_legacy_migration.py +0 -0
  84. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_legacy_resources.py +0 -0
  85. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_mcp_package_routing.py +0 -0
  86. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_mcp_setup.py +0 -0
  87. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_mcp_subagent_startup.py +0 -0
  88. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_mcp_subagent_startup_integration.py +0 -0
  89. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_ontology_assessment_validator.py +0 -0
  90. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_os_family_definition.py +0 -0
  91. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_os_knowledge_family_definition.py +0 -0
  92. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_os_selected_family.py +0 -0
  93. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_ownership.py +0 -0
  94. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_packmeta.py +0 -0
  95. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_plan_markdown.py +0 -0
  96. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_plan_observation.py +0 -0
  97. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_project_quality_baseline.py +0 -0
  98. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_qa_report_definition.py +0 -0
  99. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_reporting_profiles.py +0 -0
  100. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_reporting_quality.py +0 -0
  101. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_repository_skill_adoption.py +0 -0
  102. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_repository_startup_pack.py +0 -0
  103. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_resource_provider.py +0 -0
  104. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_runtime_contracts.py +0 -0
  105. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_sarif_to_locator.py +0 -0
  106. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_security_definition_migration.py +0 -0
  107. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_site_release_metadata.py +0 -0
  108. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_skill_definition.py +0 -0
  109. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_skill_definition_governance.py +0 -0
  110. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_skill_definition_mcp.py +0 -0
  111. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_skill_definition_runtime.py +0 -0
  112. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_skill_edits.py +0 -0
  113. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_skill_maturity_return.py +0 -0
  114. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_skill_runtime_audit.py +0 -0
  115. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_skillmeta.py +0 -0
  116. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_skills_sync.py +0 -0
  117. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_source_analysis_fragments.py +0 -0
  118. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_structure_catalog.py +0 -0
  119. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_subagent_startup.py +0 -0
  120. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_subagent_startup_boundaries.py +0 -0
  121. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_wbs.py +0 -0
  122. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_work_management.py +0 -0
  123. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_work_packages.py +0 -0
  124. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_workflow_family_definition.py +0 -0
  125. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_xref.py +0 -0
  126. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_xrefkit_instance.py +0 -0
  127. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_xrefkit_tools.py +0 -0
  128. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_xrefkit_v2_discovery.py +0 -0
  129. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_xrefkit_v2_models.py +0 -0
  130. {xrefkit-0.7.4 → xrefkit-0.7.6}/tests/test_xrefkit_v2_pipeline.py +0 -0
  131. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/__main__.py +0 -0
  132. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/attention_pet/__init__.py +0 -0
  133. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/attention_pet/__main__.py +0 -0
  134. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/attention_pet/client.py +0 -0
  135. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/attention_pet/client_protocol.py +0 -0
  136. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/attention_pet/codex_session.py +0 -0
  137. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/attention_pet/evaluator.py +0 -0
  138. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/attention_pet/model.py +0 -0
  139. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/attention_pet/presentation.py +0 -0
  140. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/attention_pet/profiles.py +0 -0
  141. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/attention_pet/scenarios.py +0 -0
  142. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/attention_pet/server.py +0 -0
  143. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/attention_pet/store.py +0 -0
  144. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/azure_connection.py +0 -0
  145. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/azure_import.py +0 -0
  146. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/azure_recovery.py +0 -0
  147. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/azure_update_candidate.py +0 -0
  148. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/azure_writer.py +0 -0
  149. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/boundary_analysis.py +0 -0
  150. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/catalog_cli.py +0 -0
  151. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/cli.py +0 -0
  152. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/contracts.py +0 -0
  153. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/ctx.py +0 -0
  154. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/dashboard.py +0 -0
  155. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/decision_trace.py +0 -0
  156. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/discovery.py +0 -0
  157. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/execution_binding.py +0 -0
  158. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/execution_binding_cli.py +0 -0
  159. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/gate.py +0 -0
  160. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/gateway.py +0 -0
  161. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/goalstate.py +0 -0
  162. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/governance_entry.py +0 -0
  163. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/governance_entry_cli.py +0 -0
  164. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/hashing.py +0 -0
  165. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/host_precheck.py +0 -0
  166. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/import_skill.py +0 -0
  167. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/instance.py +0 -0
  168. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/loaders.py +0 -0
  169. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/__init__.py +0 -0
  170. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/audit.py +0 -0
  171. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/bootstrap.py +0 -0
  172. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/cli.py +0 -0
  173. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/client_cache.py +0 -0
  174. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/client_flow.py +0 -0
  175. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/context_registry.py +0 -0
  176. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/context_token.py +0 -0
  177. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/contracts.py +0 -0
  178. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/contribution_adoption.py +0 -0
  179. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/contribution_returns.py +0 -0
  180. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/dist.py +0 -0
  181. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/gateway.py +0 -0
  182. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/governed_overlays.py +0 -0
  183. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/inbound_uploads.py +0 -0
  184. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/knowledge_edits.py +0 -0
  185. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/legacy_guidance.py +0 -0
  186. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/legacy_migration.py +0 -0
  187. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/legacy_resources.py +0 -0
  188. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/ownership.py +0 -0
  189. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/repository.py +0 -0
  190. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/schemas.py +0 -0
  191. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/server.py +0 -0
  192. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/setup.py +0 -0
  193. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/skill_edits.py +0 -0
  194. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/skill_maturity.py +0 -0
  195. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/startup_contract_pack.py +0 -0
  196. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/subagent_startup.py +0 -0
  197. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp/update_gate_intake.py +0 -0
  198. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/mcp_tools.py +0 -0
  199. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/models/__init__.py +0 -0
  200. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/models/common.py +0 -0
  201. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/models/effective_bundle.py +0 -0
  202. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/models/human_evaluation.py +0 -0
  203. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/models/local_manifest.py +0 -0
  204. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/models/run_log.py +0 -0
  205. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/models/server_config.py +0 -0
  206. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/models/skill_definition.py +0 -0
  207. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/ownership.py +0 -0
  208. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/packmeta.py +0 -0
  209. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/plan_markdown.py +0 -0
  210. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/plan_observation.py +0 -0
  211. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/registry.py +0 -0
  212. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/reporting.py +0 -0
  213. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/reporting_profiles.py +0 -0
  214. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/repository_skills.py +0 -0
  215. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resolver.py +0 -0
  216. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resource_provider.py +0 -0
  217. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/attention_pet/client-state.schema.json +0 -0
  218. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/attention_pet/pet.css +0 -0
  219. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/attention_pet/pet.html +0 -0
  220. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/attention_pet/pet.js +0 -0
  221. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/base/contracts.json +0 -0
  222. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/base/current.json +0 -0
  223. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/base/generations/7a682a5272907354/contracts.json +0 -0
  224. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/base/generations/7a682a5272907354/model_body.md +0 -0
  225. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/base/generations/9929294385ccb7b0/contracts.json +0 -0
  226. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/base/generations/9929294385ccb7b0/model_body.md +0 -0
  227. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/base/model_body.md +0 -0
  228. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/base/startup_sources/000_agent_entry.md +0 -0
  229. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/base/startup_sources/011_startup_xref_routing.md +0 -0
  230. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/base/startup_sources/015_shared_memory_operations.md +0 -0
  231. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/base/startup_sources/016_uncertainty_protocol.md +0 -0
  232. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/base/startup_sources/017_base_and_xref_layering.md +0 -0
  233. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/base/startup_sources/053_context_direction_security_guard.md +0 -0
  234. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/base/startup_sources/yomiyasu_LICENSE.txt +0 -0
  235. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/migration/docs/guides/062_legacy_flow_skill_migration_guide.md +0 -0
  236. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/migration/knowledge/operations/130_legacy_flow_skill_migration_rules.md +0 -0
  237. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/migration/knowledge/organization/160_context_direction_guard_rules.md +0 -0
  238. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/migration/skills/os/legacy_flow_skill_migration/SKILL.v1.md +0 -0
  239. {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
  240. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/migration/skills/repository_adoption.json +0 -0
  241. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/resources/migration/tools/migrate_legacy_flow_skill.py +0 -0
  242. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/runlog.py +0 -0
  243. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/skill_definition.py +0 -0
  244. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/skill_definition_catalog.py +0 -0
  245. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/skill_definition_governance.py +0 -0
  246. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/skillmeta.py +0 -0
  247. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/skills_sync.py +0 -0
  248. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/structure_catalog.py +0 -0
  249. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/subagent_startup.py +0 -0
  250. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/tools/__init__.py +0 -0
  251. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/tools/__main__.py +0 -0
  252. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/v2_cli.py +0 -0
  253. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/wbs.py +0 -0
  254. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/work_management.py +0 -0
  255. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/work_management_view.py +0 -0
  256. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/workspace.py +0 -0
  257. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit/xref.py +0 -0
  258. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit.egg-info/dependency_links.txt +0 -0
  259. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit.egg-info/entry_points.txt +0 -0
  260. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit.egg-info/requires.txt +0 -0
  261. {xrefkit-0.7.4 → xrefkit-0.7.6}/xrefkit.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xrefkit
3
- Version: 0.7.4
3
+ Version: 0.7.6
4
4
  Summary: Portable XID, Skill, Knowledge, workflow, and MCP runtime for XRefKit
5
5
  Author: synthaicode
6
6
  License: MIT License
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "xrefkit"
7
- version = "0.7.4"
7
+ version = "0.7.6"
8
8
  description = "Portable XID, Skill, Knowledge, workflow, and MCP runtime for XRefKit"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -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"
@@ -2,4 +2,4 @@
2
2
 
3
3
  __all__ = ["__version__"]
4
4
 
5
- __version__ = "0.7.4"
5
+ __version__ = "0.7.6"
@@ -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; tool-availability stays the only
1059
- # server-known readiness signal.
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"- definition_{key}: `{value}`\n"
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
- if bool(definition_arg) == bool(meta_arg):
2938
- return SkillRunResult(ok=False, skill_id=None, skill_doc=None, run_log=None, errors=["exactly one of --meta or --definition is required"])
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 not definition_arg and (governance_arg or any(
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 are definition-only runtime inputs"],
2993
+ errors=["--governance, --capability, --tuning, --responsibility, and --execution-mode require --definition or --package-skill"],
2956
2994
  )
2957
- meta_path = (root / (definition_arg or meta_arg)).resolve()
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 definition_arg else (maturity or "stable"))
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 definition_arg else None
3084
- if definition_arg:
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 definition_arg:
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 definition_arg else meta_path.relative_to(root),
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 definition_arg else "legacy_meta_compatibility",
3298
+ runtime_binding_source="instruction_derived" if instruction_bound else "legacy_meta_compatibility",
3248
3299
  compact=True,
3249
3300
  )
3250
3301
  kickoff = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xrefkit
3
- Version: 0.7.4
3
+ Version: 0.7.6
4
4
  Summary: Portable XID, Skill, Knowledge, workflow, and MCP runtime for XRefKit
5
5
  Author: synthaicode
6
6
  License: MIT License
@@ -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