lvkit 0.7.0__tar.gz → 0.7.2__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 (454) hide show
  1. {lvkit-0.7.0 → lvkit-0.7.2}/PKG-INFO +1 -1
  2. {lvkit-0.7.0 → lvkit-0.7.2}/editors/vscode/README.md +10 -0
  3. {lvkit-0.7.0 → lvkit-0.7.2}/pyproject.toml +1 -1
  4. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/__init__.py +1 -1
  5. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/cli.py +175 -6
  6. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/describe.py +43 -61
  7. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/netlist.py +10 -2
  8. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/op_walk.py +4 -4
  9. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/skill_templates/lvkit-convert/SKILL.md +3 -2
  10. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/skill_templates/lvkit-describe/SKILL.md +5 -3
  11. {lvkit-0.7.0 → lvkit-0.7.2}/.gitignore +0 -0
  12. {lvkit-0.7.0 → lvkit-0.7.2}/.pre-commit-config.yaml +0 -0
  13. {lvkit-0.7.0 → lvkit-0.7.2}/LICENSE +0 -0
  14. {lvkit-0.7.0 → lvkit-0.7.2}/NOTICE +0 -0
  15. {lvkit-0.7.0 → lvkit-0.7.2}/README.md +0 -0
  16. {lvkit-0.7.0 → lvkit-0.7.2}/deploy/cloudrun/README.md +0 -0
  17. {lvkit-0.7.0 → lvkit-0.7.2}/docs/_internal/xml-schema/README.md +0 -0
  18. {lvkit-0.7.0 → lvkit-0.7.2}/editors/vscode/LICENSE +0 -0
  19. {lvkit-0.7.0 → lvkit-0.7.2}/mcpb/README.md +0 -0
  20. {lvkit-0.7.0 → lvkit-0.7.2}/plugin/README.md +0 -0
  21. {lvkit-0.7.0 → lvkit-0.7.2}/scripts/audit_primitive_consistency.py +0 -0
  22. {lvkit-0.7.0 → lvkit-0.7.2}/scripts/audit_terminal_order.py +0 -0
  23. {lvkit-0.7.0 → lvkit-0.7.2}/scripts/audit_unresolved.py +0 -0
  24. {lvkit-0.7.0 → lvkit-0.7.2}/scripts/build_example_pages.sh +0 -0
  25. {lvkit-0.7.0 → lvkit-0.7.2}/scripts/build_hero.py +0 -0
  26. {lvkit-0.7.0 → lvkit-0.7.2}/scripts/build_ni_function_catalog.py +0 -0
  27. {lvkit-0.7.0 → lvkit-0.7.2}/scripts/connector_geometry_audit.py +0 -0
  28. {lvkit-0.7.0 → lvkit-0.7.2}/scripts/dump_primitive_context.py +0 -0
  29. {lvkit-0.7.0 → lvkit-0.7.2}/scripts/extract_corpus.py +0 -0
  30. {lvkit-0.7.0 → lvkit-0.7.2}/scripts/gen_semantics_probe.py +0 -0
  31. {lvkit-0.7.0 → lvkit-0.7.2}/scripts/generate_docs.py +0 -0
  32. {lvkit-0.7.0 → lvkit-0.7.2}/scripts/generate_driver_data.py +0 -0
  33. {lvkit-0.7.0 → lvkit-0.7.2}/scripts/generate_python.py +0 -0
  34. {lvkit-0.7.0 → lvkit-0.7.2}/scripts/list_unknown_primitives.py +0 -0
  35. {lvkit-0.7.0 → lvkit-0.7.2}/scripts/populate_vilib.py +0 -0
  36. {lvkit-0.7.0 → lvkit-0.7.2}/scripts/pull_samples.sh +0 -0
  37. {lvkit-0.7.0 → lvkit-0.7.2}/scripts/recategorize_vilib.py +0 -0
  38. {lvkit-0.7.0 → lvkit-0.7.2}/scripts/render_gallery.py +0 -0
  39. {lvkit-0.7.0 → lvkit-0.7.2}/scripts/reproduce_openg_corpus.py +0 -0
  40. {lvkit-0.7.0 → lvkit-0.7.2}/scripts/study_unwired_direction.py +0 -0
  41. {lvkit-0.7.0 → lvkit-0.7.2}/scripts/wire_decode_probe.py +0 -0
  42. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/__main__.py +0 -0
  43. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/_data.py +0 -0
  44. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/_pylabview_patches.py +0 -0
  45. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/cache_paths.py +0 -0
  46. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/README.md +0 -0
  47. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/__init__.py +0 -0
  48. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/ast_optimizer.py +0 -0
  49. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/ast_utils.py +0 -0
  50. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/builder.py +0 -0
  51. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/class_builder.py +0 -0
  52. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/condition_builder.py +0 -0
  53. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/context.py +0 -0
  54. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/dataflow.py +0 -0
  55. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/elementwise.py +0 -0
  56. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/error_handler.py +0 -0
  57. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/expressions.py +0 -0
  58. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/fragment.py +0 -0
  59. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/function.py +0 -0
  60. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/imports.py +0 -0
  61. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/__init__.py +0 -0
  62. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/base.py +0 -0
  63. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/case.py +0 -0
  64. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/compound.py +0 -0
  65. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/constant.py +0 -0
  66. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/event.py +0 -0
  67. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/first_call.py +0 -0
  68. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/formula.py +0 -0
  69. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/in_place.py +0 -0
  70. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/invoke_node.py +0 -0
  71. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/loop.py +0 -0
  72. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/nmux.py +0 -0
  73. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/primitive.py +0 -0
  74. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/printf.py +0 -0
  75. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/property_node.py +0 -0
  76. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/queue_ops.py +0 -0
  77. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/sequence.py +0 -0
  78. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/subvi.py +0 -0
  79. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/stubs.py +0 -0
  80. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/unresolved.py +0 -0
  81. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/connector_geometry.py +0 -0
  82. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/connector_pane_geometry.py +0 -0
  83. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/connector_pane_patterns.json +0 -0
  84. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/drivers/_index.json +0 -0
  85. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/drivers/daqmx.json +0 -0
  86. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/drivers/nidcpower.json +0 -0
  87. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/drivers/nidigital.json +0 -0
  88. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/drivers/nidmm.json +0 -0
  89. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/drivers/nifgen.json +0 -0
  90. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/drivers/niscope.json +0 -0
  91. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/drivers/niswitch.json +0 -0
  92. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/drivers/serial.json +0 -0
  93. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/drivers/visa.json +0 -0
  94. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/labview_error_codes.json +0 -0
  95. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/measure_data.json +0 -0
  96. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/openg/_index.json +0 -0
  97. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/openg/array.json +0 -0
  98. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/openg/file.json +0 -0
  99. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/openg/string.json +0 -0
  100. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/openg/time.json +0 -0
  101. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/openg/variant.json +0 -0
  102. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/primitives.json +0 -0
  103. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/_index.json +0 -0
  104. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/_pending_terminals.json +0 -0
  105. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/_types.json +0 -0
  106. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/addons.json +0 -0
  107. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/application-control.json +0 -0
  108. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/array.json +0 -0
  109. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/boolean.json +0 -0
  110. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/cluster-class-variant.json +0 -0
  111. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/collection.json +0 -0
  112. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/comparison.json +0 -0
  113. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/connectivity.json +0 -0
  114. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/control-simulation.json +0 -0
  115. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/data-communication.json +0 -0
  116. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/dialog-user-interface.json +0 -0
  117. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/express.json +0 -0
  118. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/file-io.json +0 -0
  119. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/graphics-sound.json +0 -0
  120. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/instrument-io.json +0 -0
  121. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/mathematics.json +0 -0
  122. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/measurement-io.json +0 -0
  123. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/numeric.json +0 -0
  124. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/report-generation.json +0 -0
  125. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/signal-processing.json +0 -0
  126. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/string.json +0 -0
  127. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/structures.json +0 -0
  128. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/synchronization.json +0 -0
  129. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/timing.json +0 -0
  130. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/waveform.json +0 -0
  131. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/docs/__init__.py +0 -0
  132. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/docs/generate.py +0 -0
  133. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/docs/html_generator.py +0 -0
  134. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/docs/template.css +0 -0
  135. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/docs/utils.py +0 -0
  136. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/extractor.py +0 -0
  137. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/flattened_typedesc.py +0 -0
  138. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/formula/__init__.py +0 -0
  139. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/formula/cparser.py +0 -0
  140. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/formula/emit.py +0 -0
  141. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/formula/lexer.py +0 -0
  142. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/formula/nodes.py +0 -0
  143. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/__init__.py +0 -0
  144. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/analysis.py +0 -0
  145. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/builders/__init__.py +0 -0
  146. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/builders/context.py +0 -0
  147. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/builders/operations.py +0 -0
  148. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/builders/refs.py +0 -0
  149. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/builders/structures.py +0 -0
  150. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/construction.py +0 -0
  151. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/core.py +0 -0
  152. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/diff.py +0 -0
  153. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/interface_order.py +0 -0
  154. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/loading.py +0 -0
  155. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/models.py +0 -0
  156. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/operations.py +0 -0
  157. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/parallel_parse.py +0 -0
  158. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/queries.py +0 -0
  159. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/index/__init__.py +0 -0
  160. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/index/build.py +0 -0
  161. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/index/model.py +0 -0
  162. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/index/project.py +0 -0
  163. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/index/query.py +0 -0
  164. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/index/sql.py +0 -0
  165. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/index/store.py +0 -0
  166. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/labview_error.py +0 -0
  167. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/labview_error_codes.py +0 -0
  168. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/labview_queue.py +0 -0
  169. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/load_mode.py +0 -0
  170. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/lv_detect.py +0 -0
  171. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/mcp/__init__.py +0 -0
  172. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/mcp/schemas.py +0 -0
  173. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/mcp/server.py +0 -0
  174. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/measure_data.py +0 -0
  175. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/models.py +0 -0
  176. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/num_format.py +0 -0
  177. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/output_cache.py +0 -0
  178. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/__init__.py +0 -0
  179. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/conp_types.py +0 -0
  180. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/constants.py +0 -0
  181. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/defaults.py +0 -0
  182. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/flags.py +0 -0
  183. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/fp_heap_type.py +0 -0
  184. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/front_panel.py +0 -0
  185. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/layout.py +0 -0
  186. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/metadata.py +0 -0
  187. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/models.py +0 -0
  188. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/naming.py +0 -0
  189. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/node_types.py +0 -0
  190. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/nodes/__init__.py +0 -0
  191. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/nodes/base.py +0 -0
  192. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/nodes/case.py +0 -0
  193. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/nodes/constant.py +0 -0
  194. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/nodes/decompose.py +0 -0
  195. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/nodes/disable.py +0 -0
  196. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/nodes/event.py +0 -0
  197. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/nodes/free_label.py +0 -0
  198. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/nodes/loop.py +0 -0
  199. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/nodes/sequence.py +0 -0
  200. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/type_mapping.py +0 -0
  201. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/type_resolution.py +0 -0
  202. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/utils.py +0 -0
  203. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/vi.py +0 -0
  204. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/wire_table.py +0 -0
  205. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/pipeline.py +0 -0
  206. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/primitive_resolver.py +0 -0
  207. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/project_store.py +0 -0
  208. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/py.typed +0 -0
  209. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/ARCHITECTURE.md +0 -0
  210. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/__init__.py +0 -0
  211. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/backend.py +0 -0
  212. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/composite.py +0 -0
  213. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/connector_pane.py +0 -0
  214. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/connector_pane_panel.py +0 -0
  215. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/diff_viewer.py +0 -0
  216. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/draw.py +0 -0
  217. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyph.py +0 -0
  218. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/__init__.py +0 -0
  219. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/decorations/__init__.py +0 -0
  220. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/decorations/arrow.py +0 -0
  221. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/decorations/base.py +0 -0
  222. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/decorations/factory.py +0 -0
  223. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/decorations/fallback.py +0 -0
  224. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/decorations/frame.py +0 -0
  225. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/decorations/line.py +0 -0
  226. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/__init__.py +0 -0
  227. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/arith.py +0 -0
  228. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/array_build.py +0 -0
  229. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/array_reverse.py +0 -0
  230. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/array_search.py +0 -0
  231. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/array_size.py +0 -0
  232. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/array_sort.py +0 -0
  233. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/array_split.py +0 -0
  234. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/base.py +0 -0
  235. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/boolean_constant.py +0 -0
  236. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/boolean_gate.py +0 -0
  237. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/bundle.py +0 -0
  238. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/bundle_by_name.py +0 -0
  239. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/centered_svg.py +0 -0
  240. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/cluster_constant.py +0 -0
  241. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/compound_arith.py +0 -0
  242. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/constant.py +0 -0
  243. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/control_ref_const.py +0 -0
  244. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/convert.py +0 -0
  245. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/error_cluster.py +0 -0
  246. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/event_data.py +0 -0
  247. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/formula_node.py +0 -0
  248. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/icon_image.py +0 -0
  249. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/in_place_element.py +0 -0
  250. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/inline_svg.py +0 -0
  251. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/invoke_node.py +0 -0
  252. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/label.py +0 -0
  253. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/local_variable.py +0 -0
  254. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/property_node.py +0 -0
  255. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/unbundle.py +0 -0
  256. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/variant.py +0 -0
  257. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/wrapped_box.py +0 -0
  258. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/structures/__init__.py +0 -0
  259. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/structures/base.py +0 -0
  260. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/structures/case.py +0 -0
  261. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/structures/disable.py +0 -0
  262. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/structures/event.py +0 -0
  263. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/structures/factory.py +0 -0
  264. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/structures/flat_sequence.py +0 -0
  265. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/structures/for_loop.py +0 -0
  266. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/structures/generic.py +0 -0
  267. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/structures/in_place.py +0 -0
  268. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/structures/selectable.py +0 -0
  269. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/structures/stacked_sequence.py +0 -0
  270. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/structures/while_loop.py +0 -0
  271. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/terminals/__init__.py +0 -0
  272. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/terminals/autoindex.py +0 -0
  273. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/terminals/base.py +0 -0
  274. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/terminals/concatenate.py +0 -0
  275. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/terminals/conditional.py +0 -0
  276. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/terminals/event_dyn.py +0 -0
  277. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/terminals/event_timeout.py +0 -0
  278. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/terminals/factory.py +0 -0
  279. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/terminals/generic.py +0 -0
  280. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/terminals/loop_count.py +0 -0
  281. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/terminals/selector.py +0 -0
  282. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/terminals/shift_register.py +0 -0
  283. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/terminals/tunnel.py +0 -0
  284. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/help_tip.py +0 -0
  285. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/icons.py +0 -0
  286. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/lane_pass.py +0 -0
  287. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/nodes.py +0 -0
  288. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/properties_panel.py +0 -0
  289. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/render_viewer.py +0 -0
  290. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/scene.py +0 -0
  291. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/style.py +0 -0
  292. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/templates/diff_viewer.html +0 -0
  293. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/templates/render_viewer.html +0 -0
  294. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/theme_control.py +0 -0
  295. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/theme_web.py +0 -0
  296. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/wire_router.py +0 -0
  297. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/runtime/__init__.py +0 -0
  298. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/runtime/lv.py +0 -0
  299. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/skill_templates/__init__.py +0 -0
  300. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/skill_templates/lvkit/SKILL.md +0 -0
  301. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/skill_templates/lvkit-document/SKILL.md +0 -0
  302. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/skill_templates/lvkit-query/SKILL.md +0 -0
  303. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/skill_templates/lvkit-resolve/SKILL.md +0 -0
  304. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/skill_templates/lvkit-review/SKILL.md +0 -0
  305. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/structure.py +0 -0
  306. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/terminal_collector.py +0 -0
  307. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/text_encoding.py +0 -0
  308. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/tools/__init__.py +0 -0
  309. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/tools/connector_geometry_profile.py +0 -0
  310. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/type_defaults.py +0 -0
  311. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/unresolved.py +0 -0
  312. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/vi_diff.py +0 -0
  313. {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/vilib_resolver.py +0 -0
  314. {lvkit-0.7.0 → lvkit-0.7.2}/tests/__init__.py +0 -0
  315. {lvkit-0.7.0 → lvkit-0.7.2}/tests/conftest.py +0 -0
  316. {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/29/PROVENANCE.md +0 -0
  317. {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/29/Test LVKit/Lib1/Class/Class.lvclass +0 -0
  318. {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/29/Test LVKit/Lib1/Class/Do.vi +0 -0
  319. {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/29/Test LVKit/Lib1/Lib1.lvlib +0 -0
  320. {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/29/Test LVKit/Lib2/Class/Class.lvclass +0 -0
  321. {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/29/Test LVKit/Lib2/Class/Do.vi +0 -0
  322. {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/29/Test LVKit/Lib2/Class/Test.vi +0 -0
  323. {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/29/Test LVKit/Lib2/Lib2.lvlib +0 -0
  324. {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/29/Test LVKit/Test LVKit.aliases +0 -0
  325. {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/29/Test LVKit/Test LVKit.lvlps +0 -0
  326. {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/29/Test LVKit/Test LVKit.lvproj +0 -0
  327. {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/30/PROVENANCE.md +0 -0
  328. {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/30/visible-frame-case-sequence.vi +0 -0
  329. {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/30/visible-frame-conditional-disable.vi +0 -0
  330. {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/31/PROVENANCE.md +0 -0
  331. {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/31/disable-structure-frame-names.vi +0 -0
  332. {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/32/PROVENANCE.md +0 -0
  333. {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/32/comments-and-decorations.vi +0 -0
  334. {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/33/PROVENANCE.md +0 -0
  335. {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/33/coercion-dot-consistency.vi +0 -0
  336. {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/34/PROVENANCE.md +0 -0
  337. {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/34/hidden-iteration-terminal.vi +0 -0
  338. {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/35/PROVENANCE.md +0 -0
  339. {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/35/objects-hidden-by-structures.vi +0 -0
  340. {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/36/PROVENANCE.md +0 -0
  341. {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/36/bundle-unbundle-names.vi +0 -0
  342. {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/37/PROVENANCE.md +0 -0
  343. {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/37/structure-tunnel-wire-bends.vi +0 -0
  344. {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/38/PROVENANCE.md +0 -0
  345. {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/38/auto-concatenating-tunnel.vi +0 -0
  346. {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/39/PROVENANCE.md +0 -0
  347. {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/39/zorder-not-respected.vi +0 -0
  348. {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/README.md +0 -0
  349. {lvkit-0.7.0 → lvkit-0.7.2}/tests/helpers.py +0 -0
  350. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_array_ops_codegen.py +0 -0
  351. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_ast_builder.py +0 -0
  352. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_ast_optimizer.py +0 -0
  353. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_case_codegen.py +0 -0
  354. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_case_parser.py +0 -0
  355. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_class_field_walkup.py +0 -0
  356. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_class_parent_linkinfo.py +0 -0
  357. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_class_properties.py +0 -0
  358. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_cli.py +0 -0
  359. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_cli_cache.py +0 -0
  360. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_cli_graph_ops.py +0 -0
  361. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_cli_query.py +0 -0
  362. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_codegen_context.py +0 -0
  363. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_compound_codegen.py +0 -0
  364. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_condition_builder.py +0 -0
  365. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_connector_geometry.py +0 -0
  366. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_connector_pane_label_recovery.py +0 -0
  367. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_connector_pane_patterns.py +0 -0
  368. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_connector_pane_render.py +0 -0
  369. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_conp_types.py +0 -0
  370. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_constant_decoding.py +0 -0
  371. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_dependency_path_refs.py +0 -0
  372. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_determinism.py +0 -0
  373. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_diff.py +0 -0
  374. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_diff_properties.py +0 -0
  375. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_diff_viewer.py +0 -0
  376. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_disable_graph.py +0 -0
  377. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_disable_parser.py +0 -0
  378. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_docs_class_hierarchy.py +0 -0
  379. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_docs_render.py +0 -0
  380. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_driver_codegen.py +0 -0
  381. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_dynamic_dispatch.py +0 -0
  382. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_e2e_codegen.py +0 -0
  383. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_elementwise.py +0 -0
  384. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_error_codegen.py +0 -0
  385. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_error_handling.py +0 -0
  386. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_error_terminal_label_fallback.py +0 -0
  387. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_event_codegen.py +0 -0
  388. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_event_parser.py +0 -0
  389. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_extraction_cache.py +0 -0
  390. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_extractor_concurrency.py +0 -0
  391. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_extractor_long_path.py +0 -0
  392. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_first_call_codegen.py +0 -0
  393. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_formula_codegen.py +0 -0
  394. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_formula_runtime.py +0 -0
  395. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_formula_semantics.py +0 -0
  396. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_formula_transpile.py +0 -0
  397. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_fp_heap_type.py +0 -0
  398. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_frame_attribution.py +0 -0
  399. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_frame_zplane.py +0 -0
  400. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_glyphs.py +0 -0
  401. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_graceful_degradation.py +0 -0
  402. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_help_tip.py +0 -0
  403. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_import_startup.py +0 -0
  404. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_in_place_codegen.py +0 -0
  405. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_index.py +0 -0
  406. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_index_sql.py +0 -0
  407. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_index_warm_no_downgrade.py +0 -0
  408. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_interface_order.py +0 -0
  409. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_issue_corpus.py +0 -0
  410. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_label_extraction.py +0 -0
  411. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_labview_queue.py +0 -0
  412. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_load_mode.py +0 -0
  413. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_load_upgrade.py +0 -0
  414. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_loop_codegen.py +0 -0
  415. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_lv_detect.py +0 -0
  416. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_lvpy.py +0 -0
  417. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_mcp_cache.py +0 -0
  418. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_mcp_evals.py +0 -0
  419. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_mcp_roots.py +0 -0
  420. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_naming.py +0 -0
  421. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_netlist.py +0 -0
  422. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_netlist_json.py +0 -0
  423. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_new_codegen.py +0 -0
  424. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_node_properties.py +0 -0
  425. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_output_cache.py +0 -0
  426. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_parallel_codegen.py +0 -0
  427. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_parallel_parse.py +0 -0
  428. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_parser.py +0 -0
  429. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_parser_regression.py +0 -0
  430. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_primitive_name_uniqueness.py +0 -0
  431. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_primitive_positional_order.py +0 -0
  432. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_primitive_resolutions.py +0 -0
  433. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_progressive_index.py +0 -0
  434. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_progressive_warm.py +0 -0
  435. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_project_store.py +0 -0
  436. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_queue_codegen.py +0 -0
  437. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_render.py +0 -0
  438. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_render_emission_order.py +0 -0
  439. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_render_viewer.py +0 -0
  440. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_sequence.py +0 -0
  441. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_soft_codegen.py +0 -0
  442. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_structure_lvproj.py +0 -0
  443. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_subvi_nav.py +0 -0
  444. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_text_encoding.py +0 -0
  445. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_type_driven_fixes.py +0 -0
  446. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_type_fields.py +0 -0
  447. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_type_loading.py +0 -0
  448. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_type_mapping.py +0 -0
  449. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_unknown_nodes.py +0 -0
  450. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_unresolved.py +0 -0
  451. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_vi_graph.py +0 -0
  452. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_vi_properties.py +0 -0
  453. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_viewer_properties.py +0 -0
  454. {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_vilib_docurls.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: lvkit
3
- Version: 0.7.0
3
+ Version: 0.7.2
4
4
  Summary: Understand and convert LabVIEW VIs to Python without a LabVIEW license
5
5
  Project-URL: Repository, https://github.com/pragmatest-dev/lvkit
6
6
  Project-URL: Issues, https://github.com/pragmatest-dev/lvkit/issues
@@ -35,6 +35,16 @@ Mode banner.
35
35
  | `lvkit.searchPaths` | `[]` | Extra dirs to search for SubVIs (repo root is auto-detected). |
36
36
  | `lvkit.diagramTheme` | `auto` | Diagram color theme (`auto`/`light`/`dark`); updated automatically when you cycle the in-viewer theme control. |
37
37
 
38
+ ## Recommending LVKit to your team
39
+
40
+ If your project has LabVIEW files, add LVKit to your workspace's recommended
41
+ extensions so teammates are prompted to install it when they open the folder:
42
+
43
+ ```json
44
+ // .vscode/extensions.json
45
+ { "recommendations": ["pragmatest.lvkit"] }
46
+ ```
47
+
38
48
  ## Trademarks
39
49
 
40
50
  LVKit is an independent, clean-room project, not affiliated with, authorized by,
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "lvkit"
7
- version = "0.7.0"
7
+ version = "0.7.2"
8
8
  description = "Understand and convert LabVIEW VIs to Python without a LabVIEW license"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -4,7 +4,7 @@ from __future__ import annotations
4
4
 
5
5
  from typing import TYPE_CHECKING
6
6
 
7
- __version__ = "0.7.0"
7
+ __version__ = "0.7.2"
8
8
 
9
9
  # The public API is exposed LAZILY (PEP 562 module ``__getattr__``): the graph /
10
10
  # parser / structure stacks (networkx, pydantic, pylabview, PIL — ~230 ms) load
@@ -4,6 +4,8 @@ from __future__ import annotations
4
4
 
5
5
  import argparse
6
6
  import json
7
+ import os
8
+ import subprocess
7
9
  import sys
8
10
  import traceback
9
11
  import webbrowser
@@ -362,16 +364,23 @@ def main() -> int:
362
364
  "-v",
363
365
  "--verbose",
364
366
  action="store_true",
365
- help="Include a full netlist section (see lvkit.graph.netlist)",
367
+ help=(
368
+ "Show full detail within each section (every VI Property, "
369
+ "Health, connector-pattern/pane-slot annotations, typed "
370
+ "terminals); with --format netlist, also emit a typed "
371
+ "## Components section before the netlist body."
372
+ ),
366
373
  )
367
374
  desc_parser.add_argument(
368
375
  "--format",
369
- choices=["text", "json"],
376
+ choices=["text", "netlist", "json"],
370
377
  default="text",
371
378
  help=(
372
- "'text' (default) prints the human-readable description; 'json' "
373
- "emits the canonical netlist IR — the same structured payload the "
374
- "MCP read_vi tool returns — for a program to parse."
379
+ "'text' (default) prints the human-readable description; "
380
+ "'netlist' prints the VI dataflow netlist body — the git-"
381
+ "textconv-friendly form (see `lvkit setup --git-textconv`); "
382
+ "'json' emits the canonical netlist IR — the same structured "
383
+ "payload the MCP read_vi tool returns — for a program to parse."
375
384
  ),
376
385
  )
377
386
  _add_project_root_arg(desc_parser)
@@ -627,6 +636,28 @@ def main() -> int:
627
636
  action="store_true",
628
637
  help="Overwrite existing skill files even if they have local edits",
629
638
  )
639
+ setup_parser.add_argument(
640
+ "--git-textconv",
641
+ action="store_true",
642
+ help=(
643
+ "Wire up `git diff`/`git show` on .vi files to render lvkit's "
644
+ "netlist text instead of the raw binary: appends `*.vi "
645
+ "diff=lvkit` to .gitattributes and sets the `diff.lvkit."
646
+ "textconv`/`diff.lvkit.cachetextconv` git config in the current "
647
+ "repo. Does ONLY this — skips the .lvkit/ store + skill install."
648
+ ),
649
+ )
650
+ setup_parser.add_argument(
651
+ "--textconv-format",
652
+ choices=["netlist", "text", "json"],
653
+ default="netlist",
654
+ help=(
655
+ "Which `describe` format `--git-textconv` renders in a `git diff`: "
656
+ "'netlist' (default, the dataflow netlist — most diff-friendly), "
657
+ "'text' (the human summary), or 'json' (the structured IR). The VS "
658
+ "Code extension sets this from the `lvkit.viTextFormat` setting."
659
+ ),
660
+ )
630
661
 
631
662
  # Unresolved command - batch-collect every resolution gap
632
663
  unresolved_parser = subparsers.add_parser(
@@ -1104,6 +1135,26 @@ def cmd_query(args: argparse.Namespace) -> int:
1104
1135
  return 0
1105
1136
 
1106
1137
 
1138
+ def _repo_relative_path(source: Path | None, base: Path) -> str | None:
1139
+ """Best-effort repo/project-relative display path for ``source`` against
1140
+ ``base`` -- for the ``-- <path>`` comment on each SubVI in a verbose
1141
+ ``describe --format netlist`` ``## Components`` line, so a VS Code terminal
1142
+ can click straight to the dependency instead of showing an absolute path.
1143
+
1144
+ Defensive by design: ``None`` when ``source`` is unresolvable (unknown/
1145
+ unloaded VI) or ``os.path.relpath`` itself fails (e.g. a cross-drive path
1146
+ on Windows, which raises ``ValueError``) -- a describe path annotation is
1147
+ decoration, never load-bearing, so it silently falls back rather than
1148
+ crashing the command.
1149
+ """
1150
+ if source is None:
1151
+ return None
1152
+ try:
1153
+ return os.path.relpath(source.resolve(), base.resolve())
1154
+ except (OSError, ValueError):
1155
+ return None
1156
+
1157
+
1107
1158
  def cmd_describe(args: argparse.Namespace) -> int:
1108
1159
  """Handle the describe command - human-readable VI description."""
1109
1160
  from .graph.describe import describe_vi
@@ -1148,7 +1199,8 @@ def cmd_describe(args: argparse.Namespace) -> int:
1148
1199
  # VI (and its SubVIs under MINIMAL), so warm all of them.
1149
1200
  warm_all_loaded(graph)
1150
1201
 
1151
- if getattr(args, "format", "text") == "json":
1202
+ fmt = getattr(args, "format", "text")
1203
+ if fmt == "json":
1152
1204
  # Same structured netlist IR the MCP read_vi tool returns — parity
1153
1205
  # so a non-MCP (CLI/CI/skill) consumer gets the structured read too.
1154
1206
  from .graph.netlist import build_netlist, netlist_to_dict
@@ -1158,6 +1210,48 @@ def cmd_describe(args: argparse.Namespace) -> int:
1158
1210
  netlist_to_dict(build_netlist(graph, vi_name)), indent=2
1159
1211
  )
1160
1212
  )
1213
+ elif fmt == "netlist":
1214
+ # The dataflow netlist body alone — the git-textconv-friendly
1215
+ # form (`lvkit setup --git-textconv`): a diff of two commits'
1216
+ # `.vi` blobs through this render is a meaningful, near-source-
1217
+ # stable text diff. The VI-line always uses the qualified display
1218
+ # name (never an abspath — that would make every clone's diff
1219
+ # differ), IDENTICAL in base and verbose. Verbose adds only a
1220
+ # `## Components` declaration table with each SubVI's repo-relative
1221
+ # path as a clickable `-- ` comment (paths never touch the semantic
1222
+ # lines, and don't resolve under textconv's isolated blob anyway).
1223
+ from .graph.netlist import build_netlist, component_line, render_netlist
1224
+
1225
+ module = build_netlist(graph, vi_name)
1226
+ # SubVI paths are resolved relative to — the first auto-detected
1227
+ # search path (explicit --search-path wins, else the input's own
1228
+ # enclosing .lvkit/ project root), falling back to the input's own
1229
+ # directory. So a VS Code terminal can click straight to the dep.
1230
+ rel_base = search_paths[0] if search_paths else input_path.parent
1231
+
1232
+ # The VI signature line always uses the QUALIFIED name — identical in
1233
+ # base and verbose, so the netlist body diffs the same either way.
1234
+ # Paths live only in verbose, and only as COMMENTS (never in the
1235
+ # semantic lines): each called SubVI's repo-relative path as a
1236
+ # trailing `-- ` comment on its ## Components declaration (clickable),
1237
+ # skipped for primitives / unresolved SubVIs.
1238
+ display_name = graph.vi_display_name(vi_name)
1239
+
1240
+ out_lines: list[str] = []
1241
+ if args.verbose and module.components:
1242
+ out_lines.append("## Components")
1243
+ for c in module.components:
1244
+ line = f" {component_line(c)}"
1245
+ comp_rel = _repo_relative_path(
1246
+ graph.get_vi_source_path(c.name), rel_base
1247
+ )
1248
+ if comp_rel is not None:
1249
+ line += f" -- {comp_rel}"
1250
+ out_lines.append(line)
1251
+ out_lines.append("")
1252
+
1253
+ out_lines.append(render_netlist(module, display_name=display_name))
1254
+ print("\n".join(out_lines))
1161
1255
  else:
1162
1256
  print(describe_vi(graph, vi_name, verbose=args.verbose))
1163
1257
 
@@ -1188,8 +1282,83 @@ def _detect_ai_editors(root: Path) -> list[str]:
1188
1282
  return editors
1189
1283
 
1190
1284
 
1285
+ def _setup_git_textconv(root: Path, fmt: str = "netlist") -> int:
1286
+ """Wire up ``git diff``/``git show`` on ``.vi`` files to render lvkit's
1287
+ ``describe`` text (``lvkit describe --format <fmt>``, default the dataflow
1288
+ ``netlist``) instead of the raw binary blob — the ``lvkit setup
1289
+ --git-textconv`` mode.
1290
+
1291
+ Appends ``*.vi diff=lvkit`` to the repo's ``.gitattributes`` (creating it
1292
+ if missing; a no-op if the line is already present) and sets the
1293
+ ``diff.lvkit.textconv``/``diff.lvkit.cachetextconv`` git config in the
1294
+ repo ``root`` belongs to. Requires ``root`` to be inside a git repo —
1295
+ reports a clear error and a non-zero exit otherwise (this is a git-only
1296
+ feature; there is nothing sensible to do without one).
1297
+ """
1298
+ repo_toplevel = subprocess.run(
1299
+ ["git", "rev-parse", "--show-toplevel"],
1300
+ cwd=root,
1301
+ capture_output=True,
1302
+ text=True,
1303
+ check=False,
1304
+ )
1305
+ if repo_toplevel.returncode != 0:
1306
+ print(
1307
+ f"Error: {root} is not inside a git repository — "
1308
+ "--git-textconv requires git (see `git init`).",
1309
+ file=sys.stderr,
1310
+ )
1311
+ return 1
1312
+ repo_root = Path(repo_toplevel.stdout.strip())
1313
+
1314
+ attrs_path = repo_root / ".gitattributes"
1315
+ attrs_line = "*.vi diff=lvkit"
1316
+ existing = attrs_path.read_text(encoding="utf-8") if attrs_path.is_file() else ""
1317
+ if attrs_line in existing.splitlines():
1318
+ print(f"{attrs_path}: already has `{attrs_line}`")
1319
+ else:
1320
+ if existing and not existing.endswith("\n"):
1321
+ existing += "\n"
1322
+ attrs_path.write_text(existing + attrs_line + "\n", encoding="utf-8")
1323
+ print(f"{attrs_path}: added `{attrs_line}`")
1324
+
1325
+ textconv_cmd = f"lvkit describe --format {fmt}"
1326
+ for key, value in (
1327
+ ("diff.lvkit.textconv", textconv_cmd),
1328
+ ("diff.lvkit.cachetextconv", "true"),
1329
+ ):
1330
+ result = subprocess.run(
1331
+ ["git", "config", key, value],
1332
+ cwd=repo_root,
1333
+ capture_output=True,
1334
+ text=True,
1335
+ check=False,
1336
+ )
1337
+ if result.returncode != 0:
1338
+ print(
1339
+ f"Error: `git config {key} {value!r}` failed: "
1340
+ f"{result.stderr.strip()}",
1341
+ file=sys.stderr,
1342
+ )
1343
+ return 1
1344
+ print(f"git config {key} {value!r}")
1345
+
1346
+ print(
1347
+ "\nGit textconv configured. `git diff`/`git show` on .vi files now "
1348
+ "render lvkit's netlist text."
1349
+ )
1350
+ return 0
1351
+
1352
+
1191
1353
  def cmd_setup(args: argparse.Namespace) -> int:
1192
1354
  """Handle the setup command — install AI skills and create .lvkit/ store."""
1355
+ if getattr(args, "git_textconv", False):
1356
+ root = Path(args.directory or ".").resolve()
1357
+ if not root.is_dir():
1358
+ print(f"Error: Not a directory: {root}", file=sys.stderr)
1359
+ return 1
1360
+ return _setup_git_textconv(root, getattr(args, "textconv_format", "netlist"))
1361
+
1193
1362
  # `directory` and `skills` are both optional positionals, so a lone
1194
1363
  # `lvkit setup copilot` binds "copilot" to `directory`. If the only
1195
1364
  # positional given is a skills choice, treat it as the skills target in
@@ -38,7 +38,6 @@ from .models import (
38
38
  WindowProps,
39
39
  bool_str,
40
40
  )
41
- from .netlist import build_netlist, component_line, render_netlist
42
41
  from .op_walk import (
43
42
  _const_value_str,
44
43
  _has_output_tunnel,
@@ -61,17 +60,18 @@ def describe_vi(
61
60
  """Describe a VI as a documentation page.
62
61
 
63
62
  Uses the graph's resolved types, names, constants, and dataflow to
64
- produce a complete reference for what this VI does. Default
65
- (non-verbose) output is unchanged: Inputs/Outputs/Class/Constants,
63
+ produce a complete reference for what this VI does. Output (verbose or
64
+ not) always has the same section shape: Inputs/Outputs/Class/Constants,
66
65
  then ``## Dependencies`` (subVI signatures) / ``## Control Flow`` /
67
66
  ``## Operations``.
68
67
 
69
- ``verbose`` replaces Dependencies + Control Flow + Operations with a
70
- declare-then-wire pair: ``## Components`` (every distinct subVI/primitive's
71
- typed interface, declared once -- see ``lvkit.graph.netlist``) followed by
72
- a final ``## Netlist`` (every node instantiated, node-first, with wiring
73
- -- its ``case (selector):`` scopes already cover control flow, so there is
74
- no separate ``## Control Flow`` section in verbose output).
68
+ ``verbose`` (``-v``) only adds DEPTH within those same sections -- every
69
+ VI Property (not just non-default ones), the ``## Health`` section even
70
+ when healthy, each pane terminal's connector-pattern slot index, and
71
+ typed terminal detail -- it never swaps in a different section shape.
72
+ The dataflow NETLIST (the declare-then-wire ``## Components`` +
73
+ node-first wiring body) is a SEPARATE output entirely -- see
74
+ ``lvkit.graph.netlist`` and the CLI's ``describe --format netlist``.
75
75
  """
76
76
  vi_name = graph.resolve_vi_name(vi_name)
77
77
  ctx = graph.get_vi_context(vi_name)
@@ -143,59 +143,41 @@ def describe_vi(
143
143
  lines.append(f" {_describe_label_line(lbl)}")
144
144
  lines.append("")
145
145
 
146
- # verbose: build the netlist IR once, shared by Components and Netlist.
147
- netlist_module = build_netlist(graph, vi_name) if verbose else None
146
+ # Dependencies: SubVI calls with their signatures and descriptions.
147
+ # Same shape verbose or not -- verbose only deepens Properties/Health/
148
+ # pane detail above; it never swaps this section out.
149
+ subvi_names = _collect_subvi_names(ctx.operations)
150
+ if subvi_names:
151
+ lines.append("## Dependencies")
152
+ for name in sorted(subvi_names):
153
+ desc = _get_subvi_description(graph, name)
154
+ ports = _subvi_ports(graph, name)
155
+ sig = _render_ports(*ports) if ports is not None else None
156
+ entry = f" {name}"
157
+ if sig:
158
+ entry += f": {sig}"
159
+ if desc:
160
+ entry += f" -- {desc}"
161
+ lines.append(entry)
162
+ lines.append("")
148
163
 
149
- if verbose:
150
- assert netlist_module is not None
151
- if netlist_module.components:
152
- lines.append("## Components")
153
- for c in netlist_module.components:
154
- lines.append(f" {component_line(c)}")
155
- lines.append("")
156
- else:
157
- # Dependencies: SubVI calls with their signatures and descriptions
158
- subvi_names = _collect_subvi_names(ctx.operations)
159
- if subvi_names:
160
- lines.append("## Dependencies")
161
- for name in sorted(subvi_names):
162
- desc = _get_subvi_description(graph, name)
163
- ports = _subvi_ports(graph, name)
164
- sig = _render_ports(*ports) if ports is not None else None
165
- entry = f" {name}"
166
- if sig:
167
- entry += f": {sig}"
168
- if desc:
169
- entry += f" -- {desc}"
170
- lines.append(entry)
171
- lines.append("")
172
-
173
- # Control flow: non-verbose only. Verbose's ``## Netlist`` below already
174
- # covers control flow in full (its ``case (selector):`` scopes, with
175
- # correctly tunnel-resolved selectors) -- this shallower summary would
176
- # be both redundant and stale there (its selector naming doesn't hop
177
- # through tunnels the way ``build_netlist`` does).
178
- if not verbose:
179
- structures = _collect_structures(
180
- graph,
181
- ctx,
182
- ctx.operations,
183
- index_terminal_owners(ctx.operations),
184
- )
185
- if structures:
186
- lines.append("## Control Flow")
187
- for s in structures:
188
- lines.append(f" {s}")
189
- lines.append("")
190
-
191
- if verbose:
192
- assert netlist_module is not None
193
- lines.append("## Netlist")
194
- lines.append(render_netlist(netlist_module))
195
- else:
196
- # Operations
197
- lines.append("## Operations")
198
- _describe_op_list(ctx.operations, ctx.constants, lines, indent=0)
164
+ # Control flow: structure summary (case/loop/sequence/... with their
165
+ # gating selectors traced one hop back to the source).
166
+ structures = _collect_structures(
167
+ graph,
168
+ ctx,
169
+ ctx.operations,
170
+ index_terminal_owners(ctx.operations),
171
+ )
172
+ if structures:
173
+ lines.append("## Control Flow")
174
+ for s in structures:
175
+ lines.append(f" {s}")
176
+ lines.append("")
177
+
178
+ # Operations
179
+ lines.append("## Operations")
180
+ _describe_op_list(ctx.operations, ctx.constants, lines, indent=0)
199
181
 
200
182
  return "\n".join(lines)
201
183
 
@@ -2496,10 +2496,17 @@ def netlist_to_dict(module: NetlistModule) -> dict[str, Any]:
2496
2496
  }
2497
2497
 
2498
2498
 
2499
- def render_netlist(module: NetlistModule) -> str:
2499
+ def render_netlist(module: NetlistModule, *, display_name: str | None = None) -> str:
2500
2500
  """Render a ``NetlistModule`` to the locked netlist text syntax.
2501
2501
 
2502
2502
  See ``.tmp/netlist-spec.md`` -- syntax is LOCKED, ASCII only.
2503
+
2504
+ ``display_name`` overrides the header line's VI label (``module.vi_name``
2505
+ is the resolved ``vi_key`` -- a source-path identity, not fit for
2506
+ display -- see ``describe.py``'s ``--format netlist`` naming rules,
2507
+ which pass the qualified display name or a repo-relative path here).
2508
+ Defaults to ``module.vi_name`` for every existing caller (JSON/diff/the
2509
+ embedded viewer never pass this).
2503
2510
  """
2504
2511
  lines: list[str] = []
2505
2512
  in_names = ", ".join(name for name, _ in module.inputs)
@@ -2512,7 +2519,8 @@ def render_netlist(module: NetlistModule) -> str:
2512
2519
  else o.name
2513
2520
  for o in module.outputs
2514
2521
  )
2515
- lines.append(f"{module.vi_name} ({in_names}) -> ({out_names})")
2522
+ header_name = display_name if display_name is not None else module.vi_name
2523
+ lines.append(f"{header_name} ({in_names}) -> ({out_names})")
2516
2524
 
2517
2525
  _render_items(module.body, 0, lines, ambiguous)
2518
2526
 
@@ -2,10 +2,10 @@
2
2
  ``netlist``.
3
3
 
4
4
  Split out to avoid a circular import: ``netlist.py`` needs these to trace
5
- wires back to their producing operation, and ``describe.py`` needs
6
- ``build_netlist``/``render_netlist`` for its ``## Netlist`` section. Neither
7
- module may import the other at module level, so the shared walk helpers
8
- live here instead.
5
+ wires back to their producing operation, and ``describe.py`` walks the same
6
+ operation tree for its own ``## Dependencies``/``## Control Flow``/
7
+ ``## Operations`` sections. Neither module may import the other at module
8
+ level, so the shared walk helpers live here instead.
9
9
  """
10
10
 
11
11
  from __future__ import annotations
@@ -56,8 +56,9 @@ wiring is expressed as `port -> source.net` bindings, not source order.
56
56
  `components` lists each distinct subVI/primitive's typed port interface
57
57
  once. This one call gives you everything — operations, wiring, structures,
58
58
  and constants — in one structured tree instead of five separate reads.
59
- `lvkit describe <vi-path> --search-path <library-path> -v` (no `--format`)
60
- prints the same facts as prose for a human instead of JSON for a program.
59
+ `lvkit describe <vi-path> --search-path <library-path> --format netlist -v`
60
+ prints the same facts as prose for a human instead of JSON for a program (`-v`
61
+ adds the typed `## Components` declarations ahead of the netlist body).
61
62
 
62
63
  **A structure's output is a named MERGE net, not a plain wire.** A value
63
64
  leaving a case/loop/feedback node is selector- or iteration-dependent, so the
@@ -23,9 +23,11 @@ together, not five separate reads.
23
23
 
24
24
  No MCP server connected? The CLI `lvkit describe` above is the twin of both:
25
25
  plain (no `--format`) prints the same prose as MCP `describe`; `-v/--verbose`
26
- adds the full netlist section inline; `--format json` emits the identical
27
- structured payload MCP `read_vi` returns, for a program instead of a person
28
- to parse.
26
+ shows full detail within each section (every VI Property, Health, typed
27
+ terminals) without changing its shape; `--format netlist` prints the VI
28
+ dataflow netlist body on its own (add `-v` for a typed `## Components`
29
+ section first); `--format json` emits the identical structured payload MCP
30
+ `read_vi` returns, for a program instead of a person to parse.
29
31
 
30
32
  To see the VI's faithful block diagram, render it to SVG (CLI-only, no MCP
31
33
  twin):
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes