systemlink-cli 1.20.0__tar.gz → 1.21.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.
Files changed (153) hide show
  1. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/PKG-INFO +1 -1
  2. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/pyproject.toml +1 -1
  3. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/_version.py +1 -1
  4. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/example_click.py +77 -9
  5. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/example_loader.py +5 -0
  6. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/example_provisioner.py +1193 -159
  7. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/examples/README.md +41 -8
  8. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/examples/_schema/schema-v1.0.json +7 -1
  9. {systemlink_cli-1.20.0/slcli/examples/demo-complete-workflow → systemlink_cli-1.21.0/slcli/examples/demo-data-1}/README.md +9 -9
  10. {systemlink_cli-1.20.0/slcli/examples/demo-complete-workflow → systemlink_cli-1.21.0/slcli/examples/demo-data-1}/config.yaml +27 -27
  11. {systemlink_cli-1.20.0/slcli/examples/demo-test-plans → systemlink_cli-1.21.0/slcli/examples/demo-data-2}/README.md +7 -7
  12. {systemlink_cli-1.20.0/slcli/examples/demo-test-plans → systemlink_cli-1.21.0/slcli/examples/demo-data-2}/config.yaml +1 -1
  13. systemlink_cli-1.21.0/slcli/examples/demo-data-3/config.yaml +870 -0
  14. systemlink_cli-1.21.0/slcli/examples/demo-data-3/leakage-current-results.json +28 -0
  15. systemlink_cli-1.21.0/slcli/examples/demo-data-3/overvoltage-results.json +29 -0
  16. systemlink_cli-1.21.0/slcli/examples/demo-data-3/product-xyz-compliance-report.json +46 -0
  17. systemlink_cli-1.21.0/slcli/examples/demo-data-3/product-xyz-specification.csv +6 -0
  18. systemlink_cli-1.21.0/slcli/examples/demo-data-3/thermal-response-results.json +27 -0
  19. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/utils.py +1 -1
  20. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/LICENSE +0 -0
  21. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/dff-editor/editor.js +0 -0
  22. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/dff-editor/index.html +0 -0
  23. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/__init__.py +0 -0
  24. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/__main__.py +0 -0
  25. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/alarm_click.py +0 -0
  26. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/asset_click.py +0 -0
  27. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/cli_formatters.py +0 -0
  28. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/cli_utils.py +0 -0
  29. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/comment_click.py +0 -0
  30. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/completion_click.py +0 -0
  31. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/config.py +0 -0
  32. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/config_click.py +0 -0
  33. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/dataframe_click.py +0 -0
  34. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/dff_click.py +0 -0
  35. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/dff_decorators.py +0 -0
  36. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/examples/exercise-5-1-parametric-insights/README.md +0 -0
  37. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/examples/exercise-5-1-parametric-insights/config.yaml +0 -0
  38. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/examples/exercise-7-1-test-plans/README.md +0 -0
  39. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/examples/exercise-7-1-test-plans/config.yaml +0 -0
  40. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/examples/spec-compliance-notebooks/README.md +0 -0
  41. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/examples/spec-compliance-notebooks/config.yaml +0 -0
  42. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/examples/spec-compliance-notebooks/notebooks/SpecAnalysis_ComplianceCalculation.ipynb +0 -0
  43. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/examples/spec-compliance-notebooks/notebooks/SpecComplianceCalculation.ipynb +0 -0
  44. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/examples/spec-compliance-notebooks/notebooks/SpecfileExtractionAndIngestion.ipynb +0 -0
  45. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/examples/spec-compliance-notebooks/spec_template.xlsx +0 -0
  46. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/feed_click.py +0 -0
  47. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/file_click.py +0 -0
  48. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/function_click.py +0 -0
  49. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/function_templates.py +0 -0
  50. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/main.py +0 -0
  51. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/mcp_click.py +0 -0
  52. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/mcp_reachability.py +0 -0
  53. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/mcp_server.py +0 -0
  54. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/notebook_click.py +0 -0
  55. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/platform.py +0 -0
  56. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/policy_click.py +0 -0
  57. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/policy_utils.py +0 -0
  58. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/profiles.py +0 -0
  59. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/response_handlers.py +0 -0
  60. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/rich_output.py +0 -0
  61. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/routine_click.py +0 -0
  62. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/skill_click.py +0 -0
  63. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/skills/slcli/SKILL.md +0 -0
  64. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/skills/slcli/references/analysis-recipes.md +0 -0
  65. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/skills/slcli/references/commands.md +0 -0
  66. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/skills/slcli/references/datasheet-workflow.md +0 -0
  67. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/skills/slcli/references/filtering.md +0 -0
  68. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/skills/slcli/references/import-specs.min.json +0 -0
  69. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/skills/slcli/references/job-debugging/overview.md +0 -0
  70. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/skills/slcli/references/nipkg/overview.md +0 -0
  71. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/skills/slcli/references/notebook/interfaces.md +0 -0
  72. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/skills/slcli/references/notebook/notebook-patterns.md +0 -0
  73. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/skills/slcli/references/notebook/overview.md +0 -0
  74. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/skills/slcli/references/python-test/overview.md +0 -0
  75. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/skills/slcli/references/routine-examples.md +0 -0
  76. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/skills/slcli/references/troubleshooting.md +0 -0
  77. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/skills/slcli/references/webapp/angular-ui-packages.md +0 -0
  78. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/skills/slcli/references/webapp/deployment.md +0 -0
  79. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/skills/slcli/references/webapp/layout-patterns.md +0 -0
  80. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/skills/slcli/references/webapp/nimble-angular.md +0 -0
  81. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/skills/slcli/references/webapp/overview.md +0 -0
  82. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/skills/slcli/references/webapp/systemlink-services.md +0 -0
  83. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/skills/slcli/references/webapp/troubleshooting.md +0 -0
  84. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/skills/slcli/scripts/spec_import_helper.py +0 -0
  85. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/spec_click.py +0 -0
  86. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/ssl_trust.py +0 -0
  87. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/state_click.py +0 -0
  88. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/system_click.py +0 -0
  89. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/system_query_utils.py +0 -0
  90. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/table_utils.py +0 -0
  91. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/tag_click.py +0 -0
  92. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/templates_click.py +0 -0
  93. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/testmonitor_click.py +0 -0
  94. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/universal_handlers.py +0 -0
  95. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/user_click.py +0 -0
  96. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/web_editor.py +0 -0
  97. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_bootstrap.py +0 -0
  98. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_click.py +0 -0
  99. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/.gitignore +0 -0
  100. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/README.md +0 -0
  101. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/angular.json +0 -0
  102. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/package.json +0 -0
  103. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/app-routing.module.ts +0 -0
  104. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/app.component.html +0 -0
  105. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/app.component.scss +0 -0
  106. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/app.component.ts +0 -0
  107. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/app.module.ts +0 -0
  108. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/core/layout/app-shell.component.html +0 -0
  109. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/core/layout/app-shell.component.scss +0 -0
  110. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/core/layout/app-shell.component.ts +0 -0
  111. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/core/state/app-view-state.service.ts +0 -0
  112. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/core/systemlink/systemlink-context.service.ts +0 -0
  113. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/core/systemlink/theme-sync.service.ts +0 -0
  114. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/core/systemlink/webapp-home-data.service.ts +0 -0
  115. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/features/assets/assets-page.component.html +0 -0
  116. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/features/assets/assets-page.component.scss +0 -0
  117. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/features/assets/assets-page.component.ts +0 -0
  118. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/features/datasets/datasets-page.component.html +0 -0
  119. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/features/datasets/datasets-page.component.scss +0 -0
  120. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/features/datasets/datasets-page.component.ts +0 -0
  121. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/features/home/home-page.component.html +0 -0
  122. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/features/home/home-page.component.scss +0 -0
  123. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/features/home/home-page.component.ts +0 -0
  124. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/features/master-detail/master-detail-page.component.html +0 -0
  125. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/features/master-detail/master-detail-page.component.scss +0 -0
  126. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/features/master-detail/master-detail-page.component.ts +0 -0
  127. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/features/operations/operations-page.component.html +0 -0
  128. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/features/operations/operations-page.component.scss +0 -0
  129. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/features/operations/operations-page.component.ts +0 -0
  130. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/features/settings/settings-page.component.html +0 -0
  131. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/features/settings/settings-page.component.scss +0 -0
  132. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/features/settings/settings-page.component.ts +0 -0
  133. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/shared/components/empty-state.component.html +0 -0
  134. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/shared/components/empty-state.component.scss +0 -0
  135. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/shared/components/empty-state.component.ts +0 -0
  136. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/shared/components/error-banner.component.html +0 -0
  137. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/shared/components/error-banner.component.scss +0 -0
  138. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/shared/components/error-banner.component.ts +0 -0
  139. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/shared/components/loading-state.component.html +0 -0
  140. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/shared/components/loading-state.component.scss +0 -0
  141. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/shared/components/loading-state.component.ts +0 -0
  142. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/app/shared/states/view-state.model.ts +0 -0
  143. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/assets/README.md +0 -0
  144. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/index.html +0 -0
  145. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/main.ts +0 -0
  146. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/src/styles.scss +0 -0
  147. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/tsconfig.app.json +0 -0
  148. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/webapp_templates/angular/blank/tsconfig.json +0 -0
  149. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/workflow_preview.py +0 -0
  150. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/workflows_click.py +0 -0
  151. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/workitem_click.py +0 -0
  152. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/workspace_click.py +0 -0
  153. {systemlink_cli-1.20.0 → systemlink_cli-1.21.0}/slcli/workspace_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: systemlink-cli
