pyarchinit-mini 2.1.68__tar.gz → 2.4.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 (475) hide show
  1. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/CHANGELOG.md +160 -0
  2. {pyarchinit_mini-2.1.68/pyarchinit_mini.egg-info → pyarchinit_mini-2.4.0}/PKG-INFO +95 -2
  3. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/README.md +92 -1
  4. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/__init__.py +1 -1
  5. pyarchinit_mini-2.4.0/pyarchinit_mini/cli/migrate_vocab.py +164 -0
  6. pyarchinit_mini-2.4.0/pyarchinit_mini/database/migrations/_2026_05_node_uuid_backfill.py +104 -0
  7. pyarchinit_mini-2.4.0/pyarchinit_mini/database/migrations/_2026_05_node_uuid_schema.py +104 -0
  8. pyarchinit_mini-2.4.0/pyarchinit_mini/database/migrations/_2026_05_vocab_alignment.py +73 -0
  9. pyarchinit_mini-2.1.68/pyarchinit_mini/database/migrations.py → pyarchinit_mini-2.4.0/pyarchinit_mini/database/migrations/__init__.py +35 -35
  10. pyarchinit_mini-2.4.0/pyarchinit_mini/database/migrations/backup.py +80 -0
  11. pyarchinit_mini-2.4.0/pyarchinit_mini/database/utils.py +33 -0
  12. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/dto/us_dto.py +33 -0
  13. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/graphml_converter/converter.py +8 -0
  14. pyarchinit_mini-2.4.0/pyarchinit_mini/graphml_converter/em_palette.py +439 -0
  15. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/graphml_converter/graphml_builder.py +8 -0
  16. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/graphml_converter/graphml_exporter.py +8 -0
  17. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/graphml_converter/pure_networkx_exporter.py +8 -0
  18. pyarchinit_mini-2.4.0/pyarchinit_mini/graphml_io/__init__.py +1 -0
  19. pyarchinit_mini-2.4.0/pyarchinit_mini/graphml_io/reader.py +38 -0
  20. pyarchinit_mini-2.4.0/pyarchinit_mini/graphml_io/writer.py +26 -0
  21. pyarchinit_mini-2.4.0/pyarchinit_mini/graphml_io/yed_writer.py +157 -0
  22. pyarchinit_mini-2.4.0/pyarchinit_mini/graphproj/__init__.py +1 -0
  23. pyarchinit_mini-2.4.0/pyarchinit_mini/graphproj/auto_regen.py +124 -0
  24. pyarchinit_mini-2.4.0/pyarchinit_mini/graphproj/edge_registry.py +43 -0
  25. pyarchinit_mini-2.4.0/pyarchinit_mini/graphproj/exceptions.py +53 -0
  26. pyarchinit_mini-2.4.0/pyarchinit_mini/graphproj/filesystem.py +62 -0
  27. pyarchinit_mini-2.4.0/pyarchinit_mini/graphproj/ingest_plan.py +32 -0
  28. pyarchinit_mini-2.4.0/pyarchinit_mini/graphproj/ingestor.py +190 -0
  29. pyarchinit_mini-2.4.0/pyarchinit_mini/graphproj/paradata_store.py +327 -0
  30. pyarchinit_mini-2.4.0/pyarchinit_mini/graphproj/projector.py +105 -0
  31. pyarchinit_mini-2.4.0/pyarchinit_mini/harris_swimlane/__init__.py +1 -0
  32. pyarchinit_mini-2.4.0/pyarchinit_mini/harris_swimlane/compound_layout.py +57 -0
  33. pyarchinit_mini-2.4.0/pyarchinit_mini/harris_swimlane/exceptions.py +31 -0
  34. pyarchinit_mini-2.4.0/pyarchinit_mini/harris_swimlane/period_sync_service.py +90 -0
  35. pyarchinit_mini-2.4.0/pyarchinit_mini/harris_swimlane/row_provider.py +113 -0
  36. pyarchinit_mini-2.4.0/pyarchinit_mini/harris_swimlane/swimlane_state.py +269 -0
  37. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/s3d_integration/s3d_converter.py +109 -68
  38. pyarchinit_mini-2.4.0/pyarchinit_mini/vocab/__init__.py +14 -0
  39. pyarchinit_mini-2.4.0/pyarchinit_mini/vocab/exceptions.py +22 -0
  40. pyarchinit_mini-2.4.0/pyarchinit_mini/vocab/i18n.py +75 -0
  41. pyarchinit_mini-2.4.0/pyarchinit_mini/vocab/loader.py +139 -0
  42. pyarchinit_mini-2.4.0/pyarchinit_mini/vocab/provider.py +134 -0
  43. pyarchinit_mini-2.4.0/pyarchinit_mini/vocab/translations/vocab_en.json +20 -0
  44. pyarchinit_mini-2.4.0/pyarchinit_mini/vocab/translations/vocab_it.json +28 -0
  45. pyarchinit_mini-2.4.0/pyarchinit_mini/vocab/types.py +53 -0
  46. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/app.py +33 -0
  47. pyarchinit_mini-2.4.0/pyarchinit_mini/web_interface/graph_routes.py +128 -0
  48. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/harris_creator_routes.py +255 -42
  49. pyarchinit_mini-2.4.0/pyarchinit_mini/web_interface/paradata_routes.py +137 -0
  50. pyarchinit_mini-2.4.0/pyarchinit_mini/web_interface/paradata_ui_routes.py +122 -0
  51. pyarchinit_mini-2.4.0/pyarchinit_mini/web_interface/templates/graph_import_preview.html +40 -0
  52. pyarchinit_mini-2.4.0/pyarchinit_mini/web_interface/templates/graph_import_result.html +19 -0
  53. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/harris_creator/editor.html +241 -0
  54. pyarchinit_mini-2.4.0/pyarchinit_mini/web_interface/templates/paradata/edit.html +21 -0
  55. pyarchinit_mini-2.4.0/pyarchinit_mini/web_interface/templates/paradata/list.html +33 -0
  56. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/three_d_builder_routes.py +13 -0
  57. pyarchinit_mini-2.4.0/pyarchinit_mini/web_interface/vocab_routes.py +87 -0
  58. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0/pyarchinit_mini.egg-info}/PKG-INFO +95 -2
  59. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini.egg-info/SOURCES.txt +98 -2
  60. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini.egg-info/entry_points.txt +1 -0
  61. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini.egg-info/requires.txt +3 -1
  62. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyproject.toml +5 -2
  63. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/requirements.txt +1 -1
  64. pyarchinit_mini-2.4.0/tests/e2e/test_web_vocab_full_flow.py +78 -0
  65. pyarchinit_mini-2.4.0/tests/fixtures/_generate_baseline_graphml.py +30 -0
  66. pyarchinit_mini-2.4.0/tests/fixtures/_generate_harris_swimlane_synthetic.py +89 -0
  67. pyarchinit_mini-2.4.0/tests/fixtures/_generate_synthetic_db.py +39 -0
  68. pyarchinit_mini-2.4.0/tests/integration/test_auto_regen_on_save.py +61 -0
  69. pyarchinit_mini-2.4.0/tests/integration/test_graph_import_flow.py +96 -0
  70. pyarchinit_mini-2.4.0/tests/integration/test_graph_routes.py +54 -0
  71. pyarchinit_mini-2.4.0/tests/integration/test_harris_matrix_post_cutover.py +44 -0
  72. pyarchinit_mini-2.4.0/tests/integration/test_harris_matrix_visual_parity.py +56 -0
  73. pyarchinit_mini-2.4.0/tests/integration/test_harris_swimlane_routes_create_row.py +93 -0
  74. pyarchinit_mini-2.4.0/tests/integration/test_harris_swimlane_routes_load.py +77 -0
  75. pyarchinit_mini-2.4.0/tests/integration/test_harris_swimlane_routes_save.py +102 -0
  76. pyarchinit_mini-2.4.0/tests/integration/test_harris_swimlane_routes_session_missing.py +23 -0
  77. pyarchinit_mini-2.4.0/tests/integration/test_migrate_vocab_cli.py +92 -0
  78. pyarchinit_mini-2.4.0/tests/integration/test_paradata_routes_authors.py +80 -0
  79. pyarchinit_mini-2.4.0/tests/integration/test_paradata_routes_other_types.py +63 -0
  80. pyarchinit_mini-2.4.0/tests/integration/test_paradata_ui.py +74 -0
  81. pyarchinit_mini-2.4.0/tests/integration/test_spec2_coverage_gaps.py +28 -0
  82. pyarchinit_mini-2.4.0/tests/integration/test_vocab_routes.py +66 -0
  83. pyarchinit_mini-2.4.0/tests/integration/test_yed_export_route.py +83 -0
  84. pyarchinit_mini-2.4.0/tests/integration/test_yed_writer_parity.py +65 -0
  85. pyarchinit_mini-2.4.0/tests/unit/__init__.py +0 -0
  86. pyarchinit_mini-2.4.0/tests/unit/test_auto_regen.py +159 -0
  87. pyarchinit_mini-2.4.0/tests/unit/test_database_utils.py +19 -0
  88. pyarchinit_mini-2.4.0/tests/unit/test_deprecated_writers_shim.py +26 -0
  89. pyarchinit_mini-2.4.0/tests/unit/test_em_palette_vocab_backed.py +68 -0
  90. pyarchinit_mini-2.4.0/tests/unit/test_graphml_io_reader.py +38 -0
  91. pyarchinit_mini-2.4.0/tests/unit/test_graphml_io_writer.py +34 -0
  92. pyarchinit_mini-2.4.0/tests/unit/test_graphproj_edge_registry.py +44 -0
  93. pyarchinit_mini-2.4.0/tests/unit/test_graphproj_exceptions.py +40 -0
  94. pyarchinit_mini-2.4.0/tests/unit/test_graphproj_filesystem.py +63 -0
  95. pyarchinit_mini-2.4.0/tests/unit/test_graphproj_ingestor_apply.py +111 -0
  96. pyarchinit_mini-2.4.0/tests/unit/test_graphproj_ingestor_preview.py +103 -0
  97. pyarchinit_mini-2.4.0/tests/unit/test_graphproj_projector.py +104 -0
  98. pyarchinit_mini-2.4.0/tests/unit/test_harris_swimlane_compound_layout.py +55 -0
  99. pyarchinit_mini-2.4.0/tests/unit/test_harris_swimlane_exceptions.py +38 -0
  100. pyarchinit_mini-2.4.0/tests/unit/test_harris_swimlane_period_sync.py +78 -0
  101. pyarchinit_mini-2.4.0/tests/unit/test_harris_swimlane_row_provider.py +133 -0
  102. pyarchinit_mini-2.4.0/tests/unit/test_harris_swimlane_state_load.py +84 -0
  103. pyarchinit_mini-2.4.0/tests/unit/test_harris_swimlane_state_save.py +123 -0
  104. pyarchinit_mini-2.4.0/tests/unit/test_ingest_plan.py +37 -0
  105. pyarchinit_mini-2.4.0/tests/unit/test_migrations_backup.py +44 -0
  106. pyarchinit_mini-2.4.0/tests/unit/test_migrations_idempotent.py +164 -0
  107. pyarchinit_mini-2.4.0/tests/unit/test_paradata_store_authors.py +51 -0
  108. pyarchinit_mini-2.4.0/tests/unit/test_paradata_store_basic.py +32 -0
  109. pyarchinit_mini-2.4.0/tests/unit/test_paradata_store_other_types.py +76 -0
  110. pyarchinit_mini-2.4.0/tests/unit/test_s3d_converter_vocab_backed.py +122 -0
  111. pyarchinit_mini-2.4.0/tests/unit/test_us_dto_unita_tipo_validator.py +62 -0
  112. pyarchinit_mini-2.4.0/tests/unit/test_vocab_bootstrap_failures.py +26 -0
  113. pyarchinit_mini-2.4.0/tests/unit/test_vocab_exceptions.py +25 -0
  114. pyarchinit_mini-2.4.0/tests/unit/test_vocab_i18n.py +41 -0
  115. pyarchinit_mini-2.4.0/tests/unit/test_vocab_loader.py +57 -0
  116. pyarchinit_mini-2.4.0/tests/unit/test_vocab_provider.py +76 -0
  117. pyarchinit_mini-2.4.0/tests/unit/test_vocab_types.py +45 -0
  118. pyarchinit_mini-2.4.0/tests/unit/test_yed_writer.py +122 -0
  119. pyarchinit_mini-2.1.68/pyarchinit_mini/graphml_converter/em_palette.py +0 -355
  120. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/MANIFEST.in +0 -0
  121. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/babel.cfg +0 -0
  122. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/data/media_viewer_demo.db +0 -0
  123. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/data/pyarchinit_mini 2.db +0 -0
  124. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/data/pyarchinit_mini.db +0 -0
  125. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/data/pyarchinit_mini_sample.db +0 -0
  126. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/data/pyarchinit_tutorial.db +0 -0
  127. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/data/pyarchinit_tutorial_backup_20251030_093228.db +0 -0
  128. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/data/pyarchinit_tutorial_clean.db +0 -0
  129. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/data/pyarchinit_tutorial_video.db +0 -0
  130. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/data/pyarchinit_v18_demo.db +0 -0
  131. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/logo/logo_pyarchinit-mini.png +0 -0
  132. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/api/__init__.py +0 -0
  133. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/api/auth.py +0 -0
  134. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/api/dependencies.py +0 -0
  135. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/api/graphml.py +0 -0
  136. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/api/inventario.py +0 -0
  137. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/api/schemas.py +0 -0
  138. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/api/site.py +0 -0
  139. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/api/sync.py +0 -0
  140. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/api/us.py +0 -0
  141. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/cli/__init__.py +0 -0
  142. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/cli/export_import_cli.py +0 -0
  143. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/cli/extended_matrix_import.py +0 -0
  144. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/cli/graphml_cli.py +0 -0
  145. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/cli/harris_import.py +0 -0
  146. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/cli/harris_template.py +0 -0
  147. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/cli/migrate.py +0 -0
  148. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/cli/pyarchinit_import_export_cli.py +0 -0
  149. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/cli/sync_cli.py +0 -0
  150. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/cli_interface/__init__.py +0 -0
  151. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/cli_interface/cli_app.py +0 -0
  152. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/config/__init__.py +0 -0
  153. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/config/connection_manager.py +0 -0
  154. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/config/em_node_config_manager.py +0 -0
  155. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/config/em_node_types.yaml +0 -0
  156. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/database/__init__.py +0 -0
  157. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/database/concurrency_manager.py +0 -0
  158. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/database/connection.py +0 -0
  159. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/database/database_creator.py +0 -0
  160. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/database/manager.py +0 -0
  161. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/database/migration_scripts/__init__.py +0 -0
  162. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/database/migration_scripts/add_file_path.py +0 -0
  163. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/database/migration_scripts/add_i18n_columns.py +0 -0
  164. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/database/migration_scripts/add_tipo_documento.py +0 -0
  165. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/database/migration_scripts/change_us_area_to_text.py +0 -0
  166. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/database/migration_scripts/change_us_area_to_text_simple.py +0 -0
  167. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/database/postgres_installer.py +0 -0
  168. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/database/schemas.py +0 -0
  169. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/__init__.py +0 -0
  170. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/analytics_dialog.py +0 -0
  171. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/assets/logo.png +0 -0
  172. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/dialogs.py +0 -0
  173. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/excel_import_dialog.py +0 -0
  174. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/export_import_dialog.py +0 -0
  175. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/graphml_export_dialog.py +0 -0
  176. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/gui_app.py +0 -0
  177. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/harris_matrix_editor.py +0 -0
  178. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/i18n.py +0 -0
  179. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/icons.py +0 -0
  180. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/inventario_dialog_extended.py +0 -0
  181. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/main_window.py +0 -0
  182. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/media_manager_advanced.py +0 -0
  183. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/postgres_installer_dialog.py +0 -0
  184. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/pottery_dialog_extended.py +0 -0
  185. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/pottery_panel.py +0 -0
  186. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/pyarchinit_import_export_dialog.py +0 -0
  187. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/thesaurus_dialog.py +0 -0
  188. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/us_dialog_extended.py +0 -0
  189. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/dto/__init__.py +0 -0
  190. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/dto/inventario_dto.py +0 -0
  191. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/dto/site_dto.py +0 -0
  192. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/exceptions.py +0 -0
  193. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/graphml_converter/__init__.py +0 -0
  194. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/graphml_converter/dot_parser.py +0 -0
  195. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/graphml_converter/svg_resources.py +0 -0
  196. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/graphml_converter/templates/EM_palette.graphml +0 -0
  197. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/graphml_converter/x11_colors.py +0 -0
  198. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/graphml_converter/yed_template.py +0 -0
  199. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/harris_matrix/__init__.py +0 -0
  200. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/harris_matrix/enhanced_visualizer.py +0 -0
  201. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/harris_matrix/matrix_generator.py +0 -0
  202. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/harris_matrix/matrix_visualizer.py +0 -0
  203. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/harris_matrix/pyarchinit_visualizer.py +0 -0
  204. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/i18n/__init__.py +0 -0
  205. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/i18n/flask_babel_config.py +0 -0
  206. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/i18n/locale_manager.py +0 -0
  207. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/__init__.py +0 -0
  208. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/__main__.py +0 -0
  209. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/blender_client.py +0 -0
  210. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/config.py +0 -0
  211. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/event_stream.py +0 -0
  212. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/graphml_parser.py +0 -0
  213. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/http_server.py +0 -0
  214. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/period_filter.py +0 -0
  215. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/prompts/__init__.py +0 -0
  216. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/prompts/base_prompt.py +0 -0
  217. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/prompts/period_visualization_prompt.py +0 -0
  218. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/prompts/stratigraphic_model_prompt.py +0 -0
  219. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/prompts/us_description_prompt.py +0 -0
  220. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/proxy_generator.py +0 -0
  221. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/resources/__init__.py +0 -0
  222. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/resources/base_resource.py +0 -0
  223. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/resources/graphml_resource.py +0 -0
  224. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/resources/periods_resource.py +0 -0
  225. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/resources/relationships_resource.py +0 -0
  226. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/resources/sites_resource.py +0 -0
  227. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/resources/us_resource.py +0 -0
  228. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/server.py +0 -0
  229. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/__init__.py +0 -0
  230. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/base_tool.py +0 -0
  231. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/batch_insert_tool.py +0 -0
  232. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/build_3d_tool.py +0 -0
  233. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/chatgpt_fetch_tool.py +0 -0
  234. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/chatgpt_search_tool.py +0 -0
  235. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/configure_em_nodes_tool.py +0 -0
  236. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/create_database_tool.py +0 -0
  237. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/create_harris_matrix_tool.py +0 -0
  238. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/data_import_parser_tool.py +0 -0
  239. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/data_management_tool.py +0 -0
  240. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/database_manager_tool.py +0 -0
  241. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/delete_data_tool.py +0 -0
  242. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/export_harris_matrix_graphml_tool.py +0 -0
  243. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/export_tool.py +0 -0
  244. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/filter_tool.py +0 -0
  245. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/generate_report_tool.py +0 -0
  246. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/get_schema_tool.py +0 -0
  247. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/import_excel_tool.py +0 -0
  248. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/insert_data_tool.py +0 -0
  249. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/manage_services_tool.py +0 -0
  250. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/material_tool.py +0 -0
  251. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/media_management_tool.py +0 -0
  252. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/position_tool.py +0 -0
  253. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/pyarchinit_sync_tool.py +0 -0
  254. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/resolve_conflicts_tool.py +0 -0
  255. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/service_management_tool.py +0 -0
  256. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/thesaurus_management_tool.py +0 -0
  257. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/update_data_tool.py +0 -0
  258. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/upload_file_tool.py +0 -0
  259. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/validate_relationship_format_tool.py +0 -0
  260. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/validate_relationship_integrity_tool.py +0 -0
  261. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/validate_stratigraphic_relationships_tool.py +0 -0
  262. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/validate_stratigraphy_tool.py +0 -0
  263. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/media_manager/__init__.py +0 -0
  264. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/media_manager/media_handler.py +0 -0
  265. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/models/__init__.py +0 -0
  266. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/models/ai_chat.py +0 -0
  267. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/models/app_setting.py +0 -0
  268. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/models/base.py +0 -0
  269. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/models/datazione.py +0 -0
  270. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/models/extended_matrix.py +0 -0
  271. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/models/harris_matrix.py +0 -0
  272. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/models/inventario_materiali.py +0 -0
  273. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/models/media.py +0 -0
  274. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/models/pottery.py +0 -0
  275. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/models/site.py +0 -0
  276. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/models/thesaurus.py +0 -0
  277. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/models/tma.py +0 -0
  278. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/models/us.py +0 -0
  279. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/models/user.py +0 -0
  280. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/pdf_export/__init__.py +0 -0
  281. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/pdf_export/pdf_generator.py +0 -0
  282. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/pdf_export/pdf_generator_backup.py +0 -0
  283. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/pdf_export/pyarchinit_finds_template.py +0 -0
  284. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/pdf_export/pyarchinit_inventory_template.py +0 -0
  285. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/pdf_export/usm_implementation.py +0 -0
  286. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/s3d_integration/__init__.py +0 -0
  287. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/s3d_integration/model_manager.py +0 -0
  288. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/__init__.py +0 -0
  289. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/auto_translate.py +0 -0
  290. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/configure_claude_desktop.py +0 -0
  291. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/create_admin_user.py +0 -0
  292. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/create_correct_stratigraphy_sample.py +0 -0
  293. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/create_italian_sample_database.py +0 -0
  294. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/create_sample_for_webapp.py +0 -0
  295. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/create_sample_with_50_us.py +0 -0
  296. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/generate_test_3d_model.py +0 -0
  297. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/load_italian_as_main.py +0 -0
  298. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/load_sample_as_main.py +0 -0
  299. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/migrate_relationships.py +0 -0
  300. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/populate_sample_data.py +0 -0
  301. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/populate_simple_data.py +0 -0
  302. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/setup_auth.py +0 -0
  303. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/setup_user_env.py +0 -0
  304. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/test_cascade_delete.py +0 -0
  305. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/test_relationship_fix.py +0 -0
  306. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/update_sample_relationships.py +0 -0
  307. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/update_urls_and_versions.py +0 -0
  308. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/verify_docs.py +0 -0
  309. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/__init__.py +0 -0
  310. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/ai_assistant_service.py +0 -0
  311. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/ai_chat_service.py +0 -0
  312. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/analytics_service.py +0 -0
  313. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/app_setting_service.py +0 -0
  314. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/backup_service.py +0 -0
  315. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/command_parser.py +0 -0
  316. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/datazione_service.py +0 -0
  317. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/export_import_service.py +0 -0
  318. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/extended_matrix_excel_parser.py +0 -0
  319. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/import_export_service.py +0 -0
  320. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/inventario_service.py +0 -0
  321. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/mcp_executor.py +0 -0
  322. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/media_service.py +0 -0
  323. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/periodizzazione_service.py +0 -0
  324. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/pottery_dto.py +0 -0
  325. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/pottery_pdf_service.py +0 -0
  326. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/pottery_service.py +0 -0
  327. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/relationship_sync_service.py +0 -0
  328. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/search_service.py +0 -0
  329. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/site_service.py +0 -0
  330. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/thesaurus_service.py +0 -0
  331. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/tma_service.py +0 -0
  332. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/us_service.py +0 -0
  333. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/user_service.py +0 -0
  334. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/stratigraph/__init__.py +0 -0
  335. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/stratigraph/bundle_creator.py +0 -0
  336. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/stratigraph/bundle_manifest.py +0 -0
  337. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/stratigraph/bundle_validator.py +0 -0
  338. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/stratigraph/connectivity_monitor.py +0 -0
  339. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/stratigraph/sync_orchestrator.py +0 -0
  340. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/stratigraph/sync_queue.py +0 -0
  341. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/stratigraph/sync_state_machine.py +0 -0
  342. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/stratigraph/uuid_manager.py +0 -0
  343. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/translations/en/LC_MESSAGES/messages.mo +0 -0
  344. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/translations/en/LC_MESSAGES/messages.po +0 -0
  345. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/translations/it/LC_MESSAGES/messages.mo +0 -0
  346. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/translations/it/LC_MESSAGES/messages.po +0 -0
  347. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/translations/messages.pot +0 -0
  348. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/utils/__init__.py +0 -0
  349. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/utils/auth.py +0 -0
  350. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/utils/exceptions.py +0 -0
  351. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/utils/relationship_validator.py +0 -0
  352. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/utils/stratigraphic_validator.py +0 -0
  353. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/utils/tma_label_generator.py +0 -0
  354. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/utils/validators.py +0 -0
  355. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/auth_routes.py +0 -0
  356. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/em_node_config_routes.py +0 -0
  357. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/excel_import_routes.py +0 -0
  358. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/pottery_routes.py +0 -0
  359. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/pyarchinit_import_export_routes.py +0 -0
  360. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/s3d_routes.py +0 -0
  361. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/socketio_events.py +0 -0
  362. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/static/css/style.css +0 -0
  363. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/static/images/favicon.ico +0 -0
  364. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/static/images/logo.png +0 -0
  365. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/static/images/no-image.png +0 -0
  366. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/static/images/pyarchinit-mini-logo.png +0 -0
  367. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/static/js/OrbitControls.js +0 -0
  368. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/static/js/harris_creator_editor.js +0 -0
  369. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/static/js/stratigraphic_layout.js +0 -0
  370. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/static/js/three-d-viewer.js +0 -0
  371. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/static/js/three.min.js +0 -0
  372. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/static/js/universal_search.js +0 -0
  373. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/static/uploads/3d_models/Sito Archeologico di Esempio/site/stratigraphy_test.bin +0 -0
  374. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/static/uploads/3d_models/Sito Archeologico di Esempio/site/stratigraphy_test.gltf +0 -0
  375. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/static/uploads/3d_models/Sito Archeologico di Esempio/site/stratigraphy_test.mtl +0 -0
  376. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/static/uploads/3d_models/Sito Archeologico di Esempio/site/stratigraphy_test.obj +0 -0
  377. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/3d_builder/index.html +0 -0
  378. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/3d_viewer/viewer.html +0 -0
  379. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/admin/backups.html +0 -0
  380. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/admin/database.html +0 -0
  381. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/admin/database_connect.html +0 -0
  382. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/admin/database_info.html +0 -0
  383. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/admin/database_upload.html +0 -0
  384. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/admin/settings_ai.html +0 -0
  385. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/ai/assistant.html +0 -0
  386. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/analytics/dashboard.html +0 -0
  387. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/auth/login.html +0 -0
  388. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/auth/users.html +0 -0
  389. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/base.html +0 -0
  390. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/blender_viewer.html +0 -0
  391. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/components/language_switcher.html +0 -0
  392. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/dashboard.html +0 -0
  393. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/datazioni/list.html +0 -0
  394. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/docs/index.html +0 -0
  395. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/em_node_config/index.html +0 -0
  396. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/excel_import/index.html +0 -0
  397. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/export/export_import.html +0 -0
  398. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/harris_creator/index.html +0 -0
  399. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/harris_matrix/graphml_export.html +0 -0
  400. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/harris_matrix/large_graph_message.html +0 -0
  401. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/harris_matrix/stratigraph_viewer.html +0 -0
  402. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/harris_matrix/view.html +0 -0
  403. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/harris_matrix/view_graphviz.html +0 -0
  404. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/harris_matrix/viewer_3d_integrated.html +0 -0
  405. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/inventario/form.html +0 -0
  406. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/inventario/list.html +0 -0
  407. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/media/list.html +0 -0
  408. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/media/upload.html +0 -0
  409. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/messaging/contacts.html +0 -0
  410. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/operators/directory.html +0 -0
  411. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/pdf/pottery_sheet.html +0 -0
  412. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/periodizzazione/form.html +0 -0
  413. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/periodizzazione/list.html +0 -0
  414. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/periodizzazione/periods.html +0 -0
  415. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/pottery/detail.html +0 -0
  416. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/pottery/form.html +0 -0
  417. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/pottery/import_form.html +0 -0
  418. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/pottery/list.html +0 -0
  419. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/pyarchinit_import_export/index.html +0 -0
  420. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/search/results.html +0 -0
  421. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/sites/detail.html +0 -0
  422. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/sites/form.html +0 -0
  423. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/sites/list.html +0 -0
  424. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/sites/map.html +0 -0
  425. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/stats/targeted.html +0 -0
  426. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/thesaurus/list.html +0 -0
  427. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/tma/form.html +0 -0
  428. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/tma/list.html +0 -0
  429. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/us/form.html +0 -0
  430. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/us/list.html +0 -0
  431. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/validation/report.html +0 -0
  432. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/test_prova_extended_matrix.graphml +0 -0
  433. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/uploads/graphml/Sito Archeologico di Esempio_stratigraphy.graphml +0 -0
  434. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/uploads/graphml/Sito Archeologico di Esempio_stratigraphy.json +0 -0
  435. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/web_interface/static/uploads/graphml/Scavo archeologico_heriverse.json +0 -0
  436. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/web_interface/static/uploads/graphml/Scavo archeologico_stratigraphy.graphml +0 -0
  437. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/web_interface/static/uploads/graphml/Scavo archeologico_stratigraphy.json +0 -0
  438. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/web_interface/static/uploads/graphml/Sito Archeologico di Esempio_stratigraphy.json +0 -0
  439. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini.egg-info/dependency_links.txt +0 -0
  440. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini.egg-info/not-zip-safe +0 -0
  441. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/pyarchinit_mini.egg-info/top_level.txt +0 -0
  442. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/setup.cfg +0 -0
  443. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/setup.py +0 -0
  444. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/tests/__init__.py +0 -0
  445. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/tests/conftest.py +0 -0
  446. {pyarchinit_mini-2.1.68/tests/integration → pyarchinit_mini-2.4.0/tests/e2e}/__init__.py +0 -0
  447. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/tests/fixtures/build_legacy_with_pottery.py +0 -0
  448. {pyarchinit_mini-2.1.68/tests/unit → pyarchinit_mini-2.4.0/tests/integration}/__init__.py +0 -0
  449. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/tests/integration/test_admin_ai_settings_routes.py +0 -0
  450. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/tests/integration/test_admin_backup_routes.py +0 -0
  451. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/tests/integration/test_full_sync_flow.py +0 -0
  452. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/tests/integration/test_pottery_completion.py +0 -0
  453. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/tests/integration/test_pottery_excel_roundtrip.py +0 -0
  454. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/tests/integration/test_pottery_legacy_upgrade.py +0 -0
  455. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/tests/integration/test_pottery_routes.py +0 -0
  456. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/tests/unit/test_app_setting_model.py +0 -0
  457. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/tests/unit/test_app_setting_service.py +0 -0
  458. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/tests/unit/test_backup_service.py +0 -0
  459. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/tests/unit/test_bundle.py +0 -0
  460. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/tests/unit/test_concurrency_columns.py +0 -0
  461. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/tests/unit/test_concurrency_manager.py +0 -0
  462. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/tests/unit/test_connectivity_monitor.py +0 -0
  463. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/tests/unit/test_inventario_schema.py +0 -0
  464. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/tests/unit/test_optimistic_locking.py +0 -0
  465. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/tests/unit/test_pottery_dto.py +0 -0
  466. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/tests/unit/test_pottery_model.py +0 -0
  467. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/tests/unit/test_pottery_service.py +0 -0
  468. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/tests/unit/test_site_service.py +0 -0
  469. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/tests/unit/test_sync_api.py +0 -0
  470. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/tests/unit/test_sync_cli.py +0 -0
  471. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/tests/unit/test_sync_orchestrator.py +0 -0
  472. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/tests/unit/test_sync_queue.py +0 -0
  473. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/tests/unit/test_sync_state_machine.py +0 -0
  474. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/tests/unit/test_us_schema.py +0 -0
  475. {pyarchinit_mini-2.1.68 → pyarchinit_mini-2.4.0}/tests/unit/test_uuid_manager.py +0 -0
