modwire 10.0.0__tar.gz → 10.1.0__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 (414) hide show
  1. {modwire-10.0.0 → modwire-10.1.0}/.dev/modwire.egg-info/SOURCES.txt +2 -0
  2. {modwire-10.0.0 → modwire-10.1.0}/.github/workflows/ci.yml +3 -0
  3. {modwire-10.0.0 → modwire-10.1.0}/PKG-INFO +9 -1
  4. {modwire-10.0.0 → modwire-10.1.0}/README.md +8 -0
  5. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/application.py +9 -0
  6. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/facade.py +4 -0
  7. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/pipeline/application.py +9 -0
  8. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/extractors/resources/typescript/build.py +1 -1
  9. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/extractors/resources/typescript/package-lock.json +7 -4
  10. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/extractors/resources/typescript/package.json +3 -0
  11. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/extractors/resources/typescript/script.js +225 -103
  12. modwire-10.1.0/src/modwire/shared/code/models/source_manifest_identity.py +10 -0
  13. modwire-10.1.0/tests/application/test_09_source_manifest_identity.py +120 -0
  14. {modwire-10.0.0 → modwire-10.1.0}/.github/workflows/release.yml +0 -0
  15. {modwire-10.0.0 → modwire-10.1.0}/.gitignore +0 -0
  16. {modwire-10.0.0 → modwire-10.1.0}/AGENTS.md +0 -0
  17. {modwire-10.0.0 → modwire-10.1.0}/LICENSE +0 -0
  18. {modwire-10.0.0 → modwire-10.1.0}/MANIFEST.in +0 -0
  19. {modwire-10.0.0 → modwire-10.1.0}/Makefile +0 -0
  20. {modwire-10.0.0 → modwire-10.1.0}/docs/target-language-ownership.md +0 -0
  21. {modwire-10.0.0 → modwire-10.1.0}/pyproject.toml +0 -0
  22. {modwire-10.0.0 → modwire-10.1.0}/scripts/check_extractors.py +0 -0
  23. {modwire-10.0.0 → modwire-10.1.0}/scripts/generate_docs.py +0 -0
  24. {modwire-10.0.0 → modwire-10.1.0}/scripts/verify_consumer.py +0 -0
  25. {modwire-10.0.0 → modwire-10.1.0}/setup.cfg +0 -0
  26. {modwire-10.0.0 → modwire-10.1.0}/setup.py +0 -0
  27. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/__init__.py +0 -0
  28. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/__main__.py +0 -0
  29. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/__init__.py +0 -0
  30. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/boundaries/__init__.py +0 -0
  31. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/boundaries/application.py +0 -0
  32. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/boundaries/domain.py +0 -0
  33. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/boundaries/models/__init__.py +0 -0
  34. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/boundaries/models/edge_rule_violation.py +0 -0
  35. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/boundaries/models/flow_report.py +0 -0
  36. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/boundaries/models/flow_violation.py +0 -0
  37. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/boundaries/models/types.py +0 -0
  38. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/boundaries/services/__init__.py +0 -0
  39. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/boundaries/services/backward_flow_analyzer.py +0 -0
  40. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/boundaries/services/boundaries_flow_analyzer.py +0 -0
  41. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/boundaries/services/module_boundary_analyzer.py +0 -0
  42. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/boundaries/services/no_cycles_flow_analyzer.py +0 -0
  43. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/boundaries/services/no_reentry_flow_analyzer.py +0 -0
  44. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/config/__init__.py +0 -0
  45. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/config/application.py +0 -0
  46. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/config/models/__init__.py +0 -0
  47. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/config/models/architecture_config.py +0 -0
  48. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/config/models/boundaries_config.py +0 -0
  49. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/config/models/boundary_rule.py +0 -0
  50. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/config/models/configuration_value.py +0 -0
  51. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/config/models/flow_realm.py +0 -0
  52. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/config/models/flow_rules.py +0 -0
  53. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/config/models/shape_config.py +0 -0
  54. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/config/models/shape_realm.py +0 -0
  55. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/config/models/shape_rules.py +0 -0
  56. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/config/models/tag_rule.py +0 -0
  57. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/facade.py +0 -0
  58. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/insights/__init__.py +0 -0
  59. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/insights/application.py +0 -0
  60. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/insights/domain.py +0 -0
  61. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/insights/models/__init__.py +0 -0
  62. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/insights/models/callable_report_entry.py +0 -0
  63. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/insights/models/callables_report.py +0 -0
  64. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/insights/models/clusters_report.py +0 -0
  65. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/insights/models/clusters_report_item.py +0 -0
  66. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/insights/models/coherence_report.py +0 -0
  67. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/insights/models/exports_report.py +0 -0
  68. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/insights/models/exports_report_item.py +0 -0
  69. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/insights/models/hotspots_report.py +0 -0
  70. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/insights/models/hotspots_report_item.py +0 -0
  71. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/insights/models/insight_report.py +0 -0
  72. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/insights/services/__init__.py +0 -0
  73. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/insights/services/callables_reporter.py +0 -0
  74. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/insights/services/clusters_reporter.py +0 -0
  75. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/insights/services/coherence_reporter.py +0 -0
  76. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/insights/services/exports_reporter.py +0 -0
  77. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/insights/services/hotspots_reporter.py +0 -0
  78. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/insights/services/insight_report_field_map.py +0 -0
  79. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/map/__init__.py +0 -0
  80. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/map/application.py +0 -0
  81. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/map/domain.py +0 -0
  82. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/map/models/__init__.py +0 -0
  83. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/map/models/architecture_map.py +0 -0
  84. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/map/models/architecture_realm.py +0 -0
  85. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/map/models/tag_map.py +0 -0
  86. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/map/models/tag_match.py +0 -0
  87. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/map/services/__init__.py +0 -0
  88. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/map/services/architecture_map_loader.py +0 -0
  89. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/map/services/tag_matcher.py +0 -0
  90. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/report/__init__.py +0 -0
  91. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/report/application.py +0 -0
  92. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/report/domain.py +0 -0
  93. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/report/models/__init__.py +0 -0
  94. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/report/models/architecture_group.py +0 -0
  95. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/report/models/map_report.py +0 -0
  96. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/report/models/report_catalog.py +0 -0
  97. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/report/models/report_descriptor.py +0 -0
  98. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/report/models/report_item.py +0 -0
  99. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/report/models/report_metadata.py +0 -0
  100. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/report/models/report_node.py +0 -0
  101. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/report/models/report_section.py +0 -0
  102. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/report/services/__init__.py +0 -0
  103. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/report/services/map_report_collector.py +0 -0
  104. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/shape/__init__.py +0 -0
  105. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/shape/application.py +0 -0
  106. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/shape/domain.py +0 -0
  107. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/shape/models/__init__.py +0 -0
  108. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/shape/models/shape_realm_architecture_map.py +0 -0
  109. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/shape/models/shape_report.py +0 -0
  110. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/shape/models/shape_violation.py +0 -0
  111. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/shape/services/__init__.py +0 -0
  112. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/shape/services/abstract_class_resolver.py +0 -0
  113. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/shape/services/callable_resolver.py +0 -0
  114. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/shape/services/class_resolver.py +0 -0
  115. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/shape/services/file_resolver.py +0 -0
  116. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/shape/services/import_resolver.py +0 -0
  117. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/shape/services/property_resolver.py +0 -0
  118. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/shape/services/signature_resolver.py +0 -0
  119. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/architecture/shape/services/symbol_resolver.py +0 -0
  120. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/autowiring.py +0 -0
  121. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/__init__.py +0 -0
  122. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/cache/__init__.py +0 -0
  123. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/cache/application.py +0 -0
  124. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/cache/domain.py +0 -0
  125. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/cache/models/__init__.py +0 -0
  126. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/cache/models/cache_entry.py +0 -0
  127. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/cache/models/cache_key.py +0 -0
  128. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/cache/models/cache_kind.py +0 -0
  129. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/cache/models/cache_options.py +0 -0
  130. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/cache/models/cache_outcome.py +0 -0
  131. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/cache/models/cache_plan.py +0 -0
  132. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/cache/models/cache_stage.py +0 -0
  133. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/cache/models/cache_storage_state.py +0 -0
  134. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/cache/models/cached_result.py +0 -0
  135. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/cache/models/source_cache_entry.py +0 -0
  136. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/cache/services/__init__.py +0 -0
  137. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/cache/services/cache_codec.py +0 -0
  138. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/cache/services/cache_identity.py +0 -0
  139. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/cache/services/filesystem_cache_storage.py +0 -0
  140. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/documentation/__init__.py +0 -0
  141. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/documentation/application.py +0 -0
  142. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/documentation/services/__init__.py +0 -0
  143. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/documentation/services/documentation_generator.py +0 -0
  144. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/initialization/__init__.py +0 -0
  145. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/initialization/application.py +0 -0
  146. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/initialization/models/__init__.py +0 -0
  147. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/initialization/models/initialization_result.py +0 -0
  148. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/initialization/services/__init__.py +0 -0
  149. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/initialization/services/initialization_service.py +0 -0
  150. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/pipeline/__init__.py +0 -0
  151. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/pipeline/domain.py +0 -0
  152. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/pipeline/models/__init__.py +0 -0
  153. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/pipeline/models/command_request.py +0 -0
  154. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/pipeline/models/extractor_batch_input.py +0 -0
  155. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/pipeline/models/extractor_command_input.py +0 -0
  156. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/pipeline/models/extractor_source_input.py +0 -0
  157. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/pipeline/models/report_pipeline_context.py +0 -0
  158. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/pipeline/models/source_entry.py +0 -0
  159. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/pipeline/models/source_inventory.py +0 -0
  160. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/pipeline/services/__init__.py +0 -0
  161. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/pipeline/services/batch_source_reader.py +0 -0
  162. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/pipeline/services/callables_insight.py +0 -0
  163. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/pipeline/services/clusters_insight.py +0 -0
  164. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/pipeline/services/coherence_insight.py +0 -0
  165. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/pipeline/services/command_line.py +0 -0
  166. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/pipeline/services/configuration_loader.py +0 -0
  167. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/pipeline/services/extractor_command.py +0 -0
  168. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/pipeline/services/flow_violations.py +0 -0
  169. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/pipeline/services/hotspots_insight.py +0 -0
  170. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/pipeline/services/map_tree.py +0 -0
  171. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/pipeline/services/output_console.py +0 -0
  172. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/pipeline/services/shape_violations.py +0 -0
  173. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/pipeline/services/source_manifest_builder.py +0 -0
  174. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/pipeline/services/success.py +0 -0
  175. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/pipeline/services/unknown_files_warning.py +0 -0
  176. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/pipeline/services/unused_exports_insight.py +0 -0
  177. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/resources/__init__.py +0 -0
  178. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/resources/application.py +0 -0
  179. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/resources/models/__init__.py +0 -0
  180. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/resources/models/defaults.py +0 -0
  181. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/resources/models/init_asset.py +0 -0
  182. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/resources/templates/AGENTS.md +0 -0
  183. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/resources/templates/ARCHITECTURE.md +0 -0
  184. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/resources/templates/INDEX.md +0 -0
  185. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/resources/templates/MODWIRE.md +0 -0
  186. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/resources/templates/RULES.md +0 -0
  187. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/resources/templates/TESTING.md +0 -0
  188. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/resources/templates/WORKFLOW.md +0 -0
  189. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/cli/resources/templates/architecture.yaml +0 -0
  190. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/__init__.py +0 -0
  191. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/dependency/__init__.py +0 -0
  192. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/dependency/application.py +0 -0
  193. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/dependency/domain.py +0 -0
  194. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/dependency/services/__init__.py +0 -0
  195. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/dependency/services/graph_builder.py +0 -0
  196. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/dependency/services/import_identity_index.py +0 -0
  197. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/dependency/services/import_resolver.py +0 -0
  198. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/extractors/__init__.py +0 -0
  199. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/extractors/application.py +0 -0
  200. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/extractors/domain.py +0 -0
  201. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/extractors/models/__init__.py +0 -0
  202. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/extractors/models/batch_config.py +0 -0
  203. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/extractors/models/extraction_request.py +0 -0
  204. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/extractors/models/extractor_resource.py +0 -0
  205. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/extractors/models/extractor_resource_set.py +0 -0
  206. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/extractors/models/extractor_runtime.py +0 -0
  207. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/extractors/models/python_call_context.py +0 -0
  208. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/extractors/resources/__init__.py +0 -0
  209. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/extractors/resources/php/build.php +0 -0
  210. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/extractors/resources/php/build.py +0 -0
  211. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/extractors/resources/php/composer.json +0 -0
  212. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/extractors/resources/php/composer.lock +0 -0
  213. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/extractors/resources/php/script.php +0 -0
  214. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/extractors/resources/php/script.src.php +0 -0
  215. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/extractors/resources/python/__init__.py +0 -0
  216. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/extractors/resources/python/script.py +0 -0
  217. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/extractors/resources/typescript/build.mjs +0 -0
  218. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/extractors/resources/typescript/script.ts +0 -0
  219. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/extractors/resources/typescript/tsconfig.json +0 -0
  220. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/extractors/services/__init__.py +0 -0
  221. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/extractors/services/php_extractor.py +0 -0
  222. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/extractors/services/python_call_reader.py +0 -0
  223. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/extractors/services/python_extractor.py +0 -0
  224. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/extractors/services/python_syntax_parser.py +0 -0
  225. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/extractors/services/type_script_extractor.py +0 -0
  226. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/extraction/facade.py +0 -0
  227. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/implementation/__init__.py +0 -0
  228. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/implementation/facade.py +0 -0
  229. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/implementation/manifest/__init__.py +0 -0
  230. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/implementation/manifest/application.py +0 -0
  231. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/implementation/manifest/contracts/__init__.py +0 -0
  232. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/implementation/manifest/contracts/manifest_compiler.py +0 -0
  233. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/implementation/manifest/contracts/manifest_serializer.py +0 -0
  234. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/implementation/manifest/models/__init__.py +0 -0
  235. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/implementation/manifest/models/digest_algorithm.py +0 -0
  236. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/implementation/manifest/models/implementation_manifest.py +0 -0
  237. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/implementation/manifest/models/implementation_manifest_document.py +0 -0
  238. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/implementation/manifest/models/manifest_annotation.py +0 -0
  239. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/implementation/manifest/models/manifest_attribute.py +0 -0
  240. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/implementation/manifest/models/manifest_callable.py +0 -0
  241. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/implementation/manifest/models/manifest_dependency.py +0 -0
  242. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/implementation/manifest/models/manifest_format.py +0 -0
  243. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/implementation/manifest/models/manifest_inheritance.py +0 -0
  244. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/implementation/manifest/models/manifest_parameter.py +0 -0
  245. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/implementation/manifest/models/manifest_span.py +0 -0
  246. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/implementation/manifest/models/manifest_symbol.py +0 -0
  247. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/implementation/manifest/services/__init__.py +0 -0
  248. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/implementation/manifest/services/canonical_json_manifest_serializer.py +0 -0
  249. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/implementation/manifest/services/code_map_manifest_compiler.py +0 -0
  250. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/py.typed +0 -0
  251. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/__init__.py +0 -0
  252. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/__init__.py +0 -0
  253. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/application.py +0 -0
  254. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/domain.py +0 -0
  255. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/__init__.py +0 -0
  256. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/capability_coverage.py +0 -0
  257. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/capability_status.py +0 -0
  258. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/code_map.py +0 -0
  259. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/code_map_producer.py +0 -0
  260. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/code_package.py +0 -0
  261. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/declaration_family.py +0 -0
  262. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/declaration_identity.py +0 -0
  263. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/dependency_edge_result.py +0 -0
  264. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/dependency_graph.py +0 -0
  265. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/dependency_node_result.py +0 -0
  266. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/duplicate_identity_error.py +0 -0
  267. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/edge.py +0 -0
  268. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/edge_resolution.py +0 -0
  269. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/extractor_descriptor.py +0 -0
  270. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/fact_capability.py +0 -0
  271. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/identity.py +0 -0
  272. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/node.py +0 -0
  273. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/query_builder.py +0 -0
  274. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/query_types.py +0 -0
  275. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/queryable_code_map.py +0 -0
  276. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/runtime_observation.py +0 -0
  277. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/scan_policy.py +0 -0
  278. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/source_abstract_class.py +0 -0
  279. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/source_artifact.py +0 -0
  280. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/source_call.py +0 -0
  281. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/source_callable.py +0 -0
  282. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/source_callable_symbol.py +0 -0
  283. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/source_class.py +0 -0
  284. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/source_class_method.py +0 -0
  285. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/source_class_property.py +0 -0
  286. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/source_export.py +0 -0
  287. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/source_extraction.py +0 -0
  288. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/source_file.py +0 -0
  289. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/source_file_result.py +0 -0
  290. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/source_function.py +0 -0
  291. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/source_import.py +0 -0
  292. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/source_imported_symbol.py +0 -0
  293. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/source_inheritance.py +0 -0
  294. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/source_interface.py +0 -0
  295. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/source_item_result.py +0 -0
  296. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/source_manifest.py +0 -0
  297. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/source_member_kind.py +0 -0
  298. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/source_parameter.py +0 -0
  299. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/source_relation_kind.py +0 -0
  300. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/source_signature.py +0 -0
  301. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/source_symbol.py +0 -0
  302. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/source_type.py +0 -0
  303. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/source_value.py +0 -0
  304. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/source_value_scope.py +0 -0
  305. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/models/types.py +0 -0
  306. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/services/__init__.py +0 -0
  307. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/services/glob_path_matcher.py +0 -0
  308. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/services/identity_resolver.py +0 -0
  309. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/code/services/installed_package_version.py +0 -0
  310. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/values/__init__.py +0 -0
  311. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/values/models/__init__.py +0 -0
  312. {modwire-10.0.0 → modwire-10.1.0}/src/modwire/shared/values/models/value_model.py +0 -0
  313. {modwire-10.0.0 → modwire-10.1.0}/tests/__init__.py +0 -0
  314. {modwire-10.0.0 → modwire-10.1.0}/tests/application/__init__.py +0 -0
  315. {modwire-10.0.0 → modwire-10.1.0}/tests/application/base_test.py +0 -0
  316. {modwire-10.0.0 → modwire-10.1.0}/tests/application/test_01_attacks.py +0 -0
  317. {modwire-10.0.0 → modwire-10.1.0}/tests/application/test_06_happy_path.py +0 -0
  318. {modwire-10.0.0 → modwire-10.1.0}/tests/application/test_07_cache.py +0 -0
  319. {modwire-10.0.0 → modwire-10.1.0}/tests/application/test_08_implementation_manifest.py +0 -0
  320. {modwire-10.0.0 → modwire-10.1.0}/tests/architecture/__init__.py +0 -0
  321. {modwire-10.0.0 → modwire-10.1.0}/tests/architecture/base_test.py +0 -0
  322. {modwire-10.0.0 → modwire-10.1.0}/tests/architecture/boundaries/__init__.py +0 -0
  323. {modwire-10.0.0 → modwire-10.1.0}/tests/architecture/boundaries/base_test.py +0 -0
  324. {modwire-10.0.0 → modwire-10.1.0}/tests/architecture/boundaries/test_01_attacks.py +0 -0
  325. {modwire-10.0.0 → modwire-10.1.0}/tests/architecture/boundaries/test_02_invariants.py +0 -0
  326. {modwire-10.0.0 → modwire-10.1.0}/tests/architecture/boundaries/test_03_public_api.py +0 -0
  327. {modwire-10.0.0 → modwire-10.1.0}/tests/architecture/boundaries/test_04_paths.py +0 -0
  328. {modwire-10.0.0 → modwire-10.1.0}/tests/architecture/config/__init__.py +0 -0
  329. {modwire-10.0.0 → modwire-10.1.0}/tests/architecture/config/test_01_attacks.py +0 -0
  330. {modwire-10.0.0 → modwire-10.1.0}/tests/architecture/config/test_02_invariants.py +0 -0
  331. {modwire-10.0.0 → modwire-10.1.0}/tests/architecture/insights/__init__.py +0 -0
  332. {modwire-10.0.0 → modwire-10.1.0}/tests/architecture/insights/base_test.py +0 -0
  333. {modwire-10.0.0 → modwire-10.1.0}/tests/architecture/insights/test_02_invariants.py +0 -0
  334. {modwire-10.0.0 → modwire-10.1.0}/tests/architecture/map/__init__.py +0 -0
  335. {modwire-10.0.0 → modwire-10.1.0}/tests/architecture/map/test_02_patterns.py +0 -0
  336. {modwire-10.0.0 → modwire-10.1.0}/tests/architecture/report/__init__.py +0 -0
  337. {modwire-10.0.0 → modwire-10.1.0}/tests/architecture/report/test_02_invariants.py +0 -0
  338. {modwire-10.0.0 → modwire-10.1.0}/tests/architecture/report_benchmark/__init__.py +0 -0
  339. {modwire-10.0.0 → modwire-10.1.0}/tests/architecture/report_benchmark/benchmark_process_timeout.py +0 -0
  340. {modwire-10.0.0 → modwire-10.1.0}/tests/architecture/report_benchmark/run.py +0 -0
  341. {modwire-10.0.0 → modwire-10.1.0}/tests/architecture/shape/__init__.py +0 -0
  342. {modwire-10.0.0 → modwire-10.1.0}/tests/architecture/shape/base_test.py +0 -0
  343. {modwire-10.0.0 → modwire-10.1.0}/tests/architecture/shape/test_01_limits.py +0 -0
  344. {modwire-10.0.0 → modwire-10.1.0}/tests/architecture/shape/test_02_invariants.py +0 -0
  345. {modwire-10.0.0 → modwire-10.1.0}/tests/cli/__init__.py +0 -0
  346. {modwire-10.0.0 → modwire-10.1.0}/tests/cli/base_test.py +0 -0
  347. {modwire-10.0.0 → modwire-10.1.0}/tests/cli/documentation/__init__.py +0 -0
  348. {modwire-10.0.0 → modwire-10.1.0}/tests/cli/documentation/test_02_invariants.py +0 -0
  349. {modwire-10.0.0 → modwire-10.1.0}/tests/cli/initialization/__init__.py +0 -0
  350. {modwire-10.0.0 → modwire-10.1.0}/tests/cli/initialization/test_01_attacks.py +0 -0
  351. {modwire-10.0.0 → modwire-10.1.0}/tests/cli/initialization/test_02_invariants.py +0 -0
  352. {modwire-10.0.0 → modwire-10.1.0}/tests/cli/initialization/test_03_interruption.py +0 -0
  353. {modwire-10.0.0 → modwire-10.1.0}/tests/cli/initialization/test_04_cleanup.py +0 -0
  354. {modwire-10.0.0 → modwire-10.1.0}/tests/cli/initialization/test_05_recovery.py +0 -0
  355. {modwire-10.0.0 → modwire-10.1.0}/tests/cli/pipeline/__init__.py +0 -0
  356. {modwire-10.0.0 → modwire-10.1.0}/tests/cli/pipeline/base_test.py +0 -0
  357. {modwire-10.0.0 → modwire-10.1.0}/tests/cli/pipeline/test_01_attacks.py +0 -0
  358. {modwire-10.0.0 → modwire-10.1.0}/tests/cli/pipeline/test_02_invariants.py +0 -0
  359. {modwire-10.0.0 → modwire-10.1.0}/tests/cli/pipeline/test_03_interruption.py +0 -0
  360. {modwire-10.0.0 → modwire-10.1.0}/tests/cli/pipeline/test_04_command_transport.py +0 -0
  361. {modwire-10.0.0 → modwire-10.1.0}/tests/cli/pipeline/test_05_recovery.py +0 -0
  362. {modwire-10.0.0 → modwire-10.1.0}/tests/cli/pipeline/test_06_happy_path.py +0 -0
  363. {modwire-10.0.0 → modwire-10.1.0}/tests/conftest.py +0 -0
  364. {modwire-10.0.0 → modwire-10.1.0}/tests/extraction/__init__.py +0 -0
  365. {modwire-10.0.0 → modwire-10.1.0}/tests/extraction/base_test.py +0 -0
  366. {modwire-10.0.0 → modwire-10.1.0}/tests/extraction/big_projects/__init__.py +0 -0
  367. {modwire-10.0.0 → modwire-10.1.0}/tests/extraction/big_projects/project.py +0 -0
  368. {modwire-10.0.0 → modwire-10.1.0}/tests/extraction/big_projects/projects.json +0 -0
  369. {modwire-10.0.0 → modwire-10.1.0}/tests/extraction/big_projects/resolution_results.json +0 -0
  370. {modwire-10.0.0 → modwire-10.1.0}/tests/extraction/big_projects/results.json +0 -0
  371. {modwire-10.0.0 → modwire-10.1.0}/tests/extraction/big_projects/run.py +0 -0
  372. {modwire-10.0.0 → modwire-10.1.0}/tests/extraction/cache_benchmark/__init__.py +0 -0
  373. {modwire-10.0.0 → modwire-10.1.0}/tests/extraction/cache_benchmark/benchmark_process_timeout.py +0 -0
  374. {modwire-10.0.0 → modwire-10.1.0}/tests/extraction/cache_benchmark/run.py +0 -0
  375. {modwire-10.0.0 → modwire-10.1.0}/tests/extraction/dependency/__init__.py +0 -0
  376. {modwire-10.0.0 → modwire-10.1.0}/tests/extraction/dependency/test_02_invariants.py +0 -0
  377. {modwire-10.0.0 → modwire-10.1.0}/tests/extraction/extractors/__init__.py +0 -0
  378. {modwire-10.0.0 → modwire-10.1.0}/tests/extraction/extractors/test_01_attacks.py +0 -0
  379. {modwire-10.0.0 → modwire-10.1.0}/tests/extraction/extractors/test_02_invariants.py +0 -0
  380. {modwire-10.0.0 → modwire-10.1.0}/tests/extraction/extractors/test_03_native_symbols.py +0 -0
  381. {modwire-10.0.0 → modwire-10.1.0}/tests/extraction/scan_benchmark/__init__.py +0 -0
  382. {modwire-10.0.0 → modwire-10.1.0}/tests/extraction/scan_benchmark/prepare.py +0 -0
  383. {modwire-10.0.0 → modwire-10.1.0}/tests/extraction/scan_benchmark/results.json +0 -0
  384. {modwire-10.0.0 → modwire-10.1.0}/tests/extraction/scan_benchmark/run.py +0 -0
  385. {modwire-10.0.0 → modwire-10.1.0}/tests/fixtures/languages/php/ignored/example_generated.php +0 -0
  386. {modwire-10.0.0 → modwire-10.1.0}/tests/fixtures/languages/php/src/example_application/example_actions/example_action.php +0 -0
  387. {modwire-10.0.0 → modwire-10.1.0}/tests/fixtures/languages/php/src/example_domain/example_model/example_record.php +0 -0
  388. {modwire-10.0.0 → modwire-10.1.0}/tests/fixtures/languages/php/src/example_domain/example_services/example_policy.php +0 -0
  389. {modwire-10.0.0 → modwire-10.1.0}/tests/fixtures/languages/php/src/example_interfaces/example_http/example_controller.php +0 -0
  390. {modwire-10.0.0 → modwire-10.1.0}/tests/fixtures/languages/python/ignored/example_generated.py +0 -0
  391. {modwire-10.0.0 → modwire-10.1.0}/tests/fixtures/languages/python/src/example_application/example_actions/example_action.py +0 -0
  392. {modwire-10.0.0 → modwire-10.1.0}/tests/fixtures/languages/python/src/example_domain/example_model/example_record.py +0 -0
  393. {modwire-10.0.0 → modwire-10.1.0}/tests/fixtures/languages/python/src/example_domain/example_services/example_policy.py +0 -0
  394. {modwire-10.0.0 → modwire-10.1.0}/tests/fixtures/languages/python/src/example_interfaces/example_http/example_controller.py +0 -0
  395. {modwire-10.0.0 → modwire-10.1.0}/tests/fixtures/languages/typescript/ignored/example_generated.ts +0 -0
  396. {modwire-10.0.0 → modwire-10.1.0}/tests/fixtures/languages/typescript/src/example_application/example_actions/example_action.ts +0 -0
  397. {modwire-10.0.0 → modwire-10.1.0}/tests/fixtures/languages/typescript/src/example_domain/example_model/example_record.ts +0 -0
  398. {modwire-10.0.0 → modwire-10.1.0}/tests/fixtures/languages/typescript/src/example_domain/example_model/example_view.tsx +0 -0
  399. {modwire-10.0.0 → modwire-10.1.0}/tests/fixtures/languages/typescript/src/example_domain/example_services/example_audit.js +0 -0
  400. {modwire-10.0.0 → modwire-10.1.0}/tests/fixtures/languages/typescript/src/example_domain/example_services/example_callables.ts +0 -0
  401. {modwire-10.0.0 → modwire-10.1.0}/tests/fixtures/languages/typescript/src/example_domain/example_services/example_policy.ts +0 -0
  402. {modwire-10.0.0 → modwire-10.1.0}/tests/fixtures/languages/typescript/src/example_interfaces/example_http/example_controller.ts +0 -0
  403. {modwire-10.0.0 → modwire-10.1.0}/tests/fixtures/languages/typescript/src/example_interfaces/example_http/example_view.jsx +0 -0
  404. {modwire-10.0.0 → modwire-10.1.0}/tests/fixtures/syntax/php/example_shapes.php +0 -0
  405. {modwire-10.0.0 → modwire-10.1.0}/tests/fixtures/syntax/python/example_shapes.py +0 -0
  406. {modwire-10.0.0 → modwire-10.1.0}/tests/fixtures/syntax/typescript/example_shapes.ts +0 -0
  407. {modwire-10.0.0 → modwire-10.1.0}/tests/shared/__init__.py +0 -0
  408. {modwire-10.0.0 → modwire-10.1.0}/tests/shared/code/__init__.py +0 -0
  409. {modwire-10.0.0 → modwire-10.1.0}/tests/shared/code/test_02_invariants.py +0 -0
  410. {modwire-10.0.0 → modwire-10.1.0}/tests/support/__init__.py +0 -0
  411. {modwire-10.0.0 → modwire-10.1.0}/tests/support/base_test.py +0 -0
  412. {modwire-10.0.0 → modwire-10.1.0}/tests/support/code_map.py +0 -0
  413. {modwire-10.0.0 → modwire-10.1.0}/tests/support/service_test.py +0 -0
  414. {modwire-10.0.0 → modwire-10.1.0}/uv.lock +0 -0
