systemlink-cli 1.29.1__tar.gz → 1.29.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/PKG-INFO +1 -1
  2. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/pyproject.toml +1 -1
  3. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/_version.py +1 -1
  4. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/config_click.py +11 -3
  5. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/platform.py +5 -2
  6. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/SKILL.md +1 -0
  7. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/evals/evals.json +275 -1
  8. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/evals/evals.schema.json +3 -2
  9. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/references/analysis-recipes.md +75 -0
  10. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/references/commands.md +12 -0
  11. systemlink_cli-1.29.3/slcli/skills/slcli/references/domain-concepts.md +106 -0
  12. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/references/filtering.md +37 -0
  13. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/scripts/eval_manifest.py +6 -2
  14. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/scripts/grade_eval_response.py +24 -1
  15. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/tsconfig.json +2 -3
  16. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/LICENSE +0 -0
  17. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/dff-editor/editor.js +0 -0
  18. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/dff-editor/index.html +0 -0
  19. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/__init__.py +0 -0
  20. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/__main__.py +0 -0
  21. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/alarm_click.py +0 -0
  22. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/asset_click.py +0 -0
  23. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/cli_formatters.py +0 -0
  24. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/cli_utils.py +0 -0
  25. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/comment_click.py +0 -0
  26. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/completion_click.py +0 -0
  27. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/config.py +0 -0
  28. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/dataframe_click.py +0 -0
  29. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/dff_click.py +0 -0
  30. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/dff_decorators.py +0 -0
  31. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/example_click.py +0 -0
  32. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/example_loader.py +0 -0
  33. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/example_provisioner.py +0 -0
  34. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/examples/README.md +0 -0
  35. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/examples/_schema/schema-v1.0.json +0 -0
  36. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/examples/demo-data-1/README.md +0 -0
  37. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/examples/demo-data-1/config.yaml +0 -0
  38. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/examples/demo-data-2/README.md +0 -0
  39. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/examples/demo-data-2/config.yaml +0 -0
  40. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/examples/demo-data-3/config.yaml +0 -0
  41. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/examples/demo-data-3/leakage-current-results.json +0 -0
  42. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/examples/demo-data-3/overvoltage-results.json +0 -0
  43. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/examples/demo-data-3/product-xyz-compliance-report.json +0 -0
  44. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/examples/demo-data-3/product-xyz-specification.csv +0 -0
  45. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/examples/demo-data-3/thermal-response-results.json +0 -0
  46. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/examples/exercise-5-1-parametric-insights/README.md +0 -0
  47. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/examples/exercise-5-1-parametric-insights/config.yaml +0 -0
  48. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/examples/exercise-7-1-test-plans/README.md +0 -0
  49. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/examples/exercise-7-1-test-plans/config.yaml +0 -0
  50. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/examples/spec-compliance-notebooks/README.md +0 -0
  51. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/examples/spec-compliance-notebooks/config.yaml +0 -0
  52. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/examples/spec-compliance-notebooks/notebooks/SpecAnalysis_ComplianceCalculation.ipynb +0 -0
  53. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/examples/spec-compliance-notebooks/notebooks/SpecComplianceCalculation.ipynb +0 -0
  54. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/examples/spec-compliance-notebooks/notebooks/SpecfileExtractionAndIngestion.ipynb +0 -0
  55. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/examples/spec-compliance-notebooks/spec_template.xlsx +0 -0
  56. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/feed_click.py +0 -0
  57. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/file_click.py +0 -0
  58. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/function_click.py +0 -0
  59. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/function_templates.py +0 -0
  60. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/main.py +0 -0
  61. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/mcp_click.py +0 -0
  62. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/mcp_reachability.py +0 -0
  63. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/mcp_server.py +0 -0
  64. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/mcp_skills.py +0 -0
  65. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/notebook_click.py +0 -0
  66. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/pkce.py +0 -0
  67. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/policy_click.py +0 -0
  68. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/policy_utils.py +0 -0
  69. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/profiles.py +0 -0
  70. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/response_handlers.py +0 -0
  71. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/rich_output.py +0 -0
  72. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/routine_click.py +0 -0
  73. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skill_click.py +0 -0
  74. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/evals/COPILOT_BATCH_RUN_PROMPT.md +0 -0
  75. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/evals/README.md +0 -0
  76. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/evals/files/spec-import/battery-specs.csv +0 -0
  77. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/evals/files/webapp-package/icon.svg +0 -0
  78. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/evals/files/webapp-package/nipkg.config.json +0 -0
  79. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/evals/files/webapp-package/webapp-content/index.html +0 -0
  80. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/evals/trigger_evals.json +0 -0
  81. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/references/datasheet-workflow.md +0 -0
  82. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/references/example-authoring.md +0 -0
  83. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/references/import-specs.min.json +0 -0
  84. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/references/job-debugging/overview.md +0 -0
  85. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/references/nipkg/overview.md +0 -0
  86. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/references/notebook/interfaces.md +0 -0
  87. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/references/notebook/notebook-patterns.md +0 -0
  88. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/references/notebook/overview.md +0 -0
  89. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/references/python-test/overview.md +0 -0
  90. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/references/routine-examples.md +0 -0
  91. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/references/troubleshooting.md +0 -0
  92. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/references/webapp/angular-ui-packages.md +0 -0
  93. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/references/webapp/deployment.md +0 -0
  94. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/references/webapp/layout-patterns.md +0 -0
  95. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/references/webapp/nimble-angular.md +0 -0
  96. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/references/webapp/overview.md +0 -0
  97. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/references/webapp/systemlink-services.md +0 -0
  98. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/references/webapp/troubleshooting.md +0 -0
  99. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/scripts/benchmark_iteration.py +0 -0
  100. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/scripts/compare_iteration.py +0 -0
  101. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/scripts/grade_iteration.py +0 -0
  102. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/scripts/prepare_eval_prompts.py +0 -0
  103. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/scripts/prepare_eval_workspace.py +0 -0
  104. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/scripts/render_eval_review.py +0 -0
  105. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/skills/slcli/scripts/spec_import_helper.py +0 -0
  106. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/spec_click.py +0 -0
  107. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/ssl_trust.py +0 -0
  108. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/state_click.py +0 -0
  109. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/system_click.py +0 -0
  110. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/system_query_utils.py +0 -0
  111. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/systemlink-logo.svg +0 -0
  112. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/table_utils.py +0 -0
  113. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/tag_click.py +0 -0
  114. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/templates_click.py +0 -0
  115. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/testmonitor_click.py +0 -0
  116. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/universal_handlers.py +0 -0
  117. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/user_click.py +0 -0
  118. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/utils.py +0 -0
  119. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/version_click.py +0 -0
  120. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/web_editor.py +0 -0
  121. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_bootstrap.py +0 -0
  122. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_click.py +0 -0
  123. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/.gitignore +0 -0
  124. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/README.md +0 -0
  125. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/angular.json +0 -0
  126. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/package.json +0 -0
  127. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/scripts/filter-sbom.js +0 -0
  128. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/app-routing.module.ts +0 -0
  129. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/app.component.html +0 -0
  130. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/app.component.scss +0 -0
  131. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/app.component.ts +0 -0
  132. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/app.module.ts +0 -0
  133. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/core/layout/app-shell.component.html +0 -0
  134. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/core/layout/app-shell.component.scss +0 -0
  135. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/core/layout/app-shell.component.ts +0 -0
  136. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/core/state/app-view-state.service.ts +0 -0
  137. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/core/systemlink/systemlink-context.service.ts +0 -0
  138. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/core/systemlink/theme-sync.service.ts +0 -0
  139. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/core/systemlink/webapp-home-data.service.ts +0 -0
  140. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/features/assets/assets-page.component.html +0 -0
  141. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/features/assets/assets-page.component.scss +0 -0
  142. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/features/assets/assets-page.component.ts +0 -0
  143. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/features/datasets/datasets-page.component.html +0 -0
  144. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/features/datasets/datasets-page.component.scss +0 -0
  145. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/features/datasets/datasets-page.component.ts +0 -0
  146. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/features/home/home-page.component.html +0 -0
  147. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/features/home/home-page.component.scss +0 -0
  148. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/features/home/home-page.component.ts +0 -0
  149. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/features/master-detail/master-detail-page.component.html +0 -0
  150. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/features/master-detail/master-detail-page.component.scss +0 -0
  151. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/features/master-detail/master-detail-page.component.ts +0 -0
  152. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/features/operations/operations-page.component.html +0 -0
  153. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/features/operations/operations-page.component.scss +0 -0
  154. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/features/operations/operations-page.component.ts +0 -0
  155. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/features/settings/settings-page.component.html +0 -0
  156. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/features/settings/settings-page.component.scss +0 -0
  157. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/features/settings/settings-page.component.ts +0 -0
  158. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/shared/components/empty-state.component.html +0 -0
  159. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/shared/components/empty-state.component.scss +0 -0
  160. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/shared/components/empty-state.component.ts +0 -0
  161. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/shared/components/error-banner.component.html +0 -0
  162. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/shared/components/error-banner.component.scss +0 -0
  163. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/shared/components/error-banner.component.ts +0 -0
  164. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/shared/components/loading-state.component.html +0 -0
  165. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/shared/components/loading-state.component.scss +0 -0
  166. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/shared/components/loading-state.component.ts +0 -0
  167. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/app/shared/states/view-state.model.ts +0 -0
  168. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/assets/README.md +0 -0
  169. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/index.html +0 -0
  170. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/main.ts +0 -0
  171. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/src/styles.scss +0 -0
  172. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/webapp_templates/angular/blank/tsconfig.app.json +0 -0
  173. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/workflow_preview.py +0 -0
  174. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/workflows_click.py +0 -0
  175. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/workitem_click.py +0 -0
  176. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/workspace_click.py +0 -0
  177. {systemlink_cli-1.29.1 → systemlink_cli-1.29.3}/slcli/workspace_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: systemlink-cli