3
- Version: 1.20.0
3
+ Version: 1.21.0
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.20.0"
3
+ version = "1.21.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" }]
@@ -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.20.0"
4
+ __version__ = "1.21.0"
@@ -57,11 +57,60 @@ def _serialize_results(results: List[ProvisioningResult]) -> List[Dict[str, Any]
57
57
  "action": action_value,
58
58
  "server_id": res.server_id,
59
59
  "error": res.error,
60
+ "details": res.details,
60
61
  }
61
62
  )
62
63
  return serialized
63
64
 
64
65
 
66
+ def _build_install_manifest(
67
+ config: Dict[str, Any],
68
+ workspace_id: Optional[str],
69
+ results: List[Dict[str, Any]],
70
+ logical_ids: Dict[str, str],
71
+ ) -> Dict[str, Any]:
72
+ """Build the opt-in manifest contract for data-heavy fixtures."""
73
+ resource_actions: Dict[str, List[Dict[str, Any]]] = {
74
+ "created": [],
75
+ "updated": [],
76
+ "skipped": [],
77
+ "failed": [],
78
+ }
79
+ for result in results:
80
+ action = result.get("action")
81
+ if action in resource_actions:
82
+ resource_actions[action].append(result)
83
+
84
+ validation = config.get("validation", {})
85
+ if not isinstance(validation, dict):
86
+ validation = {}
87
+ unsupported = validation.get("unsupported", [])
88
+ if not isinstance(unsupported, list):
89
+ unsupported = [str(unsupported)]
90
+ required_relationships = validation.get("required_relationships", [])
91
+ if not isinstance(required_relationships, list):
92
+ required_relationships = [str(required_relationships)]
93
+
94
+ failed_relationships = validation.get("failed_relationships", [])
95
+ if not isinstance(failed_relationships, list):
96
+ failed_relationships = [str(failed_relationships)]
97
+
98
+ incomplete = bool(resource_actions["failed"] or unsupported or failed_relationships)
99
+ return {
100
+ "example": config.get("name", ""),
101
+ "version": config.get("example_version", "1.0.0"),
102
+ "workspace": {"name": config.get("workspace_name", ""), "id": workspace_id},
103
+ "resources": resource_actions,
104
+ "logical_ids": logical_ids,
105
+ "validation": {
106
+ "required_relationships": required_relationships,
107
+ "failed_relationships": failed_relationships,
108
+ "unsupported": unsupported,
109
+ "complete": not incomplete,
110
+ },
111
+ }
112
+
113
+
65
114
  def _result_row_formatter(item: Dict[str, Any]) -> List[str]:
