systemlink-cli 1.17.2__tar.gz → 1.17.4__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 (146) hide show
  1. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/PKG-INFO +3 -1
  2. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/pyproject.toml +5 -7
  3. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/_version.py +1 -1
  4. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/mcp_click.py +3 -1
  5. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_click.py +117 -0
  6. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/LICENSE +0 -0
  7. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/dff-editor/editor.js +0 -0
  8. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/dff-editor/index.html +0 -0
  9. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/__init__.py +0 -0
  10. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/__main__.py +0 -0
  11. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/asset_click.py +0 -0
  12. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/cli_formatters.py +0 -0
  13. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/cli_utils.py +0 -0
  14. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/comment_click.py +0 -0
  15. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/completion_click.py +0 -0
  16. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/config.py +0 -0
  17. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/config_click.py +0 -0
  18. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/dataframe_click.py +0 -0
  19. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/dff_click.py +0 -0
  20. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/dff_decorators.py +0 -0
  21. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/example_click.py +0 -0
  22. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/example_loader.py +0 -0
  23. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/example_provisioner.py +0 -0
  24. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/examples/README.md +0 -0
  25. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/examples/_schema/schema-v1.0.json +0 -0
  26. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/examples/demo-complete-workflow/README.md +0 -0
  27. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/examples/demo-complete-workflow/config.yaml +0 -0
  28. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/examples/demo-test-plans/README.md +0 -0
  29. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/examples/demo-test-plans/config.yaml +0 -0
  30. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/examples/exercise-5-1-parametric-insights/README.md +0 -0
  31. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/examples/exercise-5-1-parametric-insights/config.yaml +0 -0
  32. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/examples/exercise-7-1-test-plans/README.md +0 -0
  33. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/examples/exercise-7-1-test-plans/config.yaml +0 -0
  34. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/examples/spec-compliance-notebooks/README.md +0 -0
  35. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/examples/spec-compliance-notebooks/config.yaml +0 -0
  36. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/examples/spec-compliance-notebooks/notebooks/SpecAnalysis_ComplianceCalculation.ipynb +0 -0
  37. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/examples/spec-compliance-notebooks/notebooks/SpecComplianceCalculation.ipynb +0 -0
  38. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/examples/spec-compliance-notebooks/notebooks/SpecfileExtractionAndIngestion.ipynb +0 -0
  39. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/examples/spec-compliance-notebooks/spec_template.xlsx +0 -0
  40. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/feed_click.py +0 -0
  41. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/file_click.py +0 -0
  42. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/function_click.py +0 -0
  43. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/function_templates.py +0 -0
  44. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/main.py +0 -0
  45. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/mcp_reachability.py +0 -0
  46. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/mcp_server.py +0 -0
  47. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/notebook_click.py +0 -0
  48. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/platform.py +0 -0
  49. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/policy_click.py +0 -0
  50. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/policy_utils.py +0 -0
  51. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/profiles.py +0 -0
  52. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/response_handlers.py +0 -0
  53. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/rich_output.py +0 -0
  54. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/routine_click.py +0 -0
  55. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/skill_click.py +0 -0
  56. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/skills/slcli/SKILL.md +0 -0
  57. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/skills/slcli/references/analysis-recipes.md +0 -0
  58. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/skills/slcli/references/commands.md +0 -0
  59. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/skills/slcli/references/datasheet-workflow.md +0 -0
  60. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/skills/slcli/references/filtering.md +0 -0
  61. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/skills/slcli/references/import-specs.min.json +0 -0
  62. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/skills/slcli/references/job-debugging/overview.md +0 -0
  63. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/skills/slcli/references/nipkg/overview.md +0 -0
  64. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/skills/slcli/references/notebook/interfaces.md +0 -0
  65. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/skills/slcli/references/notebook/notebook-patterns.md +0 -0
  66. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/skills/slcli/references/notebook/overview.md +0 -0
  67. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/skills/slcli/references/python-test/overview.md +0 -0
  68. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/skills/slcli/references/routine-examples.md +0 -0
  69. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/skills/slcli/references/troubleshooting.md +0 -0
  70. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/skills/slcli/references/webapp/angular-ui-packages.md +0 -0
  71. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/skills/slcli/references/webapp/deployment.md +0 -0
  72. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/skills/slcli/references/webapp/layout-patterns.md +0 -0
  73. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/skills/slcli/references/webapp/nimble-angular.md +0 -0
  74. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/skills/slcli/references/webapp/overview.md +0 -0
  75. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/skills/slcli/references/webapp/systemlink-services.md +0 -0
  76. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/skills/slcli/references/webapp/troubleshooting.md +0 -0
  77. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/skills/slcli/scripts/spec_import_helper.py +0 -0
  78. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/spec_click.py +0 -0
  79. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/ssl_trust.py +0 -0
  80. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/state_click.py +0 -0
  81. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/system_click.py +0 -0
  82. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/system_query_utils.py +0 -0
  83. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/table_utils.py +0 -0
  84. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/tag_click.py +0 -0
  85. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/templates_click.py +0 -0
  86. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/testmonitor_click.py +0 -0
  87. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/universal_handlers.py +0 -0
  88. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/user_click.py +0 -0
  89. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/utils.py +0 -0
  90. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/web_editor.py +0 -0
  91. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_bootstrap.py +0 -0
  92. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/.gitignore +0 -0
  93. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/README.md +0 -0
  94. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/angular.json +0 -0
  95. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/package.json +0 -0
  96. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/app-routing.module.ts +0 -0
  97. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/app.component.html +0 -0
  98. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/app.component.scss +0 -0
  99. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/app.component.ts +0 -0
  100. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/app.module.ts +0 -0
  101. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/core/layout/app-shell.component.html +0 -0
  102. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/core/layout/app-shell.component.scss +0 -0
  103. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/core/layout/app-shell.component.ts +0 -0
  104. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/core/state/app-view-state.service.ts +0 -0
  105. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/core/systemlink/systemlink-context.service.ts +0 -0
  106. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/core/systemlink/theme-sync.service.ts +0 -0
  107. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/core/systemlink/webapp-home-data.service.ts +0 -0
  108. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/features/assets/assets-page.component.html +0 -0
  109. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/features/assets/assets-page.component.scss +0 -0
  110. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/features/assets/assets-page.component.ts +0 -0
  111. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/features/datasets/datasets-page.component.html +0 -0
  112. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/features/datasets/datasets-page.component.scss +0 -0
  113. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/features/datasets/datasets-page.component.ts +0 -0
  114. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/features/home/home-page.component.html +0 -0
  115. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/features/home/home-page.component.scss +0 -0
  116. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/features/home/home-page.component.ts +0 -0
  117. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/features/master-detail/master-detail-page.component.html +0 -0
  118. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/features/master-detail/master-detail-page.component.scss +0 -0
  119. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/features/master-detail/master-detail-page.component.ts +0 -0
  120. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/features/operations/operations-page.component.html +0 -0
  121. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/features/operations/operations-page.component.scss +0 -0
  122. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/features/operations/operations-page.component.ts +0 -0
  123. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/features/settings/settings-page.component.html +0 -0
  124. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/features/settings/settings-page.component.scss +0 -0
  125. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/features/settings/settings-page.component.ts +0 -0
  126. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/shared/components/empty-state.component.html +0 -0
  127. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/shared/components/empty-state.component.scss +0 -0
  128. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/shared/components/empty-state.component.ts +0 -0
  129. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/shared/components/error-banner.component.html +0 -0
  130. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/shared/components/error-banner.component.scss +0 -0
  131. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/shared/components/error-banner.component.ts +0 -0
  132. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/shared/components/loading-state.component.html +0 -0
  133. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/shared/components/loading-state.component.scss +0 -0
  134. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/shared/components/loading-state.component.ts +0 -0
  135. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/app/shared/states/view-state.model.ts +0 -0
  136. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/assets/README.md +0 -0
  137. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/index.html +0 -0
  138. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/main.ts +0 -0
  139. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/src/styles.scss +0 -0
  140. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/tsconfig.app.json +0 -0
  141. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/webapp_templates/angular/blank/tsconfig.json +0 -0
  142. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/workflow_preview.py +0 -0
  143. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/workflows_click.py +0 -0
  144. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/workitem_click.py +0 -0
  145. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/workspace_click.py +0 -0
  146. {systemlink_cli-1.17.2 → systemlink_cli-1.17.4}/slcli/workspace_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: systemlink-cli