@@ -291,6 +291,7 @@ src/modwire/shared/code/models/source_inheritance.py
291
291
  src/modwire/shared/code/models/source_interface.py
292
292
  src/modwire/shared/code/models/source_item_result.py
293
293
  src/modwire/shared/code/models/source_manifest.py
294
+ src/modwire/shared/code/models/source_manifest_identity.py
294
295
  src/modwire/shared/code/models/source_member_kind.py
295
296
  src/modwire/shared/code/models/source_parameter.py
296
297
  src/modwire/shared/code/models/source_relation_kind.py
@@ -315,6 +316,7 @@ tests/application/test_01_attacks.py
315
316
  tests/application/test_06_happy_path.py
316
317
  tests/application/test_07_cache.py
317
318
  tests/application/test_08_implementation_manifest.py
319
+ tests/application/test_09_source_manifest_identity.py
318
320
  tests/architecture/__init__.py
319
321
  tests/architecture/base_test.py
320
322
  tests/architecture/boundaries/__init__.py
@@ -33,4 +33,7 @@ jobs:
33
33
  runs-on: ubuntu-latest
34
34
  steps:
35
35
  - uses: actions/checkout@v6
36
+ - uses: actions/setup-node@v6
37
+ with:
38
+ node-version: "20"
36
39
  - run: make extractor-check
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modwire
3
- Version: 10.0.0
3
+ Version: 10.1.0
4
4
  Summary: Code extraction, architecture analysis and the Modwire CLI.