66
115
  """Formatter for table rows in provisioning output."""
67
116
  return [
@@ -101,9 +150,7 @@ def _output_results(results: List[Dict[str, Any]], format_output: str) -> None:
101
150
  )
102
151
 
103
152
 
104
- def _write_audit_log(
105
- results: List[Dict[str, Any]], audit_log: Optional[str], quiet: bool = False
106
- ) -> None:
153
+ def _write_audit_log(results: Any, audit_log: Optional[str], quiet: bool = False) -> None:
107
154
  """Persist results to an audit log file if requested."""
108
155
  if not audit_log:
109
156
  return
@@ -189,7 +236,7 @@ def register_example_commands(cli: Any) -> None:
189
236
  estimated setup time.
190
237
 
191
238
  Example:
192
- slcli example info demo-test-plans
239
+ slcli example info demo-data-2
193
240
  """
194
241
  try:
195
242
  loader = ExampleLoader()
@@ -278,12 +325,33 @@ def register_example_commands(cli: Any) -> None:
278
325
  handle_api_error(err)
279
326
 
280
327
  serialized = _serialize_results(results)
281
- _write_audit_log(serialized, audit_log, quiet=format == "json")
282
- _output_results(serialized, format)
283
-
328
+ manifest_mode = bool(config.get("install_manifest"))
329
+ manifest = _build_install_manifest(
330
+ config,
331
+ workspace_id,
332
+ serialized,
333
+ getattr(provisioner, "id_map", {}),
334
+ )
284
335
  failed = any(r.get("action") == ProvisioningAction.FAILED.value for r in serialized)
285
- if failed:
286
- click.echo("✗ One or more resources failed to provision.", err=True)
336
+ incomplete = manifest["validation"]["complete"] is False
337
+
338
+ if manifest_mode and format == "json":
339
+ _write_audit_log(manifest, audit_log, quiet=True)
340
+ click.echo(json.dumps(manifest, indent=2))
341
+ else:
342
+ _write_audit_log(serialized, audit_log, quiet=format == "json")
343
+ _output_results(serialized, format)
344
+
345
+ if failed or (manifest_mode and incomplete):
346
+ if manifest_mode and incomplete and manifest["validation"]["unsupported"]:
347
+ click.echo(
348
+ "✗ Example install is incomplete: required capabilities are unsupported.",
349
+ err=True,
350
+ )
351
+ elif failed:
352
+ click.echo("✗ One or more resources failed to provision.", err=True)
353
+ else:
354
+ click.echo("✗ Example install is incomplete.", err=True)
287
355
  sys.exit(ExitCodes.GENERAL_ERROR)
288
356
 
289
357
  if format == "json":
@@ -33,6 +33,11 @@ class ExampleLoader:
33
33
  "data_table",
34
34
  "file",
35
35
  "notebook",
36
+ "state",
37
+ "tag",
38
+ "specification",
39
+ "feed",
40
+ "alarm",
36
41
  }
37
42
 
38
43
  def __init__(self, examples_dir: Optional[Path] = None) -> None: