systemlink-cli 1.3.1__py3-none-any.whl

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 (74) hide show
  1. slcli/__init__.py +1 -0
  2. slcli/__main__.py +23 -0
  3. slcli/_version.py +4 -0
  4. slcli/asset_click.py +1289 -0
  5. slcli/cli_formatters.py +218 -0
  6. slcli/cli_utils.py +504 -0
  7. slcli/comment_click.py +602 -0
  8. slcli/completion_click.py +418 -0
  9. slcli/config.py +81 -0
  10. slcli/config_click.py +498 -0
  11. slcli/dff_click.py +979 -0
  12. slcli/dff_decorators.py +24 -0
  13. slcli/example_click.py +404 -0
  14. slcli/example_loader.py +274 -0
  15. slcli/example_provisioner.py +2777 -0
  16. slcli/examples/README.md +134 -0
  17. slcli/examples/_schema/schema-v1.0.json +169 -0
  18. slcli/examples/demo-complete-workflow/README.md +323 -0
  19. slcli/examples/demo-complete-workflow/config.yaml +638 -0
  20. slcli/examples/demo-test-plans/README.md +132 -0
  21. slcli/examples/demo-test-plans/config.yaml +154 -0
  22. slcli/examples/exercise-5-1-parametric-insights/README.md +101 -0
  23. slcli/examples/exercise-5-1-parametric-insights/config.yaml +1589 -0
  24. slcli/examples/exercise-7-1-test-plans/README.md +93 -0
  25. slcli/examples/exercise-7-1-test-plans/config.yaml +323 -0
  26. slcli/examples/spec-compliance-notebooks/README.md +140 -0
  27. slcli/examples/spec-compliance-notebooks/config.yaml +112 -0
  28. slcli/examples/spec-compliance-notebooks/notebooks/SpecAnalysis_ComplianceCalculation.ipynb +1553 -0
  29. slcli/examples/spec-compliance-notebooks/notebooks/SpecComplianceCalculation.ipynb +1577 -0
  30. slcli/examples/spec-compliance-notebooks/notebooks/SpecfileExtractionAndIngestion.ipynb +912 -0
  31. slcli/examples/spec-compliance-notebooks/spec_template.xlsx +0 -0
  32. slcli/feed_click.py +892 -0
  33. slcli/file_click.py +932 -0
  34. slcli/function_click.py +1400 -0
  35. slcli/function_templates.py +85 -0
  36. slcli/main.py +406 -0
  37. slcli/mcp_click.py +269 -0
  38. slcli/mcp_server.py +748 -0
  39. slcli/notebook_click.py +1770 -0
  40. slcli/platform.py +345 -0
  41. slcli/policy_click.py +679 -0
  42. slcli/policy_utils.py +411 -0
  43. slcli/profiles.py +411 -0
  44. slcli/response_handlers.py +359 -0
  45. slcli/routine_click.py +763 -0
  46. slcli/skill_click.py +253 -0
  47. slcli/skills/slcli/SKILL.md +713 -0
  48. slcli/skills/slcli/references/analysis-recipes.md +474 -0
  49. slcli/skills/slcli/references/filtering.md +236 -0
  50. slcli/skills/systemlink-webapp/SKILL.md +744 -0
  51. slcli/skills/systemlink-webapp/references/deployment.md +123 -0
  52. slcli/skills/systemlink-webapp/references/nimble-angular.md +380 -0
  53. slcli/skills/systemlink-webapp/references/systemlink-services.md +192 -0
  54. slcli/ssl_trust.py +93 -0
  55. slcli/system_click.py +2216 -0
  56. slcli/table_utils.py +124 -0
  57. slcli/tag_click.py +794 -0
  58. slcli/templates_click.py +599 -0
  59. slcli/testmonitor_click.py +1667 -0
  60. slcli/universal_handlers.py +305 -0
  61. slcli/user_click.py +1218 -0
  62. slcli/utils.py +832 -0
  63. slcli/web_editor.py +295 -0
  64. slcli/webapp_click.py +981 -0
  65. slcli/workflow_preview.py +287 -0
  66. slcli/workflows_click.py +988 -0
  67. slcli/workitem_click.py +2258 -0
  68. slcli/workspace_click.py +576 -0
  69. slcli/workspace_utils.py +206 -0
  70. systemlink_cli-1.3.1.dist-info/METADATA +20 -0
  71. systemlink_cli-1.3.1.dist-info/RECORD +74 -0
  72. systemlink_cli-1.3.1.dist-info/WHEEL +4 -0
  73. systemlink_cli-1.3.1.dist-info/entry_points.txt +7 -0
  74. systemlink_cli-1.3.1.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,206 @@