5
5
  Author: Tomasz Szpak
6
6
  License-Expression: MIT
@@ -88,6 +88,10 @@ Return a queryable code map with content-addressed persistent reuse.
88
88
 
89
89
  Return a queryable code map and public outcomes for every applicable cache stage.
90
90
 
91
+ ### `source_manifest_identity`
92
+
93
+ Observe the current canonical source-manifest identity without parsing source.
94
+
91
95
  ### `implementation_manifest`
92
96
 
93
97
  Publish a deterministic, provenance-bearing implementation manifest.
@@ -154,6 +158,10 @@ Generic persistent-cache settings supplied by a caller.
154
158
 
155
159
  Caller-owned filesystem traversal policy with explicit exclusions and opt-in symlink following.
156
160
 
161
+ ## `SourceManifestIdentity`
162
+
163
+ Canonical identity of one observed source manifest.
164
+
157
165
  ## `SourceMemberKind`
158
166
 
159
167
  Ownership kind for a declared class or type member.
@@ -60,6 +60,10 @@ Return a queryable code map with content-addressed persistent reuse.
60
60
 
61
61
  Return a queryable code map and public outcomes for every applicable cache stage.
62
62
 
63
+ ### `source_manifest_identity`
64
+
65
+ Observe the current canonical source-manifest identity without parsing source.
66
+
63
67
  ### `implementation_manifest`
