systemlink-cli 1.3.1__tar.gz → 1.4.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.3.1 → systemlink_cli-1.4.1}/PKG-INFO +1 -1
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/pyproject.toml +6 -2
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/_version.py +1 -1
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/skill_click.py +63 -13
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/skills/slcli/SKILL.md +17 -1
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/webapp_click.py +48 -66
- systemlink_cli-1.3.1/dff-editor/README.md +0 -182
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/LICENSE +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/dff-editor/editor.js +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/dff-editor/index.html +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/__init__.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/__main__.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/asset_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/cli_formatters.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/cli_utils.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/comment_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/completion_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/config.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/config_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/dff_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/dff_decorators.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/example_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/example_loader.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/example_provisioner.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/examples/README.md +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/examples/_schema/schema-v1.0.json +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/examples/demo-complete-workflow/README.md +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/examples/demo-complete-workflow/config.yaml +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/examples/demo-test-plans/README.md +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/examples/demo-test-plans/config.yaml +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/examples/exercise-5-1-parametric-insights/README.md +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/examples/exercise-5-1-parametric-insights/config.yaml +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/examples/exercise-7-1-test-plans/README.md +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/examples/exercise-7-1-test-plans/config.yaml +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/examples/spec-compliance-notebooks/README.md +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/examples/spec-compliance-notebooks/config.yaml +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/examples/spec-compliance-notebooks/notebooks/SpecAnalysis_ComplianceCalculation.ipynb +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/examples/spec-compliance-notebooks/notebooks/SpecComplianceCalculation.ipynb +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/examples/spec-compliance-notebooks/notebooks/SpecfileExtractionAndIngestion.ipynb +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/examples/spec-compliance-notebooks/spec_template.xlsx +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/feed_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/file_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/function_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/function_templates.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/main.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/mcp_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/mcp_server.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/notebook_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/platform.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/policy_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/policy_utils.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/profiles.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/response_handlers.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/routine_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/skills/slcli/references/analysis-recipes.md +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/skills/slcli/references/filtering.md +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/skills/systemlink-webapp/SKILL.md +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/skills/systemlink-webapp/references/deployment.md +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/skills/systemlink-webapp/references/nimble-angular.md +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/skills/systemlink-webapp/references/systemlink-services.md +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/ssl_trust.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/system_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/table_utils.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/tag_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/templates_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/testmonitor_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/universal_handlers.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/user_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/utils.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/web_editor.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/workflow_preview.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/workflows_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/workitem_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/workspace_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/workspace_utils.py +0 -0
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "systemlink-cli"
|
|
3
|
-
version = "1.
|
|
3
|
+
version = "1.4.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
|
-
include = [
|
|
7
|
+
include = [
|
|
8
|
+
{ path = "dff-editor/index.html", format = ["wheel", "sdist"] },
|
|
9
|
+
{ path = "dff-editor/editor.js", format = ["wheel", "sdist"] },
|
|
10
|
+
"slcli/skills/**/*",
|
|
11
|
+
]
|
|
8
12
|
|
|
9
13
|
|
|
10
14
|
[tool.poetry.scripts]
|
|
@@ -13,12 +13,11 @@ from .utils import ExitCodes
|
|
|
13
13
|
SKILL_NAME = "slcli"
|
|
14
14
|
SKILL_CHOICES = ["slcli", "systemlink-webapp"]
|
|
15
15
|
|
|
16
|
-
# Mapping of client name
|
|
16
|
+
# Mapping of client name -> (personal skills dir, project subdir relative to repo root)
|
|
17
17
|
# personal dir uses Path.home() so it's always resolved at call time via _personal_dir().
|
|
18
18
|
_CLIENT_TABLE: Dict[str, Tuple[str, str]] = {
|
|
19
|
-
"
|
|
19
|
+
"agents": ("~/.agents/skills", ".agents/skills"),
|
|
20
20
|
"claude": ("~/.claude/skills", ".claude/skills"),
|
|
21
|
-
"codex": ("~/.agents/skills", ".agents/skills"),
|
|
22
21
|
}
|
|
23
22
|
|
|
24
23
|
CLIENT_CHOICES = list(_CLIENT_TABLE.keys())
|
|
@@ -84,6 +83,54 @@ def _find_bundled_skills_dir() -> Path:
|
|
|
84
83
|
)
|
|
85
84
|
|
|
86
85
|
|
|
86
|
+
# Universal project-scoped skills directory (client-agnostic)
|
|
87
|
+
PROJECT_SKILLS_SUBDIR = ".agents/skills"
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def install_skills_to_directory(
|
|
91
|
+
directory: Path,
|
|
92
|
+
skill_names: Optional[List[str]] = None,
|
|
93
|
+
subdir: str = PROJECT_SKILLS_SUBDIR,
|
|
94
|
+
) -> int:
|
|
95
|
+
"""Install bundled skills into a project directory.
|
|
96
|
+
|
|
97
|
+
Copies skill folders into a skills subdirectory within *directory*.
|
|
98
|
+
The default location (``.agents/skills/``) is the universal convention
|
|
99
|
+
recognized by multiple AI clients.
|
|
100
|
+
|
|
101
|
+
Args:
|
|
102
|
+
directory: Project root to install into.
|
|
103
|
+
skill_names: Skills to install. Defaults to all available skills.
|
|
104
|
+
subdir: Relative subdirectory for skills. Defaults to ``.agents/skills``.
|
|
105
|
+
|
|
106
|
+
Returns:
|
|
107
|
+
Number of skills successfully installed.
|
|
108
|
+
"""
|
|
109
|
+
if skill_names is None:
|
|
110
|
+
skill_names = list(SKILL_CHOICES)
|
|
111
|
+
|
|
112
|
+
try:
|
|
113
|
+
skills_dir = _find_bundled_skills_dir()
|
|
114
|
+
except FileNotFoundError:
|
|
115
|
+
return 0
|
|
116
|
+
|
|
117
|
+
dest_parent = directory / subdir
|
|
118
|
+
installed = 0
|
|
119
|
+
|
|
120
|
+
for name in skill_names:
|
|
121
|
+
source = skills_dir / name
|
|
122
|
+
if not source.exists():
|
|
123
|
+
continue
|
|
124
|
+
dest = dest_parent / name
|
|
125
|
+
dest_parent.mkdir(parents=True, exist_ok=True)
|
|
126
|
+
if dest.exists():
|
|
127
|
+
shutil.rmtree(dest)
|
|
128
|
+
shutil.copytree(source, dest)
|
|
129
|
+
installed += 1
|
|
130
|
+
|
|
131
|
+
return installed
|
|
132
|
+
|
|
133
|
+
|
|
87
134
|
def _resolve_destinations(clients: List[str], scope: str) -> List[Path]:
|
|
88
135
|
"""Build the list of destination skill parent directories.
|
|
89
136
|
|
|
@@ -123,7 +170,7 @@ def register_skill_commands(cli: Any) -> None:
|
|
|
123
170
|
|
|
124
171
|
@cli.group()
|
|
125
172
|
def skill() -> None:
|
|
126
|
-
"""Manage AI agent skills for
|
|
173
|
+
"""Manage AI agent skills for most agents and Claude."""
|
|
127
174
|
|
|
128
175
|
@skill.command(name="install")
|
|
129
176
|
@click.option(
|
|
@@ -136,9 +183,9 @@ def register_skill_commands(cli: Any) -> None:
|
|
|
136
183
|
@click.option(
|
|
137
184
|
"--client",
|
|
138
185
|
"-c",
|
|
139
|
-
type=click.Choice(CLIENT_CHOICES
|
|
186
|
+
type=click.Choice(CLIENT_CHOICES, case_sensitive=False),
|
|
140
187
|
default=None,
|
|
141
|
-
help="AI client to install for (
|
|
188
|
+
help="AI client to install for (agents [most agents] or claude).",
|
|
142
189
|
)
|
|
143
190
|
@click.option(
|
|
144
191
|
"--scope",
|
|
@@ -163,10 +210,10 @@ def register_skill_commands(cli: Any) -> None:
|
|
|
163
210
|
Available skills: slcli, systemlink-webapp.
|
|
164
211
|
Supported clients and their skill locations:
|
|
165
212
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
213
|
+
\b
|
|
214
|
+
agents personal: ~/.agents/skills/ project: .agents/skills/
|
|
215
|
+
(most agents)
|
|
216
|
+
claude personal: ~/.claude/skills/ project: .claude/skills/
|
|
170
217
|
|
|
171
218
|
When options are omitted you will be prompted interactively.
|
|
172
219
|
"""
|
|
@@ -183,8 +230,11 @@ def register_skill_commands(cli: Any) -> None:
|
|
|
183
230
|
if client is None:
|
|
184
231
|
client = questionary.select(
|
|
185
232
|
"Install for which AI client?",
|
|
186
|
-
choices=
|
|
187
|
-
|
|
233
|
+
choices=[
|
|
234
|
+
questionary.Choice("most agents", value="agents"),
|
|
235
|
+
questionary.Choice("claude", value="claude"),
|
|
236
|
+
],
|
|
237
|
+
default="agents",
|
|
188
238
|
).ask()
|
|
189
239
|
if client is None:
|
|
190
240
|
raise click.Abort()
|
|
@@ -200,7 +250,7 @@ def register_skill_commands(cli: Any) -> None:
|
|
|
200
250
|
|
|
201
251
|
# ── resolve skill and client lists ────────────────────────────────────
|
|
202
252
|
skill_names: List[str] = SKILL_CHOICES if skill == "all" else [skill]
|
|
203
|
-
clients: List[str] =
|
|
253
|
+
clients: List[str] = [client]
|
|
204
254
|
|
|
205
255
|
# ── locate source ─────────────────────────────────────────────────────
|
|
206
256
|
try:
|
|
@@ -676,7 +676,23 @@ slcli webapp open <WEBAPP_ID> # Open webapp URL in br
|
|
|
676
676
|
|
|
677
677
|
Templates:
|
|
678
678
|
- `html` (default) — minimal index.html
|
|
679
|
-
- `angular` — Nimble Angular project with PROMPTS.md
|
|
679
|
+
- `angular` — Nimble Angular project with `PROMPTS.md`, `README.md`, and bundled AI skills installed into `.agents/skills/`
|
|
680
|
+
|
|
681
|
+
### skill — AI skill installation
|
|
682
|
+
|
|
683
|
+
Install bundled skills for supported AI clients.
|
|
684
|
+
|
|
685
|
+
```bash
|
|
686
|
+
slcli skill install --skill [slcli|systemlink-webapp|all] --client [agents|claude] --scope [personal|project|both]
|
|
687
|
+
```
|
|
688
|
+
|
|
689
|
+
Client paths:
|
|
690
|
+
- `agents` — personal: `~/.agents/skills/`, project: `.agents/skills/` (most agents)
|
|
691
|
+
- `claude` — personal: `~/.claude/skills/`, project: `.claude/skills/`
|
|
692
|
+
|
|
693
|
+
Notes:
|
|
694
|
+
- `agents` is the default client in interactive mode.
|
|
695
|
+
- `webapp init --template angular` installs project-scoped skills into `.agents/skills/` by default.
|
|
680
696
|
|
|
681
697
|
### example — Built-in example resource provisioning
|
|
682
698
|
|
|
@@ -17,6 +17,7 @@ import questionary
|
|
|
17
17
|
import requests
|
|
18
18
|
|
|
19
19
|
from .cli_utils import validate_output_format
|
|
20
|
+
from .skill_click import install_skills_to_directory
|
|
20
21
|
from .universal_handlers import UniversalResponseHandler
|
|
21
22
|
from .utils import (
|
|
22
23
|
ExitCodes,
|
|
@@ -277,63 +278,59 @@ _ANGULAR_PROMPTS_MD = """\
|
|
|
277
278
|
# SystemLink WebApp — AI Prompts
|
|
278
279
|
|
|
279
280
|
This project was scaffolded with `slcli webapp init --template angular`.
|
|
281
|
+
The **systemlink-webapp** skill has been installed into this project so
|
|
282
|
+
your AI assistant already knows how to build Nimble Angular apps for
|
|
283
|
+
SystemLink — including component choices, API patterns, routing, theming,
|
|
284
|
+
and deployment. Just describe what you want.
|
|
280
285
|
|
|
281
|
-
|
|
282
|
-
Nimble Angular applications for SystemLink. Install it first:
|
|
286
|
+
## Getting Started
|
|
283
287
|
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
288
|
+
Open this project in your editor and describe your app:
|
|
289
|
+
|
|
290
|
+
> "I need a web dashboard for monitoring our production test systems.
|
|
291
|
+
> It should show which systems are online, recent test results, and
|
|
292
|
+
> any assets due for calibration."
|
|
287
293
|
|
|
288
|
-
|
|
294
|
+
Your AI assistant will create the Angular project, install the right
|
|
295
|
+
packages, and build the pages for you.
|
|
289
296
|
|
|
290
|
-
|
|
297
|
+
## Example Prompts
|
|
291
298
|
|
|
292
|
-
|
|
299
|
+
Describe your goals — the skill handles the technical details.
|
|
293
300
|
|
|
294
|
-
|
|
295
|
-
> with automatic theme detection, and a nimble-anchor-tabs layout with
|
|
296
|
-
> Overview and Settings tabs. Use hash routing."
|
|
301
|
+
### Fleet monitoring
|
|
297
302
|
|
|
298
|
-
|
|
303
|
+
> "Build a dashboard that shows all connected systems with their
|
|
304
|
+
> status, operating system, and last check-in time. Highlight any
|
|
305
|
+
> systems that have been offline for more than 24 hours."
|
|
299
306
|
|
|
300
|
-
|
|
301
|
-
> client to fetch connected systems and display them in a nimble-table
|
|
302
|
-
> with columns for alias, state, OS, and last-updated timestamp.
|
|
303
|
-
> Add a nimble-spinner while loading."
|
|
307
|
+
### Test results review
|
|
304
308
|
|
|
305
|
-
|
|
309
|
+
> "Create a page where I can browse recent test results, filter by
|
|
310
|
+
> status (passed, failed, running) and program name, and see a
|
|
311
|
+
> summary of failure rates."
|
|
306
312
|
|
|
307
|
-
|
|
308
|
-
> client to list recent test results in a nimble-table. Add
|
|
309
|
-
> nimble-select filters for status (Passed/Failed/Running) and
|
|
310
|
-
> program name. Show a nimble-banner when there are failures."
|
|
313
|
+
### Asset & calibration tracking
|
|
311
314
|
|
|
312
|
-
|
|
315
|
+
> "Show all tracked assets grouped by calibration status. I want to
|
|
316
|
+
> see which assets are due soon, which are overdue, and be able to
|
|
317
|
+
> click on an asset to see its full details."
|
|
313
318
|
|
|
314
|
-
|
|
315
|
-
> TypeScript client to show assets grouped by calibration status.
|
|
316
|
-
> Use nimble-card components for each status category with counts.
|
|
317
|
-
> Add a nimble-drawer that shows asset details when clicked."
|
|
319
|
+
### Production KPIs
|
|
318
320
|
|
|
319
|
-
|
|
321
|
+
> "Build a dashboard with key metrics: first-pass yield, test
|
|
322
|
+
> throughput per hour, and a trend chart of failures over the last
|
|
323
|
+
> 30 days."
|
|
320
324
|
|
|
321
|
-
|
|
322
|
-
|
|
325
|
+
### Build and deploy
|
|
326
|
+
|
|
327
|
+
> "Build the project for production and deploy it to SystemLink."
|
|
323
328
|
|
|
324
329
|
## Reference
|
|
325
330
|
|
|
326
331
|
- [Nimble Angular components](https://nimble.ni.dev/)
|
|
327
332
|
- [SystemLink TypeScript clients](https://www.npmjs.com/package/@ni/systemlink-clients-ts)
|
|
328
333
|
- [slcli webapp commands](https://ni-kismet.github.io/systemlink-cli/commands.html#webapp)
|
|
329
|
-
|
|
330
|
-
## Build & Deploy
|
|
331
|
-
|
|
332
|
-
```bash
|
|
333
|
-
ng build --configuration production
|
|
334
|
-
slcli webapp publish dist/<project-name>/browser/ \\
|
|
335
|
-
--name "My Dashboard" --workspace Default
|
|
336
|
-
```
|
|
337
334
|
"""
|
|
338
335
|
|
|
339
336
|
_ANGULAR_README_MD = """\
|
|
@@ -345,39 +342,23 @@ A Nimble Angular web application for SystemLink, scaffolded with
|
|
|
345
342
|
## Prerequisites
|
|
346
343
|
|
|
347
344
|
- [Node.js](https://nodejs.org/) 18+ and npm
|
|
348
|
-
- [
|
|
349
|
-
- [slcli](https://ni-kismet.github.io/systemlink-cli/) with AI skills installed
|
|
345
|
+
- [slcli](https://ni-kismet.github.io/systemlink-cli/)
|
|
350
346
|
|
|
351
|
-
##
|
|
347
|
+
## Getting Started
|
|
352
348
|
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
npm install
|
|
349
|
+
Open this directory in your editor and ask your AI assistant to create
|
|
350
|
+
the project — see [PROMPTS.md](PROMPTS.md) for ready-made prompts.
|
|
356
351
|
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
# Build for production
|
|
361
|
-
ng build --configuration production
|
|
362
|
-
```
|
|
352
|
+
The AI skills for SystemLink webapp development are already installed
|
|
353
|
+
in this project directory.
|
|
363
354
|
|
|
364
355
|
## Deploy to SystemLink
|
|
365
356
|
|
|
366
357
|
```bash
|
|
358
|
+
ng build --configuration production
|
|
367
359
|
slcli webapp publish dist/<project-name>/browser/ \\
|
|
368
360
|
--name "My Dashboard" --workspace Default
|
|
369
361
|
```
|
|
370
|
-
|
|
371
|
-
## AI-Assisted Development
|
|
372
|
-
|
|
373
|
-
See [PROMPTS.md](PROMPTS.md) for example prompts to give your AI assistant.
|
|
374
|
-
Install the systemlink-webapp skill first:
|
|
375
|
-
|
|
376
|
-
```bash
|
|
377
|
-
slcli skill install --client all
|
|
378
|
-
```
|
|
379
|
-
|
|
380
|
-
Then ask your assistant to build features using the prompts in PROMPTS.md.
|
|
381
362
|
"""
|
|
382
363
|
|
|
383
364
|
|
|
@@ -404,18 +385,19 @@ def _init_angular_template(directory: Path, force: bool) -> None:
|
|
|
404
385
|
prompts_file.write_text(_ANGULAR_PROMPTS_MD, encoding="utf-8")
|
|
405
386
|
readme_file.write_text(_ANGULAR_README_MD, encoding="utf-8")
|
|
406
387
|
|
|
388
|
+
# Auto-install AI skills into the project directory
|
|
389
|
+
installed = install_skills_to_directory(directory)
|
|
390
|
+
skill_msg = f"{installed} skill(s) installed" if installed else "skills not found"
|
|
391
|
+
|
|
407
392
|
format_success(
|
|
408
393
|
"Scaffolded Nimble Angular project",
|
|
409
394
|
{
|
|
410
395
|
"Directory": str(directory),
|
|
396
|
+
"Skills": skill_msg,
|
|
411
397
|
"Next steps": (
|
|
412
398
|
"1. cd " + str(directory) + "\n"
|
|
413
|
-
" 2.
|
|
414
|
-
" 3.
|
|
415
|
-
" 4. npm install @ni/nimble-angular "
|
|
416
|
-
"@ni/systemlink-clients-ts\n"
|
|
417
|
-
" 5. Install AI skills: slcli skill install --client all\n"
|
|
418
|
-
" 6. Open PROMPTS.md and start building with AI"
|
|
399
|
+
" 2. Open in your editor and ask AI to create the app\n"
|
|
400
|
+
" 3. See PROMPTS.md for example prompts"
|
|
419
401
|
),
|
|
420
402
|
},
|
|
421
403
|
)
|
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
# Custom Fields Editor
|
|
2
|
-
|
|
3
|
-
This directory contains a standalone web editor for SystemLink Custom Fields configurations with a VS Code-like interface.
|
|
4
|
-
|
|
5
|
-
## Files
|
|
6
|
-
|
|
7
|
-
- index.html - The main editor interface
|
|
8
|
-
- editor.js - Editor JavaScript logic
|
|
9
|
-
- README.md - This file
|
|
10
|
-
- index.html.backup - Backup of original simple editor
|
|
11
|
-
|
|
12
|
-
## Usage
|
|
13
|
-
|
|
14
|
-
1. Start the editor server:
|
|
15
|
-
|
|
16
|
-
```bash
|
|
17
|
-
slcli customfield edit --port 8080
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
2. Open your browser to: http://localhost:8080
|
|
21
|
-
|
|
22
|
-
3. Use the visual editor to build and manage your configuration
|
|
23
|
-
|
|
24
|
-
4. Click "Apply to Server" when ready to save
|
|
25
|
-
|
|
26
|
-
## Features
|
|
27
|
-
|
|
28
|
-
### Monaco Editor
|
|
29
|
-
|
|
30
|
-
- Syntax highlighting and IntelliSense for JSON
|
|
31
|
-
- Real-time validation against custom fields schema
|
|
32
|
-
- Auto-formatting (Alt+F) and validate (Alt+V)
|
|
33
|
-
- Find/Replace (Ctrl+F / Ctrl+H)
|
|
34
|
-
- Minimap, dark theme, format on paste/type
|
|
35
|
-
- Auto-save every 30 seconds to local storage
|
|
36
|
-
|
|
37
|
-
### Configuration Tree View
|
|
38
|
-
|
|
39
|
-
- Root configuration, configurations, groups, fields
|
|
40
|
-
- Counts for groups/fields; required field indicator
|
|
41
|
-
- Click to navigate
|
|
42
|
-
|
|
43
|
-
### Add New Items
|
|
44
|
-
|
|
45
|
-
- Add Configuration: name, workspace, resource type, group keys
|
|
46
|
-
- Add Group: key, name, display text, field keys (with duplicate key guard)
|
|
47
|
-
- Add Field: key, name, display text, type, required (with duplicate key guard)
|
|
48
|
-
- Templates with inline help and validation
|
|
49
|
-
|
|
50
|
-
### Validation
|
|
51
|
-
|
|
52
|
-
- JSON syntax correctness
|
|
53
|
-
- Required fields present
|
|
54
|
-
- Unique keys for groups/fields
|
|
55
|
-
- Reference checks (configs → groups, groups → fields)
|
|
56
|
-
- Enum validation (resourceType, fieldType)
|
|
57
|
-
- Schema compliance
|
|
58
|
-
|
|
59
|
-
### Server Integration
|
|
60
|
-
|
|
61
|
-
- **Load from Server**: Fetch configurations by ID or list all configurations
|
|
62
|
-
- **Apply to Server**: Seamlessly creates new or updates existing configurations
|
|
63
|
-
- **New configurations** (no ID): Automatically calls create endpoint and saves returned ID
|
|
64
|
-
- **Existing configurations** (has ID): Updates configuration on server
|
|
65
|
-
- Automatically detects operation type and uses appropriate endpoint
|
|
66
|
-
- **Smart ID tracking**: After creating a config, the ID is saved to metadata and injected into the editor
|
|
67
|
-
- Confirmation dialog before apply with operation-specific messaging
|
|
68
|
-
- Error handling with clear messages
|
|
69
|
-
- Metadata persistence: `.editor-metadata.json` tracks configuration IDs for seamless workflows
|
|
70
|
-
|
|
71
|
-
### Keyboard Shortcuts
|
|
72
|
-
|
|
73
|
-
- Alt+F: Format document
|
|
74
|
-
- Alt+V: Validate document
|
|
75
|
-
- Ctrl/Cmd+S: Save to server
|
|
76
|
-
- Ctrl+F: Find
|
|
77
|
-
- Ctrl+H: Find and replace
|
|
78
|
-
|
|
79
|
-
### Persistence & Safety
|
|
80
|
-
|
|
81
|
-
- Auto-save to localStorage every 30 seconds
|
|
82
|
-
- Auto-recovery prompt for drafts <24h old
|
|
83
|
-
- Unsaved changes warning on navigation
|
|
84
|
-
- Download JSON export
|
|
85
|
-
|
|
86
|
-
### Toolbar Actions
|
|
87
|
-
|
|
88
|
-
- Format, Validate, Load Example, Download JSON, Reset
|
|
89
|
-
|
|
90
|
-
## Configuration Structure
|
|
91
|
-
|
|
92
|
-
### Configurations
|
|
93
|
-
|
|
94
|
-
```json
|
|
95
|
-
{
|
|
96
|
-
"name": "Work Order Configuration",
|
|
97
|
-
"workspace": "workspace-id",
|
|
98
|
-
"resourceType": "workorder:workorder",
|
|
99
|
-
"groupKeys": ["group1", "group2"],
|
|
100
|
-
"properties": {}
|
|
101
|
-
}
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
Resource types: workorder:workorder, workitem:workitem, asset:asset, system:system, testmonitor:product
|
|
105
|
-
|
|
106
|
-
Note: workorder:testplan has been replaced by workitem:workitem to align with the current API.
|
|
107
|
-
|
|
108
|
-
### Groups
|
|
109
|
-
|
|
110
|
-
```json
|
|
111
|
-
{
|
|
112
|
-
"key": "basicInfo",
|
|
113
|
-
"workspace": "workspace-id",
|
|
114
|
-
"name": "Basic Information",
|
|
115
|
-
"displayText": "Basic Information",
|
|
116
|
-
"fieldKeys": ["field1", "field2"],
|
|
117
|
-
"properties": {}
|
|
118
|
-
}
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
### Fields
|
|
122
|
-
|
|
123
|
-
```json
|
|
124
|
-
{
|
|
125
|
-
"key": "deviceId",
|
|
126
|
-
"workspace": "workspace-id",
|
|
127
|
-
"name": "Device ID",
|
|
128
|
-
"displayText": "Device Identifier",
|
|
129
|
-
"fieldType": "STRING",
|
|
130
|
-
"required": true,
|
|
131
|
-
"validation": { "maxLength": 50 },
|
|
132
|
-
"properties": {}
|
|
133
|
-
}
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
Field types: STRING, NUMBER, BOOLEAN, DATE, DATETIME, SELECT, MULTISELECT
|
|
137
|
-
Validation options: STRING (minLength, maxLength, pattern), NUMBER (min, max, step), DATE/DATETIME (min, max), SELECT/MULTISELECT (options)
|
|
138
|
-
|
|
139
|
-
## Example Workflow
|
|
140
|
-
|
|
141
|
-
1. Load example or start empty
|
|
142
|
-
2. Add configuration (resource type)
|
|
143
|
-
3. Add groups
|
|
144
|
-
4. Add fields
|
|
145
|
-
5. Link fields to groups via fieldKeys
|
|
146
|
-
6. Link groups to configuration via groupKeys
|
|
147
|
-
7. Validate
|
|
148
|
-
8. Apply to server (automatically creates new or updates existing configuration)
|
|
149
|
-
9. Configuration ID is saved automatically for future updates
|
|
150
|
-
|
|
151
|
-
## Technical Details
|
|
152
|
-
|
|
153
|
-
- Monaco Editor 0.45.0 via CDN
|
|
154
|
-
- Pure vanilla JS; no build step
|
|
155
|
-
- Uses fetch for API calls; localStorage for drafts
|
|
156
|
-
- Customize `serverUrl`, schema, and templates in editor.js
|
|
157
|
-
- Smart create/update detection based on configuration ID presence
|
|
158
|
-
- Metadata tracking in `.editor-metadata.json` for seamless workflows
|
|
159
|
-
|
|
160
|
-
## Troubleshooting
|
|
161
|
-
|
|
162
|
-
- Editor not loading: check console/CDN access
|
|
163
|
-
- Validation errors: ensure unique keys and valid references
|
|
164
|
-
- Server issues: check port, CORS, network tab
|
|
165
|
-
- Auto-save: ensure localStorage is available
|
|
166
|
-
|
|
167
|
-
## Future Enhancements
|
|
168
|
-
|
|
169
|
-
- Drag-and-drop reordering
|
|
170
|
-
- Visual preview
|
|
171
|
-
- Diff view (local vs server)
|
|
172
|
-
- Undo/redo history
|
|
173
|
-
- Import from file
|
|
174
|
-
- Field/group duplication
|
|
175
|
-
- Bulk operations
|
|
176
|
-
- Search/filter in tree
|
|
177
|
-
- Theme toggle
|
|
178
|
-
- Version history
|
|
179
|
-
|
|
180
|
-
---
|
|
181
|
-
|
|
182
|
-
Version: 2.1 | Updated: January 8, 2026
|
|
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
|
{systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/examples/demo-complete-workflow/README.md
RENAMED
|
File without changes
|
{systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/examples/demo-complete-workflow/config.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/examples/exercise-7-1-test-plans/README.md
RENAMED
|
File without changes
|
{systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/examples/exercise-7-1-test-plans/config.yaml
RENAMED
|
File without changes
|
{systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/examples/spec-compliance-notebooks/README.md
RENAMED
|
File without changes
|
{systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/examples/spec-compliance-notebooks/config.yaml
RENAMED
|
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
|
{systemlink_cli-1.3.1 → systemlink_cli-1.4.1}/slcli/skills/slcli/references/analysis-recipes.md
RENAMED
|
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
|