1
+ """Workspace utilities for CLI commands."""
2
+
3
+ from typing import Dict, List, Any, Optional, Callable
4
+
5
+ from .profiles import get_default_workspace
6
+ from .utils import get_workspace_map
7
+
8
+ # Sentinel value: pass --workspace all to bypass the profile default and show
9
+ # resources from every workspace.
10
+ WORKSPACE_ALL = "all"
11
+
12
+
13
+ def get_effective_workspace(workspace: Optional[str]) -> Optional[str]:
14
+ """Return the effective workspace: explicit value or profile default.
15
+
16
+ Use this before any workspace guard to ensure the profile's default
17
+ workspace is applied when the user omits ``--workspace``.
18
+
19
+ Passing ``"all"`` as the workspace sentinel explicitly disables both the
20
+ profile default and any resulting filter, returning ``None`` so that
21
+ downstream code shows resources from all workspaces.
22
+
23
+ Args:
24
+ workspace: Explicitly provided workspace name/ID, ``"all"`` to
25
+ disable filtering, or None to fall back to the profile default.
26
+
27
+ Returns:
28
+ The workspace to use, or None if no filter should be applied.
29
+ """
30
+ if workspace and workspace.lower() == WORKSPACE_ALL:
31
+ return None
32
+ return workspace or get_default_workspace()
33
+
34
+
35
+ def resolve_workspace_filter(workspace: str, workspace_map: Dict[str, str]) -> str:
36
+ """Resolve workspace name to ID for filtering.
37
+
38
+ Args:
39
+ workspace: Workspace name or ID to resolve
40
+ workspace_map: Dictionary mapping workspace IDs to names
41
+
42
+ Returns:
43
+ Workspace ID (either the original if it was an ID, or resolved from name)
44
+ """
45
+ if not workspace:
46
+ return workspace
47
+
48
+ # Check if it's already an ID (exists as key in workspace_map)
49
+ if workspace in workspace_map:
50
+ return workspace
51
+
52
+ # Try to find by name (case-insensitive)
53
+ for ws_id, ws_name in workspace_map.items():
54
+ if ws_name and workspace.lower() == ws_name.lower():
55
+ return ws_id
56
+
57
+ # Return original if no match found
58
+ return workspace
59
+
60
+
61
+ def filter_by_workspace(
62
+ items: List[Dict[str, Any]],
63
+ workspace: str,
64
+ workspace_map: Dict[str, str],
65
+ workspace_field: str = "workspace",
66
+ ) -> List[Dict[str, Any]]:
67
+ """Filter items by workspace name or ID.
68
+
69
+ Falls back to the active profile's default workspace when no explicit
70
+ workspace is provided.
71
+
72
+ Args:
73
+ items: List of items to filter
74
+ workspace: Workspace name or ID to filter by
75
+ workspace_map: Dictionary mapping workspace IDs to names
76
+ workspace_field: Field name in items that contains workspace ID
77
+
78
+ Returns:
79
+ Filtered list of items
80
+ """
81
+ if not workspace:
82
+ workspace = get_default_workspace() or ""
83
+ if not workspace:
84
+ return items
85
+
86
+ filtered_items = []
87
+ for item in items:
88
+ item_workspace = item.get(workspace_field, "")
89
+ item_workspace_name = workspace_map.get(item_workspace, item_workspace)
90
+
91
+ # Match by ID or name (case-insensitive)
92
+ if workspace.lower() == item_workspace.lower() or (
93
+ item_workspace_name and workspace.lower() == item_workspace_name.lower()
94
+ ):
95
+ filtered_items.append(item)
96
+
97
+ return filtered_items
98
+
99
+
100
+ def resolve_workspace_id(workspace: Optional[str]) -> str:
101
+ """Resolve workspace name to ID with error handling.
102
+
103
+ Falls back to the active profile's default workspace when none is provided.
104
+
105
+ Args:
106
+ workspace: Workspace name or ID to resolve
107
+
108
+ Returns:
109
+ Resolved workspace ID
110
+ """
111
+ if not workspace:
112
+ workspace = get_default_workspace()
113
+ if not workspace:
114
+ return ""
115
+
116
+ try:
117
+ workspace_map = get_workspace_map()
118
+ return resolve_workspace_filter(workspace, workspace_map)
119
+ except Exception:
120
+ return workspace
121
+
122
+
123
+ def get_workspace_display_name(
124
+ workspace_id: str, workspace_map: Optional[Dict[str, str]] = None
125
+ ) -> str:
126
+ """Get display name for a workspace ID.
127
+
128
+ Args:
129
+ workspace_id: Workspace ID to get display name for
130
+ workspace_map: Optional workspace map, will fetch if not provided
131
+
132
+ Returns:
133
+ Workspace display name (name if available, otherwise ID)
134
+ """
135
+ if not workspace_map:
136
+ try:
137
+ workspace_map = get_workspace_map()
138
+ except Exception:
139
+ return workspace_id or ""
140
+
141
+ return workspace_map.get(workspace_id, workspace_id) or ""
142
+
143
+
144
+ class WorkspaceFormatter:
145
+ """Utility class for formatting workspace-related data."""
146
+
147
+ @staticmethod
148
+ def create_workspace_row_formatter(
149
+ workspace_map: Dict[str, str], name_field: str = "name", id_field: str = "id"
150
+ ) -> Callable[[Dict[str, Any]], List[str]]:
151
+ """Create a row formatter function for workspace-based tables."""
152
+
153
+ def formatter(item: Dict[str, Any]) -> List[str]:
154
+ workspace_id = item.get("workspace", "")
155
+ workspace_name = workspace_map.get(workspace_id, workspace_id) or ""
156
+ name = item.get(name_field, "")
157
+ item_id = item.get(id_field, "")
158
+ return [workspace_name, name, item_id]
159
+
160
+ return formatter
161
+
162
+ @staticmethod
163
+ def create_config_row_formatter(
164
+ workspace_map: Dict[str, str],
165
+ ) -> Callable[[Dict[str, Any]], List[str]]:
166
+ """Create a row formatter for DFF configurations."""
167
+
168
+ def formatter(config: Dict[str, Any]) -> List[str]:
169
+ workspace_id = config.get("workspace", "")
170
+ workspace_name = workspace_map.get(workspace_id, workspace_id) or ""
171
+ name = config.get("name", "")
172
+ config_id = config.get("id", "")
173
+ return [workspace_name, name, config_id]
174
+
175
+ return formatter
176
+
177
+ @staticmethod
178
+ def create_group_field_row_formatter(
179
+ workspace_map: Dict[str, str],
180
+ ) -> Callable[[Dict[str, Any]], List[str]]:
181
+ """Create a row formatter for DFF groups and fields."""
182
+
183
+ def formatter(item: Dict[str, Any]) -> List[str]:
184
+ workspace_id = item.get("workspace", "")
185
+ workspace_name = workspace_map.get(workspace_id, workspace_id) or ""
186
+ name = item.get("displayText", item.get("name", ""))
187
+ key = item.get("key", "")
188
+ return [workspace_name, name, key]
189
+
190
+ return formatter
191
+
192
+ @staticmethod
193
+ def create_table_row_formatter(
194
+ workspace_map: Dict[str, str],
195
+ ) -> Callable[[Dict[str, Any]], List[str]]:
196
+ """Create a row formatter for DFF table properties."""
197
+
198
+ def formatter(table: Dict[str, Any]) -> List[str]:
199
+ workspace_id = table.get("workspace", "")
200
+ workspace_name = workspace_map.get(workspace_id, workspace_id) or ""
201
+ resource_type = table.get("resourceType", "")
202
+ resource_id = table.get("resourceId", "")
203
+ table_id = table.get("id", "")
204
+ return [workspace_name, resource_type, resource_id, table_id]
205
+
206
+ return formatter
@@ -0,0 +1,20 @@
1
+ Metadata-Version: 2.4
2
+ Name: systemlink-cli
3
+ Version: 1.3.1
4
+ Summary: SystemLink Integrator CLI - cross-platform CLI for SystemLink workflows and templates.
5
+ License-File: LICENSE
6
+ Author: Fred Visser
7
+ Author-email: fred.visser@emerson.com
8
+ Requires-Python: >=3.11.1,<3.15
9
+ Classifier: Programming Language :: Python :: 3
10
+ Classifier: Programming Language :: Python :: 3.12
11
+ Classifier: Programming Language :: Python :: 3.13
12
+ Classifier: Programming Language :: Python :: 3.14
13
+ Requires-Dist: click (>=7.1.2)
14
+ Requires-Dist: keyring (>=25.6.0,<26.0.0)
15
+ Requires-Dist: pyyaml (>=6.0.3,<7.0.0)
16
+ Requires-Dist: questionary (>=2.1.1,<3.0.0)
17
+ Requires-Dist: requests (>=2.32.4,<3.0.0)
18
+ Requires-Dist: tabulate (>=0.10.0,<0.11.0)
19
+ Requires-Dist: truststore (>=0.9,<0.11)
20
+ Requires-Dist: watchdog (>=6.0.0,<7.0.0)
@@ -0,0 +1,74 @@
1
+ slcli/__init__.py,sha256=ZRF050VsFgb4zeyyQzQINQ4eHFwEBBoUq-CPyziIB6g,66
2
+ slcli/__main__.py,sha256=wUlBlvYS3Tn4ipw9_7zMr2d1houRpNnALG0TxHg6xZg,829
3
+ slcli/_version.py,sha256=ZUcQaSXzn0J9kgWF9aJURzZIGTbWoe_0LnE5aDmprTI,113
4
+ slcli/asset_click.py,sha256=TEBbwvn2c6WxWHwZ3vKFjk7z3y5hgLjqnE3kFxE8Adw,44566
5
+ slcli/cli_formatters.py,sha256=ShrU2RbnQUEKhJ6ahWuv8c3zw7C-yg0o20i1opq9gZk,7275
6
+ slcli/cli_utils.py,sha256=-2gAnZP4HB0owDetMnjGU2djAnnMU3hTi4i_gaSPIsE,14331
7
+ slcli/comment_click.py,sha256=0lN2Ynxb_pOf3Q32JPjsdj6Ukwd7rcHqFreFtMmIrHA,20899
8
+ slcli/completion_click.py,sha256=dYip8Xp1q1mT20YT67jIOyTkpphmokA6MOO5AqoqUjw,13947
9
+ slcli/config.py,sha256=tdVP-1cvy6Qs2ThGXv4nPNa5AoqNu1SG6oOwgMJ6Yx0,2221
10
+ slcli/config_click.py,sha256=YLbWu-1TkfPw-UaWLwWyGihXLx6BKCtQmXeosbs37WY,18604
11
+ slcli/dff_click.py,sha256=r-6XotRF_V0Qdr-lvKlvPPfOm9tk_Q4MpJoo03u0YKE,37054
12
+ slcli/dff_decorators.py,sha256=o-QfzYjWGnJ45GevsI-6vAdODCotwv7OgFgXKO3FVqQ,714
13
+ slcli/example_click.py,sha256=J930D3_guQg1-sSqjtgK4IqTPvLD94xmLHCNLr9oLWY,14029
14
+ slcli/example_loader.py,sha256=nuoqCnfOgudfh53cKrl2QIZj8bq2VuPkHprM3T-nOGw,9595
15
+ slcli/example_provisioner.py,sha256=uko5w-DWask93u4-jCW19FpI_tbsQH_UuVb6hgojekc,117426
16
+ slcli/examples/README.md,sha256=YWSasMLP_sQoNerN-k6OhPgQkaoqa80o0pwP2y7R-t8,3836
17
+ slcli/examples/_schema/schema-v1.0.json,sha256=wP0dEHlBD6tXL5bw1-PIbtfZp76chFKuHFdKv-ASHYk,4157
18
+ slcli/examples/demo-complete-workflow/README.md,sha256=Y17_u7P_SkQJFWEODX_zekHdIApYaL_BabeApDxmYEo,11528
19
+ slcli/examples/demo-complete-workflow/config.yaml,sha256=sij-_pOTn9w8ZcdWU3DKKDXw6NloPyioGMA9bSDapMw,21539
20
+ slcli/examples/demo-test-plans/README.md,sha256=4cu7wdodHbEbkc_0udcwt8YKBbBYobD1HI2C73-wCH4,3243
21
+ slcli/examples/demo-test-plans/config.yaml,sha256=vLzYX1Rc_QXjjEj6UUkSw7fWxedr5ZEi8RwmxBOYkWQ,3817
22
+ slcli/examples/exercise-5-1-parametric-insights/README.md,sha256=DpZ8l5_gwE0qOnOBwgaBZvAlDkL-OYcupugsUaLtLdg,4780
23
+ slcli/examples/exercise-5-1-parametric-insights/config.yaml,sha256=RI7nmtlYPOHRfsG61nMeAYT_CTbFCEVa8rNoBZmG_94,53264
24
+ slcli/examples/exercise-7-1-test-plans/README.md,sha256=JHCBmK-IKX7n5xt9VOYhYz3GtL-VvJfFsAhIFt1ccZE,4225
25
+ slcli/examples/exercise-7-1-test-plans/config.yaml,sha256=kBwn2N5KnJEg_oeScYUtHhpBUcxcyxexwp9LzpUMink,11833
26
+ slcli/examples/spec-compliance-notebooks/README.md,sha256=YYH80RcHvqmNHKWtQ0QT2uBUnL0A3PGoIwfVhccB6LM,4584
27
+ slcli/examples/spec-compliance-notebooks/config.yaml,sha256=3kKchJ-rxxKmnQPcaK66bmfIxAmG44ajiyj-_TJaJh8,4493
28
+ slcli/examples/spec-compliance-notebooks/notebooks/SpecAnalysis_ComplianceCalculation.ipynb,sha256=fMWBF2Ec-HRcYwqhRaqRDjs5NcCrs5GQxrRS2PFVp2Y,63279
29
+ slcli/examples/spec-compliance-notebooks/notebooks/SpecComplianceCalculation.ipynb,sha256=BEW_ngIwDQ_X6ovCOpjXAYkq5U5sdcXxewMGJdfycLg,62544
30
+ slcli/examples/spec-compliance-notebooks/notebooks/SpecfileExtractionAndIngestion.ipynb,sha256=nhIRbiG_LfCEVe7S2eActnvlUIjTdOgfMxOpsVmpbOg,31836
31
+ slcli/examples/spec-compliance-notebooks/spec_template.xlsx,sha256=fLMzo1oTLVFZ1HM5hqoCPhs_BIxppYM5ETVCgPZLGWg,15675
32
+ slcli/feed_click.py,sha256=3_InqD3hNbhvBpSnLn83nMs-6y3M_TNayJ3rPykxX4s,30443
33
+ slcli/file_click.py,sha256=1Wjyei7Z_0MpdDWlY11Na-ItgjZnjWJBXJIR6eepqGU,31042
34
+ slcli/function_click.py,sha256=EX-WUOkzsiSh6k55LDZNve3pJeGERX9CcI_zSoLBbBw,53447
35
+ slcli/function_templates.py,sha256=GfmsBF0KrsIp2rBiO9ha5UAHv0O9g7yr7xcA4l8vbi8,3371
36
+ slcli/main.py,sha256=feXndeNfH5_GceJ05b1aRQn_GN8nmqU4tlQFlB1TSAU,16019
37
+ slcli/mcp_click.py,sha256=HErTUYLRFvEvMvVaLV6ZGeYkggQqGWPO0I2tdZortK0,8904
38
+ slcli/mcp_server.py,sha256=e9LQTkkWxrYnHOSX5YoE3oRsA8dI4ALn8MkKb1R0fiQ,26972
39
+ slcli/notebook_click.py,sha256=J767OROBvtgN0cQfLGXYw1_Wpsgy54pV_g3Lc4wueGk,69389
40
+ slcli/platform.py,sha256=Vo5QApX8fipyX44T5lxTDIWENpVxdCGhEunQ7PnftmY,11255
41
+ slcli/policy_click.py,sha256=8pSrrlX1yKbN6buWqwVnCL_8ROn2hxFMmOOTnDNRPqg,23523
42
+ slcli/policy_utils.py,sha256=awi-vh40XO9m_bTotdJ3WR7MIV_gPLlTPgEB8eH1oyU,13085
43
+ slcli/profiles.py,sha256=NjhF747QAO_vfQs-etUYdn379xN99LsM_gx8BmCsUoU,13114
44
+ slcli/response_handlers.py,sha256=8nURxCwRgBMgED2AfM1GglcjUcceanBg4yQ-tPTUIek,12812
45
+ slcli/routine_click.py,sha256=9XpoHHZk0l_i--IxPA8S60yepQ1HfqezYwGu3Wvm8_g,25298
46
+ slcli/skill_click.py,sha256=yFj2_NRmhOnYkGgEjkoONlANlXELDRvgJJLR7Kxzo-I,8602
47
+ slcli/skills/slcli/SKILL.md,sha256=QmUvMC9FCfJYruHX_9SIOllixwU6ZCe3HLDcCj4Z2ts,28839
48
+ slcli/skills/slcli/references/analysis-recipes.md,sha256=p-XBGs36AV11LVOleuq7m3jpoP7OQJz8s7yIWOitBhc,15596
49
+ slcli/skills/slcli/references/filtering.md,sha256=2_Q8_3_HG3vhTbtA9QAB54B81VRl3iDhb5Yk3VW_9r4,7493
50
+ slcli/skills/systemlink-webapp/SKILL.md,sha256=DXziaj1_2xy5xJNfAxutXS3wEojdB7dlgULJgmxyA9s,31072
51
+ slcli/skills/systemlink-webapp/references/deployment.md,sha256=LkhZ_4wolp6kL11PcL1JxR6LnP-i6l1AWR2Z6bhBOa8,3003
52
+ slcli/skills/systemlink-webapp/references/nimble-angular.md,sha256=EMN0XSTxA9S81R51F0G5-857JC_j8Ka6wP5CkaLIfaA,9540
53
+ slcli/skills/systemlink-webapp/references/systemlink-services.md,sha256=LSv2l1tv8gChHXOrZ0k4vLwQVN9ILON_Fn_zD98pVz0,5119
54
+ slcli/ssl_trust.py,sha256=y882ii01wrDYtWZLIVgrDGDDMYI0Km7EIjNJffRkZiY,3696
55
+ slcli/system_click.py,sha256=Z1lUcfJoFX2XxHaYr2QFxhDvMtaZtA4bIH8N3ZgghxY,76881
56
+ slcli/table_utils.py,sha256=pEBQv4YyiyE9qT1HkyK2ZqPE3KlZlNnNgrySCtWRTFA,4203
57
+ slcli/tag_click.py,sha256=4SpSsFCZBVYYEPFKFmTP6TNnSUnO43tEYTEwPEjR5NQ,26350
58
+ slcli/templates_click.py,sha256=_cAQQxTGyOupofM31cIlF6rE1r4_SZJcgLqO0IgkrRk,23025
59
+ slcli/testmonitor_click.py,sha256=5iHbYD4DVvH5oR-WrC1jOYCgFkYLKC1X8h9F7Sdl_uU,61524
60
+ slcli/universal_handlers.py,sha256=bcmuDXWJP55urRxGB6xv8rQBzVaJLeQx5bSgZ_JlzJw,11670
61
+ slcli/user_click.py,sha256=alsfhvmWVYd20zJlGrxbvmN3NPMwlLnRfJC4iBSQC9Q,46763
62
+ slcli/utils.py,sha256=G8rdh7jnXiEqZ14QZDXdyeHzpm62J5LPp2HhyCP3Zms,27107
63
+ slcli/web_editor.py,sha256=f7ruCa21pnWk42Nx4nct8MZ6p-59zWWX5PwyseR2LFA,11204
64
+ slcli/webapp_click.py,sha256=fa2cfkWcI4SglccwLI89yYuubER8uXJ4SGEw7LcurHM,37253
65
+ slcli/workflow_preview.py,sha256=yXvIC5HtpCC23AxeK8O3-gvZSrAT66qQegBuq95uJjs,12453
66
+ slcli/workflows_click.py,sha256=yKm_XdixjBcdLqHLpKFdrHV-XXDJlmN9Epko7mc49KM,40224
67
+ slcli/workitem_click.py,sha256=YOdkWhLfqGzlAV2j3aZvc81ZEUtX5KBQ6UAhmjYzRsc,87540
68
+ slcli/workspace_click.py,sha256=JYv3vEa-4Jfqkssp2DHuaTziNetMMdPjOVCb7ZFY5AM,21477
69
+ slcli/workspace_utils.py,sha256=7QOtotmv3ghJs6a0fDQVojKxrBKPeq_GtE4F1SmZKnM,6872
70
+ systemlink_cli-1.3.1.dist-info/METADATA,sha256=hDmVJMnQEkvlAd1YDGKhH-QrxKcAwFmFOoRMJrkioGc,789
71
+ systemlink_cli-1.3.1.dist-info/WHEEL,sha256=kJCRJT_g0adfAJzTx2GUMmS80rTJIVHRCfG0DQgLq3o,88
72
+ systemlink_cli-1.3.1.dist-info/entry_points.txt,sha256=bmnzCceRleTC8p8tS_Iizn_7D5p0sGpOLdk2bnoDELQ,191
73
+ systemlink_cli-1.3.1.dist-info/licenses/LICENSE,sha256=ioLAEBMHywwQkOr14pBIc7nenmWrc-bgcMrqsB_Uvq8,1077
74
+ systemlink_cli-1.3.1.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: poetry-core 2.3.1
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,7 @@
1
+ [console_scripts]
2
+ build-pyinstaller=scripts.build_pyinstaller:main
3
+ lint=scripts.lint:main
4
+ slcli=slcli.__main__:cli
5
+ slcli-mcp=slcli.mcp_server:main
6
+ update-version=scripts.update_version:main
7
+
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 National Instruments
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.