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.
- {lvkit-0.2.0 → lvkit-0.2.1}/PKG-INFO +1 -1
- {lvkit-0.2.0 → lvkit-0.2.1}/pyproject.toml +1 -1
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/cli.py +3 -2
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/skill_templates/lvkit-convert/SKILL.md +5 -5
- lvkit-0.2.1/src/lvkit/skill_templates/lvkit-describe/SKILL.md +66 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/skill_templates/lvkit-idiomatic/SKILL.md +0 -19
- lvkit-0.2.0/src/lvkit/skill_templates/lvkit-describe/SKILL.md +0 -108
- {lvkit-0.2.0 → lvkit-0.2.1}/.gitignore +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/.pre-commit-config.yaml +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/LICENSE +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/README.md +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/scripts/analyze_vi.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/scripts/generate_docs.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/scripts/generate_driver_data.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/scripts/generate_python.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/scripts/populate_vilib.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/scripts/sync_skills.sh +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/__init__.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/_data.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/README.md +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/__init__.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/ast_optimizer.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/ast_utils.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/builder.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/class_builder.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/condition_builder.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/context.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/dataflow.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/error_handler.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/expressions.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/fragment.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/function.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/imports.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/nodes/__init__.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/nodes/base.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/nodes/case.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/nodes/compound.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/nodes/constant.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/nodes/invoke_node.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/nodes/loop.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/nodes/nmux.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/nodes/primitive.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/nodes/printf.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/nodes/property_node.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/nodes/sequence.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/nodes/subvi.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/stubs.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/codegen/unresolved.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/drivers/_index.json +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/drivers/daqmx.json +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/drivers/nidcpower.json +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/drivers/nidigital.json +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/drivers/nidmm.json +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/drivers/nifgen.json +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/drivers/niscope.json +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/drivers/niswitch.json +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/drivers/serial.json +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/drivers/visa.json +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/labview_error_codes.json +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/openg/_index.json +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/openg/array.json +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/openg/file.json +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/openg/string.json +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/openg/time.json +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/openg/variant.json +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/primitives-from-pdf.json +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/primitives.json +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/vilib/_index.json +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/vilib/_pending_terminals.json +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/vilib/_types.json +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/vilib/application-control.json +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/vilib/array.json +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/vilib/boolean.json +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/vilib/cluster.json +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/vilib/comparison.json +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/vilib/error-handling.json +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/vilib/file-io.json +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/vilib/numeric.json +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/vilib/other.json +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/vilib/string.json +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/vilib/structures.json +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/data/vilib/variant.json +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/docs/__init__.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/docs/generate.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/docs/html_generator.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/docs/template.css +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/docs/utils.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/extractor.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/graph/__init__.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/graph/analysis.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/graph/construction.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/graph/core.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/graph/describe.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/graph/diff.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/graph/flowchart.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/graph/loading.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/graph/models.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/graph/operations.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/graph/queries.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/labview_error.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/labview_error_codes.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/mcp/__init__.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/mcp/schemas.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/mcp/server.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/mcp/tools.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/models.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/__init__.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/constants.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/defaults.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/flags.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/front_panel.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/metadata.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/models.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/naming.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/node_types.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/nodes/__init__.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/nodes/base.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/nodes/case.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/nodes/constant.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/nodes/loop.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/nodes/sequence.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/type_mapping.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/type_resolution.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/utils.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/parser/vi.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/pipeline.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/primitive_resolver.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/project_store.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/py.typed +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/skill_templates/__init__.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/skill_templates/lvkit-resolve-primitive/SKILL.md +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/skill_templates/lvkit-resolve-vilib/SKILL.md +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/structure.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/terminal_collector.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/type_defaults.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/src/lvkit/vilib_resolver.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/tests/__init__.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/tests/conftest.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/tests/helpers.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_ast_builder.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_ast_optimizer.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_case_parser.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_codegen_context.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_compound_codegen.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_condition_builder.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_constant_decoding.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_diff.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_driver_codegen.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_dynamic_dispatch.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_e2e_codegen.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_error_codegen.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_error_handling.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_graceful_degradation.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_loop_codegen.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_lvpy.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_naming.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_new_codegen.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_parallel_codegen.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_parser.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_parser_regression.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_project_store.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_sequence.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_soft_codegen.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_type_driven_fixes.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_type_fields.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_type_loading.py +0 -0
- {lvkit-0.2.0 → lvkit-0.2.1}/tests/test_type_mapping.py +0 -0
- {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.
|
|
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
|
|
@@ -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.
|
|
500
|
-
"
|
|
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
|
-
- `
|
|
111
|
-
- `
|
|
110
|
+
- `load` — Load VI into persistent graph
|
|
111
|
+
- `list_loaded` — List loaded VIs
|
|
112
112
|
|
|
113
113
|
**Exploration:**
|
|
114
|
-
- `
|
|
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
|
-
- `
|
|
123
|
+
- `get_context` — Raw VI context as JSON
|
|
124
124
|
|
|
125
125
|
**Documentation:**
|
|
126
126
|
- `generate_documents` — Create HTML documentation
|
|
127
|
-
- `
|
|
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
|
|
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
|
|
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
|