64
68
 
65
69
  Publish a deterministic, provenance-bearing implementation manifest.
@@ -126,6 +130,10 @@ Generic persistent-cache settings supplied by a caller.
126
130
 
127
131
  Caller-owned filesystem traversal policy with explicit exclusions and opt-in symlink following.
128
132
 
133
+ ## `SourceManifestIdentity`
134
+
135
+ Canonical identity of one observed source manifest.
136
+
129
137
  ## `SourceMemberKind`
130
138
 
131
139
  Ownership kind for a declared class or type member.
@@ -29,6 +29,7 @@ from .shared.code.models.declaration_identity import DeclarationIdentity
29
29
  from .shared.code.models.fact_capability import FactCapability
30
30
  from .shared.code.models.queryable_code_map import QueryableCodeMap
31
31
  from .shared.code.models.scan_policy import ScanPolicy
32
+ from .shared.code.models.source_manifest_identity import SourceManifestIdentity
32
33
  from .shared.code.models.source_member_kind import SourceMemberKind
33
34
  from .shared.code.models.source_relation_kind import SourceRelationKind
34
35
 
@@ -51,6 +52,7 @@ __all__ = [
51
52
  "QueryableCodeMap",
52
53
  "ScanPolicy",
53
54
  "SourceMemberKind",
55
+ "SourceManifestIdentity",
54
56
  "SourceRelationKind",
55
57
  ]
