lvkit 0.2.0__tar.gz → 0.2.1__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 (168) hide show
  1. {lvkit-0.2.0 → lvkit-0.2.1}/PKG-INFO +1 -1
  2. {lvkit-0.2.0 → lvkit-0.2.1}/pyproject.toml +1 -1
  3. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/cli.py +3 -2
  4. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/skill_templates/lvkit-convert/SKILL.md +5 -5
  5. lvkit-0.2.1/src/lvkit/skill_templates/lvkit-describe/SKILL.md +66 -0
  6. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/skill_templates/lvkit-idiomatic/SKILL.md +0 -19
  7. lvkit-0.2.0/src/lvkit/skill_templates/lvkit-describe/SKILL.md +0 -108
  8. {lvkit-0.2.0 → lvkit-0.2.1}/.gitignore +0 -0
  9. {lvkit-0.2.0 → lvkit-0.2.1}/.pre-commit-config.yaml +0 -0
  10. {lvkit-0.2.0 → lvkit-0.2.1}/LICENSE +0 -0
  11. {lvkit-0.2.0 → lvkit-0.2.1}/README.md +0 -0
  12. {lvkit-0.2.0 → lvkit-0.2.1}/scripts/analyze_vi.py +0 -0
  13. {lvkit-0.2.0 → lvkit-0.2.1}/scripts/generate_docs.py +0 -0
  14. {lvkit-0.2.0 → lvkit-0.2.1}/scripts/generate_driver_data.py +0 -0
  15. {lvkit-0.2.0 → lvkit-0.2.1}/scripts/generate_python.py +0 -0
  16. {lvkit-0.2.0 → lvkit-0.2.1}/scripts/populate_vilib.py +0 -0
  17. {lvkit-0.2.0 → lvkit-0.2.1}/scripts/sync_skills.sh +0 -0
  18. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/__init__.py +0 -0
  19. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/_data.py +0 -0
  20. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/README.md +0 -0
  21. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/__init__.py +0 -0
  22. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/ast_optimizer.py +0 -0
  23. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/ast_utils.py +0 -0
  24. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/builder.py +0 -0
  25. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/class_builder.py +0 -0
  26. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/condition_builder.py +0 -0
  27. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/context.py +0 -0
  28. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/dataflow.py +0 -0
  29. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/error_handler.py +0 -0
  30. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/expressions.py +0 -0
  31. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/fragment.py +0 -0
  32. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/function.py +0 -0
  33. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/imports.py +0 -0
  34. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/nodes/__init__.py +0 -0
  35. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/nodes/base.py +0 -0
  36. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/nodes/case.py +0 -0
  37. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/nodes/compound.py +0 -0
  38. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/nodes/constant.py +0 -0
  39. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/nodes/invoke_node.py +0 -0
  40. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/nodes/loop.py +0 -0
  41. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/nodes/nmux.py +0 -0
  42. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/nodes/primitive.py +0 -0
  43. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/nodes/printf.py +0 -0
  44. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/nodes/property_node.py +0 -0
  45. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/nodes/sequence.py +0 -0
  46. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/nodes/subvi.py +0 -0
  47. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/stubs.py +0 -0
  48. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/unresolved.py +0 -0
  49. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/drivers/_index.json +0 -0
  50. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/drivers/daqmx.json +0 -0
  51. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/drivers/nidcpower.json +0 -0
  52. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/drivers/nidigital.json +0 -0
  53. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/drivers/nidmm.json +0 -0
  54. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/drivers/nifgen.json +0 -0
  55. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/drivers/niscope.json +0 -0
  56. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/drivers/niswitch.json +0 -0
  57. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/drivers/serial.json +0 -0
  58. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/drivers/visa.json +0 -0
  59. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/labview_error_codes.json +0 -0
  60. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/openg/_index.json +0 -0
  61. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/openg/array.json +0 -0
  62. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/openg/file.json +0 -0
  63. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/openg/string.json +0 -0
  64. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/openg/time.json +0 -0
  65. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/openg/variant.json +0 -0
  66. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/primitives-from-pdf.json +0 -0
  67. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/primitives.json +0 -0
  68. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/vilib/_index.json +0 -0
  69. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/vilib/_pending_terminals.json +0 -0
  70. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/vilib/_types.json +0 -0
  71. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/vilib/application-control.json +0 -0
  72. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/vilib/array.json +0 -0
  73. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/vilib/boolean.json +0 -0
  74. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/vilib/cluster.json +0 -0
  75. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/vilib/comparison.json +0 -0
  76. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/vilib/error-handling.json +0 -0
  77. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/vilib/file-io.json +0 -0
  78. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/vilib/numeric.json +0 -0
  79. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/vilib/other.json +0 -0
  80. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/vilib/string.json +0 -0
  81. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/vilib/structures.json +0 -0
  82. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/vilib/variant.json +0 -0
  83. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/docs/__init__.py +0 -0
  84. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/docs/generate.py +0 -0
  85. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/docs/html_generator.py +0 -0
  86. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/docs/template.css +0 -0
  87. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/docs/utils.py +0 -0
  88. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/extractor.py +0 -0
  89. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/graph/__init__.py +0 -0
  90. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/graph/analysis.py +0 -0
  91. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/graph/construction.py +0 -0
  92. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/graph/core.py +0 -0
  93. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/graph/describe.py +0 -0
  94. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/graph/diff.py +0 -0
  95. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/graph/flowchart.py +0 -0
  96. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/graph/loading.py +0 -0
  97. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/graph/models.py +0 -0
  98. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/graph/operations.py +0 -0
  99. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/graph/queries.py +0 -0
  100. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/labview_error.py +0 -0
  101. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/labview_error_codes.py +0 -0
  102. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/mcp/__init__.py +0 -0
  103. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/mcp/schemas.py +0 -0
  104. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/mcp/server.py +0 -0
  105. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/mcp/tools.py +0 -0
  106. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/models.py +0 -0
  107. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/__init__.py +0 -0
  108. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/constants.py +0 -0
  109. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/defaults.py +0 -0
  110. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/flags.py +0 -0
  111. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/front_panel.py +0 -0
  112. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/metadata.py +0 -0
  113. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/models.py +0 -0
  114. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/naming.py +0 -0
  115. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/node_types.py +0 -0
  116. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/nodes/__init__.py +0 -0
  117. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/nodes/base.py +0 -0
  118. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/nodes/case.py +0 -0
  119. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/nodes/constant.py +0 -0
  120. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/nodes/loop.py +0 -0
  121. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/nodes/sequence.py +0 -0
  122. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/type_mapping.py +0 -0
  123. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/type_resolution.py +0 -0
  124. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/utils.py +0 -0
  125. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/vi.py +0 -0
  126. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/pipeline.py +0 -0
  127. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/primitive_resolver.py +0 -0
  128. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/project_store.py +0 -0
  129. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/py.typed +0 -0
  130. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/skill_templates/__init__.py +0 -0
  131. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/skill_templates/lvkit-resolve-primitive/SKILL.md +0 -0
  132. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/skill_templates/lvkit-resolve-vilib/SKILL.md +0 -0
  133. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/structure.py +0 -0
  134. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/terminal_collector.py +0 -0
  135. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/type_defaults.py +0 -0
  136. {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/vilib_resolver.py +0 -0
  137. {lvkit-0.2.0 → lvkit-0.2.1}/tests/__init__.py +0 -0
  138. {lvkit-0.2.0 → lvkit-0.2.1}/tests/conftest.py +0 -0
  139. {lvkit-0.2.0 → lvkit-0.2.1}/tests/helpers.py +0 -0
  140. {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_ast_builder.py +0 -0
  141. {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_ast_optimizer.py +0 -0
  142. {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_case_parser.py +0 -0
  143. {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_codegen_context.py +0 -0
  144. {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_compound_codegen.py +0 -0
  145. {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_condition_builder.py +0 -0
  146. {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_constant_decoding.py +0 -0
  147. {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_diff.py +0 -0
  148. {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_driver_codegen.py +0 -0
  149. {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_dynamic_dispatch.py +0 -0
  150. {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_e2e_codegen.py +0 -0
  151. {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_error_codegen.py +0 -0
  152. {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_error_handling.py +0 -0
  153. {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_graceful_degradation.py +0 -0
  154. {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_loop_codegen.py +0 -0
  155. {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_lvpy.py +0 -0
  156. {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_naming.py +0 -0
  157. {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_new_codegen.py +0 -0
  158. {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_parallel_codegen.py +0 -0
  159. {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_parser.py +0 -0
  160. {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_parser_regression.py +0 -0
  161. {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_project_store.py +0 -0
  162. {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_sequence.py +0 -0
  163. {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_soft_codegen.py +0 -0
  164. {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_type_driven_fixes.py +0 -0
  165. {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_type_fields.py +0 -0
  166. {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_type_loading.py +0 -0
  167. {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_type_mapping.py +0 -0
  168. {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_vi_graph.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lvkit
3
- Version: 0.2.0
3
+ Version: 0.2.1
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
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "lvkit"
7
- version = "0.2.0"
7
+ version = "0.2.1"
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"
@@ -496,8 +496,9 @@ def cmd_setup(args: argparse.Namespace) -> int:
496
496
  editors = _detect_ai_editors(root)
497
497
  if not editors:
498
498
  print(
499
- "No AI agent detected. Run with --skills claude or --skills copilot "
500
- "to install skills explicitly."
499
+ "No AI agent detected. If you add one later, run `lvkit setup` again. "
500
+ "If you have one that wasn't detected, run `lvkit setup claude` or "
501
+ "`lvkit setup copilot` to install skills explicitly."
501
502
  )
502
503
  return 0
503
504
 
@@ -107,11 +107,11 @@ lvkit mcp # Start MCP server for IDE integration
107
107
  The MCP server (`lvkit mcp`) provides tools for interactive exploration:
108
108
 
109
109
  **Session:**
110
- - `load_vi` — Load VI into persistent graph
111
- - `list_loaded_vis` — List loaded VIs
110
+ - `load` — Load VI into persistent graph
111
+ - `list_loaded` — List loaded VIs
112
112
 
113
113
  **Exploration:**
114
- - `describe_vi` — Human-readable VI overview (signature, SubVIs, control flow)
114
+ - `describe` — Human-readable VI overview (signature, SubVIs, control flow)
115
115
  - `get_operations` — Execution order with nested structures
116
116
  - `get_dataflow` — Wire connections, optionally filtered by operation
117
117
  - `get_structure` — Case/loop/sequence details
@@ -120,11 +120,11 @@ The MCP server (`lvkit mcp`) provides tools for interactive exploration:
120
120
  **Generation:**
121
121
  - `generate_ast_code` — Deterministic Python from loaded VI
122
122
  - `generate_python` — Full pipeline: load + generate + write files
123
- - `get_vi_context` — Raw VI context as JSON
123
+ - `get_context` — Raw VI context as JSON
124
124
 
125
125
  **Documentation:**
126
126
  - `generate_documents` — Create HTML documentation
127
- - `analyze_vi` — Parse and return VI structure
127
+ - `analyze` — Parse and return VI structure
128
128
 
129
129
  ## Related Skills
130
130
 
@@ -0,0 +1,66 @@
1
+ ---
2
+ name: lvkit-describe
3
+ description: Describe what a LabVIEW VI does — signature, operations, dataflow, structures, constants. Works via CLI or MCP.
4
+ allowed-tools: Bash, Read, Grep
5
+ ---
6
+
7
+ # Describe VI
8
+
9
+ Run `lvkit describe` on the VI:
10
+
11
+ ```bash
12
+ lvkit describe "<vi-path>" --search-path "<library-path>"
13
+ ```
14
+
15
+ Add `--chart` to also print a Mermaid flowchart:
16
+
17
+ ```bash
18
+ lvkit describe "<vi-path>" --search-path "<library-path>" --chart
19
+ ```
20
+
21
+ **Report to the user using this format:**
22
+
23
+ ```
24
+ # <VI name>
25
+
26
+ **What it does:** <1-2 sentence interpretation — purpose, key behavior, notable observations>
27
+
28
+ **Signature:** `<function signature>`
29
+
30
+ | Input | Type | Default |
31
+ |---|---|---|
32
+ | <name> | <type> | <default or —> |
33
+
34
+ | Output | Type |
35
+ |---|---|
36
+ | <name> | <type> |
37
+
38
+ **Control flow:** <brief description — frames, loops, cases>
39
+ <bulleted breakdown if the structure has meaningful steps>
40
+
41
+ | Constant | Type | Value |
42
+ |---|---|---|
43
+ | <inferred name or purpose> | <type> | <value> |
44
+
45
+ | Dependency | Description |
46
+ |---|---|
47
+ | <VI name> | <what it does> |
48
+
49
+ **Notable:** <surprising things, naming quirks, caveats — omit section if nothing to say>
50
+ ```
51
+
52
+ Rules:
53
+ - Omit any table that has no rows (e.g. no inputs → no inputs table)
54
+ - Collapse repeated dependencies: `DAQmx Write.vi ×3`
55
+ - Use judgment on Constants — infer purpose from context, omit trivial ones
56
+ - Interpretation leads; raw data follows
57
+
58
+ ## MCP alternative
59
+
60
+ If MCP tools are available, use them directly:
61
+
62
+ - `load` → `describe` → `get_operations` → `get_dataflow` → `get_structure` → `get_constants`
63
+
64
+ ## Note
65
+
66
+ `lvkit describe` never requires resolution to succeed. Unknown primitives and vi.lib VIs render as `[prim N]` / their bare name.
@@ -18,29 +18,10 @@ The user provides either:
18
18
 
19
19
  Substitute `<vi-path>` and `<library-path>` with the user's actual paths.
20
20
 
21
- The simplest path is the CLI:
22
-
23
21
  ```bash
24
22
  lvkit describe "<vi-path>" --search-path "<library-path>"
25
23
  ```
26
24
 
27
- Or programmatically if you need the operations list separately:
28
-
29
- ```bash
30
- python3 -c "
31
- from pathlib import Path
32
- from lvkit.graph.core import InMemoryVIGraph
33
- from lvkit.graph.describe import describe_vi, describe_operations
34
-
35
- g = InMemoryVIGraph()
36
- g.load_vi('<vi-path>', search_paths=[Path('<library-path>')])
37
- vi_name = list(g.list_vis())[0]
38
- print(describe_vi(g, vi_name))
39
- print()
40
- print(describe_operations(g, vi_name))
41
- "
42
- ```
43
-
44
25
  ## Step 2: Read the generated code
45
26
 
46
27
  Read the AST-generated Python file. This is the **correct reference** — same behavior required.
@@ -1,108 +0,0 @@
1
- ---
2
- name: lvkit-describe
3
- description: Describe what a LabVIEW VI does — signature, operations, dataflow, structures, constants. Works via CLI or MCP.
4
- allowed-tools: Bash, Read, Grep
5
- ---
6
-
7
- # Describe VI
8
-
9
- Understand what a LabVIEW VI does without converting it.
10
-
11
- Substitute the placeholders below with the user's actual paths:
12
-
13
- - `<vi-path>` — the .vi file you want to describe
14
- - `<library-path>` — additional search path for SubVI resolution (repeat for multiple)
15
- - `<vi-name>` — the canonical VI name as it appears in the loaded graph (e.g. `MyLib.lvlib:Foo.vi`)
16
- - `<operation-id>` — the ID of a specific operation node from the describe output
17
-
18
- ## Quick path: CLI
19
-
20
- The `lvkit describe` CLI is the simplest entry point.
21
-
22
- ```bash
23
- lvkit describe "<vi-path>" --search-path "<library-path>"
24
- ```
25
-
26
- Add `--chart` to also print a Mermaid flowchart of the dataflow:
27
-
28
- ```bash
29
- lvkit describe "<vi-path>" --search-path "<library-path>" --chart
30
- ```
31
-
32
- ## Programmatic path: Python
33
-
34
- For deeper exploration (drilling into a specific operation, listing class methods, etc.) use the graph API directly.
35
-
36
- ### Overview
37
-
38
- ```bash
39
- python3 -c "
40
- from pathlib import Path
41
- from lvkit.graph.core import InMemoryVIGraph
42
- from lvkit.graph.describe import describe_vi, describe_operations, describe_constants
43
-
44
- g = InMemoryVIGraph()
45
- g.load_vi('<vi-path>', search_paths=[Path('<library-path>')])
46
- vi = list(g.list_vis())[0]
47
- print(describe_vi(g, vi))
48
- print()
49
- print(describe_operations(g, vi))
50
- print()
51
- print(describe_constants(g, vi))
52
- "
53
- ```
54
-
55
- ### Dataflow for a specific operation
56
-
57
- ```bash
58
- python3 -c "
59
- from pathlib import Path
60
- from lvkit.graph.core import InMemoryVIGraph
61
- from lvkit.graph.describe import describe_dataflow
62
-
63
- g = InMemoryVIGraph()
64
- g.load_vi('<vi-path>', search_paths=[Path('<library-path>')])
65
- print(describe_dataflow(g, '<vi-name>', '<operation-id>'))
66
- "
67
- ```
68
-
69
- ### Structure details (case/loop/sequence)
70
-
71
- ```bash
72
- python3 -c "
73
- from pathlib import Path
74
- from lvkit.graph.core import InMemoryVIGraph
75
- from lvkit.graph.describe import describe_structure
76
-
77
- g = InMemoryVIGraph()
78
- g.load_vi('<vi-path>', search_paths=[Path('<library-path>')])
79
- print(describe_structure(g, '<vi-name>', '<operation-id>'))
80
- "
81
- ```
82
-
83
- ### Classes — list all methods
84
-
85
- ```bash
86
- python3 -c "
87
- from pathlib import Path
88
- from lvkit.graph.core import InMemoryVIGraph
89
- from lvkit.graph.describe import describe_vi
90
-
91
- g = InMemoryVIGraph()
92
- g.load_lvclass('<lvclass-path>', search_paths=[Path('<library-path>')])
93
- for vi in sorted(g.list_vis()):
94
- if '.lvclass:' in vi:
95
- print(describe_vi(g, vi))
96
- print()
97
- "
98
- ```
99
-
100
- ## MCP alternative
101
-
102
- If MCP tools are available, use them directly instead of the CLI/Python paths:
103
-
104
- - `load_vi` → `describe_vi` → `get_operations` → `get_dataflow` → `get_structure` → `get_constants`
105
-
106
- ## Note
107
-
108
- `lvkit describe` and the underlying graph functions never require resolution to succeed. Unknown primitives and vi.lib VIs render as `[prim N]` / their bare name — you can describe a VI even if lvkit has no mapping for some of its operations.
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
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
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
File without changes