metaobjects 1.0.1__tar.gz → 1.0.3__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 (448) hide show
  1. {metaobjects-1.0.1 → metaobjects-1.0.3}/PKG-INFO +1 -1
  2. {metaobjects-1.0.1 → metaobjects-1.0.3}/pyproject.toml +11 -17
  3. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/cli.py +189 -47
  4. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/runner.py +22 -5
  5. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/config/__init__.py +14 -0
  6. metaobjects-1.0.3/src/metaobjects/config/dependencies.py +583 -0
  7. metaobjects-1.0.3/src/metaobjects/config/neutral_config.py +234 -0
  8. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/config/source_resolver.py +115 -6
  9. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/errors.py +21 -0
  10. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/loader/merge.py +167 -44
  11. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/loader/sources/file_source.py +10 -2
  12. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/naming.py +8 -0
  13. metaobjects-1.0.3/src/metaobjects/scope.py +104 -0
  14. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/serializer_json.py +35 -1
  15. metaobjects-1.0.3/tests/codegen/test_cli_dependencies.py +175 -0
  16. metaobjects-1.0.3/tests/config/test_dependencies.py +374 -0
  17. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/config/test_neutral_config.py +38 -0
  18. metaobjects-1.0.3/tests/conformance/test_dependency_conformance.py +150 -0
  19. metaobjects-1.0.3/tests/conformance/test_scope_conformance.py +75 -0
  20. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/test_source_resolution_conformance.py +9 -5
  21. metaobjects-1.0.3/tests/unit/test_file_source_id.py +23 -0
  22. metaobjects-1.0.3/tests/unit/test_merge.py +244 -0
  23. metaobjects-1.0.3/tests/unit/test_serializer_shared_document.py +51 -0
  24. {metaobjects-1.0.1 → metaobjects-1.0.3}/uv.lock +1 -1
  25. metaobjects-1.0.1/src/metaobjects/config/neutral_config.py +0 -87
  26. metaobjects-1.0.1/tests/unit/test_merge.py +0 -128
  27. {metaobjects-1.0.1 → metaobjects-1.0.3}/.gitignore +0 -0
  28. {metaobjects-1.0.1 → metaobjects-1.0.3}/LICENSE +0 -0
  29. {metaobjects-1.0.1 → metaobjects-1.0.3}/README.md +0 -0
  30. {metaobjects-1.0.1 → metaobjects-1.0.3}/hatch_build.py +0 -0
  31. {metaobjects-1.0.1 → metaobjects-1.0.3}/scripts/generate_embedded_library.py +0 -0
  32. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/__init__.py +0 -0
  33. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/agent_context/__init__.py +0 -0
  34. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/agent_context/scaffold.py +0 -0
  35. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/apidocs/__init__.py +0 -0
  36. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/apidocs/api_model.py +0 -0
  37. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/apidocs/builder.py +0 -0
  38. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/apidocs/naming.py +0 -0
  39. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/apidocs/paths.py +0 -0
  40. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/apidocs/renderer.py +0 -0
  41. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/attr_class_map.py +0 -0
  42. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/KNOWN_GAPS.md +0 -0
  43. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/__init__.py +0 -0
  44. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/collision_names.py +0 -0
  45. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/config.py +0 -0
  46. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/constants.py +0 -0
  47. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/extract_delegate_emitter.py +0 -0
  48. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/extract_schema_emitter.py +0 -0
  49. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/format.py +0 -0
  50. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/fr010_field_mapping.py +0 -0
  51. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generator.py +0 -0
  52. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generator_registry.py +0 -0
  53. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generators/__init__.py +0 -0
  54. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generators/entity_model.py +0 -0
  55. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generators/extractor_generator.py +0 -0
  56. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generators/filter_allowlist_generator.py +0 -0
  57. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generators/find_inbound.py +0 -0
  58. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generators/fr019_shared_enum.py +0 -0
  59. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generators/m2m_codegen.py +0 -0
  60. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generators/names_generator.py +0 -0
  61. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generators/output_parser_generator.py +0 -0
  62. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generators/output_prompt_generator.py +0 -0
  63. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generators/payload_vo_generator.py +0 -0
  64. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generators/render_helper_generator.py +0 -0
  65. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generators/router_generator.py +0 -0
  66. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generators/template_generator.py +0 -0
  67. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generators/tph_plan.py +0 -0
  68. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generators/trace_helper_generator.py +0 -0
  69. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/instance_artifacts.py +0 -0
  70. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/metaobjects-config.schema.json +0 -0
  71. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/output_format_spec_emitter.py +0 -0
  72. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/overwrite_policy.py +0 -0
  73. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/project_config.py +0 -0
  74. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/runtime/__init__.py +0 -0
  75. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/runtime/filter_parser.py +0 -0
  76. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/template_codegen/__init__.py +0 -0
  77. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/template_codegen/output_pattern.py +0 -0
  78. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/template_codegen/template_data.py +0 -0
  79. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/template_codegen/template_spec.py +0 -0
  80. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/type_map.py +0 -0
  81. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/core_types.py +0 -0
  82. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/datatype.py +0 -0
  83. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/documentation/__init__.py +0 -0
  84. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/documentation/doc_constants.py +0 -0
  85. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/documentation/doc_provider.py +0 -0
  86. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/documentation/doc_schema.py +0 -0
  87. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/library/__init__.py +0 -0
  88. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/library/embedded_library.py +0 -0
  89. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/library/library_sources.py +0 -0
  90. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/loader/__init__.py +0 -0
  91. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/loader/meta_data_loader.py +0 -0
  92. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/loader/registered_validation.py +0 -0
  93. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/loader/sources/__init__.py +0 -0
  94. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/loader/sources/directory_source.py +0 -0
  95. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/loader/sources/meta_data_source.py +0 -0
  96. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/loader/sources/uri_source.py +0 -0
  97. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/loader/validate_discriminator.py +0 -0
  98. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/loader/validate_enum_normalize_ambiguity.py +0 -0
  99. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/loader/validate_field_mutability.py +0 -0
  100. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/loader/validate_source_escapes.py +0 -0
  101. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/loader/validate_source_parameter_ref.py +0 -0
  102. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/loader/validate_source_physical_names.py +0 -0
  103. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/loader/validation_passes.py +0 -0
  104. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/__init__.py +0 -0
  105. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/__init__.py +0 -0
  106. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/attr/__init__.py +0 -0
  107. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/attr/attr_constants.py +0 -0
  108. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/attr/meta_attr.py +0 -0
  109. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/field/__init__.py +0 -0
  110. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/field/field_constants.py +0 -0
  111. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/field/meta_field.py +0 -0
  112. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/identity/__init__.py +0 -0
  113. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/identity/identity_constants.py +0 -0
  114. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/identity/meta_identity.py +0 -0
  115. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/index/__init__.py +0 -0
  116. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/index/index_constants.py +0 -0
  117. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/index/meta_index.py +0 -0
  118. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/object/__init__.py +0 -0
  119. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/object/meta_object.py +0 -0
  120. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/object/meta_object_aware.py +0 -0
  121. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/object/object_class_registry.py +0 -0
  122. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/object/object_constants.py +0 -0
  123. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/object/object_extract.py +0 -0
  124. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/object/value_object.py +0 -0
  125. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/relationship/__init__.py +0 -0
  126. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/relationship/derive_m2m_fields.py +0 -0
  127. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/relationship/meta_relationship.py +0 -0
  128. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/relationship/relationship_constants.py +0 -0
  129. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/requirement/__init__.py +0 -0
  130. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/requirement/meta_requirement.py +0 -0
  131. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/requirement/requirement_constants.py +0 -0
  132. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/validator/__init__.py +0 -0
  133. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/validator/validator_constants.py +0 -0
  134. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/meta_data.py +0 -0
  135. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/meta_root.py +0 -0
  136. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/persistence/__init__.py +0 -0
  137. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/persistence/db/__init__.py +0 -0
  138. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/persistence/db/db_constants.py +0 -0
  139. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/persistence/db/db_provider.py +0 -0
  140. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/persistence/origin/__init__.py +0 -0
  141. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/persistence/origin/meta_origin.py +0 -0
  142. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/persistence/origin/origin_constants.py +0 -0
  143. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/persistence/source/__init__.py +0 -0
  144. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/persistence/source/meta_source.py +0 -0
  145. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/persistence/source/source_constants.py +0 -0
  146. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/presentation/__init__.py +0 -0
  147. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/presentation/layout/__init__.py +0 -0
  148. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/presentation/layout/layout_constants.py +0 -0
  149. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/presentation/layout/meta_layout.py +0 -0
  150. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/presentation/ui/__init__.py +0 -0
  151. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/presentation/ui/ui_provider.py +0 -0
  152. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/presentation/view/__init__.py +0 -0
  153. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/presentation/view/meta_view.py +0 -0
  154. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/presentation/view/view_constants.py +0 -0
  155. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/provider_extends.py +0 -0
  156. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/template/__init__.py +0 -0
  157. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/template/meta_template.py +0 -0
  158. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/template/prompt_provider.py +0 -0
  159. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/template/template_constants.py +0 -0
  160. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/naming_refs.py +0 -0
  161. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/parser.py +0 -0
  162. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/parser_yaml.py +0 -0
  163. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/provider.py +0 -0
  164. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/py.typed +0 -0
  165. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/registry.py +0 -0
  166. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/registry_manifest.py +0 -0
  167. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/__init__.py +0 -0
  168. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/email_document.py +0 -0
  169. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/escapers.py +0 -0
  170. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/extract/KNOWN_GAPS.md +0 -0
  171. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/extract/__init__.py +0 -0
  172. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/extract/coerce.py +0 -0
  173. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/extract/extract.py +0 -0
  174. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/extract/extract_map.py +0 -0
  175. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/extract/json_forgiving_reader.py +0 -0
  176. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/extract/locate.py +0 -0
  177. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/extract/normalize.py +0 -0
  178. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/extract/strip.py +0 -0
  179. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/extract/types.py +0 -0
  180. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/extract/xml_forgiving_reader.py +0 -0
  181. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/filesystem_provider.py +0 -0
  182. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/payload_accessors.py +0 -0
  183. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/prompt/__init__.py +0 -0
  184. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/prompt/output_format_renderer.py +0 -0
  185. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/prompt/output_format_spec.py +0 -0
  186. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/prompt/prompt_field.py +0 -0
  187. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/prompt/prompt_overrides.py +0 -0
  188. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/prompt/prompt_style.py +0 -0
  189. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/renderer.py +0 -0
  190. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/verify.py +0 -0
  191. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/runtime/__init__.py +0 -0
  192. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/runtime/llm_recorder.py +0 -0
  193. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/runtime/n2m_resolver.py +0 -0
  194. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/runtime/object_manager.py +0 -0
  195. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/runtime/tph.py +0 -0
  196. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/shared/__init__.py +0 -0
  197. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/shared/base_types.py +0 -0
  198. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/shared/separators.py +0 -0
  199. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/shared/structural.py +0 -0
  200. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/source/__init__.py +0 -0
  201. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/source/error_source.py +0 -0
  202. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/source/json_path.py +0 -0
  203. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/source/semantic_diff.py +0 -0
  204. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/source/yaml_positions.py +0 -0
  205. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/source_resolution.py +0 -0
  206. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/__init__.py +0 -0
  207. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/attr.json +0 -0
  208. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/db.json +0 -0
  209. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/documentation.json +0 -0
  210. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/field.json +0 -0
  211. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/identity.json +0 -0
  212. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/index.json +0 -0
  213. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/layout.json +0 -0
  214. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/object.json +0 -0
  215. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/origin.json +0 -0
  216. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/prompt.json +0 -0
  217. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/relationship.json +0 -0
  218. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/requirement.json +0 -0
  219. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/source.json +0 -0
  220. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/template.json +0 -0
  221. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/ui-web.json +0 -0
  222. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/ui.json +0 -0
  223. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/validator.json +0 -0
  224. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/view.json +0 -0
  225. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/super_resolve.py +0 -0
  226. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/validation_types.py +0 -0
  227. {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/yaml_desugar.py +0 -0
  228. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/__init__.py +0 -0
  229. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/__init__.py +0 -0
  230. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/golden/extends/expected/BaseEntity.py +0 -0
  231. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/golden/extends/expected/Program.py +0 -0
  232. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/golden/extends/meta.json +0 -0
  233. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/golden/nested-array/expected/AuthorBrief.py +0 -0
  234. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/golden/nested-array/expected/PostBrief.py +0 -0
  235. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/golden/nested-array/meta.json +0 -0
  236. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/golden/scalars/expected/Metric.py +0 -0
  237. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/golden/scalars/expected/Report.py +0 -0
  238. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/golden/scalars/meta.json +0 -0
  239. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/golden/vanilla/expected/Subscriber.py +0 -0
  240. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/golden/vanilla/meta.json +0 -0
  241. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_abstract_conformance.py +0 -0
  242. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_api_docs_builder.py +0 -0
  243. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_api_docs_paths.py +0 -0
  244. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_cli.py +0 -0
  245. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_cli_config_gen.py +0 -0
  246. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_cli_config_verify.py +0 -0
  247. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_cli_providers.py +0 -0
  248. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_cli_registry.py +0 -0
  249. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_cli_staleness_nudge.py +0 -0
  250. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_cli_verify_strict.py +0 -0
  251. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_cli_verify_subverbs.py +0 -0
  252. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_constants_config.py +0 -0
  253. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_entity_model.py +0 -0
  254. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_enum_conformance.py +0 -0
  255. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_extends_abstract_field_inheritance.py +0 -0
  256. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_extract_tier_collision.py +0 -0
  257. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_extractor_generator.py +0 -0
  258. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_filter_allowlist_generator.py +0 -0
  259. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_format.py +0 -0
  260. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_fr010_nested_object_prompt.py +0 -0
  261. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_fr010_output_codegen.py +0 -0
  262. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_fr019_shared_provided_conformance.py +0 -0
  263. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_gen_state_keying.py +0 -0
  264. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_generator.py +0 -0
  265. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_generator_extension_seams.py +0 -0
  266. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_golden.py +0 -0
  267. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_inherit_without_restate_gate.py +0 -0
  268. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_inheritance_conformance.py +0 -0
  269. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_instance_artifacts.py +0 -0
  270. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_m2m_codegen.py +0 -0
  271. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_names_extends_chain.py +0 -0
  272. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_names_generator.py +0 -0
  273. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_no_magic_physical_names.py +0 -0
  274. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_origin_nullability.py +0 -0
  275. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_output_parser_generator.py +0 -0
  276. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_overwrite_policy.py +0 -0
  277. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_overwrite_policy_hash.py +0 -0
  278. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_payload_vo_generator.py +0 -0
  279. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_project_config.py +0 -0
  280. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_projection_compile.py +0 -0
  281. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_render_helper_conformance.py +0 -0
  282. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_render_helper_generator.py +0 -0
  283. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_reverse_finders.py +0 -0
  284. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_router_autoset.py +0 -0
  285. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_router_generator.py +0 -0
  286. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_runner.py +0 -0
  287. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_source_resolution.py +0 -0
  288. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_sourceless_projection.py +0 -0
  289. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_template_data.py +0 -0
  290. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_template_generator.py +0 -0
  291. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_template_output_pattern.py +0 -0
  292. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_template_scope_helpers.py +0 -0
  293. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_template_scope_walk.py +0 -0
  294. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_template_spec.py +0 -0
  295. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_tph_codegen.py +0 -0
  296. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_trace_helper_generator.py +0 -0
  297. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_type_map.py +0 -0
  298. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_validation_conformance.py +0 -0
  299. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_write_through.py +0 -0
  300. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/config/__init__.py +0 -0
  301. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/config/test_source_resolver.py +0 -0
  302. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/__init__.py +0 -0
  303. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/capabilities.py +0 -0
  304. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/conformance-expected-failures.json +0 -0
  305. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/conformance_adapter.py +0 -0
  306. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/corpus.py +0 -0
  307. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/expected_failures.py +0 -0
  308. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/fixture_discovery.py +0 -0
  309. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/navigator.py +0 -0
  310. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/test_api_docs_cross_port_conformance.py +0 -0
  311. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/test_conformance.py +0 -0
  312. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/test_extract_conformance.py +0 -0
  313. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/test_extract_object_verdict.py +0 -0
  314. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/test_fr010_loader_attrs.py +0 -0
  315. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/test_fr011_attrs.py +0 -0
  316. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/test_generator_registry_conformance.py +0 -0
  317. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/test_object_model_conformance.py +0 -0
  318. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/test_provider_composition_conformance.py +0 -0
  319. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/test_registry_conformance.py +0 -0
  320. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/test_runner_hardfail.py +0 -0
  321. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/test_spec_metamodel_embed.py +0 -0
  322. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/test_strict_attr_load.py +0 -0
  323. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/test_template_codegen_conformance.py +0 -0
  324. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/test_template_generator_conformance.py +0 -0
  325. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/test_yaml_conformance.py +0 -0
  326. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/yaml-conformance-expected-failures.json +0 -0
  327. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/__init__.py +0 -0
  328. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/api_contract_assertions.py +0 -0
  329. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/api_contract_jsonb_server.py +0 -0
  330. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/api_contract_m2m_server.py +0 -0
  331. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/api_contract_server.py +0 -0
  332. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/generated_jsonb_app.py +0 -0
  333. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/generated_m2m_app.py +0 -0
  334. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/generated_router_app.py +0 -0
  335. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/generated_tph_app.py +0 -0
  336. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/meta_ai_trace.yaml +0 -0
  337. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/normalization.py +0 -0
  338. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/postgres_container.py +0 -0
  339. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/query_runner.py +0 -0
  340. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/scenarios.py +0 -0
  341. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/test_api_contract.py +0 -0
  342. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/test_api_contract_generated.py +0 -0
  343. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/test_api_contract_jsonb.py +0 -0
  344. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/test_api_contract_m2m.py +0 -0
  345. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/test_api_contract_m2m_generated.py +0 -0
  346. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/test_api_contract_tph_generated.py +0 -0
  347. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/test_generated_router_uuid_pk.py +0 -0
  348. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/test_llm_call_trace.py +0 -0
  349. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/test_normalization.py +0 -0
  350. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/test_query_scenarios.py +0 -0
  351. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/test_runtime_return_types.py +0 -0
  352. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/loader/__init__.py +0 -0
  353. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/loader/test_abstract_subtype_authored.py +0 -0
  354. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/loader/test_enum_extends_values_conflict.py +0 -0
  355. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/loader/test_field_mutability_order.py +0 -0
  356. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/loader/test_shipped_library_ai.py +0 -0
  357. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/loader/test_template_payload_target_210.py +0 -0
  358. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/open_closed_proof_test.py +0 -0
  359. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/__init__.py +0 -0
  360. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/extract/__init__.py +0 -0
  361. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/extract/test_coerce.py +0 -0
  362. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/extract/test_extract.py +0 -0
  363. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/extract/test_extract_map.py +0 -0
  364. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/extract/test_json_forgiving_reader.py +0 -0
  365. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/extract/test_locate.py +0 -0
  366. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/extract/test_model.py +0 -0
  367. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/extract/test_normalize.py +0 -0
  368. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/extract/test_strip.py +0 -0
  369. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/extract/test_xml_forgiving_reader.py +0 -0
  370. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/prompt/__init__.py +0 -0
  371. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/prompt/test_output_format_renderer.py +0 -0
  372. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/test_email_document.py +0 -0
  373. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/test_filesystem_provider.py +0 -0
  374. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/test_output_format_renderer_nested.py +0 -0
  375. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/test_output_prompt_conformance.py +0 -0
  376. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/test_render_conformance.py +0 -0
  377. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/test_render_max_chars.py +0 -0
  378. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/test_verify.py +0 -0
  379. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/test_verify_conformance.py +0 -0
  380. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/runtime/test_object_manager_enum_intvaluemap.py +0 -0
  381. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/runtime/test_object_manager_table_name.py +0 -0
  382. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/source/__init__.py +0 -0
  383. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/source/test_fr5c_merge_attribution.py +0 -0
  384. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/source/test_fr5d_reference_resolution.py +0 -0
  385. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/source/test_fr5e_database_source_shape.py +0 -0
  386. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/source/test_json_path.py +0 -0
  387. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/source/test_semantic_diff.py +0 -0
  388. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/source/test_source_on_node.py +0 -0
  389. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/source/test_yaml_positions.py +0 -0
  390. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/test_api_docs_accuracy.py +0 -0
  391. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/__init__.py +0 -0
  392. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_agent_context_staleness.py +0 -0
  393. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_capabilities.py +0 -0
  394. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_column_naming_strategy.py +0 -0
  395. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_common_attrs.py +0 -0
  396. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_core_types.py +0 -0
  397. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_effective_children_sibling_shadowing.py +0 -0
  398. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_effective_package.py +0 -0
  399. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_errors.py +0 -0
  400. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_field_enum.py +0 -0
  401. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_field_enum_intvaluemap.py +0 -0
  402. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_field_map_validation.py +0 -0
  403. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_field_uuid_dbcolumntype.py +0 -0
  404. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_fr016_source_name_and_kind_aliases.py +0 -0
  405. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_index_lookup.py +0 -0
  406. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_llm_recorder.py +0 -0
  407. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_loader.py +0 -0
  408. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_loader_bom.py +0 -0
  409. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_loader_class.py +0 -0
  410. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_meta_attr.py +0 -0
  411. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_meta_data.py +0 -0
  412. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_meta_source.py +0 -0
  413. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_module_shortcuts.py +0 -0
  414. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_n2m_resolver.py +0 -0
  415. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_n2m_resolver_inherited.py +0 -0
  416. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_no_dead_config_fields.py +0 -0
  417. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_object_manager_autoset_stamping.py +0 -0
  418. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_object_manager_uuid_coercion.py +0 -0
  419. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_object_manager_write_through.py +0 -0
  420. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_one_primary_source.py +0 -0
  421. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_parser.py +0 -0
  422. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_parser_yaml.py +0 -0
  423. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_provider.py +0 -0
  424. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_provider_extension.py +0 -0
  425. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_registry.py +0 -0
  426. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_registry_completeness.py +0 -0
  427. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_registry_extend.py +0 -0
  428. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_registry_sealed.py +0 -0
  429. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_relationship_referential_actions.py +0 -0
  430. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_resolution_key.py +0 -0
  431. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_runtime_resolution_key_binding.py +0 -0
  432. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_serializer.py +0 -0
  433. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_shared_constants.py +0 -0
  434. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_smoke.py +0 -0
  435. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_source_escapes.py +0 -0
  436. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_sources.py +0 -0
  437. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_strict_child_placement.py +0 -0
  438. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_super_resolve.py +0 -0
  439. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_template_toolcall.py +0 -0
  440. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_template_wrong_subtype_attrs.py +0 -0
  441. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_validation_attr_schema.py +0 -0
  442. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_validation_filter_values.py +0 -0
  443. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_validation_origin_195.py +0 -0
  444. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_validation_origin_paths.py +0 -0
  445. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_validation_sort_field.py +0 -0
  446. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_validation_warnings.py +0 -0
  447. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_write_coercion_arrays.py +0 -0
  448. {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_yaml_desugar.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: metaobjects
3
- Version: 1.0.1
3
+ Version: 1.0.3
4
4
  Summary: Cross-language metadata standard: declare typed entities once, generate idiomatic drift-checked code across languages — Python port.
5
5
  Project-URL: Homepage, https://metaobjects.dev
6
6
  Project-URL: Repository, https://github.com/metaobjectsdev/metaobjects
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "metaobjects"
3
- version = "1.0.1"
3
+ version = "1.0.3"
4
4
  description = "Cross-language metadata standard: declare typed entities once, generate idiomatic drift-checked code across languages — Python port."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -62,27 +62,21 @@ integration = ["pg8000>=1.31", "fastapi>=0.110", "httpx>=0.27"]
62
62
  requires = ["hatchling"]
63
63
  build-backend = "hatchling.build"
64
64
 
65
- [tool.hatch.build.targets.wheel]
66
- packages = ["src/metaobjects"]
67
- exclude = ["**/KNOWN_GAPS.md"]
68
-
69
- # Bundle the repo-root agent-context/ content tree into the package so the installed
70
- # `metaobjects agent-docs` command can resolve it offline (no Node, no monorepo).
71
- # A custom build hook (hatch_build.py) copies ../../agent-context into
72
- # src/metaobjects/agent_context/_content at build time, and `artifacts` below forces
73
- # that (gitignored) tree into BOTH the sdist and the wheel — so `uv build`
74
- # (sdist -> wheel) works, not just a direct wheel build. In dev/test the resolver
75
- # falls back to walking up to the monorepo agent-context/.
76
- [tool.hatch.build.hooks.custom]
77
-
78
- # FR-033 — the 15 shared spec/metamodel/*.json files are COMMITTED copies under
65
+ # FR-033 — the shared spec/metamodel/*.json files are COMMITTED copies under
79
66
  # src/metaobjects/spec_metamodel/ (not build-time-generated), so hatchling's default
80
67
  # package inclusion ships them in both the sdist and the wheel (read via
81
68
  # importlib.resources, AOT-safe). A byte-identity gate
82
69
  # (tests/conformance/test_spec_metamodel_embed.py) keeps the copies from drifting
83
70
  # from the repo-root spec/metamodel/ source.
84
- [tool.hatch.build]
85
- artifacts = ["src/metaobjects/agent_context/_content/**"]
71
+ [tool.hatch.build.targets.wheel]
72
+ packages = ["src/metaobjects"]
73
+ exclude = ["**/KNOWN_GAPS.md"]
74
+
75
+ # No agent-context ships in this package. `metaobjects agent-docs` redirects to the Node
76
+ # scaffolder (`npx meta agent-docs --server python`), which owns that content, so the wheel
77
+ # and sdist carry none of it and an agent-context/ edit never makes PyPI publish.
78
+ # hatch_build.py is a deliberate no-op, kept only so tooling that names the hook does not break.
79
+ [tool.hatch.build.hooks.custom]
86
80
 
87
81
  [tool.pytest.ini_options]
88
82
  testpaths = ["tests"]
@@ -49,9 +49,14 @@ import re
49
49
  import sys
50
50
  import tempfile
51
51
  from pathlib import Path
52
+ from typing import Callable
52
53
 
53
54
  from metaobjects import MetaDataLoader
54
55
  from metaobjects.errors import ParseError
56
+ from metaobjects.config.dependencies import Collection, imported_from, refuse_unowned_packages
57
+ from metaobjects.loader.meta_data_loader import LoadResult
58
+ from metaobjects.loader.sources import FileSource
59
+ from metaobjects.meta.core.object.meta_object import MetaObject
55
60
  from metaobjects.agent_context import (
56
61
  AGENT_CONTEXT_MANIFEST_PATH,
57
62
  agent_context_staleness,
@@ -93,14 +98,14 @@ from metaobjects.codegen.generators.render_helper_generator import (
93
98
  _resolve_payload_vo,
94
99
  )
95
100
  from metaobjects.meta.template import template_constants as tc
96
- from metaobjects.naming import COLUMN_NAMING_STRATEGIES, DEFAULT_COLUMN_NAMING
101
+ from metaobjects.naming import COLUMN_NAMING_STRATEGIES, DEFAULT_COLUMN_NAMING, package_of_resolution_key
97
102
  from metaobjects.render.filesystem_provider import FilesystemProvider
98
103
  from metaobjects.render.verify import (
99
104
  ERR_REQUIRED_SLOT_UNUSED,
100
105
  PayloadField,
101
106
  verify as render_verify,
102
107
  )
103
- from metaobjects.shared.base_types import TYPE_TEMPLATE
108
+ from metaobjects.shared.base_types import TYPE_OBJECT, TYPE_TEMPLATE
104
109
  from metaobjects.shared.separators import PACKAGE_SEP
105
110
 
106
111
 
@@ -296,33 +301,64 @@ def _load_root(
296
301
  return result.root, []
297
302
 
298
303
 
299
- def _load_root_from_paths(
300
- paths: list[str],
304
+ def _load_collection_result(
305
+ collection: Collection,
301
306
  strict: bool = False,
302
307
  providers: list[object] | None = None,
303
308
  libraries: list[str] | None = None,
304
- ) -> tuple[MetaData | None, list[str]]:
305
- """Load metadata from an explicit file list rather than a single directory.
306
-
307
- The source-resolution ladder's ``.metaobjects/config.json`` rung
308
- (:func:`resolve_metadata_location`) can resolve to several directories or
309
- individual files, which a single ``from_directory`` call cannot express —
310
- so this loads each resolved file as its own ``file://`` source via
311
- :meth:`MetaDataLoader.from_uris`. Mirrors :func:`_load_root`'s ``strict``/
312
- ``providers``/``libraries`` contract exactly.
309
+ ) -> LoadResult:
310
+ """Load a resolved `Collection`'s files its dependency artifacts leading,
311
+ each under its `dep:<name>/<artifact>` source id (FR-023) — then run the
312
+ post-load ownership refusal (`ERR_DEPENDENCY_PACKAGE_NOT_OWNED`, DESIGN
313
+ §11.5). Mirrors the TS `loadMemory` (`sdk/src/memory.ts`).
314
+
315
+ Lower-level than :func:`_load_root_from_collection`: this returns the raw
316
+ `LoadResult` (structured `MetaError`s, a code + provenance on each) rather
317
+ than the CLI's flattened `(root, message-strings)` contract, so a caller
318
+ that needs the CODE or the offending FILE — the dependency corpus runner —
319
+ can read them. ``refuse_unowned_packages`` runs AFTER the loader's own
320
+ errors, never before: an unflagged overlay whose target the upstream
321
+ removed fails first, with its own coded error.
313
322
  """
314
- uris = [Path(p).resolve().as_uri() for p in paths]
323
+ lib_sources: list[object] = []
324
+ if libraries:
325
+ from metaobjects.library import library_sources
326
+
327
+ lib_sources = library_sources(libraries)
328
+
329
+ sources = [FileSource(p, id=collection.file_ids.get(p)) for p in collection.files]
330
+
315
331
  if providers:
316
332
  from metaobjects.core_types import core_providers
317
333
 
318
- result = MetaDataLoader.from_uris(
319
- uris,
320
- providers=[*core_providers, *providers],
321
- strict=strict,
322
- libraries=libraries,
323
- )
334
+ loader = MetaDataLoader(providers=[*core_providers, *providers], strict=strict)
324
335
  else:
325
- result = MetaDataLoader.from_uris(uris, strict=strict, libraries=libraries)
336
+ loader = MetaDataLoader(strict=strict)
337
+
338
+ result = loader.load([*lib_sources, *sources])
339
+ if not result.errors:
340
+ refuse_unowned_packages(result.root, collection.imported_packages, collection.imported_nodes)
341
+ return result
342
+
343
+
344
+ def _load_root_from_collection(
345
+ collection: Collection,
346
+ strict: bool = False,
347
+ providers: list[object] | None = None,
348
+ libraries: list[str] | None = None,
349
+ ) -> tuple[MetaData | None, list[str]]:
350
+ """Load a resolved `Collection` — the source-resolution ladder's
351
+ ``.metaobjects/config.json`` rung (:func:`resolve_metadata_location`), which
352
+ can resolve to several directories, individual files, AND a dependency's
353
+ snapshot artifact, none of which a single ``from_directory`` call can
354
+ express. Mirrors :func:`_load_root`'s ``strict``/``providers``/``libraries``
355
+ contract exactly (CLI-facing: flattened error messages, never a raised
356
+ exception for a plain loader error).
357
+ """
358
+ try:
359
+ result = _load_collection_result(collection, strict=strict, providers=providers, libraries=libraries)
360
+ except ParseError as exc:
361
+ return None, [f"{exc.code}: {exc}"]
326
362
  if result.errors:
327
363
  msgs = [f"{e.code}: {e.message}" for e in result.errors]
328
364
  return None, msgs
@@ -369,6 +405,51 @@ def _parse_entities(value: str | None) -> list[str] | None:
369
405
  return names or None
370
406
 
371
407
 
408
+ def _refuse_imported_entities(
409
+ entity_names: list[str] | None,
410
+ root: MetaData,
411
+ collection: Collection,
412
+ ) -> str | None:
413
+ """FR-023 §11.1 item 2 — the error message for a target's ``entities:`` (or
414
+ ``--entities``) naming ONLY objects imported from a dependency and excluded
415
+ from output (imported metadata is load-only by default; only the project's
416
+ own `scope.include` naming the package literally opts it in). Returns
417
+ `None` for every other case, INCLUDING a name matching nothing at all —
418
+ that stays the runner's own "no entities matched" warning, unchanged.
419
+ Mirrors the TS `refuseImportedPositional` (`cli/src/commands/gen.ts`).
420
+
421
+ A named entity is a bare NAME, not a fully-qualified one, so two packages
422
+ declaring the same short name are both candidates; the refusal fires only
423
+ when NONE of them would generate.
424
+ """
425
+ if not entity_names:
426
+ return None
427
+ # ADR-0039 sanctioned own: top-level object scan on the loader ROOT
428
+ # (metadata.root is never extended, so own == effective) — mirrors
429
+ # `codegen.runner._objects`.
430
+ all_objects = [
431
+ c for c in root.own_children() if c.type == TYPE_OBJECT and isinstance(c, MetaObject)
432
+ ]
433
+ for name in entity_names:
434
+ matches = [o for o in all_objects if o.name == name]
435
+ if not matches:
436
+ continue # nothing loaded by this name — the runner's own warning covers it
437
+ all_excluded = all(
438
+ collection.imported(o.resolution_key()) and not collection.in_scope(o.resolution_key())
439
+ for o in matches
440
+ )
441
+ if not all_excluded:
442
+ continue
443
+ fqn = matches[0].resolution_key()
444
+ pkg = package_of_resolution_key(fqn)
445
+ dep_name = imported_from(pkg, collection.dependencies) or pkg
446
+ return (
447
+ f"error: '{name}' ({fqn}) is imported from dependency '{dep_name}' and is not "
448
+ "generated here — add its package to scope.include in .metaobjects/config.json"
449
+ )
450
+ return None
451
+
452
+
372
453
  def _run_suite(
373
454
  root: MetaData,
374
455
  out_dir: str,
@@ -380,6 +461,7 @@ def _run_suite(
380
461
  project_root: str | None = None,
381
462
  baseline: str = "default",
382
463
  refused_out: list[str] | None = None,
464
+ select: Callable[[str], bool] | None = None,
383
465
  ) -> list[str]:
384
466
  """Run a generator suite against an ALREADY-LOADED ``root`` into ``out_dir``.
385
467
 
@@ -388,6 +470,12 @@ def _run_suite(
388
470
  the ``--template-spec`` pass). See :func:`_generate` for the parameter
389
471
  semantics. Returns the written paths.
390
472
 
473
+ ``select`` (FR-023 §11.1 item 2) — normally a resolved `Collection`'s
474
+ `in_scope`: the output filter that excludes an imported dependency's
475
+ objects from codegen unless the project's own `scope.include` names their
476
+ package. `None` (the default) admits everything, byte-identical to a
477
+ project with no dependencies.
478
+
391
479
  NOTE: ``run_gen``'s output-path collision guard is per-pass — a
392
480
  ``--template-spec`` ``outputPattern`` that collides with a default-suite path
393
481
  is not flagged across the two passes (it would overwrite, since default files
@@ -420,7 +508,7 @@ def _run_suite(
420
508
  baseline=baseline,
421
509
  )
422
510
  suite = generators if generators is not None else _default_generators()
423
- result = run_gen(config, root, generators=suite, entity_filter=entity_filter)
511
+ result = run_gen(config, root, generators=suite, entity_filter=entity_filter, select=select)
424
512
  for warning in result.warnings:
425
513
  print(f"warning: {warning}")
426
514
  # A refusal is a FAILED gate, and the return value carries only what was WRITTEN — so
@@ -557,8 +645,11 @@ def template_spec_generators(
557
645
  def resolve_metadata_location(
558
646
  config: ProjectConfig | None,
559
647
  root: Path,
560
- ) -> list[str]:
648
+ ) -> Collection:
561
649
  """The precedence ladder for where metadata lives, rungs 2-4. First match wins.
650
+ Returns the full FR-023-aware `Collection` at EVERY rung — `dependencies` (and
651
+ `scope`/`migrate.scope`) are read from `root`'s neutral `.metaobjects/config.json`
652
+ regardless of which rung supplied the OWN files (DESIGN §2.3).
562
653
 
563
654
  2. This port's native surface — ``metadata`` in ``metaobjects.config.yaml``.
564
655
  3. ``sources`` in the port-neutral ``.metaobjects/config.json``.
@@ -583,23 +674,27 @@ def resolve_metadata_location(
583
674
  through to the next rung. See
584
675
  `docs/superpowers/specs/2026-08-19-cross-port-metadata-sources-design.md` §5.
585
676
  """
586
- from metaobjects.config.source_resolver import resolve_collection, resolve_sources
677
+ from metaobjects.config.source_resolver import (
678
+ build_collection,
679
+ resolve_collection_full,
680
+ resolve_sources,
681
+ )
587
682
 
588
683
  if config is not None:
589
684
  # `config.metadata_dir()` is already resolved to an absolute path
590
685
  # (`ProjectConfig._resolve_under`), so the base passed here is
591
- # likewise irrelevant.
592
- return [
593
- str(p) for p in resolve_sources(root, [{"path": config.metadata_dir()}])
594
- ]
686
+ # likewise irrelevant to resolving OWN files — but `root` is still
687
+ # where `.metaobjects/config.json` (dependencies/scope) is read from.
688
+ own_files = resolve_sources(root, [{"path": config.metadata_dir()}])
689
+ return build_collection(root, own_files)
595
690
 
596
- # Rungs 3 and 4 both live in `resolve_collection`.
597
- return [str(p) for p in resolve_collection(root)]
691
+ # Rungs 3 and 4 both live in `resolve_collection_full`.
692
+ return resolve_collection_full(root)
598
693
 
599
694
 
600
695
  def _resolve_metadata_location_or_print_error(
601
696
  config: ProjectConfig | None, root: Path
602
- ) -> list[str] | None:
697
+ ) -> Collection | None:
603
698
  """``resolve_metadata_location`` for the no-explicit-``metadata_dir`` CLI
604
699
  paths (``docs``, and the ``gen``/``verify --codegen`` neutral fallbacks),
605
700
  translating a raised ``ParseError`` into this CLI's print-and-return-1
@@ -657,8 +752,8 @@ def _cmd_docs(args: argparse.Namespace) -> int:
657
752
  except ConfigError as exc:
658
753
  print(f"error: {exc}", file=sys.stderr)
659
754
  return 1
660
- paths = _resolve_metadata_location_or_print_error(config, root_dir)
661
- if paths is None:
755
+ collection = _resolve_metadata_location_or_print_error(config, root_dir)
756
+ if collection is None:
662
757
  return 1
663
758
  docs_libraries: list[str] | None = None
664
759
  if config is not None:
@@ -673,8 +768,8 @@ def _cmd_docs(args: argparse.Namespace) -> int:
673
768
  return 1
674
769
  providers = [*providers, *config_providers]
675
770
  docs_libraries = config.libraries
676
- root, errors = _load_root_from_paths(
677
- paths, providers=providers, libraries=docs_libraries
771
+ root, errors = _load_root_from_collection(
772
+ collection, providers=providers, libraries=docs_libraries
678
773
  )
679
774
  project_default = root_dir.name
680
775
  else:
@@ -873,6 +968,7 @@ def _run_gen_targets(
873
968
  project_root: str | None = None,
874
969
  baseline: str = "default",
875
970
  refused_out: list[str] | None = None,
971
+ select: Callable[[str], bool] | None = None,
876
972
  ) -> tuple[list[str], list[str]]:
877
973
  """Run each target's suite into its ``outDir``. Returns (all_written, errors).
878
974
 
@@ -887,6 +983,9 @@ def _run_gen_targets(
887
983
  path across targets and record an error when two targets emit the same one.
888
984
  (Detection is post-write — the colliding file may already be on disk — but the
889
985
  command still fails, so a misconfigured gate is caught in CI.)
986
+
987
+ ``select`` (FR-023 §11.1 item 2) — see :func:`_run_suite`; the SAME predicate
988
+ applies to every target, since a `Collection`'s scope is project-wide.
890
989
  """
891
990
  all_written: list[str] = []
892
991
  seen: dict[str, str] = {} # full path -> target name
@@ -903,6 +1002,7 @@ def _run_gen_targets(
903
1002
  written = _run_suite(
904
1003
  root, out_dir, gens, t.entities, gen_state_dir=gen_state_dir,
905
1004
  project_root=project_root, baseline=baseline, refused_out=refused_out,
1005
+ select=select,
906
1006
  )
907
1007
  except ValueError as exc: # intra-target run_gen collision → clean error
908
1008
  errors.append(f"target '{t.name}': {exc}")
@@ -942,8 +1042,8 @@ def _cmd_gen_neutral_fallback(args: argparse.Namespace) -> int:
942
1042
  return 2
943
1043
 
944
1044
  root_dir = Path.cwd()
945
- paths = _resolve_metadata_location_or_print_error(None, root_dir)
946
- if paths is None:
1045
+ collection = _resolve_metadata_location_or_print_error(None, root_dir)
1046
+ if collection is None:
947
1047
  return 1
948
1048
 
949
1049
  generators: list[Generator] | None = None
@@ -960,19 +1060,25 @@ def _cmd_gen_neutral_fallback(args: argparse.Namespace) -> int:
960
1060
  if not providers_ok:
961
1061
  return 1
962
1062
 
963
- root, load_errors = _load_root_from_paths(paths, providers=providers)
1063
+ root, load_errors = _load_root_from_collection(collection, providers=providers)
964
1064
  if root is None:
965
1065
  print("error: failed to load metadata:", file=sys.stderr)
966
1066
  for msg in load_errors:
967
1067
  print(f" {msg}", file=sys.stderr)
968
1068
  return 1
969
1069
 
1070
+ imported_refusal = _refuse_imported_entities(entities, root, collection)
1071
+ if imported_refusal is not None:
1072
+ print(imported_refusal, file=sys.stderr)
1073
+ return 2
1074
+
970
1075
  gen_state = str(root_dir.resolve() / ".metaobjects" / ".gen-state")
971
1076
  column_naming = getattr(args, "column_naming", None) or DEFAULT_COLUMN_NAMING
972
1077
  refused: list[str] = []
973
1078
  written = _run_suite(
974
1079
  root, args.out, generators, entities,
975
1080
  gen_state_dir=gen_state, column_naming=column_naming,
1081
+ select=collection.in_scope,
976
1082
  project_root=str(root_dir.resolve()),
977
1083
  baseline=getattr(args, "baseline", None) or "default",
978
1084
  refused_out=refused,
@@ -1038,8 +1144,17 @@ def _cmd_gen_config(args: argparse.Namespace) -> int:
1038
1144
  if not providers_ok:
1039
1145
  return 1
1040
1146
 
1041
- root, load_errors = _load_root(
1042
- config.metadata_dir(), providers=providers, libraries=config.libraries
1147
+ # FR-023: rung 2 (this native `metaobjects.config.yaml` surface) still reads
1148
+ # `dependencies`/`scope`/`migrate.scope` from the project's neutral
1149
+ # `.metaobjects/config.json` (DESIGN §2.3 — dependencies apply at EVERY rung).
1150
+ collection = _resolve_metadata_location_or_print_error(
1151
+ config, project_root_for(config.metadata_dir())
1152
+ )
1153
+ if collection is None:
1154
+ return 1
1155
+
1156
+ root, load_errors = _load_root_from_collection(
1157
+ collection, providers=providers, libraries=config.libraries
1043
1158
  )
1044
1159
  if root is None:
1045
1160
  print("error: failed to load metadata:", file=sys.stderr)
@@ -1047,6 +1162,12 @@ def _cmd_gen_config(args: argparse.Namespace) -> int:
1047
1162
  print(f" {msg}", file=sys.stderr)
1048
1163
  return 1
1049
1164
 
1165
+ for t in targets:
1166
+ imported_refusal = _refuse_imported_entities(t.entities, root, collection)
1167
+ if imported_refusal is not None:
1168
+ print(imported_refusal, file=sys.stderr)
1169
+ return 2
1170
+
1050
1171
  refused: list[str] = []
1051
1172
  written, errors = _run_gen_targets(
1052
1173
  config, targets, root,
@@ -1054,6 +1175,7 @@ def _cmd_gen_config(args: argparse.Namespace) -> int:
1054
1175
  project_root=str(project_root_for(config.metadata_dir())),
1055
1176
  baseline=getattr(args, "baseline", None) or "default",
1056
1177
  refused_out=refused,
1178
+ select=collection.in_scope,
1057
1179
  )
1058
1180
  if errors:
1059
1181
  for msg in errors:
@@ -1323,8 +1445,8 @@ def _verify_codegen_neutral_fallback(args: argparse.Namespace) -> int:
1323
1445
  return 2
1324
1446
 
1325
1447
  root_dir = Path.cwd()
1326
- paths = _resolve_metadata_location_or_print_error(None, root_dir)
1327
- if paths is None:
1448
+ collection = _resolve_metadata_location_or_print_error(None, root_dir)
1449
+ if collection is None:
1328
1450
  return 1
1329
1451
 
1330
1452
  strict = not getattr(args, "lax", False)
@@ -1338,7 +1460,7 @@ def _verify_codegen_neutral_fallback(args: argparse.Namespace) -> int:
1338
1460
 
1339
1461
  with tempfile.TemporaryDirectory() as tmp:
1340
1462
  entities = _parse_entities(getattr(args, "entities", None))
1341
- root, load_errors = _load_root_from_paths(paths, strict=strict, providers=providers)
1463
+ root, load_errors = _load_root_from_collection(collection, strict=strict, providers=providers)
1342
1464
  if root is None:
1343
1465
  print("error: failed to load metadata:", file=sys.stderr)
1344
1466
  for msg in load_errors:
@@ -1347,8 +1469,14 @@ def _verify_codegen_neutral_fallback(args: argparse.Namespace) -> int:
1347
1469
  print(_strict_load_hint(), file=sys.stderr)
1348
1470
  return 1
1349
1471
 
1472
+ imported_refusal = _refuse_imported_entities(entities, root, collection)
1473
+ if imported_refusal is not None:
1474
+ print(imported_refusal, file=sys.stderr)
1475
+ return 2
1476
+
1350
1477
  _run_suite(
1351
- root, tmp, None, entities, gen_state_dir=None, column_naming=column_naming
1478
+ root, tmp, None, entities, gen_state_dir=None, column_naming=column_naming,
1479
+ select=collection.in_scope,
1352
1480
  )
1353
1481
  expected = _relative_set(Path(tmp))
1354
1482
  committed = _relative_set(Path(args.out))
@@ -1429,8 +1557,16 @@ def _verify_codegen_config(args: argparse.Namespace) -> int:
1429
1557
  if not providers_ok:
1430
1558
  return 1
1431
1559
 
1432
- root, load_errors = _load_root(
1433
- config.metadata_dir(), strict=strict, providers=providers, libraries=config.libraries
1560
+ # FR-023: see the matching comment in `_cmd_gen_config` — dependencies apply
1561
+ # at this rung too.
1562
+ collection = _resolve_metadata_location_or_print_error(
1563
+ config, project_root_for(config.metadata_dir())
1564
+ )
1565
+ if collection is None:
1566
+ return 1
1567
+
1568
+ root, load_errors = _load_root_from_collection(
1569
+ collection, strict=strict, providers=providers, libraries=config.libraries
1434
1570
  )
1435
1571
  if root is None:
1436
1572
  print("error: failed to load metadata:", file=sys.stderr)
@@ -1440,6 +1576,12 @@ def _verify_codegen_config(args: argparse.Namespace) -> int:
1440
1576
  print(_strict_load_hint(), file=sys.stderr)
1441
1577
  return 1
1442
1578
 
1579
+ for t in closure:
1580
+ imported_refusal = _refuse_imported_entities(t.entities, root, collection)
1581
+ if imported_refusal is not None:
1582
+ print(imported_refusal, file=sys.stderr)
1583
+ return 2
1584
+
1443
1585
  with tempfile.TemporaryDirectory() as temp_root:
1444
1586
  # Map each unique real outDir to ONE temp slot (shared real dir => shared slot).
1445
1587
  temp_for: dict[str, str] = {}
@@ -1456,7 +1598,7 @@ def _verify_codegen_config(args: argparse.Namespace) -> int:
1456
1598
  # gen_state_dir stays None: this regenerates into a temp tree purely to
1457
1599
  # diff, so recording a manifest would mutate the user's project from a
1458
1600
  # read-only drift check, keyed to a directory deleted seconds later.
1459
- _written, errors = _run_gen_targets(config, remapped, root)
1601
+ _written, errors = _run_gen_targets(config, remapped, root, select=collection.in_scope)
1460
1602
  if errors:
1461
1603
  for msg in errors:
1462
1604
  print(f"error: {msg}", file=sys.stderr)
@@ -60,8 +60,22 @@ def run_gen(
60
60
  *,
61
61
  generators: list[Generator],
62
62
  entity_filter: list[str] | None = None,
63
+ select: Callable[[str], bool] | None = None,
63
64
  merge_strategy: str = "overwrite",
64
65
  ) -> RunGenResult:
66
+ """Mirrors ``codegen-ts``'s ``runner.ts``.
67
+
68
+ ``select`` (FR-023 §11.1 item 2) — applied AFTER ``entity_filter``, over each
69
+ object's ``resolution_key()`` (never the bare name — two packages may declare
70
+ the same short name). Normally a resolved ``Collection``'s ``in_scope``: the
71
+ output filter that excludes an imported dependency's objects from codegen
72
+ unless the project's own ``scope.include`` names their package. ``None`` (the
73
+ default) admits everything, byte-identical to a project with no dependencies.
74
+ A generator that renders once over the WHOLE selected set (the shared-enums
75
+ module, so far the only one) reads it off ``ctx.entities`` like any other
76
+ generator — no separate wiring needed, since that list is already the
77
+ post-``select`` set (parity with the TS ``codegen-ts`` runner's ``select``).
78
+ """
65
79
  result = RunGenResult()
66
80
  if not isinstance(metadata, MetaRoot):
67
81
  raise ValueError("run_gen: metadata must be a loaded MetaRoot.")
@@ -69,13 +83,16 @@ def run_gen(
69
83
  objs = _objects(metadata)
70
84
  if entity_filter is not None:
71
85
  objs = [o for o in objs if o.name in entity_filter]
86
+ if select is not None:
87
+ objs = [o for o in objs if select(o.resolution_key())]
72
88
 
73
89
  if not objs:
74
- reason = (
75
- "no object children match the provided entity_filter"
76
- if entity_filter is not None
77
- else "root has no object children"
78
- )
90
+ if entity_filter is not None:
91
+ reason = "no object children match the provided entity_filter"
92
+ elif select is not None:
93
+ reason = "no object children survived the collection's scope"
94
+ else:
95
+ reason = "root has no object children"
79
96
  result.warnings.append(f"No entities to generate — {reason}.")
80
97
  return result
81
98
 
@@ -5,11 +5,25 @@ carries TypeScript-owned keys; those are ignored rather than modeled, so a new
5
5
  TS-only key never becomes a four-port change. See
6
6
  `docs/superpowers/specs/2026-08-19-cross-port-metadata-sources-design.md` §4.
7
7
  """
8
+ from .dependencies import (
9
+ ARTIFACT_SUFFIX,
10
+ DEPENDENCY_SOURCE_ID_PREFIX,
11
+ DEPS_DIR,
12
+ INTEGRITY_PREFIX,
13
+ LOCK_FILE,
14
+ MANIFEST_FILE,
15
+ )
8
16
  from .neutral_config import DEFAULT_METADATA_DIR, NeutralConfig, read_neutral_config
9
17
  from .source_resolver import resolve_collection, resolve_sources
10
18
 
11
19
  __all__ = [
20
+ "ARTIFACT_SUFFIX",
12
21
  "DEFAULT_METADATA_DIR",
22
+ "DEPENDENCY_SOURCE_ID_PREFIX",
23
+ "DEPS_DIR",
24
+ "INTEGRITY_PREFIX",
25
+ "LOCK_FILE",
26
+ "MANIFEST_FILE",
13
27
  "NeutralConfig",
14
28
  "read_neutral_config",
15
29
  "resolve_collection",