56
58
 
@@ -189,6 +191,12 @@ class ModwireApplication:
189
191
  cached = self.generate_map_cached_with_diagnostics(language, root, policy, options)
190
192
  return CachedResult(value=QueryableCodeMap(code_map=cached.value), outcomes=cached.outcomes)
191
193
 
194
+ def source_manifest_identity(self, language: str, root: str, policy: ScanPolicy) -> SourceManifestIdentity:
195
+ """Observe the current canonical source-manifest identity without parsing source."""
196
+
197
+ request = self.extraction.request(language, str(root))
198
+ return self.cli.source_manifest_identity(request, policy)
199
+
192
200
  def implementation_manifest(self, code_map: CodeMap, format: ManifestFormat) -> ImplementationManifestDocument:
193
201
  """Publish a deterministic, provenance-bearing implementation manifest."""
194
202
 
@@ -231,6 +239,7 @@ class ModwireApplication:
231
239
  CachedResult,
232
240
  CacheOptions,
233
241
  ScanPolicy,
242
+ SourceManifestIdentity,
234
243
  SourceMemberKind,
235
244
  SourceRelationKind,
236
245
  ImplementationManifest,
@@ -13,6 +13,7 @@ from ..shared.code.models.code_map import CodeMap
13
13
  from ..shared.code.models.queryable_code_map import QueryableCodeMap
14
14
  from ..shared.code.models.scan_policy import ScanPolicy
15
15
  from ..shared.code.models.source_extraction import SourceExtraction
16
+ from ..shared.code.models.source_manifest_identity import SourceManifestIdentity
16
17
  from .cache.application import CacheApplication
17
18
  from .cache.models.cache_options import CacheOptions
18
19
  from .cache.models.cache_plan import CachePlan
@@ -49,6 +50,9 @@ class CliFacade:
49
50
  def extract(self, request: ExtractionRequest, policy: ScanPolicy) -> SourceExtraction:
50
51
  return self.pipeline.extract(request, policy)
51
52
 
53
+ def source_manifest_identity(self, request: ExtractionRequest, policy: ScanPolicy) -> SourceManifestIdentity:
54
+ return self.pipeline.source_manifest_identity(request, policy)
55
+
52
56
  def has_source_files(self, request: ExtractionRequest, policy: ScanPolicy) -> bool:
53
57
  return self.pipeline.has_source_files(request, policy)
54
58
 
@@ -9,6 +9,7 @@ from ...architecture.report.models.report_node import ReportNode
9
9
  from ...extraction.extractors.models.extraction_request import ExtractionRequest
10
10
  from ...shared.code.models.scan_policy import ScanPolicy
11
11
  from ...shared.code.models.source_extraction import SourceExtraction
12
+ from ...shared.code.models.source_manifest_identity import SourceManifestIdentity
12
13
  from .domain import ReportPipelineStep, SourceReader
13
14
  from .models.command_request import CommandRequest
14
15
  from .models.extractor_command_input import ExtractorCommandInput
@@ -37,6 +38,14 @@ class PipelineApplication:
37
38
  self.reader.ensure_available(request.runtime)