3
- Version: 1.29.1
3
+ Version: 1.29.3
4
4
  Summary: SystemLink Integrator CLI - cross-platform CLI for SystemLink workflows and templates.
5
5
  License-File: LICENSE
6
6
  Author: Fred Visser
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "systemlink-cli"
3
- version = "1.29.1"
3
+ version = "1.29.3"
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" }]
@@ -1,4 +1,4 @@
1
1
  """Version information for slcli."""
2
2
 
3
3
  # This file is auto-generated. Do not edit manually.
4
- __version__ = "1.29.1"
4
+ __version__ = "1.29.3"
@@ -179,7 +179,10 @@ def _trust_certificate_if_requested(
179
179
 
180
180
  try:
181
181
  save_managed_certificate(certificate)
182
- retry_status = check_service_status(url, credential, auth_scheme=auth_scheme)
182
+ if auth_scheme == "bearer":
183
+ retry_status = check_web_server_auth(url, credential, auth_scheme=auth_scheme)
184
+ else:
185
+ retry_status = check_service_status(url, credential, auth_scheme=auth_scheme)
183
186
  except (OSError, ValueError) as exc:
184
187
  _exit_with_validation_error(
185
188
  f"Could not save the trusted certificate: {exc}. Profile was not saved.",
@@ -303,10 +306,10 @@ def _add_profile_impl(
303
306
 
304
307
  assert isinstance(api_key, str)
305
308
 
306
- # PKCE uses the Web URL for bearer service probes; API-key login uses the API URL.
309
+ # Validate PKCE against the Web Server identity route; API-key login retains API probes.
307
310
  click.echo("Checking server connectivity and services...")
308
311
  if auth_mode == "pkce":
309
- status = check_service_status(web_url, api_key, auth_scheme="bearer")
312
+ status = check_web_server_auth(web_url, api_key, auth_scheme="bearer")
310
313
  else:
311
314
  status = check_service_status(url, api_key)
312
315
 
@@ -321,6 +324,11 @@ def _add_profile_impl(
321
324
  )
322
325
 
323
326
  platform = status["platform"]
327
+ if auth_mode == "pkce":
328
+ platform_status = check_service_status(web_url, api_key, auth_scheme="bearer")
329
+ detected_platform = platform_status.get("platform")
330
+ if detected_platform in (PLATFORM_SLE, PLATFORM_SLS):
331
+ platform = detected_platform
324
332
  services = status.get("services", {})
325
333
 
326
334
  if not status["server_reachable"]:
@@ -200,6 +200,7 @@ def get_platform() -> str:
200
200
  ):
201
201
  pass
202
202
 
203
+ # Priority 3: Stored platform from keyring config (legacy fallback)
203
204
  cfg = _get_keyring_config()
204
205
  if cfg:
205
206
  platform = str(cfg.get("platform", "")).upper()
@@ -438,7 +439,7 @@ def _get_service_status_snapshot(force_refresh: bool = False) -> Optional[Dict[s
438
439
 
439
440
  _, api_url, credential, auth_scheme = api_context
440
441
  if auth_scheme == "bearer":
441
- status = check_service_status(api_url, credential, auth_scheme)
442
+ status = check_web_server_auth(api_url, credential, auth_scheme)
442
443
  else:
443
444
  status = check_service_status(api_url, credential)
444
445
  _save_service_status_snapshot(api_context, status)
@@ -945,7 +946,9 @@ def get_platform_info(skip_health: bool = False) -> Dict[str, Any]:
945
946
  server_reachable = status["server_reachable"]
946
947
  auth_valid = status["auth_valid"]
947
948
  services = status["services"]
948
- platform = status["platform"]
949
+ detected_platform = status.get("platform", PLATFORM_UNKNOWN)
950
+ if detected_platform != PLATFORM_UNKNOWN:
951
+ platform = detected_platform
949
952
  file_query_endpoint = status.get("file_query_endpoint")
950
953
  elasticsearch_available = status.get("elasticsearch_available")
951
954
  system_query_endpoint = status.get("system_query_endpoint")
@@ -36,6 +36,7 @@ Load only what the current task needs.
36
36
  | Datasheet-to-spec workflow | [datasheet-workflow.md](./references/datasheet-workflow.md) | Importing specifications from PDF, CSV, or structured text |
37
37
  | Minimal spec import payload | [import-specs.min.json](./references/import-specs.min.json) | Need a bundled create-compatible starter payload or conditions |
38
38
  | Spec import helper | [spec_import_helper.py](./scripts/spec_import_helper.py) | Scaffold or validate a datasheet spec import payload |
39
+ | Domain concepts | [domain-concepts.md](./references/domain-concepts.md) | Interpreting resource terminology, relationships, identifiers, status intent, or availability |
39
40
  | Filtering guide | [filtering.md](./references/filtering.md) | Advanced filters, LINQ syntax, and query composition |
40
41
  | Analysis recipes | [analysis-recipes.md](./references/analysis-recipes.md) | Multi-step analysis workflows and reporting patterns |
41
42
  | Troubleshooting | [troubleshooting.md](./references/troubleshooting.md) | SSL, workspace IDs, encoding, or scripting pitfalls |
@@ -3,7 +3,7 @@
3
3
  "skill_name": "slcli",
4
4
  "recommended_suites": {
5
5
  "gating": [1, 4, 5, 7, 10],
6
- "regression": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
6
+ "regression": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
7
7
  },
8
8
  "evals": [
9
9
  {
@@ -637,6 +637,280 @@
637
637
  ]
638
638
  }
639
639
  ]
640
+ },
641
+ {
642
+ "id": 12,
643
+ "tags": ["regression", "testmonitor", "status-intent"],
644
+ "prompt": "Show me failed SystemLink tests from the last seven days. Treat every terminal failure outcome as a failure.",
645
+ "expected_output": "Uses one parameterized testmonitor query covering FAILED, ERRORED, and TERMINATED, constrained to results started during the last seven days without matching unrelated statuses.",
646
+ "files": [],
647
+ "expectations": [
648
+ "Uses the testmonitor result list command",
649
+ "Expands broad failure intent to FAILED, ERRORED, and TERMINATED",
650
+ "Uses substitutions rather than interpolating status values",
651
+ "Adds a parameterized startedAt lower bound for the last seven days",
652
+ "Does not implement failure as everything other than PASSED"
653
+ ],
654
+ "grading_rules": [
655
+ {
656
+ "text": "Queries test results",
657
+ "critical": true,
658
+ "positive_control": "slcli testmonitor result list --format json",
659
+ "negative_control": "slcli testmonitor product list --format json",
660
+ "scope": "command",
661
+ "mode": "any_of",
662
+ "patterns": [
663
+ "slcli\\s+testmonitor\\s+result\\s+list"
664
+ ]
665
+ },
666
+ {
667
+ "text": "Includes all terminal failure statuses",
668
+ "critical": true,
669
+ "positive_control": "slcli testmonitor result list --filter 'status.statusType == @0 or status.statusType == @1 or status.statusType == @2' --substitution FAILED --substitution ERRORED --substitution TERMINATED",
670
+ "negative_control": "slcli testmonitor result list --status FAILED",
671
+ "scope": "command",
672
+ "mode": "all_of",
673
+ "patterns": [
674
+ "--substitution\\s+FAILED",
675
+ "--substitution\\s+ERRORED",
676
+ "--substitution\\s+TERMINATED",
677
+ "--filter\\s+[^\\n]*status\\.statusType\\s*==\\s*@0",
678
+ "--filter\\s+[^\\n]*status\\.statusType\\s*==\\s*@1",
679
+ "--filter\\s+[^\\n]*status\\.statusType\\s*==\\s*@2"
680
+ ]
681
+ },
682
+ {
683
+ "text": "Avoids not-passed filtering",
684
+ "critical": true,
685
+ "positive_control": "slcli testmonitor result list --filter 'status.statusType == @0' --substitution FAILED",
686
+ "negative_control": "slcli testmonitor result list --filter 'status.statusType != @0' --substitution PASSED",
687
+ "scope": "command",
688
+ "mode": "none_of",
689
+ "patterns": [
690
+ "status\\.statusType\\s*!=",
691
+ "NOT\\s+PASSED"
692
+ ]
693
+ },
694
+ {
695
+ "text": "Constrains results to the last seven days",
696
+ "critical": true,
697
+ "positive_control": "slcli testmonitor result list --filter '(status.statusType == @0 or status.statusType == @1 or status.statusType == @2) and startedAt >= @3' --substitution FAILED --substitution ERRORED --substitution TERMINATED --substitution 2026-09-10T00:00:00Z",
698
+ "negative_control": "slcli testmonitor result list --filter 'status.statusType == @0 or status.statusType == @1 or status.statusType == @2' --substitution FAILED --substitution ERRORED --substitution TERMINATED",
699
+ "scope": "command",
700
+ "mode": "all_of",
701
+ "validator": "last_n_days",
702
+ "days": 7,
703
+ "control_reference_date": "2026-09-17",
704
+ "patterns": [
705
+ "startedAt\\s*>=\\s*@\\d+",
706
+ "--substitution\\s+\\d{4}-\\d{2}-\\d{2}T00:00:00Z"
707
+ ]
708
+ }
709
+ ]
710
+ },
711
+ {
712
+ "id": 13,
713
+ "tags": ["regression", "packages", "routing"],
714
+ "prompt": "Show the commands to check packages available in feed FEED-1, packages installed on system SYS-1, and packages declared by desired state STATE-1.",
715
+ "expected_output": "Routes repository availability, observed installation, and desired-state membership to three distinct slcli command surfaces.",
716
+ "files": [],
717
+ "expectations": [
718
+ "Uses feed package list for available packages",
719
+ "Uses system details with installed packages for observed installation",
720
+ "Uses state details for desired packages",
721
+ "Does not imply that any one package view proves another"
722
+ ],
723
+ "grading_rules": [
724
+ {
725
+ "text": "Queries available feed packages",
726
+ "critical": true,
727
+ "positive_control": "slcli feed package list --feed-id FEED-1 --format json",
728
+ "negative_control": "slcli feed list --format json",
729
+ "scope": "command",
730
+ "mode": "all_of",
731
+ "patterns": [
732
+ "slcli\\s+feed\\s+package\\s+list",
733
+ "--feed-id\\s+FEED-1"
734
+ ]
735
+ },
736
+ {
737
+ "text": "Queries installed system packages",
738
+ "critical": true,
739
+ "positive_control": "slcli system get SYS-1 --include-packages --format json",
740
+ "negative_control": "slcli system get SYS-1 --format json",
741
+ "scope": "command",
742
+ "mode": "all_of",
743
+ "patterns": [
744
+ "slcli\\s+system\\s+get\\s+SYS-1",
745
+ "--include-packages"
746
+ ]
747
+ },
748
+ {
749
+ "text": "Queries desired-state packages",
750
+ "critical": true,
751
+ "positive_control": "slcli state get STATE-1 --format json",
752
+ "negative_control": "slcli state list --format json",
753
+ "scope": "command",
754
+ "mode": "any_of",
755
+ "patterns": [
756
+ "slcli\\s+state\\s+get\\s+STATE-1"
757
+ ]
758
+ },
759
+ {
760
+ "text": "Keeps package views independent",
761
+ "critical": true,
762
+ "positive_control": "slcli feed package list --feed-id FEED-1 --format json\nslcli system get SYS-1 --include-packages --format json\nslcli state get STATE-1 --format json\nThese are independent facts; do not infer one from another.",
763
+ "negative_control": "slcli feed package list --feed-id FEED-1 --format json\nslcli system get SYS-1 --include-packages --format json\nslcli state get STATE-1 --format json",
764
+ "scope": "response",
765
+ "mode": "all_of",
766
+ "patterns": [
767
+ "independent facts",
768
+ "do not infer"
769
+ ]
770
+ }
771
+ ]
772
+ },
773
+ {
774
+ "id": 14,
775
+ "tags": ["regression", "systems", "health"],
776
+ "prompt": "Check the current health of SystemLink system SYS-1, including current health signals and active alarm instances.",
777
+ "expected_output": "Combines system state, active alarm instances, and current CPU, memory, and disk health-tag values without inventing thresholds or claiming that an empty instance query means no alarm rule is configured.",
778
+ "files": [],
779
+ "expectations": [
780
+ "Retrieves system details and active alarm instances",
781
+ "Reads the three standard current health tags",
782
+ "Treats missing or stale evidence as an incomplete health conclusion",
783
+ "Does not invent utilization thresholds"
784
+ ],
785
+ "grading_rules": [
786
+ {
787
+ "text": "Includes system and alarm state",
788
+ "critical": true,
789
+ "positive_control": "slcli system get SYS-1 --include-alarms --format json",
790
+ "negative_control": "slcli system get SYS-1 --format json",
791
+ "scope": "command",
792
+ "mode": "all_of",
793
+ "patterns": [
794
+ "slcli\\s+system\\s+get\\s+SYS-1",
795
+ "--include-(?:alarms|all)"
796
+ ]
797
+ },
798
+ {
799
+ "text": "Reads CPU, memory, and disk health tags",
800
+ "critical": true,
801
+ "positive_control": "slcli tag get-value SYS-1.Health.CPU.MeanUsePercentage\nslcli tag get-value SYS-1.Health.Memory.UsePercentage\nslcli tag get-value SYS-1.Health.Disk.UsePercentage",
802
+ "negative_control": "slcli tag get-value SYS-1.Health.CPU.MeanUsePercentage",
803
+ "scope": "commands",
804
+ "mode": "all_of",
805
+ "patterns": [
806
+ "SYS-1\\.Health\\.CPU\\.MeanUsePercentage",
807
+ "SYS-1\\.Health\\.Memory\\.UsePercentage",
808
+ "SYS-1\\.Health\\.Disk\\.UsePercentage"
809
+ ]
810
+ },
811
+ {
812
+ "text": "Treats incomplete evidence as inconclusive",
813
+ "critical": true,
814
+ "positive_control": "slcli system get SYS-1 --include-alarms --format json\nslcli tag get-value SYS-1.Health.CPU.MeanUsePercentage\nMissing or stale evidence makes the health conclusion incomplete.",
815
+ "negative_control": "slcli system get SYS-1 --include-alarms --format json\nslcli tag get-value SYS-1.Health.CPU.MeanUsePercentage",
816
+ "scope": "response",
817
+ "mode": "any_of",
818
+ "patterns": [
819
+ "(?:missing|stale).{0,80}(?:incomplete|insufficient|cannot|can't|not definitive)"
820
+ ]
821
+ },
822
+ {
823
+ "text": "Does not invent utilization thresholds",
824
+ "critical": true,
825
+ "positive_control": "slcli system get SYS-1 --include-alarms --format json\nslcli tag get-value SYS-1.Health.CPU.MeanUsePercentage",
826
+ "negative_control": "slcli system get SYS-1 --include-alarms --format json\nCPU above 80% means the system is unhealthy.",
827
+ "scope": "response",
828
+ "mode": "none_of",
829
+ "patterns": [
830
+ "(?:cpu|memory|disk|utilization|usage).{0,50}(?:above|below|greater than|less than|[<>]\\s*\\d+%?)"
831
+ ]
832
+ }
833
+ ]
834
+ },
835
+ {
836
+ "id": 15,
837
+ "tags": ["regression", "files", "relationships"],
838
+ "prompt": "Find files attached to SystemLink system SYS-1 in workspace WORKSPACE-1. SYS-1 is the exact system ID.",
839
+ "expected_output": "Lists files in the resolved workspace and filters the system-reference property locally rather than treating the system ID as a file ID.",
840
+ "files": [],
841
+ "expectations": [
842
+ "Uses the file list command with the resolved workspace",
843
+ "Filters properties.minionId with the supplied system ID",
844
+ "Does not use SYS-1 as a file ID"
845
+ ],
846
+ "grading_rules": [
847
+ {
848
+ "text": "Queries the system file-reference property",
849
+ "critical": true,
850
+ "positive_control": "slcli file list --workspace WORKSPACE-1 --take 1000 --format json | jq --arg system_id SYS-1 '[.[] | select(.properties.minionId == $system_id)]'",
851
+ "negative_control": "slcli file list --workspace WORKSPACE-1 --id-filter SYS-1 --format json",
852
+ "scope": "response",
853
+ "mode": "all_of",
854
+ "patterns": [
855
+ "slcli\\s+file\\s+list",
856
+ "--workspace\\s+WORKSPACE-1",
857
+ "properties\\.minionId[^\\n]*system_id"
858
+ ]
859
+ },
860
+ {
861
+ "text": "Does not treat the system ID as a file ID",
862
+ "critical": true,
863
+ "positive_control": "select(.properties.minionId == $system_id)",
864
+ "negative_control": "select(.id == $system_id)",
865
+ "scope": "response",
866
+ "mode": "none_of",
867
+ "patterns": [
868
+ "select\\(\\.id\\s*=="
869
+ ]
870
+ }
871
+ ]
872
+ },
873
+ {
874
+ "id": 16,
875
+ "tags": ["regression", "assets", "instrument-intent"],
876
+ "prompt": "Show me all connected DMM instruments in SystemLink.",
877
+ "expected_output": "Uses the connected asset inventory query as a 40xx candidate search, then verifies that returned model names contain a standalone 40xx family before presenting them as DMMs.",
878
+ "files": [],
879
+ "expectations": [
880
+ "Uses the asset list command",
881
+ "Maps DMM to the 40xx model family",
882
+ "Limits results to connected assets",
883
+ "Verifies the returned model names match the standalone 40xx family"
884
+ ],
885
+ "grading_rules": [
886
+ {
887
+ "text": "Queries connected assets",
888
+ "critical": true,
889
+ "positive_control": "slcli asset list --model 40 --connected --format json",
890
+ "negative_control": "slcli system list --has-package DAQmx --format json",
891
+ "scope": "command",
892
+ "mode": "all_of",
893
+ "patterns": [
894
+ "slcli\\s+asset\\s+list",
895
+ "--connected"
896
+ ]
897
+ },
898
+ {
899
+ "text": "Maps DMM to the 40xx model family",
900
+ "critical": true,
901
+ "positive_control": "slcli asset list --model 40 --connected --format json | jq '[.[] | select(.modelName | test(\"(^|[^0-9])40[0-9]{2}([^0-9]|$)\"))]'",
902
+ "negative_control": "slcli asset list --model DMM --connected",
903
+ "scope": "response",
904
+ "mode": "all_of",
905
+ "patterns": [
906
+ "--model\\s+40",
907
+ "jq\\s+",
908
+ "test\\(\\\"",
909
+ "40\\[0-9\\]\\{2\\}",
910
+ "\\[\\^0-9\\]"
911
+ ]
912
+ }
913
+ ]
640
914
  }
641
915
  ]
642
916
  }