3
- Version: 1.17.2
3
+ Version: 1.17.4
4
4
  Summary: SystemLink Integrator CLI - cross-platform CLI for SystemLink workflows and templates.
5
5
  License-File: LICENSE
6
6
  Author: Fred Visser
@@ -10,9 +10,11 @@ Classifier: Programming Language :: Python :: 3
10
10
  Classifier: Programming Language :: Python :: 3.12
11
11
  Classifier: Programming Language :: Python :: 3.13
12
12
  Classifier: Programming Language :: Python :: 3.14
13
+ Provides-Extra: mcp
13
14
  Requires-Dist: click (>=7.1.2)
14
15
  Requires-Dist: cryptography (>=49.0.0)
15
16
  Requires-Dist: keyring (>=25.6.0,<26.0.0)
17
+ Requires-Dist: mcp (>=1.0) ; extra == "mcp"
16
18
  Requires-Dist: packaging (>=21.0)
17
19
  Requires-Dist: pygments (>=2.20.0)
18
20
  Requires-Dist: pyyaml (>=6.0.3,<7.0.0)
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "systemlink-cli"
3
- version = "1.17.2"
3
+ version = "1.17.4"
4
4
  description = "SystemLink Integrator CLI - cross-platform CLI for SystemLink workflows and templates."