38
39
  return self.reader.extract_source(request, policy)
39
40
 
41
+ def source_manifest_identity(self, request: ExtractionRequest, policy: ScanPolicy) -> SourceManifestIdentity:
42
+ self.reader.ensure_available(request.runtime)
43
+ manifest = self.reader.inventory(request, policy).manifest
44
+ return SourceManifestIdentity(
45
+ digest_algorithm=manifest.digest_algorithm,
46
+ digest=manifest.digest,
47
+ )
48
+
40
49
  def has_source_files(self, request: ExtractionRequest, policy: ScanPolicy) -> bool:
41
50
  self.reader.ensure_available(request.runtime)
42
51
  return self.reader.has_source_files(request, policy)
@@ -12,7 +12,7 @@ class BuildAdapter:
12
12
  shutil.copytree(source, work, ignore=shutil.ignore_patterns("build.py", "__pycache__"))
13
13
  environment = dict(os.environ)
14
14
  environment["npm_config_cache"] = str(work.parent.parent / "cache/npm")
15
- BuildAdapter.run(("npm", "ci"), cwd=work, environment=environment)
15
+ BuildAdapter.run(("npm", "ci", "--engine-strict"), cwd=work, environment=environment)
16
16
  BuildAdapter.run(("npm", "run", "check"), cwd=work, environment=environment)
17
17
  BuildAdapter.run(("npm", "run", "build"), cwd=work, environment=environment)
18
18
  if (work / "script.js").read_bytes() != (source / "script.js").read_bytes():
@@ -11,6 +11,9 @@
11
11
  "devDependencies": {
12
12
  "@types/node": "^24.0.7",
13
13
  "@vercel/ncc": "^0.38.3"
14
+ },
15
+ "engines": {
16
+ "node": "20 || >=22"
14
17
  }
15
18
  },
16
19
  "node_modules/@nodelib/fs.scandir": {
@@ -89,15 +92,15 @@
89
92
  }
90
93
  },
91
94
  "node_modules/brace-expansion": {
92
- "version": "5.0.7",
93
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz",
94
- "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==",
95
+ "version": "5.0.12",
96
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz",
97
+ "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==",
95
98
  "license": "MIT",
96
99
  "dependencies": {
97
100
  "balanced-match": "^4.0.2"
98
101
  },
99
102
  "engines": {
100
- "node": "18 || 20 || >=22"
103
+ "node": "20 || >=22"
101
104
  }
102
105
  },