@@ -37,8 +37,9 @@
37
37
  "critical": {"type": "boolean"},
38
38
  "positive_control": {"type": "string", "minLength": 1},
39
39
  "negative_control": {"type": "string", "minLength": 1},
40
- "scope": {"enum": ["response", "command"]},
41
- "validator": {"enum": ["previous_calendar_month"]},
40
+ "scope": {"enum": ["response", "command", "commands"]},
41
+ "validator": {"enum": ["previous_calendar_month", "last_n_days"]},
42
+ "days": {"type": "integer", "minimum": 1},
42
43
  "control_reference_date": {"type": "string", "format": "date"},
43
44
  "mode": {"enum": ["all_of", "any_of", "none_of"]},
44
45
  "patterns": {"type": "array", "minItems": 1, "items": {"type": "string"}}
@@ -17,6 +17,7 @@ Each recipe maps to a real-world scenario and shows the exact commands needed.
17
17
  - [Recipe 9: Product family workload distribution](#recipe-9-product-family-workload-distribution)
18
18
  - [Recipe 10: Environmental condition failure patterns](#recipe-10-environmental-condition-failure-patterns)
19
19
  - [Recipe 11: Create and schedule a work item on a specific fixture/slot and system](#recipe-11-create-and-schedule-a-work-item-on-a-specific-fixtureslot-and-system)
20
+ - [Recipe 12: Find files attached to a resource](#recipe-12-find-files-attached-to-a-resource)
20
21
  - [Product discovery and overview](#product-discovery-and-overview)
21
22
  - [General tips](#general-tips)
22
23
 
@@ -260,6 +261,15 @@ slcli system get <SYSTEM_ID> --include-all -t 5 --workitem-days 60
260
261
  # Machine-readable JSON — all sections embedded
261
262
  slcli system get <SYSTEM_ID> --include-all -f json
262
263
 
264
+ # Read the three current health signals. Tag paths use the system/minion ID.
265
+ # Use the workspace resolved for this system, not only the active profile workspace.
266
+ slcli tag get-value '<SYSTEM_ID>.Health.CPU.MeanUsePercentage' \
267
+ --workspace "$WORKSPACE_ID" -f json
268
+ slcli tag get-value '<SYSTEM_ID>.Health.Memory.UsePercentage' \
269
+ --workspace "$WORKSPACE_ID" -f json
270
+ slcli tag get-value '<SYSTEM_ID>.Health.Disk.UsePercentage' \
271
+ --workspace "$WORKSPACE_ID" -f json
272
+
263
273
  # Extract just the active alarms
264
274
  slcli system get <SYSTEM_ID> --include-alarms -f json | jq '._alarms.items'
265
275
 
@@ -287,6 +297,13 @@ slcli system list --state CONNECTED -f json --take 200 | \
287
297
  > If a service is unavailable, `"error"` contains the error message and the
288
298
  > other sections still render normally.
289
299
 
300
+ Report connection state, the three values and their timestamps, and active alarm
301
+ instances together. `--include-alarms` does not enumerate configured alarm
302
+ rules, so an empty instance query does not prove that no rule is configured.
303
+ Missing or stale metrics make the health conclusion incomplete. Report raw
304
+ values and active alarm instances; do not invent CPU, memory, or disk
305
+ thresholds.
306
+
290
307
  ---
291
308
 
292
309
  ## Recipe 5: Product yield analysis
@@ -561,6 +578,64 @@ slcli workitem schedule wi-12345 \
561
578
 
562
579
  ---
563
580
 
581
+ ## Recipe 12: Find files attached to a resource
582
+
583
+ **Question:** Which files are attached to this system, asset, product, work
584
+ item, or test result?
585
+
586
+ First resolve one canonical resource. File associations then follow one of two
587
+ directions.
588
+
589
+ Resolve the resource's workspace first and retain it as `WORKSPACE_ID` for every
590
+ file command below.
591
+
592
+ **The file references the resource:**
593
+
594
+ ```bash
595
+ # Systems use a property containing the system/minion ID. List the workspace
596
+ # and apply the property filter locally so the workflow also works when the
597
+ # search-files endpoint is unavailable.
598
+ slcli file list --workspace "$WORKSPACE_ID" --take 1000 --format json | \
599
+ jq --arg system_id "<SYSTEM_ID>" \
600
+ '[.[] | select(.properties.minionId == $system_id)]'
601
+ ```
602
+
603
+ **The resource contains file IDs:**
604
+
605
+ ```bash
606
+ # Retrieve the resource and retain its fileIds field.
607
+ slcli asset get <ASSET_ID> --format json
608
+ slcli testmonitor product get <PRODUCT_ID> --format json
609
+ slcli testmonitor result get <RESULT_ID> --format json
610
+ slcli workitem get <WORK_ITEM_ID> --format json
611
+
612
+ # Query the returned IDs together with the portable ID filter.
613
+ slcli file list \
614
+ --workspace "$WORKSPACE_ID" \
615
+ --id-filter "<FILE_ID_1>,<FILE_ID_2>" \
616
+ --format json
617
+ ```
618
+
619
+ Some work items also have files whose properties contain the work-item ID.
620
+ Combine both association directions when the resource data exposes template
621
+ file IDs:
622
+
623
+ ```bash
624
+ slcli file list --workspace "$WORKSPACE_ID" --take 1000 --format json | \
625
+ jq --arg work_item_id "<WORK_ITEM_ID>" \
626
+ --arg template_file_id "<TEMPLATE_FILE_ID>" \
627
+ '[.[] | select(
628
+ .properties.workItemId == $work_item_id or .id == $template_file_id
629
+ )]'
630
+ ```
631
+
632
+ An empty `fileIds` field proves only that the resource does not reference files
633
+ in that direction. Never substitute the resource ID where a file ID is
634
+ required. Increase the bounded workspace listing when the workspace contains
635
+ more than 1000 files.
636
+
637
+ ---
638
+
564
639
  ## General tips
565
640
 
566
641
  - **Start with `--summary`** to understand data shape before fetching raw records.
@@ -341,6 +341,9 @@ slcli state list [OPTIONS]
341
341
  # Get state details
342
342
  slcli state get <STATE_ID> [-f json]
343
343
 
344
+ # `state list` is for discovery metadata. Use `state get` to inspect the full
345
+ # desired configuration, including packages, feeds, and system image details.
346
+
344
347
  # Create or update a package/feed-defined state
345
348
  slcli state create --name TEXT --distribution CHOICE --architecture CHOICE [OPTIONS]
346
349
  --workspace, -w TEXT
@@ -748,6 +751,15 @@ slcli auth template delete <TEMPLATE_ID>
748
751
  Manage package repository feeds used to install software on test systems.
749
752
  Supports Windows (.nipkg) and NI Linux RT (.ipk/.deb).
750
753
 
754
+ Choose the package view that matches the user's intent:
755
+
756
+ - Available from a repository: `slcli feed package list --feed-id <FEED_ID>`
757
+ - Installed on one managed system: `slcli system get <SYSTEM_ID> --include-packages`
758
+ - Declared in a desired configuration: `slcli state get <STATE_ID>`
759
+
760
+ Feed availability, observed installation, and desired-state membership are
761
+ independent facts. Do not infer one from another.
762
+
751
763
  ```bash
752
764
  slcli feed list [-w WORKSPACE] [-t INT] [-f json]
753
765
  slcli feed get --id FEED_ID [-f json]
@@ -0,0 +1,106 @@
1
+ # SystemLink Domain Concepts
2
+
3
+ Use these concepts to translate user language into the correct resource and
4
+ identifier before choosing commands. Consult the command and filtering
5
+ references for supported syntax.
6
+
7
+ ## Resource identity and scope
8
+
9
+ - A workspace is a data-isolation boundary. Every resource belongs to one
10
+ workspace. Resolve workspace names to IDs before scripted workflows.
11
+ - Resource IDs are not display names. Resolve names, aliases, part numbers,
12
+ serial numbers, or email addresses before passing an ID to another command.
13
+ - A system is a managed physical or virtual target. Systems Management owns
14
+ connection, operating-system, package, and remote-management data.
15
+ - An asset is physical inventory such as an instrument, fixture, controller,
16
+ or device under test. Asset Management owns the instruments assigned to a
17
+ system.
18
+
19
+ ## Assets and systems
20
+
21
+ - In hardware questions, treat "asset", "device", and "instrument" as asset
22
+ inventory. Treat DMM and device aliases as asset classes. Treat DAQmx as
23
+ software/package data, including when the user asks about its installation,
24
+ capabilities, or version.
25
+ - Asset types are `GENERIC`, `DEVICE_UNDER_TEST`, `FIXTURE`, and `SYSTEM`.
26
+ Fixtures are also called slots in scheduling workflows. A DUT or UUT is a
27
+ `DEVICE_UNDER_TEST` asset associated with a product part number.
28
+ - An asset can be directly located in a physical location or in a system by
29
+ slot. Its system reference is the system's minion ID, not its alias.
30
+ - "Connected asset" means the asset is present and its owning system is
31
+ connected. Connection does not prove that the asset or system is available
32
+ for scheduling.
33
+
34
+ Common NI instrument model families:
35
+
36
+ | User intent | Model families |
37
+ | --- | --- |
38
+ | DMM or digital multimeter | standalone 40xx family |
39
+ | SMU or power supply | 41xx |
40
+ | Oscilloscope or scope | 51xx, 59xx |
41
+ | Waveform, signal, or function generator | 54xx |
42
+ | Switch | 25xx, 27xx |
43
+ | Analog-input DAQ | 43xx, 44xx |
44
+ | Multifunction DAQ | 60xx, 63xx |
45
+ | Digital I/O | 65xx |
46
+
47
+ NI model names commonly contain a hyphen before the family, such as
48
+ `NI PXIe-5422`. Prefer the `asset list --model` convenience filter; use an
49
+ Asset API expression only when the convenience filter cannot express the
50
+ request. Because `--model` is a contains match, use it as a candidate
51
+ prefilter for a model family and verify the returned names before treating
52
+ every result as that instrument class. For example, keep only model names
53
+ containing a standalone 40xx family when answering an all-DMM query:
54
+
55
+ ```bash
56
+ slcli asset list --model 40 --connected --format json | \
57
+ jq '[.[] | select(.modelName | test("(^|[^0-9])40[0-9]{2}([^0-9]|$)"))]'
58
+ ```
59
+
60
+ ## Test data
61
+
62
+ - A product represents the item being tested and is identified by part number.
63
+ - A specification defines expected limits or a functional expectation for a
64
+ product. A test result records one execution. Test steps contain the
65
+ measurements and nested sequences for that execution.
66
+ - Query result summaries before retrieving steps unless a result ID is already
67
+ known. Inspect steps to explain why one result passed or failed.
68
+ - "Failed tests" includes `FAILED`, `ERRORED`, and `TERMINATED` unless the user
69
+ names a narrower status. It does not automatically include `TIMEDOUT`,
70
+ `SKIPPED`, `CUSTOM`, or active states.
71
+
72
+ ## Alarms and tags
73
+
74
+ - An alarm instance proves that a monitored condition triggered; an empty
75
+ instance query does not prove that no alarm rule is configured.
76
+ - An alarm becomes inactive only after it is cleared and acknowledged. Cleared
77
+ alarms have severity `-1`; higher nonnegative severity is more severe.
78
+ - System health requires connection state, current health-tag values, and alarm
79
+ state together. Missing or stale evidence prevents a definitive healthy
80
+ conclusion.
81
+ - System tag paths begin with the minion ID. Common health paths end in
82
+ `.Health.CPU.MeanUsePercentage`, `.Health.Memory.UsePercentage`, and
83
+ `.Health.Disk.UsePercentage`.
84
+
85
+ ## Work items and users
86
+
87
+ - A work item describes test or maintenance work, assignment, schedule, target
88
+ product, and reserved resources. Use the `slcli workitem` command group for
89
+ work-item discovery, creation, scheduling, and lifecycle operations.
90
+ - "Free" means no scheduled work item overlaps the requested interval. It does
91
+ not mean connected, present, or unlocked.
92
+ - Fields such as `assignedTo`, `requestedBy`, `createdBy`, and `updatedBy`
93
+ contain user IDs. Resolve a supplied name, email, or login before filtering
94
+ or assigning work.
95
+
96
+ ## Files
97
+
98
+ Files are separate resources. Associations use either direction:
99
+
100
+ - A resource can store file IDs, such as `fileIds` on assets, products, and
101
+ test results. Retrieve the resource first, then query those file IDs.
102
+ - A file can reference its owner through properties, such as
103
+ `properties.minionId` for a system.
104
+
105
+ Never use a resource ID as a file ID unless the resource data explicitly
106
+ contains that same value as a file reference.