systemlink-cli 1.4.6__tar.gz → 1.4.8__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.4.6 → systemlink_cli-1.4.8}/PKG-INFO +1 -1
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/pyproject.toml +1 -1
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/_version.py +1 -1
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/skill_click.py +4 -3
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/skills/slcli/SKILL.md +2 -1
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/user_click.py +43 -49
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/LICENSE +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/dff-editor/editor.js +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/dff-editor/index.html +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/__init__.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/__main__.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/asset_click.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/cli_formatters.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/cli_utils.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/comment_click.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/completion_click.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/config.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/config_click.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/dff_click.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/dff_decorators.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/example_click.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/example_loader.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/example_provisioner.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/examples/README.md +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/examples/_schema/schema-v1.0.json +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/examples/demo-complete-workflow/README.md +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/examples/demo-complete-workflow/config.yaml +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/examples/demo-test-plans/README.md +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/examples/demo-test-plans/config.yaml +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/examples/exercise-5-1-parametric-insights/README.md +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/examples/exercise-5-1-parametric-insights/config.yaml +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/examples/exercise-7-1-test-plans/README.md +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/examples/exercise-7-1-test-plans/config.yaml +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/examples/spec-compliance-notebooks/README.md +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/examples/spec-compliance-notebooks/config.yaml +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/examples/spec-compliance-notebooks/notebooks/SpecAnalysis_ComplianceCalculation.ipynb +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/examples/spec-compliance-notebooks/notebooks/SpecComplianceCalculation.ipynb +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/examples/spec-compliance-notebooks/notebooks/SpecfileExtractionAndIngestion.ipynb +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/examples/spec-compliance-notebooks/spec_template.xlsx +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/feed_click.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/file_click.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/function_click.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/function_templates.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/main.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/mcp_click.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/mcp_server.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/notebook_click.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/platform.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/policy_click.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/policy_utils.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/profiles.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/response_handlers.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/routine_click.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/skills/slcli/references/analysis-recipes.md +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/skills/slcli/references/filtering.md +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/skills/systemlink-webapp/SKILL.md +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/skills/systemlink-webapp/references/deployment.md +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/skills/systemlink-webapp/references/nimble-angular.md +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/skills/systemlink-webapp/references/systemlink-services.md +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/ssl_trust.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/system_click.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/table_utils.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/tag_click.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/templates_click.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/testmonitor_click.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/universal_handlers.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/utils.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/web_editor.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/webapp_click.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/workflow_preview.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/workflows_click.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/workitem_click.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/workspace_click.py +0 -0
- {systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/workspace_utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "systemlink-cli"
|
|
3
|
-
version = "1.4.
|
|
3
|
+
version = "1.4.8"
|
|
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" }]
|
|
@@ -183,9 +183,9 @@ def register_skill_commands(cli: Any) -> None:
|
|
|
183
183
|
@click.option(
|
|
184
184
|
"--client",
|
|
185
185
|
"-c",
|
|
186
|
-
type=click.Choice(CLIENT_CHOICES, case_sensitive=False),
|
|
186
|
+
type=click.Choice(CLIENT_CHOICES + ["all"], case_sensitive=False),
|
|
187
187
|
default=None,
|
|
188
|
-
help="AI client to install for (agents [most agents] or
|
|
188
|
+
help="AI client to install for (agents [most agents], claude, or all).",
|
|
189
189
|
)
|
|
190
190
|
@click.option(
|
|
191
191
|
"--scope",
|
|
@@ -233,6 +233,7 @@ def register_skill_commands(cli: Any) -> None:
|
|
|
233
233
|
choices=[
|
|
234
234
|
questionary.Choice("most agents", value="agents"),
|
|
235
235
|
questionary.Choice("claude", value="claude"),
|
|
236
|
+
questionary.Choice("all clients", value="all"),
|
|
236
237
|
],
|
|
237
238
|
default="agents",
|
|
238
239
|
).ask()
|
|
@@ -250,7 +251,7 @@ def register_skill_commands(cli: Any) -> None:
|
|
|
250
251
|
|
|
251
252
|
# ── resolve skill and client lists ────────────────────────────────────
|
|
252
253
|
skill_names: List[str] = SKILL_CHOICES if skill == "all" else [skill]
|
|
253
|
-
clients: List[str] = [client]
|
|
254
|
+
clients: List[str] = CLIENT_CHOICES if client == "all" else [client]
|
|
254
255
|
|
|
255
256
|
# ── locate source ─────────────────────────────────────────────────────
|
|
256
257
|
try:
|
|
@@ -683,12 +683,13 @@ Templates:
|
|
|
683
683
|
Install bundled skills for supported AI clients.
|
|
684
684
|
|
|
685
685
|
```bash
|
|
686
|
-
slcli skill install --skill [slcli|systemlink-webapp|all] --client [agents|claude] --scope [personal|project|both]
|
|
686
|
+
slcli skill install --skill [slcli|systemlink-webapp|all] --client [agents|claude|all] --scope [personal|project|both]
|
|
687
687
|
```
|
|
688
688
|
|
|
689
689
|
Client paths:
|
|
690
690
|
- `agents` — personal: `~/.agents/skills/`, project: `.agents/skills/` (most agents)
|
|
691
691
|
- `claude` — personal: `~/.claude/skills/`, project: `.claude/skills/`
|
|
692
|
+
- `all` — install to both the `agents` and `claude` locations for the selected scope
|
|
692
693
|
|
|
693
694
|
Notes:
|
|
694
695
|
- `agents` is the default client in interactive mode.
|
|
@@ -13,6 +13,7 @@ from uuid import uuid4
|
|
|
13
13
|
|
|
14
14
|
import click
|
|
15
15
|
import questionary
|
|
16
|
+
from click.core import ParameterSource
|
|
16
17
|
|
|
17
18
|
from .cli_utils import paginate_list_output, validate_output_format
|
|
18
19
|
from .utils import (
|
|
@@ -25,6 +26,10 @@ from .utils import (
|
|
|
25
26
|
from .workspace_utils import get_workspace_display_name, resolve_workspace_id
|
|
26
27
|
|
|
27
28
|
|
|
29
|
+
USER_QUERY_PAGE_SIZE = 100
|
|
30
|
+
USER_JSON_DEFAULT_TAKE = 1000
|
|
31
|
+
|
|
32
|
+
|
|
28
33
|
def _get_policy_details(policy_id: str) -> Optional[dict]:
|
|
29
34
|
"""Fetch policy details from the Auth service.
|
|
30
35
|
|
|
@@ -412,6 +417,7 @@ def _query_all_users(
|
|
|
412
417
|
sortby: str = "firstName",
|
|
413
418
|
order: str = "asc",
|
|
414
419
|
include_disabled: bool = False,
|
|
420
|
+
max_items: Optional[int] = None,
|
|
415
421
|
) -> list:
|
|
416
422
|
"""Query all users from the API with server-side pagination using continuation tokens.
|
|
417
423
|
|
|
@@ -430,6 +436,7 @@ def _query_all_users(
|
|
|
430
436
|
sortby: Field to sort by
|
|
431
437
|
order: Sort order ('asc' or 'desc')
|
|
432
438
|
include_disabled: Whether to include disabled users
|
|
439
|
+
max_items: Maximum number of users to return. When omitted, fetches all pages.
|
|
433
440
|
|
|
434
441
|
Returns:
|
|
435
442
|
List of all users
|
|
@@ -437,7 +444,7 @@ def _query_all_users(
|
|
|
437
444
|
url = f"{get_base_url()}/niuser/v1/users/query"
|
|
438
445
|
all_users = []
|
|
439
446
|
continuation_token = None
|
|
440
|
-
|
|
447
|
+
remaining_items = max_items if max_items and max_items > 0 else None
|
|
441
448
|
|
|
442
449
|
# Build the base filter - combine user filter with active status filter if needed
|
|
443
450
|
combined_filter = filter_str
|
|
@@ -451,8 +458,13 @@ def _query_all_users(
|
|
|
451
458
|
combined_filter = active_filter
|
|
452
459
|
|
|
453
460
|
while True:
|
|
461
|
+
request_take = (
|
|
462
|
+
USER_QUERY_PAGE_SIZE
|
|
463
|
+
if remaining_items is None
|
|
464
|
+
else min(USER_QUERY_PAGE_SIZE, remaining_items)
|
|
465
|
+
)
|
|
454
466
|
payload = {
|
|
455
|
-
"take":
|
|
467
|
+
"take": request_take,
|
|
456
468
|
"sortby": sortby,
|
|
457
469
|
"order": "ascending" if order == "asc" else "descending",
|
|
458
470
|
}
|
|
@@ -472,6 +484,11 @@ def _query_all_users(
|
|
|
472
484
|
|
|
473
485
|
all_users.extend(users)
|
|
474
486
|
|
|
487
|
+
if remaining_items is not None:
|
|
488
|
+
remaining_items -= len(users)
|
|
489
|
+
if remaining_items <= 0:
|
|
490
|
+
return all_users[:max_items]
|
|
491
|
+
|
|
475
492
|
# Check for continuation token to get next page
|
|
476
493
|
continuation_token = data.get("continuationToken")
|
|
477
494
|
if not continuation_token:
|
|
@@ -499,8 +516,10 @@ def register_user_commands(cli: click.Group) -> None:
|
|
|
499
516
|
"-t",
|
|
500
517
|
type=int,
|
|
501
518
|
default=25,
|
|
502
|
-
|
|
503
|
-
|
|
519
|
+
help=(
|
|
520
|
+
"Table page size (default 25). JSON returns up to 1000 users by default; "
|
|
521
|
+
"use --take to override."
|
|
522
|
+
),
|
|
504
523
|
)
|
|
505
524
|
@click.option(
|
|
506
525
|
"--format",
|
|
@@ -573,59 +592,34 @@ def register_user_commands(cli: click.Group) -> None:
|
|
|
573
592
|
if user_type != "all":
|
|
574
593
|
type_filter = f'type = "{user_type}"'
|
|
575
594
|
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
if format_output.lower() == "json":
|
|
579
|
-
# Use server-side pagination for JSON output
|
|
580
|
-
url = f"{get_base_url()}/niuser/v1/users/query"
|
|
581
|
-
|
|
582
|
-
# Build the filter - combine search filter with active status filter if needed
|
|
583
|
-
combined_filter = search_filter
|
|
584
|
-
if not include_disabled:
|
|
585
|
-
# Add active status filter to the query using correct Dynamic LINQ syntax
|
|
586
|
-
# Note: User API uses 'status' field with values 'pending' or 'active'
|
|
587
|
-
active_filter = 'status = "active"'
|
|
588
|
-
if combined_filter:
|
|
589
|
-
combined_filter = f"({combined_filter}) and {active_filter}"
|
|
590
|
-
else:
|
|
591
|
-
combined_filter = active_filter
|
|
592
|
-
|
|
593
|
-
# Add type filter
|
|
594
|
-
if type_filter:
|
|
595
|
-
if combined_filter:
|
|
596
|
-
combined_filter = f"({combined_filter}) and {type_filter}"
|
|
597
|
-
else:
|
|
598
|
-
combined_filter = type_filter
|
|
599
|
-
|
|
600
|
-
payload = {
|
|
601
|
-
"take": take,
|
|
602
|
-
"sortby": sortby,
|
|
603
|
-
"order": "ascending" if order == "asc" else "descending",
|
|
604
|
-
}
|
|
605
|
-
|
|
595
|
+
combined_filter = search_filter
|
|
596
|
+
if type_filter:
|
|
606
597
|
if combined_filter:
|
|
607
|
-
|
|
598
|
+
combined_filter = f"({combined_filter}) and {type_filter}"
|
|
599
|
+
else:
|
|
600
|
+
combined_filter = type_filter
|
|
608
601
|
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
602
|
+
if format_output.lower() == "json":
|
|
603
|
+
ctx = click.get_current_context()
|
|
604
|
+
take_source = ctx.get_parameter_source("take")
|
|
605
|
+
json_take = (
|
|
606
|
+
USER_JSON_DEFAULT_TAKE if take_source == ParameterSource.DEFAULT else take
|
|
607
|
+
)
|
|
608
|
+
|
|
609
|
+
users = _query_all_users(
|
|
610
|
+
filter_str=combined_filter,
|
|
611
|
+
sortby=sortby,
|
|
612
|
+
order=order,
|
|
613
|
+
include_disabled=include_disabled,
|
|
614
|
+
max_items=json_take,
|
|
615
|
+
)
|
|
612
616
|
|
|
613
617
|
click.echo(json.dumps(users, indent=2))
|
|
614
618
|
return
|
|
615
619
|
else:
|
|
616
620
|
# For table format, fetch all users for proper client-side pagination
|
|
617
|
-
# Combine filters for table output
|
|
618
|
-
combined_filter_for_table = search_filter
|
|
619
|
-
if type_filter:
|
|
620
|
-
if combined_filter_for_table:
|
|
621
|
-
combined_filter_for_table = (
|
|
622
|
-
f"({combined_filter_for_table}) and {type_filter}"
|
|
623
|
-
)
|
|
624
|
-
else:
|
|
625
|
-
combined_filter_for_table = type_filter
|
|
626
|
-
|
|
627
621
|
all_users = _query_all_users(
|
|
628
|
-
filter_str=
|
|
622
|
+
filter_str=combined_filter,
|
|
629
623
|
sortby=sortby,
|
|
630
624
|
order=order,
|
|
631
625
|
include_disabled=include_disabled,
|
|
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.4.6 → systemlink_cli-1.4.8}/slcli/examples/demo-complete-workflow/README.md
RENAMED
|
File without changes
|
{systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/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.4.6 → systemlink_cli-1.4.8}/slcli/examples/exercise-7-1-test-plans/README.md
RENAMED
|
File without changes
|
{systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/examples/exercise-7-1-test-plans/config.yaml
RENAMED
|
File without changes
|
{systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/slcli/examples/spec-compliance-notebooks/README.md
RENAMED
|
File without changes
|
{systemlink_cli-1.4.6 → systemlink_cli-1.4.8}/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.4.6 → systemlink_cli-1.4.8}/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
|