103
106
  "node_modules/braces": {
@@ -1,6 +1,9 @@
1
1
  {
2
2
  "private": true,
3
3
  "type": "commonjs",
4
+ "engines": {
5
+ "node": "20 || >=22"
6
+ },
4
7
  "scripts": {
5
8
  "build": "node build.mjs",
6
9
  "check": "tsc --noEmit"
@@ -230989,7 +230989,7 @@ exports.range = range;
230989
230989
  "use strict";
230990
230990
 
230991
230991
  Object.defineProperty(exports, "__esModule", ({ value: true }));
230992
- exports.EXPANSION_MAX = void 0;
230992
+ exports.EXPANSION_MAX_REWRITES = exports.EXPANSION_MAX_DEPTH = exports.EXPANSION_MAX_LENGTH = exports.EXPANSION_MAX = void 0;
230993
230993
  exports.expand = expand;
230994
230994
  const balanced_match_1 = __nccwpck_require__(2649);
230995
230995
  const escSlash = '\0SLASH' + Math.random() + '\0';
@@ -231008,6 +231008,35 @@ const closePattern = /\\}/g;
231008
231008
  const commaPattern = /\\,/g;
231009
231009
  const periodPattern = /\\\./g;
231010
231010
  exports.EXPANSION_MAX = 100_000;
231011
+ // `EXPANSION_MAX` caps the *number* of expansions, but not their length. An
231012
+ // input like `'{a,b}'.repeat(1500)` stays under that count - its output is
231013
+ // truncated to 100k results - while making every result ~1500 characters
231014
+ // long. The result set, and the intermediate arrays built while combining
231015
+ // brace sets, then grow large enough to exhaust memory and crash the process
231016
+ // (CVE-2026-14257). `EXPANSION_MAX_LENGTH` bounds the total number of
231017
+ // characters the accumulator may hold at any point, so memory stays flat no
231018
+ // matter how many brace groups are chained. The limit sits well above any
231019
+ // realistic expansion (100k results hitting `EXPANSION_MAX` measure ~1M
231020
+ // characters) so legitimate input is unaffected.
231021
+ exports.EXPANSION_MAX_LENGTH = 4_000_000;
231022
+ // `expand_` recurses once per level of brace *nesting* - both when expanding a
231023
+ // set's comma members and when re-wrapping a set whose body is a single part.
231024
+ // The CVE-2026-14257 fix made the *tail* iterative (recursion on `m.post`, one
231025
+ // level per chained group), which left nesting depth unbounded: about 3,100
231026
+ // levels of `{{{...a,b...}}}` - only ~6KB of input - exhausted the native stack
231027
+ // and crashed the process. `EXPANSION_MAX_DEPTH` bounds how deep the parser
231028
+ // will follow nesting. It sits far above any realistic pattern and well below
231029
+ // the depth at which the stack runs out.
231030
+ exports.EXPANSION_MAX_DEPTH = 1_000;
231031
+ // Bash keeps a quirk where a brace group followed by a comma set still expands
231032
+ // (`{a},b}`). The parser implements it by rewriting the string and restarting
231033
+ // the scan, absorbing one `}` per pass. `n` trailing braces therefore cost `n`
231034
+ // full passes over a string that itself grows by one `escClose` sentinel each
231035
+ // time - quadratic in `n`, with a ~26x constant from the sentinel's length.
231036
+ // 128KB of `'{a}' + '}'.repeat(n) + ',z}'` blocked the event loop for 27
231037
+ // seconds to produce two results. `EXPANSION_MAX_REWRITES` bounds how many
231038
+ // times the scan may restart. Real `{a},b}` input needs a handful.
231039
+ exports.EXPANSION_MAX_REWRITES = 1_000;
231011
231040
  function numeric(str) {
231012
231041
  return !isNaN(str) ? parseInt(str, 10) : str.charCodeAt(0);
231013
231042
  }
@@ -231027,37 +231056,52 @@ function unescapeBraces(str) {
231027
231056
  .replace(escCommaPattern, ',')
231028
231057
  .replace(escPeriodPattern, '.');
231029
231058
  }
231059
+ // Like `target.push(...items)` but doesn't overflow the stack
231060
+ function pushAll(target, items) {
231061
+ for (let i = 0; i < items.length; i++) {
231062
+ target.push(items[i]);
231063
+ }
231064
+ }
231030
231065
  /**
231031
231066
  * Basically just str.split(","), but handling cases
231032
231067
  * where we have nested braced sections, which should be
231033
231068
  * treated as individual members, like {a,{b,c},d}
231034
231069
  */
231035
231070
  function parseCommaParts(str) {
231036
- if (!str) {
231037
- return [''];
231038
- }
231039
231071
  const parts = [];
231040
- const m = (0, balanced_match_1.balanced)('{', '}', str);
231041
- if (!m) {
231042
- return str.split(',');
231043
- }
231044
- const { pre, body, post } = m;
231045
- const p = pre.split(',');
231046
- p[p.length - 1] += '{' + body + '}';
231047
- const postParts = parseCommaParts(post);
231048
- if (post.length) {
231049
- ;
231050
- p[p.length - 1] += postParts.shift();
231051
- p.push.apply(p, postParts);
231052
- }
231053
- parts.push.apply(parts, p);
231054
- return parts;
231072
+ // Walk the brace groups iteratively. Recursing on `post` once per group let a
231073
+ // chain of them exhaust the stack - the parsing-side counterpart to
231074
+ // the `expand_` overflow fixed for CVE-2026-14257, and not something `max` or
231075
+ // `maxLength` can bound, since it happens before expansion.
231076
+ //
231077
+ // The part the next chunk continues
231078
+ let carry = '';
231079
+ for (;;) {
231080
+ const m = (0, balanced_match_1.balanced)('{', '}', str);
231081
+ if (!m) {
231082
+ const tail = str.split(',');
231083
+ tail[0] = carry + tail[0];
231084
+ pushAll(parts, tail);
231085
+ return parts;
231086
+ }
231087
+ const { pre, body, post } = m;
231088
+ const p = pre.split(',');
231089
+ p[0] = carry + p[0];
231090
+ p[p.length - 1] += '{' + body + '}';
231091
+ if (!post.length) {
231092
+ pushAll(parts, p);
231093
+ return parts;
231094
+ }
231095
+ carry = p.pop();
231096
+ pushAll(parts, p);
231097
+ str = post;
231098
+ }
231055
231099
  }
231056
231100
  function expand(str, options = {}) {
231057
231101
  if (!str) {
231058
231102
  return [];
231059
231103
  }
231060
- const { max = exports.EXPANSION_MAX } = options;
231104
+ const { max = exports.EXPANSION_MAX, maxLength = exports.EXPANSION_MAX_LENGTH, maxDepth = exports.EXPANSION_MAX_DEPTH, maxRewrites = exports.EXPANSION_MAX_REWRITES, } = options;
231061
231105
  // I don't know why Bash 4.3 does this, but it does.
231062
231106
  // Anything starting with {} will have the first two bytes preserved
231063
231107
  // but *only* at the top level, so {},a}b will not expand to anything,
@@ -231067,7 +231111,7 @@ function expand(str, options = {}) {
231067
231111
  if (str.slice(0, 2) === '{}') {
231068
231112
  str = '\\{\\}' + str.slice(2);
231069
231113
  }
231070
- return expand_(escapeBraces(str), max, true).map(unescapeBraces);
231114
+ return expand_(escapeBraces(str), max, maxLength, maxDepth, 0, maxRewrites, true).map(unescapeBraces);
231071
231115
  }
231072
231116
  function embrace(str) {
231073
231117
  return '{' + str + '}';
@@ -231081,25 +231125,125 @@ function lte(i, y) {
231081
231125
  function gte(i, y) {
231082
231126
  return i >= y;
231083
231127
  }
231084
- function expand_(str, max, isTop) {
231085
- /** @type {string[]} */
231086
- const expansions = [];
231087
- // The `{a},b}` rewrite below restarts expansion on a rewritten string with
231088
- // the same `max` and `isTop = true`. Loop instead of recursing so a long run
231089
- // of non-expanding `{}` groups can't exhaust the call stack.
231128
+ // Build `{ acc[a] + pre + values[v] }` for every combination, capping the
231129
+ // number of results at `max` and the total number of characters at `maxLength`.
231130
+ // This is the one place output grows, so bounding it here keeps the single
231131
+ // accumulator - and therefore memory - flat regardless of how many brace groups
231132
+ // are combined (CVE-2026-14257).
231133
+ function combine(acc, pre, values, max, maxLength, dropEmpties) {
231134
+ const out = [];
231135
+ let length = 0;
231136
+ for (let a = 0; a < acc.length; a++) {
231137
+ for (let v = 0; v < values.length; v++) {
231138
+ if (out.length >= max)
231139
+ return out;
231140
+ const expansion = acc[a] + pre + values[v];
231141
+ // Bash drops empty results at the top level. Skip them before they count
231142
+ // against `max`, so `max` bounds the number of *kept* results.
231143
+ if (dropEmpties && !expansion)
231144
+ continue;
231145
+ if (length + expansion.length > maxLength)
231146
+ return out;
231147
+ out.push(expansion);
231148
+ length += expansion.length;
231149
+ }
231150
+ }
231151
+ return out;
231152
+ }
231153
+ // The expansion values of a single numeric (`1..5`) or alphabetic (`a..e..2`)
231154
+ // sequence body.
231155
+ function expandSequence(body, isAlphaSequence, max, maxLength) {
231156
+ const n = body.split(/\.\./);
231157
+ const N = [];
231158
+ // A sequence body always splits into two or three parts, but the compiler
231159
+ // can't know that.
231160
+ /* c8 ignore start */
231161
+ if (n[0] === undefined || n[1] === undefined) {
231162
+ return N;
231163
+ }
231164
+ /* c8 ignore stop */
231165
+ const x = numeric(n[0]);
231166
+ const y = numeric(n[1]);
231167
+ const width = Math.max(n[0].length, n[1].length);
231168
+ let incr = n.length === 3 && n[2] !== undefined ?
231169
+ Math.max(Math.abs(numeric(n[2])), 1)
231170
+ : 1;
231171
+ let test = lte;
231172
+ const reverse = y < x;
231173
+ if (reverse) {
231174
+ incr *= -1;
231175
+ test = gte;
231176
+ }
231177
+ const pad = n.some(isPadded);
231178
+ let length = 0;
231179
+ for (let i = x; test(i, y) && N.length < max; i += incr) {
231180
+ let c;
231181
+ if (isAlphaSequence) {
231182
+ c = String.fromCharCode(i);
231183
+ if (c === '\\') {
231184
+ c = '';
231185
+ }
231186
+ }
231187
+ else {
231188
+ c = String(i);
231189
+ if (pad) {
231190
+ const need = width - c.length;
231191
+ if (need > 0) {
231192
+ const z = new Array(need + 1).join('0');
231193
+ if (i < 0) {
231194
+ c = '-' + z + c.slice(1);
231195
+ }
231196
+ else {
231197
+ c = z + c;
231198
+ }
231199
+ }
231200
+ }
231201
+ }
231202
+ if (length + c.length > maxLength)
231203
+ break;
231204
+ N.push(c);
231205
+ length += c.length;
231206
+ }
231207
+ return N;
231208
+ }
231209
+ function expand_(str, max, maxLength, maxDepth, depth, maxRewrites, isTop) {
231210
+ // Too deeply nested to keep following: treat the rest as literal, the same
231211
+ // way a group that cannot expand is already handled. Truncating rather than
231212
+ // throwing keeps `expand` total, matching `max` and `maxLength`.
231213
+ if (depth > maxDepth) {
231214
+ return [str];
231215
+ }
231216
+ // Consume the string's top-level brace groups left to right, threading a
231217
+ // running set of combined prefixes (`acc`). Expanding the tail iteratively -
231218
+ // rather than recursing on `m.post` once per group - keeps the native stack
231219
+ // depth constant, so deeply chained input (`'{a,b}'.repeat(3000)`) can no
231220
+ // longer overflow the stack, and leaves a single accumulator whose size
231221
+ // `maxLength` bounds directly (CVE-2026-14257).
231222
+ let acc = [''];
231223
+ // Bash drops empty results, but only when the *first* top-level group is a
231224
+ // comma set - a sequence like `{a..\}` may legitimately yield ''. The drop
231225
+ // is on the final strings, so it is applied to whichever `combine` produces
231226
+ // them (the one with no brace set left in the tail).
231227
+ // How many times the `{a},b}` rewrite below has restarted the scan. Each pass
231228
+ // re-reads the whole string, so leaving this unbounded is quadratic.
231229
+ let rewrites = 0;
231230
+ let dropEmpties = false;
231231
+ let firstGroup = true;
231090
231232
  for (;;) {
231091
231233
  const m = (0, balanced_match_1.balanced)('{', '}', str);
231092
- if (!m)
231093
- return [str];
231234
+ // No brace set left: the rest of the string is literal.
231235
+ if (!m) {
231236
+ return combine(acc, str, [''], max, maxLength, dropEmpties);
231237
+ }
231094
231238
  // no need to expand pre, since it is guaranteed to be free of brace-sets
231095
231239
  const pre = m.pre;
231096
- if (/\$$/.test(m.pre)) {
231097
- const post = m.post.length ? expand_(m.post, max, false) : [''];
231098
- for (let k = 0; k < post.length && k < max; k++) {
231099
- const expansion = pre + '{' + m.body + '}' + post[k];
231100
- expansions.push(expansion);
231101
- }
231102
- return expansions;
231240
+ if (/\$$/.test(pre)) {
231241
+ acc = combine(acc, pre + '{' + m.body + '}', [''], max, maxLength, dropEmpties && !m.post.length);
231242
+ firstGroup = false;
231243
+ if (!m.post.length)
231244
+ break;
231245
+ str = m.post;
231246
+ continue;
231103
231247
  }
231104
231248
  const isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
231105
231249
  const isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
@@ -231107,95 +231251,73 @@ function expand_(str, max, isTop) {
231107
231251
  const isOptions = m.body.indexOf(',') >= 0;
231108
231252
  if (!isSequence && !isOptions) {
231109
231253
  // {a},b}
231110
- if (m.post.match(/,(?!,).*\}/)) {
231254
+ if (rewrites < maxRewrites && m.post.match(/,(?!,).*\}/)) {
231255
+ rewrites++;
231111
231256
  str = m.pre + '{' + m.body + escClose + m.post;
231112
231257
  isTop = true;
231113
231258
  continue;
231114
231259
  }
231115
- return [str];
231260
+ // Nothing here expands, so the whole remaining string is literal.
231261
+ return combine(acc, pre + '{' + m.body + '}' + m.post, [''], max, maxLength, dropEmpties);
231116
231262
  }
231117
- // Only expand post once we know this brace set actually expands. Computing
231118
- // it before the early returns above expanded post a second time on every
231119
- // non-expanding `{}`, which is what made inputs like `a{},{},{}...` blow up
231120
- // exponentially.
231121
- const post = m.post.length ? expand_(m.post, max, false) : [''];
231122
- let n;
231263
+ if (firstGroup) {
231264
+ dropEmpties = isTop && !isSequence;
231265
+ firstGroup = false;
231266
+ }
231267
+ let values;
231123
231268
  if (isSequence) {
231124
- n = m.body.split(/\.\./);
231269
+ values = expandSequence(m.body, isAlphaSequence, max, maxLength);
231125
231270
  }
231126
231271
  else {
231127
- n = parseCommaParts(m.body);
231272
+ let n = parseCommaParts(m.body);
231128
231273
  if (n.length === 1 && n[0] !== undefined) {
231129
231274
  // x{{a,b}}y ==> x{a}y x{b}y
231130
- n = expand_(n[0], max, false).map(embrace);
231275
+ n = expand_(n[0], max, maxLength, maxDepth, depth + 1, maxRewrites, false).map(embrace);
231131
231276
  //XXX is this necessary? Can't seem to hit it in tests.
231132
231277
  /* c8 ignore start */
231133
231278
  if (n.length === 1) {
231134
- return post.map(p => m.pre + n[0] + p);
231279
+ acc = combine(acc, pre + n[0], [''], max, maxLength, dropEmpties && !m.post.length);
231280
+ if (!m.post.length)
231281
+ break;
231282
+ str = m.post;
231283
+ continue;
231135
231284
  }
231136
231285
  /* c8 ignore stop */
231137
231286
  }
231138
- }
231139
- // at this point, n is the parts, and we know it's not a comma set
231140
- // with a single entry.
231141
- let N;
231142
- if (isSequence && n[0] !== undefined && n[1] !== undefined) {
231143
- const x = numeric(n[0]);
231144
- const y = numeric(n[1]);
231145
- const width = Math.max(n[0].length, n[1].length);
231146
- let incr = n.length === 3 && n[2] !== undefined ?
231147
- Math.max(Math.abs(numeric(n[2])), 1)
231148
- : 1;
231149
- let test = lte;
231150
- const reverse = y < x;
231151
- if (reverse) {
231152
- incr *= -1;
231153
- test = gte;
231154
- }
231155
- const pad = n.some(isPadded);
231156
- N = [];
231157
- for (let i = x; test(i, y) && N.length < max; i += incr) {
231158
- let c;
231159
- if (isAlphaSequence) {
231160
- c = String.fromCharCode(i);
231161
- if (c === '\\') {
231162
- c = '';
231163
- }
231287
+ // Values that `combine` is going to drop as empty produce no result, so
231288
+ // they must not count against `max` - otherwise `{a,,b}` with `max: 2`
231289
+ // would stop at `['a', '']` and yield one result instead of two. Skipping
231290
+ // them outright keeps `values` bounded while leaving `max` a bound on
231291
+ // *kept* results.
231292
+ let dropsEmpties = dropEmpties && !m.post.length && !pre;
231293
+ for (let d = 0; dropsEmpties && d < acc.length; d++) {
231294
+ if (acc[d]) {
231295
+ dropsEmpties = false;
231164
231296
  }
231165
- else {
231166
- c = String(i);
231167
- if (pad) {
231168
- const need = width - c.length;
231169
- if (need > 0) {
231170
- const z = new Array(need + 1).join('0');
231171
- if (i < 0) {
231172
- c = '-' + z + c.slice(1);
231173
- }
231174
- else {
231175
- c = z + c;
231176
- }
231177
- }
231178
- }
231179
- }
231180
- N.push(c);
231181
231297
  }
231182
- }
231183
- else {
231184
- N = [];
231185
- for (let j = 0; j < n.length; j++) {
231186
- N.push.apply(N, expand_(n[j], max, false));
231187
- }
231188
- }
231189
- for (let j = 0; j < N.length; j++) {
231190
- for (let k = 0; k < post.length && expansions.length < max; k++) {
231191
- const expansion = pre + N[j] + post[k];
231192
- if (!isTop || isSequence || expansion) {
231193
- expansions.push(expansion);
231298
+ values = [];
231299
+ let valuesLength = 0;
231300
+ outer: for (let j = 0; j < n.length; j++) {
231301
+ const expanded = expand_(n[j], max, maxLength, maxDepth, depth + 1, maxRewrites, false);
231302
+ for (let k = 0; k < expanded.length; k++) {
231303
+ const v = expanded[k];
231304
+ if (dropsEmpties && !v)
231305
+ continue;
231306
+ if (values.length >= max ||
231307
+ valuesLength + v.length > maxLength) {
231308
+ break outer;
231309
+ }
231310
+ values.push(v);
231311
+ valuesLength += v.length;
231194
231312
  }
231195
231313
  }
231196
231314
  }
231197
- return expansions;
231315
+ acc = combine(acc, pre, values, max, maxLength, dropEmpties && !m.post.length);
231316
+ if (!m.post.length)
231317
+ break;
231318
+ str = m.post;
231198
231319
  }
231320
+ return acc;
231199
231321
  }
231200
231322
  //# sourceMappingURL=index.js.map
231201
231323
 
@@ -0,0 +1,10 @@
1
+ from pydantic import Field
2
+
3
+ from ...values.models.value_model import ValueModel
4
+
5
+
6
+ class SourceManifestIdentity(ValueModel):
7
+ """Canonical identity of one observed source manifest."""
8
+
9
+ digest_algorithm: str = Field(pattern="^sha256$")
10
+ digest: str = Field(pattern="^[0-9a-f]{64}$")