systemlink-cli 1.3.1__tar.gz → 1.4.0__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.0}/PKG-INFO +1 -1
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/pyproject.toml +1 -1
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/_version.py +1 -1
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/skill_click.py +63 -13
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/skills/slcli/SKILL.md +17 -1
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/webapp_click.py +48 -66
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/LICENSE +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/dff-editor/README.md +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/dff-editor/editor.js +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/dff-editor/index.html +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/__init__.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/__main__.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/asset_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/cli_formatters.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/cli_utils.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/comment_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/completion_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/config.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/config_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/dff_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/dff_decorators.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/example_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/example_loader.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/example_provisioner.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/examples/README.md +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/examples/_schema/schema-v1.0.json +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/examples/demo-complete-workflow/README.md +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/examples/demo-complete-workflow/config.yaml +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/examples/demo-test-plans/README.md +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/examples/demo-test-plans/config.yaml +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/examples/exercise-5-1-parametric-insights/README.md +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/examples/exercise-5-1-parametric-insights/config.yaml +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/examples/exercise-7-1-test-plans/README.md +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/examples/exercise-7-1-test-plans/config.yaml +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/examples/spec-compliance-notebooks/README.md +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/examples/spec-compliance-notebooks/config.yaml +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/examples/spec-compliance-notebooks/notebooks/SpecAnalysis_ComplianceCalculation.ipynb +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/examples/spec-compliance-notebooks/notebooks/SpecComplianceCalculation.ipynb +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/examples/spec-compliance-notebooks/notebooks/SpecfileExtractionAndIngestion.ipynb +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/examples/spec-compliance-notebooks/spec_template.xlsx +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/feed_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/file_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/function_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/function_templates.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/main.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/mcp_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/mcp_server.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/notebook_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/platform.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/policy_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/policy_utils.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/profiles.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/response_handlers.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/routine_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/skills/slcli/references/analysis-recipes.md +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/skills/slcli/references/filtering.md +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/skills/systemlink-webapp/SKILL.md +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/skills/systemlink-webapp/references/deployment.md +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/skills/systemlink-webapp/references/nimble-angular.md +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/skills/systemlink-webapp/references/systemlink-services.md +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/ssl_trust.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/system_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/table_utils.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/tag_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/templates_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/testmonitor_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/universal_handlers.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/user_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/utils.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/web_editor.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/workflow_preview.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/workflows_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/workitem_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/workspace_click.py +0 -0
- {systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/workspace_utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "systemlink-cli"
|
|
3
|
-
version = "1.
|
|
3
|
+
version = "1.4.0"
|
|
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" }]
|
|
@@ -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
|
)
|
|
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
|
{systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/examples/demo-complete-workflow/README.md
RENAMED
|
File without changes
|
{systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/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.0}/slcli/examples/exercise-7-1-test-plans/README.md
RENAMED
|
File without changes
|
{systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/examples/exercise-7-1-test-plans/config.yaml
RENAMED
|
File without changes
|
{systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/slcli/examples/spec-compliance-notebooks/README.md
RENAMED
|
File without changes
|
{systemlink_cli-1.3.1 → systemlink_cli-1.4.0}/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.0}/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
|