systemlink-cli 1.13.20__tar.gz → 1.15.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.
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/PKG-INFO +2 -2
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/pyproject.toml +6 -4
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/_version.py +1 -1
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/skill_click.py +81 -20
- systemlink_cli-1.15.1/slcli/skills/slcli/SKILL.md +79 -0
- systemlink_cli-1.15.1/slcli/skills/slcli/references/analysis-recipes.md +490 -0
- systemlink_cli-1.15.1/slcli/skills/slcli/references/commands.md +884 -0
- systemlink_cli-1.15.1/slcli/skills/slcli/references/datasheet-workflow.md +615 -0
- systemlink_cli-1.15.1/slcli/skills/slcli/references/filtering.md +236 -0
- systemlink_cli-1.15.1/slcli/skills/slcli/references/import-specs.min.json +61 -0
- systemlink_cli-1.15.1/slcli/skills/slcli/references/job-debugging/overview.md +113 -0
- systemlink_cli-1.15.1/slcli/skills/slcli/references/nipkg/overview.md +143 -0
- systemlink_cli-1.15.1/slcli/skills/slcli/references/notebook/interfaces.md +185 -0
- systemlink_cli-1.15.1/slcli/skills/slcli/references/notebook/notebook-patterns.md +324 -0
- systemlink_cli-1.15.1/slcli/skills/slcli/references/notebook/overview.md +168 -0
- systemlink_cli-1.15.1/slcli/skills/slcli/references/python-test/overview.md +179 -0
- systemlink_cli-1.15.1/slcli/skills/slcli/references/routine-examples.md +186 -0
- systemlink_cli-1.15.1/slcli/skills/slcli/references/troubleshooting.md +75 -0
- systemlink_cli-1.15.1/slcli/skills/slcli/references/webapp/angular-ui-packages.md +154 -0
- systemlink_cli-1.15.1/slcli/skills/slcli/references/webapp/deployment.md +147 -0
- systemlink_cli-1.15.1/slcli/skills/slcli/references/webapp/layout-patterns.md +183 -0
- systemlink_cli-1.15.1/slcli/skills/slcli/references/webapp/nimble-angular.md +487 -0
- systemlink_cli-1.15.1/slcli/skills/slcli/references/webapp/overview.md +200 -0
- systemlink_cli-1.15.1/slcli/skills/slcli/references/webapp/systemlink-services.md +192 -0
- systemlink_cli-1.15.1/slcli/skills/slcli/references/webapp/troubleshooting.md +110 -0
- systemlink_cli-1.15.1/slcli/skills/slcli/scripts/spec_import_helper.py +309 -0
- systemlink_cli-1.15.1/slcli/webapp_bootstrap.py +631 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/webapp_click.py +24 -7
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/.gitignore +4 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/README.md +94 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/angular.json +96 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/package.json +13 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/app-routing.module.ts +42 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/app.component.html +3 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/app.component.scss +3 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/app.component.ts +17 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/app.module.ts +75 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/core/layout/app-shell.component.html +44 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/core/layout/app-shell.component.scss +103 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/core/layout/app-shell.component.ts +64 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/core/state/app-view-state.service.ts +10 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/core/systemlink/systemlink-context.service.ts +35 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/core/systemlink/theme-sync.service.ts +65 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/core/systemlink/webapp-home-data.service.ts +62 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/features/assets/assets-page.component.html +109 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/features/assets/assets-page.component.scss +88 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/features/assets/assets-page.component.ts +99 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/features/datasets/datasets-page.component.html +80 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/features/datasets/datasets-page.component.scss +47 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/features/datasets/datasets-page.component.ts +133 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/features/home/home-page.component.html +61 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/features/home/home-page.component.scss +71 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/features/home/home-page.component.ts +40 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/features/master-detail/master-detail-page.component.html +108 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/features/master-detail/master-detail-page.component.scss +103 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/features/master-detail/master-detail-page.component.ts +160 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/features/operations/operations-page.component.html +157 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/features/operations/operations-page.component.scss +188 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/features/operations/operations-page.component.ts +197 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/features/settings/settings-page.component.html +175 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/features/settings/settings-page.component.scss +137 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/features/settings/settings-page.component.ts +88 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/shared/components/empty-state.component.html +4 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/shared/components/empty-state.component.scss +11 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/shared/components/empty-state.component.ts +11 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/shared/components/error-banner.component.html +3 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/shared/components/error-banner.component.scss +3 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/shared/components/error-banner.component.ts +11 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/shared/components/loading-state.component.html +4 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/shared/components/loading-state.component.scss +10 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/shared/components/loading-state.component.ts +9 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/app/shared/states/view-state.model.ts +13 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/assets/README.md +1 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/index.html +11 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/main.ts +11 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/src/styles.scss +130 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/tsconfig.app.json +9 -0
- systemlink_cli-1.15.1/slcli/webapp_templates/angular/blank/tsconfig.json +28 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/LICENSE +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/dff-editor/editor.js +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/dff-editor/index.html +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/__init__.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/__main__.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/asset_click.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/cli_formatters.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/cli_utils.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/comment_click.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/completion_click.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/config.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/config_click.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/dataframe_click.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/dff_click.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/dff_decorators.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/example_click.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/example_loader.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/example_provisioner.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/examples/README.md +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/examples/_schema/schema-v1.0.json +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/examples/demo-complete-workflow/README.md +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/examples/demo-complete-workflow/config.yaml +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/examples/demo-test-plans/README.md +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/examples/demo-test-plans/config.yaml +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/examples/exercise-5-1-parametric-insights/README.md +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/examples/exercise-5-1-parametric-insights/config.yaml +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/examples/exercise-7-1-test-plans/README.md +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/examples/exercise-7-1-test-plans/config.yaml +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/examples/spec-compliance-notebooks/README.md +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/examples/spec-compliance-notebooks/config.yaml +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/examples/spec-compliance-notebooks/notebooks/SpecAnalysis_ComplianceCalculation.ipynb +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/examples/spec-compliance-notebooks/notebooks/SpecComplianceCalculation.ipynb +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/examples/spec-compliance-notebooks/notebooks/SpecfileExtractionAndIngestion.ipynb +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/examples/spec-compliance-notebooks/spec_template.xlsx +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/feed_click.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/file_click.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/function_click.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/function_templates.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/main.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/mcp_click.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/mcp_reachability.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/mcp_server.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/notebook_click.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/platform.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/policy_click.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/policy_utils.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/profiles.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/response_handlers.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/rich_output.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/routine_click.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/spec_click.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/ssl_trust.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/state_click.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/system_click.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/system_query_utils.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/table_utils.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/tag_click.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/templates_click.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/testmonitor_click.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/universal_handlers.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/user_click.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/utils.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/web_editor.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/workflow_preview.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/workflows_click.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/workitem_click.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/workspace_click.py +0 -0
- {systemlink_cli-1.13.20 → systemlink_cli-1.15.1}/slcli/workspace_utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: systemlink-cli
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.15.1
|
|
4
4
|
Summary: SystemLink Integrator CLI - cross-platform CLI for SystemLink workflows and templates.
|
|
5
5
|
License-File: LICENSE
|
|
6
6
|
Author: Fred Visser
|
|
@@ -11,7 +11,7 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
11
11
|
Classifier: Programming Language :: Python :: 3.13
|
|
12
12
|
Classifier: Programming Language :: Python :: 3.14
|
|
13
13
|
Requires-Dist: click (>=7.1.2)
|
|
14
|
-
Requires-Dist: cryptography (>=
|
|
14
|
+
Requires-Dist: cryptography (>=49.0.0)
|
|
15
15
|
Requires-Dist: keyring (>=25.6.0,<26.0.0)
|
|
16
16
|
Requires-Dist: packaging (>=21.0)
|
|
17
17
|
Requires-Dist: pygments (>=2.20.0)
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "systemlink-cli"
|
|
3
|
-
version = "1.
|
|
3
|
+
version = "1.15.1"
|
|
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" }]
|
|
7
7
|
include = [
|
|
8
8
|
{ path = "dff-editor/index.html", format = ["wheel", "sdist"] },
|
|
9
9
|
{ path = "dff-editor/editor.js", format = ["wheel", "sdist"] },
|
|
10
|
+
{ path = "slcli/skills", format = ["wheel", "sdist"] },
|
|
11
|
+
{ path = "slcli/webapp_templates", format = ["wheel", "sdist"] },
|
|
10
12
|
]
|
|
11
13
|
|
|
12
14
|
|
|
@@ -39,7 +41,7 @@ questionary = "^2.1.1"
|
|
|
39
41
|
packaging = ">=21.0"
|
|
40
42
|
rich = ">=15,<16"
|
|
41
43
|
rich-click = ">=1.8,<2"
|
|
42
|
-
cryptography = ">=
|
|
44
|
+
cryptography = ">=49.0.0"
|
|
43
45
|
pygments = ">=2.20.0"
|
|
44
46
|
|
|
45
47
|
|
|
@@ -55,9 +57,9 @@ flake8-import-order = ">=0.19.2"
|
|
|
55
57
|
isort = ">=6.0.1,<9"
|
|
56
58
|
pep8-naming = ">=0.15.1"
|
|
57
59
|
lxml = ">=6.1.0"
|
|
58
|
-
pyjwt = ">=2.
|
|
60
|
+
pyjwt = ">=2.13.0"
|
|
59
61
|
python-dotenv = ">=1.2.2"
|
|
60
|
-
python-multipart = ">=0.0.
|
|
62
|
+
python-multipart = ">=0.0.32"
|
|
61
63
|
|
|
62
64
|
# Type checking
|
|
63
65
|
mypy = ">=1.0"
|
|
@@ -1,25 +1,16 @@
|
|
|
1
1
|
"""Agent Skills install command for slcli."""
|
|
2
2
|
|
|
3
|
+
import shutil
|
|
3
4
|
import sys
|
|
4
5
|
from pathlib import Path
|
|
5
6
|
from typing import Any, Dict, List, Optional, Tuple
|
|
6
7
|
|
|
7
8
|
import click
|
|
8
9
|
|
|
9
|
-
from .utils import ExitCodes
|
|
10
|
+
from .utils import ExitCodes, format_success
|
|
10
11
|
|
|
11
12
|
SKILL_NAME = "slcli"
|
|
12
|
-
|
|
13
|
-
"AI skills are currently unavailable and cannot be installed right now."
|
|
14
|
-
)
|
|
15
|
-
_FALLBACK_SKILL_CHOICES = [
|
|
16
|
-
"nipkg-file-package",
|
|
17
|
-
"slcli",
|
|
18
|
-
"systemlink-job-debugging",
|
|
19
|
-
"systemlink-notebook",
|
|
20
|
-
"systemlink-python-test",
|
|
21
|
-
"systemlink-webapp",
|
|
22
|
-
]
|
|
13
|
+
_FALLBACK_SKILL_CHOICES = [SKILL_NAME]
|
|
23
14
|
|
|
24
15
|
# Mapping of client name -> (personal skills dir, project subdir relative to repo root)
|
|
25
16
|
# personal dir uses Path.home() so it's always resolved at call time via _personal_dir().
|
|
@@ -118,14 +109,49 @@ def _find_bundled_skills_dir() -> Path:
|
|
|
118
109
|
PROJECT_SKILLS_SUBDIR = ".agents/skills"
|
|
119
110
|
|
|
120
111
|
|
|
112
|
+
def _expand_skill_selection(skill_names: Optional[List[str]] = None) -> List[str]:
|
|
113
|
+
"""Validate and normalize requested bundled skill names."""
|
|
114
|
+
requested = list(dict.fromkeys(skill_names or SKILL_CHOICES))
|
|
115
|
+
invalid = [name for name in requested if name not in SKILL_CHOICES]
|
|
116
|
+
if invalid:
|
|
117
|
+
invalid_display = ", ".join(sorted(invalid))
|
|
118
|
+
raise ValueError(f"Unknown bundled skill(s): {invalid_display}")
|
|
119
|
+
return requested
|
|
120
|
+
|
|
121
|
+
|
|
121
122
|
def install_skills_to_directory(
|
|
122
123
|
directory: Path,
|
|
123
124
|
skill_names: Optional[List[str]] = None,
|
|
124
125
|
subdir: str = PROJECT_SKILLS_SUBDIR,
|
|
126
|
+
force: bool = False,
|
|
125
127
|
) -> int:
|
|
126
|
-
"""
|
|
127
|
-
|
|
128
|
-
|
|
128
|
+
"""Install bundled skills into the requested directory and return the count."""
|
|
129
|
+
bundled_skills_dir = _find_bundled_skills_dir()
|
|
130
|
+
selected_skills = _expand_skill_selection(skill_names)
|
|
131
|
+
destination_root = directory / subdir if subdir else directory
|
|
132
|
+
destination_root.mkdir(parents=True, exist_ok=True)
|
|
133
|
+
|
|
134
|
+
for skill_name in selected_skills:
|
|
135
|
+
source_dir = bundled_skills_dir / skill_name
|
|
136
|
+
if not source_dir.exists():
|
|
137
|
+
raise FileNotFoundError(
|
|
138
|
+
f"Bundled skill '{skill_name}' not found in {bundled_skills_dir}"
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
destination_dir = destination_root / skill_name
|
|
142
|
+
if destination_dir.exists():
|
|
143
|
+
if not force:
|
|
144
|
+
raise FileExistsError(
|
|
145
|
+
f"{destination_dir} already exists. Use --force to overwrite it."
|
|
146
|
+
)
|
|
147
|
+
if destination_dir.is_dir():
|
|
148
|
+
shutil.rmtree(destination_dir)
|
|
149
|
+
else:
|
|
150
|
+
destination_dir.unlink()
|
|
151
|
+
|
|
152
|
+
shutil.copytree(source_dir, destination_dir)
|
|
153
|
+
|
|
154
|
+
return len(selected_skills)
|
|
129
155
|
|
|
130
156
|
|
|
131
157
|
def _resolve_destinations(clients: List[str], scope: str) -> List[Path]:
|
|
@@ -167,7 +193,7 @@ def register_skill_commands(cli: Any) -> None:
|
|
|
167
193
|
|
|
168
194
|
@cli.group()
|
|
169
195
|
def skill() -> None:
|
|
170
|
-
"""
|
|
196
|
+
"""Install bundled AI assistant skills."""
|
|
171
197
|
|
|
172
198
|
@skill.command(name="install")
|
|
173
199
|
@click.option(
|
|
@@ -201,7 +227,42 @@ def register_skill_commands(cli: Any) -> None:
|
|
|
201
227
|
def install_skill(
|
|
202
228
|
skill: Optional[str], client: Optional[str], scope: Optional[str], force: bool
|
|
203
229
|
) -> None:
|
|
204
|
-
"""
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
230
|
+
"""Install bundled skills for supported AI clients."""
|
|
231
|
+
requested_skills: Optional[List[str]]
|
|
232
|
+
if skill in (None, "all"):
|
|
233
|
+
requested_skills = None
|
|
234
|
+
else:
|
|
235
|
+
assert skill is not None
|
|
236
|
+
requested_skills = [skill.lower()]
|
|
237
|
+
selected_skill_names = _expand_skill_selection(requested_skills)
|
|
238
|
+
selected_clients = CLIENT_CHOICES if client == "all" else [client or "agents"]
|
|
239
|
+
selected_scope = scope or "project"
|
|
240
|
+
destinations = _resolve_destinations(selected_clients, selected_scope)
|
|
241
|
+
|
|
242
|
+
try:
|
|
243
|
+
installed_count = 0
|
|
244
|
+
for destination in destinations:
|
|
245
|
+
installed_count += install_skills_to_directory(
|
|
246
|
+
destination,
|
|
247
|
+
skill_names=selected_skill_names,
|
|
248
|
+
subdir="",
|
|
249
|
+
force=force,
|
|
250
|
+
)
|
|
251
|
+
except ValueError as exc:
|
|
252
|
+
click.echo(f"✗ {exc}", err=True)
|
|
253
|
+
sys.exit(ExitCodes.INVALID_INPUT)
|
|
254
|
+
except FileExistsError as exc:
|
|
255
|
+
click.echo(f"✗ {exc}", err=True)
|
|
256
|
+
sys.exit(ExitCodes.INVALID_INPUT)
|
|
257
|
+
except FileNotFoundError as exc:
|
|
258
|
+
click.echo(f"✗ {exc}", err=True)
|
|
259
|
+
sys.exit(ExitCodes.GENERAL_ERROR)
|
|
260
|
+
|
|
261
|
+
format_success(
|
|
262
|
+
"Installed bundled AI skills",
|
|
263
|
+
{
|
|
264
|
+
"Skills": ", ".join(selected_skill_names),
|
|
265
|
+
"Destinations": ", ".join(str(path) for path in destinations),
|
|
266
|
+
"Installed": str(installed_count),
|
|
267
|
+
},
|
|
268
|
+
)
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: slcli
|
|
3
|
+
description: >-
|
|
4
|
+
Query and manage NI SystemLink resources using the slcli command-line interface.
|
|
5
|
+
Use when the user asks about test results, assets, systems, work items,
|
|
6
|
+
specifications, webapps, notebooks, dataframes, files, feeds, tags,
|
|
7
|
+
authorization, users, or other SystemLink resource workflows.
|
|
8
|
+
argument-hint: >-
|
|
9
|
+
Describe the SystemLink workflow you want to inspect, automate, scaffold, or
|
|
10
|
+
troubleshoot.
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# SystemLink CLI
|
|
14
|
+
|
|
15
|
+
Use this skill when the task is primarily about `slcli` commands or a
|
|
16
|
+
SystemLink resource workflow that should be driven from the CLI.
|
|
17
|
+
|
|
18
|
+
## When to use it
|
|
19
|
+
|
|
20
|
+
- Querying or managing SystemLink resources through `slcli`
|
|
21
|
+
- Looking up exact command syntax, flags, or JSON output patterns
|
|
22
|
+
- Building command sequences for analysis, provisioning, packaging, or cleanup
|
|
23
|
+
- Troubleshooting CLI behavior, platform gating, or command selection
|
|
24
|
+
|
|
25
|
+
## Reference docs
|
|
26
|
+
|
|
27
|
+
Load only what the current task needs.
|
|
28
|
+
|
|
29
|
+
| Topic | File | When to load |
|
|
30
|
+
| --- | --- | --- |
|
|
31
|
+
| CLI command reference | [commands.md](./references/commands.md) | Looking up command syntax, options, or examples |
|
|
32
|
+
| Datasheet-to-spec workflow | [datasheet-workflow.md](./references/datasheet-workflow.md) | Importing specifications from PDF, CSV, or structured text |
|
|
33
|
+
| Minimal spec import payload | [import-specs.min.json](./references/import-specs.min.json) | Need a bundled create-compatible starter payload or conditions |
|
|
34
|
+
| Spec import helper | [spec_import_helper.py](./scripts/spec_import_helper.py) | Scaffold or validate a datasheet spec import payload |
|
|
35
|
+
| Filtering guide | [filtering.md](./references/filtering.md) | Advanced filters, LINQ syntax, and query composition |
|
|
36
|
+
| Analysis recipes | [analysis-recipes.md](./references/analysis-recipes.md) | Multi-step analysis workflows and reporting patterns |
|
|
37
|
+
| Troubleshooting | [troubleshooting.md](./references/troubleshooting.md) | SSL, workspace IDs, encoding, or scripting pitfalls |
|
|
38
|
+
| Notebook workflow | [notebook/overview.md](./references/notebook/overview.md) | Creating notebooks for SystemLink |
|
|
39
|
+
| Webapp workflow | [webapp/overview.md](./references/webapp/overview.md) | Hosted Angular webapp scaffolding and deployment |
|
|
40
|
+
| Python test workflow | [python-test/overview.md](./references/python-test/overview.md) | Python test app structure and deployment |
|
|
41
|
+
| Job debugging | [job-debugging/overview.md](./references/job-debugging/overview.md) | Salt job triage and recovery |
|
|
42
|
+
| NI package files | [nipkg/overview.md](./references/nipkg/overview.md) | File-package assembly and `nipkg pack` guidance |
|
|
43
|
+
|
|
44
|
+
## Default approach
|
|
45
|
+
|
|
46
|
+
1. Prefer long-form flags in generated commands.
|
|
47
|
+
2. Use `-f json` when the result will be filtered, transformed, or piped into other tools.
|
|
48
|
+
3. Use `--summary --group-by` for aggregation before fetching large raw result sets.
|
|
49
|
+
4. Use convenience filters first, then fall back to `--filter` with `--substitution` for complex queries.
|
|
50
|
+
5. Stay scoped to the user’s requested resource or workflow.
|
|
51
|
+
6. Load deeper references only when the command surface alone is not enough.
|
|
52
|
+
7. Prefer workspace IDs over names in scripted workflows when an endpoint is strict about identity.
|
|
53
|
+
8. Use `make_api_request` from `slcli.utils` for helper scripts so auth, SSL, and error handling stay consistent.
|
|
54
|
+
9. For datasheet imports, default to autonomy when the product or workspace can be resolved unambiguously.
|
|
55
|
+
|
|
56
|
+
## Common command groups
|
|
57
|
+
|
|
58
|
+
| Group | Purpose | Key subcommands |
|
|
59
|
+
| --- | --- | --- |
|
|
60
|
+
| `testmonitor` | Test results and products | `result list/get`, `product list/create/update` |
|
|
61
|
+
| `spec` | Specifications | `list`, `query`, `get`, `create`, `import`, `export` |
|
|
62
|
+
| `asset` | Assets and calibration | `list`, `get`, `summary`, `calibration` |
|
|
63
|
+
| `system` | System fleet | `list`, `get`, `compare`, `summary`, `job` |
|
|
64
|
+
| `tag` | Tag read/write | `list`, `get-value`, `set-value`, `create` |
|
|
65
|
+
| `routine` | Event-action routines | `list`, `create`, `enable/disable` |
|
|
66
|
+
| `comment` | Resource comments | `list`, `add`, `update`, `delete` |
|
|
67
|
+
| `workitem` | Work items and workflows | `list`, `create`, `schedule`, `template`, `workflow` |
|
|
68
|
+
| `file` | File management | `list`, `upload`, `download`, `query`, `watch` |
|
|
69
|
+
| `notebook` | Jupyter notebooks | `manage list/create`, `execute start/sync` |
|
|
70
|
+
| `feed` | Package feeds | `list`, `create`, `package upload` |
|
|
71
|
+
| `customfield` | Dynamic form fields | `list`, `create`, `export`, `edit` |
|
|
72
|
+
| `template` | Test plan templates | `list`, `import`, `export` |
|
|
73
|
+
| `webapp` | Web applications | `init`, `pack`, `publish`, `list` |
|
|
74
|
+
| `config` | Connection profiles | `list`, `use`, `add`, `delete` |
|
|
75
|
+
| `user` | User management | `list`, `get`, `create`, `update` |
|
|
76
|
+
| `auth` | Authorization policies | `policy list/create`, `template list` |
|
|
77
|
+
| `workspace` | Workspaces | `list`, `get` |
|
|
78
|
+
| `skill` | AI skill installation | `install` |
|
|
79
|
+
| `example` | Demo provisioning | `list`, `install`, `delete` |
|