5
5
  authors = ["Fred Visser <fred.visser@emerson.com>"]
6
6
  packages = [{ include = "slcli" }]
@@ -21,12 +21,6 @@ update-version = "scripts.update_version:main"
21
21
  release-from-changes = "scripts.towncrier_release:main"
22
22
  lint = "scripts.lint:main"
23
23
 
24
- [tool.poetry.group.mcp]
25
- optional = true
26
-
27
- [tool.poetry.group.mcp.dependencies]
28
- mcp = ">=1.0"
29
-
30
24
  [tool.poetry.dependencies]
31
25
  python = ">=3.11.1,<3.15"
32
26
  # cli
@@ -43,6 +37,10 @@ rich = ">=15,<16"
43
37
  rich-click = ">=1.8,<2"
44
38
  cryptography = ">=49.0.0"
45
39
  pygments = ">=2.20.0"
40
+ mcp = { version = ">=1.0", optional = true }
41
+
42
+ [tool.poetry.extras]
43
+ mcp = ["mcp"]
46
44
 
47
45
 
48
46
  [tool.poetry.group.dev.dependencies]
@@ -1,4 +1,4 @@
1
1
  """Version information for slcli."""
2
2
 
3
3
  # This file is auto-generated. Do not edit manually.
4
- __version__ = "1.17.2"
4
+ __version__ = "1.17.4"
@@ -200,7 +200,9 @@ def register_mcp_commands(cli: Any) -> None:
200
200
  click.echo(
201
201
  "✗ The 'mcp' package is not installed.\n"
202
202
  " Install it with: pip install 'mcp>=1.0'\n"
203
- " Or in a Poetry project: poetry add mcp",
203
+ " Or in a Poetry project: poetry add mcp\n"
204
+ " If slcli was installed with pipx:\n"
205
+ " pipx runpip systemlink-cli install 'mcp>=1.0'\n",
204
206
  err=True,
205
207
  )
206
208
  sys.exit(ExitCodes.GENERAL_ERROR)