@@ -1,3 +1,163 @@
1
+ ## [2.4.0] - 2026-05-18
2
+
3
+ ### Added (IT)
4
+ - Modulo `pyarchinit_mini/harris_swimlane/` (5 moduli: row_provider,
5
+ swimlane_state, period_sync_service, compound_layout, exceptions) per
6
+ l'editor swimlane di Harris Matrix.
7
+ - `pyarchinit_mini/graphml_io/yed_writer.py` — nuovo emitter
8
+ yEd-flavored con `y:TableNode + y:Rows + y:ShapeNode`, separato
9
+ dall'export s3dgraphy clean di Spec 2.
10
+ - 5 nuove route REST per il Harris Creator:
11
+ `GET/POST /api/swimlanes/<site>`, `GET /api/load/<site>`,
12
+ `POST /api/save/<site>`, `GET /api/export/<site>/yed-graphml`.
13
+ - Editor `/harris-creator/editor` ora carica swimlane automaticamente
14
+ (row da `period_table` priorità → fallback distinct values), supporta
15
+ drag-drop tra row, creazione interattiva di nuove row, save esplicito
16
+ con auto-regen (Spec 2) post-commit.
17
+ - Export yEd GraphML on-demand → `data/exports/harris_yed/<slug>-harris-yed.graphml`.
18
+
19
+ ### Added (EN)
20
+ - New `pyarchinit_mini/harris_swimlane/` package — backend for Harris
21
+ Matrix swimlane editing.
22
+ - New `pyarchinit_mini/graphml_io/yed_writer.py` — yEd-flavored GraphML
23
+ emitter (TableNode + Rows + ShapeNode), separate from Spec 2's
24
+ s3dgraphy delegate.
25
+ - 5 new REST endpoints under `/harris-creator/api/`.
26
+ - Editor loads swimlanes auto from `period_table` (fallback distinct);
27
+ drag-drop between rows; interactive row creation; explicit Save with
28
+ Spec 2 auto-regen. On-demand yEd export.
29
+
30
+ ### Changed
31
+ - `harris_creator_routes.py` extended additively — existing routes
32
+ unchanged.
33
+ - `editor.html` extended additively — Cytoscape compound nodes,
34
+ swimlane parents, new toolbar buttons.
35
+
36
+ ### Architecture note
37
+ Two GraphML outputs now coexist:
38
+ - `data/paradata/<slug>/stratigraphy.graphml` (Spec 2 auto-regen,
39
+ s3dgraphy clean, EM-canonical)
40
+ - `data/exports/harris_yed/<slug>-harris-yed.graphml` (Spec 3-bis,
41
+ on-demand, yEd-flavored with TableNode)
42
+
43
+ Legacy `pure_networkx_exporter` stays deprecated (was deprecated in
44
+ Spec 2 PR8). NOT resurrected.
45
+
46
+ ### Dependencies
47
+ - No new dependencies.
48
+
49
+ ### Spec / Plan
50
+ - Spec: `docs/superpowers/specs/2026-05-18-harris-swimlane-template-design.md`
51
+ - Plan: `docs/superpowers/plans/2026-05-18-harris-swimlane-template.md`
52
+ - Spec 3-bis (auxiliary): independent of Spec 3 (SyncEngine + EM
53
+ Datacenter, on hold pending Datacenter readiness).
54
+
55
+ ## [2.3.0-alpha] - 2026-05-18
56
+
57
+ ### Added (IT)
58
+ - Modulo `pyarchinit_mini/graphproj/` con `GraphProjector` (DB → s3dgraphy.Graph),
59
+ `ParadataStore` (storage per-sito su filesystem), `GraphIngestor` (preview/apply
60
+ bidirezionale con staleness check), `auto_regen` (hook post-commit), edge_registry,
61
+ filesystem helpers.
62
+ - Modulo `pyarchinit_mini/graphml_io/` con writer/reader delegati a
63
+ `s3dgraphy.exporter.graphml.GraphMLExporter` / `s3dgraphy.importer.import_graphml.GraphMLImporter`.
64
+ - Auto-regen di `data/paradata/<site_slug>/stratigraphy.graphml` su ogni save US/USM
65
+ (best-effort, errori isolati). Disabilitabile con `PYARCHINIT_DISABLE_AUTO_REGEN=1`
66
+ o col context manager `auto_regen.disable_regen()`.
67
+ - 5 pagine HTML CRUD per paradata (authors, licenses, embargoes, documents, epochs)
68
+ con form Bootstrap.
69
+ - REST API completa `/api/v1/paradata/<site>/{authors,licenses,embargoes,documents,epochs}`.
70
+ - Route web `/sites/<site>/graph/{view,download,import-preview,import-apply}` con
71
+ preview 2-fasi obbligatorio per l'import GraphML + snapshot staleness check.
72
+
73
+ ### Changed
74
+ - `pyarchinit_mini/graphml_converter/{graphml_builder, graphml_exporter,
75
+ pure_networkx_exporter, converter}.py` marcati deprecati (emettono
76
+ `DeprecationWarning` all'import). Verranno rimossi in Spec 3.
77
+ - `harris_creator_routes.py` refactored: il branch `graphml` ora usa
78
+ `GraphProjector.populate_graph()` + `graphml_io.writer.write_graphml()`
79
+ invece di passare attraverso `HarrisMatrixGenerator.export_to_graphml()` /
80
+ `GraphMLBuilder`.
81
+ - Edge canonical names allineati a s3dgraphy 0.1.42: `covers` → `overlies`,
82
+ `leans_against` → `abuts`. Fix del bug latente Spec 1 in
83
+ `vocab_{en,it}.json` e `s3d_converter._LEGACY_CODE_MAP`.
84
+
85
+ ### Architecture note (paradata storage)
86
+ s3dgraphy 0.1.42's GraphML exporter does not round-trip standalone paradata
87
+ nodes (AuthorNode, etc.) — they're only serialised when wrapped in
88
+ ParadataNodeGroup. Spec 2 therefore adopted a **JSON sidecar pattern**:
89
+ paradata entities live in `data/paradata/<site_slug>/paradata.json`
90
+ (committed to git), while the auto-regenerated `stratigraphy.graphml` is
91
+ purely the stratigraphic projection. Paradata are exposed via REST/UI but
92
+ not embedded in the GraphML output.
93
+
94
+ ### Added (EN)
95
+ - New `pyarchinit_mini/graphproj/` package: GraphProjector, ParadataStore,
96
+ GraphIngestor (2-phase preview/apply), auto_regen post-commit hook,
97
+ edge_registry, filesystem helpers.
98
+ - New `pyarchinit_mini/graphml_io/` package delegating to s3dgraphy.
99
+ - Auto-regen of stratigraphy.graphml on US/USM save, error-isolated.
100
+ - 5 paradata CRUD HTML pages + REST API.
101
+ - Graph routes: view, download, import-preview, import-apply with snapshot
102
+ staleness check (409 on stale).
103
+ - Deprecation warnings on 4 legacy writers.
104
+
105
+ ### Dependencies
106
+ - No new dependencies. Uses s3dgraphy 0.1.42 (bumped in 2.2.0-alpha).
107
+
108
+ ### Spec / Plan
109
+ - Spec: `docs/superpowers/specs/2026-05-17-spec-2-local-graph-paradata-design.md`
110
+ - Plan: `docs/superpowers/plans/2026-05-17-spec-2-local-graph-paradata.md`
111
+ - Spec 2 of 4 for the s3dgraphy bidirectional bridge work.
112
+
113
+ ## [2.2.0-alpha] - 2026-05-17
114
+
115
+ ### Added (IT)
116
+ - Modulo `pyarchinit_mini/vocab/` con `VocabProvider` singleton: legge i tre pillar JSON di s3dgraphy
117
+ (`s3Dgraphy_node_datamodel.json`, `s3Dgraphy_connections_datamodel.json`, `em_visual_rules.json`)
118
+ come fonte canonica per tipi di unità, tipi di relazione, e stili visivi.
119
+ - Endpoint REST `/api/v1/vocab/{unit-types, edge-types, visual-style, diagnostics}` per popolare
120
+ select e form lato web.
121
+ - CLI `pyarchinit-mini-migrate-vocab` per allineare il vocabolario legacy
122
+ (`USVA`/`USVB` → `USVs`, `USVC` → `USVn`) e fare il backfill della colonna `node_uuid` (UUID v7)
123
+ su `us_table`, `inventario_materiali_table`, `periodizzazione_table`.
124
+ - Colonna `node_uuid` (prerequisito per il sync futuro col Datacenter EM).
125
+ - Catalogo i18n custom (`pyarchinit_mini/vocab/translations/vocab_{en,it}.json`) con
126
+ `edge_type_aliases` per il parsing dei `rapporti` italiani.
127
+
128
+ ### Added (EN)
129
+ - New `pyarchinit_mini/vocab/` package with `VocabProvider` singleton reading three s3dgraphy
130
+ JSON pillars as canonical source of unit types, edge types, and visual styles.
131
+ - REST endpoints `/api/v1/vocab/{unit-types, edge-types, visual-style, diagnostics}` to populate
132
+ forms in the web UI.
133
+ - CLI `pyarchinit-mini-migrate-vocab` to align legacy vocabulary (`USVA`/`USVB` → `USVs`,
134
+ `USVC` → `USVn`) and backfill `node_uuid` (UUID v7) across `us_table`,
135
+ `inventario_materiali_table`, `periodizzazione_table`.
136
+ - `node_uuid` column (prerequisite for future EM Datacenter sync).
137
+ - Custom i18n catalogue with `edge_type_aliases` for parsing Italian `rapporti` strings.
138
+
139
+ ### Changed
140
+ - `graphml_converter/em_palette.py` reads visual styles from `VocabProvider` instead of the
141
+ hardcoded `PALETTE` dict (kept as deprecated shim emitting `DeprecationWarning` on access).
142
+ - `s3d_integration/s3d_converter.py` parses `rapporti` text and categorizes node families via
143
+ `VocabProvider` (`italian_aliases`, `family`, `class_name`) instead of hardcoded if/elif chains.
144
+ - Harris Matrix Creator now consumes `VocabProvider` visual styles end-to-end.
145
+
146
+ ### Migration required
147
+ - After upgrading, run `pyarchinit-mini-migrate-vocab --dry-run` to preview, then
148
+ `--apply` to migrate (auto-backup under `data/backups/`).
149
+ - See `docs/CLI_MIGRATE_VOCAB.md` for full reference.
150
+
151
+ ### Dependencies
152
+ - `s3dgraphy>=0.1.42` (was 0.1.15).
153
+ - New: `uuid7>=0.1.0` (importable as `uuid_extensions`).
154
+ - Dev: `freezegun>=1.5.0`.
155
+
156
+ ### Spec / Plan
157
+ - Spec: `docs/superpowers/specs/2026-05-16-s3dgraphy-web-foundation-design.md`
158
+ - Plan: `docs/superpowers/plans/2026-05-16-s3dgraphy-web-foundation.md`
159
+ - This is Spec 1 of 4 for porting the s3dgraphy bidirectional bridge from the QGIS plugin.
160
+
1
161
  ## [2.1.6] - 2026-02-25
2
162
 
3
163
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyarchinit-mini
3
- Version: 2.1.68
3
+ Version: 2.4.0
4
4
  Summary: Lightweight archaeological data management system with REST API, Web UI, Desktop GUI, CLI, multi-user authentication, real-time collaboration, analytics dashboard, PyArchInit import/export, Heriverse/ATON export integration, and 3D CRUD viewer
5
5
  Home-page: https://github.com/enzococca/pyarchinit-mini
6
6
  Author: PyArchInit Team
@@ -42,7 +42,8 @@ Requires-Dist: networkx>=3.0.0
42
42
  Requires-Dist: reportlab>=4.0.0
43
43
  Requires-Dist: pillow>=10.0.0
44
44
  Requires-Dist: qrcode[pil]>=7.4.0
45
- Requires-Dist: s3dgraphy>=0.1.13
45
+ Requires-Dist: s3dgraphy>=0.1.42
46
+ Requires-Dist: uuid7>=0.1.0
46
47
  Requires-Dist: click>=8.1.0
47
48
  Requires-Dist: rich>=13.0.0
48
49
  Requires-Dist: inquirer>=3.0.0
@@ -91,6 +92,7 @@ Requires-Dist: black>=23.0.0; extra == "dev"
91
92
  Requires-Dist: flake8>=6.0.0; extra == "dev"
92
93
  Requires-Dist: isort>=5.12.0; extra == "dev"
93
94
  Requires-Dist: mypy>=1.0.0; extra == "dev"
95
+ Requires-Dist: freezegun>=1.5.0; extra == "dev"
94
96
  Provides-Extra: docs
95
97
  Requires-Dist: sphinx>=6.0.0; extra == "docs"
96
98
  Requires-Dist: sphinx-rtd-theme>=1.2.0; extra == "docs"
@@ -2366,3 +2368,94 @@ This project is licensed under the GNU General Public License v2.0 - see the [LI
2366
2368
 
2367
2369
 
2368
2370
  **Made with ❤️ for the Archaeological Community**
2371
+
2372
+ ## s3dgraphy integration
2373
+
2374
+ Since 2.2.0-alpha, pyarchinit-mini-web reads the canonical Extended Matrix
2375
+ vocabulary (unit types, edge types, visual styles) from the
2376
+ [s3dgraphy](https://github.com/zalmoxes-laran/s3dgraphy) package's JSON
2377
+ catalogues. Unit types like `US`, `USVs`, `USVn`, `RSF`, `USM` come from
2378
+ `s3Dgraphy_node_datamodel.json` (v1.5.4 at time of writing).
2379
+
2380
+ Bumping s3dgraphy (`pip install --upgrade s3dgraphy`) makes new EM types
2381
+ immediately available in form selects without any pyarchinit-mini code change.
2382
+
2383
+ After upgrading, run the data alignment to update legacy records:
2384
+
2385
+ ```bash
2386
+ pyarchinit-mini-migrate-vocab --dry-run # preview changes
2387
+ pyarchinit-mini-migrate-vocab --apply # backup + migrate
2388
+ ```
2389
+
2390
+ See `docs/CLI_MIGRATE_VOCAB.md` for the full CLI reference.
2391
+
2392
+ The vocab is exposed to the browser via:
2393
+
2394
+ - `GET /api/v1/vocab/unit-types?lang=it`
2395
+ - `GET /api/v1/vocab/unit-types/<abbr>`
2396
+ - `GET /api/v1/vocab/edge-types?lang=it`
2397
+ - `GET /api/v1/vocab/visual-style/<unit_type>`
2398
+ - `GET /api/v1/vocab/diagnostics` (admin-only)
2399
+
2400
+ ## Graph projection & paradata
2401
+
2402
+ Since 2.3.0-alpha, pyarchinit-mini-web auto-generates the stratigraphic graph
2403
+ as a GraphML file every time you save a US/USM record. Output lives at
2404
+ `data/paradata/<site_slug>/stratigraphy.graphml`.
2405
+
2406
+ Paradata (authors, licenses, embargoes, documents, epochs) are stored in a
2407
+ JSON sidecar:
2408
+ ```
2409
+ data/paradata/<site_slug>/paradata.json
2410
+ ```
2411
+ because s3dgraphy 0.1.42's GraphML exporter does not round-trip standalone
2412
+ paradata nodes. The JSON sidecar IS committed to git.
2413
+
2414
+ ### Paradata editing
2415
+
2416
+ Visit `/paradata/<site>/{authors,licenses,embargoes,documents,epochs}` to
2417
+ manage paradata. REST endpoints under `/api/v1/paradata/<site>/...` mirror
2418
+ the UI. See `docs/PARADATA_GUIDE.md`.
2419
+
2420
+ ### Graph import
2421
+
2422
+ `/sites/<site>/graph/import-preview` accepts a GraphML upload; you see a
2423
+ preview of planned INSERT/UPDATE/SKIP and must confirm via
2424
+ `/sites/<site>/graph/import-apply` before any DB write.
2425
+
2426
+ ### Auto-regen control
2427
+
2428
+ - Disable globally: `export PYARCHINIT_DISABLE_AUTO_REGEN=1`
2429
+ - Disable during bulk ops: `with graphproj.auto_regen.disable_regen():`
2430
+
2431
+ See `docs/GRAPH_AUTO_REGEN.md`.
2432
+
2433
+ ## Harris Swimlane Editor
2434
+
2435
+ Since 2.4.0, the Harris Matrix Creator at `/harris-creator/editor`
2436
+ displays stratigraphic graphs with **yEd-like swimlanes** — horizontal
2437
+ rows representing periods+phases. Existing US records are auto-placed
2438
+ in their row based on `periodo_iniziale + fase_iniziale`. Users can
2439
+ drag US records between rows, create new rows interactively, and save
2440
+ back to the DB.
2441
+
2442
+ Row source priority:
2443
+ 1. `period_table` (formal definitions)
2444
+ 2. Fallback: distinct `(periodo_iniziale, fase_iniziale)` from
2445
+ `periodizzazione_table` + `us_table`
2446
+
2447
+ ### Two GraphML outputs
2448
+
2449
+ - `data/paradata/<site>/stratigraphy.graphml` (Spec 2, auto-regen):
2450
+ s3dgraphy clean, EM-canonical, for the EM Datacenter
2451
+ - `data/exports/harris_yed/<site>-harris-yed.graphml` (Spec 3-bis,
2452
+ on-demand): yEd-flavored with `y:TableNode`, for users editing in
2453
+ yEd Desktop
2454
+
2455
+ ### Auto-regen integration
2456
+
2457
+ Save endpoint also triggers Spec 2's auto_regen for
2458
+ `stratigraphy.graphml`, keeping the canonical output consistent with
2459
+ DB state.
2460
+
2461
+ See `docs/HARRIS_SWIMLANE.md` and `docs/YED_INTEGRATION.md`.
@@ -2264,4 +2264,95 @@ This project is licensed under the GNU General Public License v2.0 - see the [LI
2264
2264
  ---
2265
2265
 
2266
2266
 
2267
- **Made with ❤️ for the Archaeological Community**
2267
+ **Made with ❤️ for the Archaeological Community**
2268
+
2269
+ ## s3dgraphy integration
2270
+
2271
+ Since 2.2.0-alpha, pyarchinit-mini-web reads the canonical Extended Matrix
2272
+ vocabulary (unit types, edge types, visual styles) from the
2273
+ [s3dgraphy](https://github.com/zalmoxes-laran/s3dgraphy) package's JSON
2274
+ catalogues. Unit types like `US`, `USVs`, `USVn`, `RSF`, `USM` come from
2275
+ `s3Dgraphy_node_datamodel.json` (v1.5.4 at time of writing).
2276
+
2277
+ Bumping s3dgraphy (`pip install --upgrade s3dgraphy`) makes new EM types
2278
+ immediately available in form selects without any pyarchinit-mini code change.
2279
+
2280
+ After upgrading, run the data alignment to update legacy records:
2281
+
2282
+ ```bash
2283
+ pyarchinit-mini-migrate-vocab --dry-run # preview changes
2284
+ pyarchinit-mini-migrate-vocab --apply # backup + migrate
2285
+ ```
2286
+
2287
+ See `docs/CLI_MIGRATE_VOCAB.md` for the full CLI reference.
2288
+
2289
+ The vocab is exposed to the browser via:
2290
+
2291
+ - `GET /api/v1/vocab/unit-types?lang=it`
2292
+ - `GET /api/v1/vocab/unit-types/<abbr>`
2293
+ - `GET /api/v1/vocab/edge-types?lang=it`
2294
+ - `GET /api/v1/vocab/visual-style/<unit_type>`
2295
+ - `GET /api/v1/vocab/diagnostics` (admin-only)
2296
+
2297
+ ## Graph projection & paradata
2298
+
2299
+ Since 2.3.0-alpha, pyarchinit-mini-web auto-generates the stratigraphic graph
2300
+ as a GraphML file every time you save a US/USM record. Output lives at
2301
+ `data/paradata/<site_slug>/stratigraphy.graphml`.
2302
+
2303
+ Paradata (authors, licenses, embargoes, documents, epochs) are stored in a
2304
+ JSON sidecar:
2305
+ ```
2306
+ data/paradata/<site_slug>/paradata.json
2307
+ ```
2308
+ because s3dgraphy 0.1.42's GraphML exporter does not round-trip standalone
2309
+ paradata nodes. The JSON sidecar IS committed to git.
2310
+
2311
+ ### Paradata editing
2312
+
2313
+ Visit `/paradata/<site>/{authors,licenses,embargoes,documents,epochs}` to
2314
+ manage paradata. REST endpoints under `/api/v1/paradata/<site>/...` mirror
2315
+ the UI. See `docs/PARADATA_GUIDE.md`.
2316
+
2317
+ ### Graph import
2318
+
2319
+ `/sites/<site>/graph/import-preview` accepts a GraphML upload; you see a
2320
+ preview of planned INSERT/UPDATE/SKIP and must confirm via
2321
+ `/sites/<site>/graph/import-apply` before any DB write.
2322
+
2323
+ ### Auto-regen control
2324
+
2325
+ - Disable globally: `export PYARCHINIT_DISABLE_AUTO_REGEN=1`
2326
+ - Disable during bulk ops: `with graphproj.auto_regen.disable_regen():`
2327
+
2328
+ See `docs/GRAPH_AUTO_REGEN.md`.
2329
+
2330
+ ## Harris Swimlane Editor
2331
+
2332
+ Since 2.4.0, the Harris Matrix Creator at `/harris-creator/editor`
2333
+ displays stratigraphic graphs with **yEd-like swimlanes** — horizontal
2334
+ rows representing periods+phases. Existing US records are auto-placed
2335
+ in their row based on `periodo_iniziale + fase_iniziale`. Users can
2336
+ drag US records between rows, create new rows interactively, and save
2337
+ back to the DB.
2338
+
2339
+ Row source priority:
2340
+ 1. `period_table` (formal definitions)
2341
+ 2. Fallback: distinct `(periodo_iniziale, fase_iniziale)` from
2342
+ `periodizzazione_table` + `us_table`
2343
+
2344
+ ### Two GraphML outputs
2345
+
2346
+ - `data/paradata/<site>/stratigraphy.graphml` (Spec 2, auto-regen):
2347
+ s3dgraphy clean, EM-canonical, for the EM Datacenter
2348
+ - `data/exports/harris_yed/<site>-harris-yed.graphml` (Spec 3-bis,
2349
+ on-demand): yEd-flavored with `y:TableNode`, for users editing in
2350
+ yEd Desktop
2351
+
2352
+ ### Auto-regen integration
2353
+
2354
+ Save endpoint also triggers Spec 2's auto_regen for
2355
+ `stratigraphy.graphml`, keeping the canonical output consistent with
2356
+ DB state.
2357
+
2358
+ See `docs/HARRIS_SWIMLANE.md` and `docs/YED_INTEGRATION.md`.
@@ -23,7 +23,7 @@ Features:
23
23
  - Scalable and modular architecture
24
24
  """
25
25
 
26
- __version__ = "2.1.68"
26
+ __version__ = "2.4.0"
27
27
  __author__ = "PyArchInit Team"
28
28
  __email__ = "enzo.ccc@gmail.com"
29
29
 
@@ -0,0 +1,164 @@
1
+ """CLI: pyarchinit-mini-migrate-vocab
2
+
3
+ Wraps the 3 Spec 1 Foundation migrations (node_uuid schema → backfill →
4
+ vocab alignment USVA/USVB→USVs USVC→USVn) and the backup module.
5
+
6
+ Discovery order for target DBs:
7
+ 1. --database <url> (CLI flag, wins outright)
8
+ 2. $DATABASE_URL (default app DB)
9
+ 3. data/connections.json (saved web connections; skip with --only-default)
10
+
11
+ Usage examples:
12
+ pyarchinit-mini-migrate-vocab --dry-run
13
+ pyarchinit-mini-migrate-vocab --apply --yes
14
+ pyarchinit-mini-migrate-vocab --rollback --yes
15
+ pyarchinit-mini-migrate-vocab --list-backups
16
+ pyarchinit-mini-migrate-vocab --apply --script vocab_alignment --database sqlite:///x.db --yes
17
+ """
18
+ from __future__ import annotations
19
+
20
+ import argparse
21
+ import importlib
22
+ import json
23
+ import os
24
+ import sys
25
+ from pathlib import Path
26
+
27
+ # Use importlib to avoid name collisions with the legacy DatabaseMigrations
28
+ # class exported from pyarchinit_mini.database.migrations.__init__.
29
+ _pkg = "pyarchinit_mini.database.migrations"
30
+ schema_m = importlib.import_module(f"{_pkg}._2026_05_node_uuid_schema")
31
+ backfill_m = importlib.import_module(f"{_pkg}._2026_05_node_uuid_backfill")
32
+ align_m = importlib.import_module(f"{_pkg}._2026_05_vocab_alignment")
33
+
34
+ from pyarchinit_mini.database.migrations.backup import backup_database # noqa: E402
35
+
36
+
37
+ SCRIPTS = {
38
+ "node_uuid_schema": schema_m,
39
+ "node_uuid_backfill": backfill_m,
40
+ "vocab_alignment": align_m,
41
+ }
42
+ ORDER = ["node_uuid_schema", "node_uuid_backfill", "vocab_alignment"]
43
+
44
+
45
+ def _discover_dbs(args) -> list[str]:
46
+ if args.database:
47
+ return [args.database]
48
+ dbs: list[str] = []
49
+ env = os.environ.get("DATABASE_URL")
50
+ if env:
51
+ dbs.append(env)
52
+ if not args.only_default:
53
+ conns = Path("data/connections.json")
54
+ if conns.exists():
55
+ try:
56
+ data = json.loads(conns.read_text(encoding="utf-8"))
57
+ for entry in data.get("connections", []):
58
+ url = entry.get("url")
59
+ if url and url not in dbs:
60
+ dbs.append(url)
61
+ except json.JSONDecodeError:
62
+ print(f"warning: could not parse {conns}", file=sys.stderr)
63
+ return dbs
64
+
65
+
66
+ def _confirm(prompt: str, yes: bool) -> bool:
67
+ if yes:
68
+ return True
69
+ try:
70
+ ans = input(f"{prompt} [y/N] ").strip().lower()
71
+ except EOFError:
72
+ return False
73
+ return ans == "y"
74
+
75
+
76
+ def _list_backups(backups_dir: Path) -> int:
77
+ idx = backups_dir / "_index.json"
78
+ if not idx.exists():
79
+ print("No backups found.")
80
+ return 0
81
+ for r in json.loads(idx.read_text(encoding="utf-8")):
82
+ print(f"{r['timestamp']} {r['backup_path']} ({r['size_bytes']} bytes)")
83
+ return 0
84
+
85
+
86
+ def main(argv=None) -> int:
87
+ p = argparse.ArgumentParser(
88
+ prog="pyarchinit-mini-migrate-vocab",
89
+ description="Foundation migrations: node_uuid schema + backfill + vocab alignment.",
90
+ )
91
+ mode = p.add_mutually_exclusive_group(required=True)
92
+ mode.add_argument("--dry-run", action="store_true", help="Report changes without mutating")
93
+ mode.add_argument("--apply", action="store_true", help="Backup then apply migrations")
94
+ mode.add_argument("--rollback", action="store_true", help="(Manual) restore from backup")
95
+ mode.add_argument("--list-backups", action="store_true", help="List recorded backups")
96
+ p.add_argument("--database", type=str, help="Target a specific DB URL")
97
+ p.add_argument("--script", type=str, choices=list(SCRIPTS.keys()),
98
+ help="Run a single script (advanced)")
99
+ p.add_argument("--only-default", action="store_true",
100
+ help="Skip data/connections.json discovery")
101
+ p.add_argument("--backups-dir", type=Path, default=Path("data/backups"))
102
+ p.add_argument("--yes", action="store_true", help="Skip confirmation prompts")
103
+ args = p.parse_args(argv)
104
+
105
+ if args.list_backups:
106
+ return _list_backups(args.backups_dir)
107
+
108
+ if args.rollback:
109
+ # TODO(Spec-2): implement actual rollback (read _index.json → restore latest backup
110
+ # SQLite via cp / PG via pg_restore). Currently prints manual instructions only.
111
+ print("Rollback requires manual restore. Use --list-backups to see what's available,")
112
+ print("then copy/restore the backup file manually (SQLite) or pg_restore (PostgreSQL).")
113
+ return 0
114
+
115
+ dbs = _discover_dbs(args)
116
+ if not dbs:
117
+ print("No databases discovered. Use --database <url> or set DATABASE_URL.",
118
+ file=sys.stderr)
119
+ return 2
120
+
121
+ scripts_to_run = (
122
+ [SCRIPTS[args.script]] if args.script
123
+ else [SCRIPTS[k] for k in ORDER]
124
+ )
125
+
126
+ # TODO(Spec-2): acquire data/.migration_lock (PID + timestamp) to reject concurrent
127
+ # --apply invocations per Spec §6.3
128
+ overall_status = 0
129
+ for db in dbs:
130
+ print(f"== DB: {db} ==")
131
+ if args.apply:
132
+ if not _confirm(f"Backup and migrate {db}?", args.yes):
133
+ print(" skipped (no confirmation)")
134
+ continue
135
+ try:
136
+ rec = backup_database(db, backups_dir=args.backups_dir)
137
+ print(f" backup: {rec.backup_path}")
138
+ except Exception as e:
139
+ print(f" backup failed: {e}", file=sys.stderr)
140
+ overall_status = 1
141
+ continue
142
+ for script in scripts_to_run:
143
+ try:
144
+ report = script.run(db, dry_run=args.dry_run)
145
+ print(f" {report.script}: status={report.status}")
146
+ if hasattr(report, "tables_changed") and report.tables_changed:
147
+ print(f" tables_changed: {report.tables_changed}")
148
+ if hasattr(report, "tables_skipped") and report.tables_skipped:
149
+ print(f" tables_skipped: {report.tables_skipped}")
150
+ if hasattr(report, "rows_updated"):
151
+ print(f" rows_updated: {report.rows_updated}")
152
+ if hasattr(report, "mappings"):
153
+ print(f" mappings: {report.mappings}")
154
+ except Exception as e:
155
+ print(f" {script.__name__} FAILED: {e}", file=sys.stderr)
156
+ overall_status = 1
157
+
158
+ # TODO(Spec-2): append per-script JSON-line entry to data/migration.log per Spec §6.4
159
+ # (ts, script, db, rows_updated/mappings/tables_*, duration_ms, status)
160
+ return overall_status
161
+
162
+
163
+ if __name__ == "__main__":
164
+ sys.exit(main())
@@ -0,0 +1,104 @@
1
+ """Backfill migration (2026-05-16):
2
+ Populates `node_uuid` column with UUID v7 values on us_table,
3
+ inventario_materiali_table, periodizzazione_table. Batched at 1000 rows.
4
+
5
+ Idempotent: only updates rows WHERE node_uuid IS NULL.
6
+ """
7
+ import sqlite3
8
+ from dataclasses import dataclass, field
9
+
10
+ from pyarchinit_mini.database.utils import generate_node_uuid
11
+
12
+
13
+ @dataclass
14
+ class MigrationReport:
15
+ script: str
16
+ db: str
17
+ rows_updated: dict = field(default_factory=dict)
18
+ dry_run: bool = False
19
+ status: str = "ok"
20
+
21
+
22
+ TABLES = ("us_table", "inventario_materiali_table", "periodizzazione_table")
23
+ BATCH = 1000
24
+
25
+
26
+ def _backfill_sqlite(db_path: str, dry_run: bool) -> dict:
27
+ conn = sqlite3.connect(db_path)
28
+ out = {}
29
+ try:
30
+ for t in TABLES:
31
+ # Determine PK column. For test fixtures it's "id"; for real
32
+ # pyarchinit_mini.models.us.US it's "id_us". Inspect the table.
33
+ cols = conn.execute(f"PRAGMA table_info({t})").fetchall()
34
+ pk_col = next((c[1] for c in cols if c[5]), None)
35
+ if pk_col is None:
36
+ out[t] = 0
37
+ continue
38
+ col_names = {c[1] for c in cols}
39
+ if "node_uuid" not in col_names:
40
+ # Column not yet added (e.g. schema migration was dry-run)
41
+ out[t] = 0
42
+ continue
43
+ rows = conn.execute(
44
+ f"SELECT {pk_col} FROM {t} WHERE node_uuid IS NULL"
45
+ ).fetchall()
46
+ count = len(rows)
47
+ if count == 0 or dry_run:
48
+ out[t] = count
49
+ continue
50
+ for offset in range(0, count, BATCH):
51
+ batch = rows[offset:offset + BATCH]
52
+ for (row_id,) in batch:
53
+ conn.execute(
54
+ f"UPDATE {t} SET node_uuid=? WHERE {pk_col}=?",
55
+ (generate_node_uuid(), row_id)
56
+ )
57
+ conn.commit()
58
+ out[t] = count
59
+ finally:
60
+ conn.close()
61
+ return out
62
+
63
+
64
+ def _backfill_postgresql(url: str, dry_run: bool) -> dict:
65
+ from sqlalchemy import create_engine, text, inspect
66
+ eng = create_engine(url)
67
+ out = {}
68
+ inspector = inspect(eng)
69
+ with eng.begin() as c:
70
+ for t in TABLES:
71
+ if t not in inspector.get_table_names():
72
+ out[t] = 0
73
+ continue
74
+ pk_cols = inspector.get_pk_constraint(t).get("constrained_columns", [])
75
+ if not pk_cols:
76
+ out[t] = 0
77
+ continue
78
+ pk_col = pk_cols[0]
79
+ rows = c.execute(text(f"SELECT {pk_col} FROM {t} WHERE node_uuid IS NULL")).fetchall()
80
+ count = len(rows)
81
+ if not dry_run and count > 0:
82
+ for (row_id,) in rows:
83
+ c.execute(
84
+ text(f"UPDATE {t} SET node_uuid=:u WHERE {pk_col}=:i"),
85
+ {"u": generate_node_uuid(), "i": row_id}
86
+ )
87
+ out[t] = count
88
+ return out
89
+
90
+
91
+ def run(connection_url: str, *, dry_run: bool = False) -> MigrationReport:
92
+ report = MigrationReport(
93
+ script="2026_05_node_uuid_backfill",
94
+ db=connection_url,
95
+ dry_run=dry_run,
96
+ )
97
+ if connection_url.startswith("sqlite"):
98
+ path = connection_url.replace("sqlite:///", "", 1)
99
+ report.rows_updated = _backfill_sqlite(path, dry_run)
100
+ elif connection_url.startswith("postgresql") or connection_url.startswith("postgres"):
101
+ report.rows_updated = _backfill_postgresql(connection_url, dry_run)
102
+ else:
103
+ report.status = "unsupported_backend"
104
+ return report