@@ -151,6 +151,111 @@ def _build_published_webapp_url(
151
151
  return ""
152
152
 
153
153
 
154
+ def _find_conflicting_webapp_id(value: Any) -> str:
155
+ """Find a webapp ID in a duplicate-create response payload."""
156
+ if isinstance(value, dict):
157
+ for key in (
158
+ "id",
159
+ "webappId",
160
+ "webAppId",
161
+ "existingId",
162
+ "existingWebappId",
163
+ "existingWebAppId",
164
+ "resourceId",
165
+ ):
166
+ candidate = value.get(key)
167
+ if candidate:
168
+ return str(candidate)
169
+ for nested in value.values():
170
+ conflict_id = _find_conflicting_webapp_id(nested)
171
+ if conflict_id:
172
+ return conflict_id
173
+ elif isinstance(value, list):
174
+ for nested in value:
175
+ conflict_id = _find_conflicting_webapp_id(nested)
176
+ if conflict_id:
177
+ return conflict_id
178
+ return ""
179
+
180
+
181
+ def _find_existing_webapp(webapp_name: str, workspace_id: str) -> Optional[Dict[str, Any]]:
182
+ """Find an existing WebVI with the requested name and workspace."""
183
+ escaped_name = webapp_name.replace("\\", "\\\\").replace('"', '\\"')
184
+ filter_parts = [f'type == "WebVI"', f'name.Contains("{escaped_name}")']
185
+ if workspace_id:
186
+ escaped_workspace = workspace_id.replace("\\", "\\\\").replace('"', '\\"')
187
+ filter_parts.append(f'workspace == "{escaped_workspace}"')
188
+
189
+ try:
190
+ webapps = _query_webapps_http(" and ".join(filter_parts), max_items=100)
191
+ except Exception:
192
+ return None
193
+
194
+ for webapp in webapps:
195
+ if (
196
+ webapp.get("type") == "WebVI"
197
+ and webapp.get("name") == webapp_name
198
+ and (not workspace_id or webapp.get("workspace") == workspace_id)
199
+ ):
200
+ return webapp
201
+ return None
202
+
203
+
204
+ def _handle_webapp_create_conflict(
205
+ response: Any,
206
+ workspace_id: str,
207
+ workspace_name_hint: str,
208
+ webapp_name: str,
209
+ ) -> None:
210
+ """Display details for a webapp that conflicts with a create request."""
211
+ if response.status_code != 409:
212
+ return
213
+
214
+ try:
215
+ response_data = response.json()
216
+ except (ValueError, AttributeError):
217
+ response_data = {}
218
+
219
+ conflict_id = _find_conflicting_webapp_id(response_data)
220
+ conflict_record: Optional[Dict[str, Any]] = None
221
+ if not conflict_id:
222
+ conflict_record = _find_existing_webapp(webapp_name, workspace_id)
223
+ if conflict_record:
224
+ conflict_id = str(conflict_record.get("id", ""))
225
+ conflict_message = ""
226
+ if isinstance(response_data, dict):
227
+ error_data = response_data.get("error")
228
+ if isinstance(error_data, dict):
229
+ message = error_data.get("message")
230
+ if message:
231
+ conflict_message = str(message)
232
+ if not conflict_message:
233
+ message = response_data.get("message")
234
+ if message:
235
+ conflict_message = str(message)
236
+
237
+ if not conflict_message:
238
+ conflict_message = "A webapp with this name already exists."
239
+
240
+ click.echo(f"✗ {conflict_message}", err=True)
241
+ if conflict_id:
242
+ conflict_name = str(conflict_record.get("name", "")) if conflict_record else webapp_name
243
+ conflict_workspace_id = (
244
+ str(conflict_record.get("workspace", "")) if conflict_record else workspace_id
245
+ )
246
+ conflict_properties = conflict_record.get("properties", {}) if conflict_record else None
247
+ conflict_url = _build_published_webapp_url(
248
+ conflict_id,
249
+ webapp_name=conflict_name,
250
+ workspace_id=conflict_workspace_id,
251
+ workspace_name_hint=workspace_name_hint,
252
+ properties=conflict_properties,
253
+ )
254
+ click.echo(f" Conflicting Webapp ID: {conflict_id}", err=True)
255
+ click.echo(f" Conflicting Webapp URL: {conflict_url}", err=True)
256
+ sys.exit(ExitCodes.INVALID_INPUT)
257
+
258
+
154
259
  def _query_webapps_http(filter_str: str, max_items: int = 1000) -> List[Dict[str, Any]]:
155
260
  """Query webapps using continuation token pagination.
156
261
 
@@ -1518,6 +1623,12 @@ def register_webapp_commands(cli: Any) -> None:
1518
1623
  json=payload,
1519
1624
  verify=get_ssl_verify(),
1520
1625
  )
1626
+ _handle_webapp_create_conflict(
1627
+ resp_create,
1628
+ workspace_id=created_workspace_id,
1629
+ workspace_name_hint=get_effective_workspace(workspace) or workspace,
1630
+ webapp_name=name,
1631
+ )
1521
1632
  resp_create.raise_for_status()
1522
1633
  created = resp_create.json()
1523
1634
  webapp_id = created.get("id")
@@ -1590,6 +1701,12 @@ def register_webapp_commands(cli: Any) -> None:
1590
1701
  json=payload,
1591
1702
  verify=get_ssl_verify(),
1592
1703
  )
1704
+ _handle_webapp_create_conflict(
1705
+ resp_create,
1706
+ workspace_id=created_workspace_id,
1707
+ workspace_name_hint=get_effective_workspace(workspace) or workspace,
1708
+ webapp_name=name,
1709
+ )
1593
1710
  resp_create.raise_for_status()
1594
1711
  created = resp_create.json()
1595
1712
  webapp_id = created.get("id")
File without changes