systemlink-cli 1.27.6__tar.gz → 1.28.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/PKG-INFO +1 -1
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/pyproject.toml +2 -1
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/_version.py +1 -1
- systemlink_cli-1.28.1/slcli/skills/slcli/evals/COPILOT_BATCH_RUN_PROMPT.md +127 -0
- systemlink_cli-1.28.1/slcli/skills/slcli/evals/README.md +236 -0
- systemlink_cli-1.28.1/slcli/skills/slcli/evals/evals.json +642 -0
- systemlink_cli-1.28.1/slcli/skills/slcli/evals/evals.schema.json +53 -0
- systemlink_cli-1.28.1/slcli/skills/slcli/evals/files/spec-import/battery-specs.csv +4 -0
- systemlink_cli-1.28.1/slcli/skills/slcli/evals/files/webapp-package/icon.svg +4 -0
- systemlink_cli-1.28.1/slcli/skills/slcli/evals/files/webapp-package/nipkg.config.json +15 -0
- systemlink_cli-1.28.1/slcli/skills/slcli/evals/files/webapp-package/webapp-content/index.html +10 -0
- systemlink_cli-1.28.1/slcli/skills/slcli/evals/trigger_evals.json +34 -0
- systemlink_cli-1.28.1/slcli/skills/slcli/scripts/benchmark_iteration.py +183 -0
- systemlink_cli-1.28.1/slcli/skills/slcli/scripts/compare_iteration.py +350 -0
- systemlink_cli-1.28.1/slcli/skills/slcli/scripts/eval_manifest.py +134 -0
- systemlink_cli-1.28.1/slcli/skills/slcli/scripts/grade_eval_response.py +354 -0
- systemlink_cli-1.28.1/slcli/skills/slcli/scripts/grade_iteration.py +283 -0
- systemlink_cli-1.28.1/slcli/skills/slcli/scripts/prepare_eval_prompts.py +279 -0
- systemlink_cli-1.28.1/slcli/skills/slcli/scripts/prepare_eval_workspace.py +523 -0
- systemlink_cli-1.28.1/slcli/skills/slcli/scripts/render_eval_review.py +82 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/LICENSE +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/dff-editor/editor.js +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/dff-editor/index.html +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/__init__.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/__main__.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/alarm_click.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/asset_click.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/cli_formatters.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/cli_utils.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/comment_click.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/completion_click.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/config.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/config_click.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/dataframe_click.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/dff_click.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/dff_decorators.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/example_click.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/example_loader.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/example_provisioner.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/examples/README.md +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/examples/_schema/schema-v1.0.json +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/examples/demo-data-1/README.md +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/examples/demo-data-1/config.yaml +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/examples/demo-data-2/README.md +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/examples/demo-data-2/config.yaml +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/examples/demo-data-3/config.yaml +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/examples/demo-data-3/leakage-current-results.json +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/examples/demo-data-3/overvoltage-results.json +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/examples/demo-data-3/product-xyz-compliance-report.json +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/examples/demo-data-3/product-xyz-specification.csv +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/examples/demo-data-3/thermal-response-results.json +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/examples/exercise-5-1-parametric-insights/README.md +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/examples/exercise-5-1-parametric-insights/config.yaml +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/examples/exercise-7-1-test-plans/README.md +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/examples/exercise-7-1-test-plans/config.yaml +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/examples/spec-compliance-notebooks/README.md +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/examples/spec-compliance-notebooks/config.yaml +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/examples/spec-compliance-notebooks/notebooks/SpecAnalysis_ComplianceCalculation.ipynb +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/examples/spec-compliance-notebooks/notebooks/SpecComplianceCalculation.ipynb +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/examples/spec-compliance-notebooks/notebooks/SpecfileExtractionAndIngestion.ipynb +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/examples/spec-compliance-notebooks/spec_template.xlsx +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/feed_click.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/file_click.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/function_click.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/function_templates.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/main.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/mcp_click.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/mcp_reachability.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/mcp_server.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/notebook_click.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/pkce.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/platform.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/policy_click.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/policy_utils.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/profiles.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/response_handlers.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/rich_output.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/routine_click.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/skill_click.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/skills/slcli/SKILL.md +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/skills/slcli/references/analysis-recipes.md +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/skills/slcli/references/commands.md +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/skills/slcli/references/datasheet-workflow.md +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/skills/slcli/references/example-authoring.md +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/skills/slcli/references/filtering.md +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/skills/slcli/references/import-specs.min.json +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/skills/slcli/references/job-debugging/overview.md +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/skills/slcli/references/nipkg/overview.md +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/skills/slcli/references/notebook/interfaces.md +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/skills/slcli/references/notebook/notebook-patterns.md +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/skills/slcli/references/notebook/overview.md +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/skills/slcli/references/python-test/overview.md +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/skills/slcli/references/routine-examples.md +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/skills/slcli/references/troubleshooting.md +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/skills/slcli/references/webapp/angular-ui-packages.md +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/skills/slcli/references/webapp/deployment.md +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/skills/slcli/references/webapp/layout-patterns.md +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/skills/slcli/references/webapp/nimble-angular.md +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/skills/slcli/references/webapp/overview.md +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/skills/slcli/references/webapp/systemlink-services.md +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/skills/slcli/references/webapp/troubleshooting.md +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/skills/slcli/scripts/spec_import_helper.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/spec_click.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/ssl_trust.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/state_click.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/system_click.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/system_query_utils.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/systemlink-logo.svg +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/table_utils.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/tag_click.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/templates_click.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/testmonitor_click.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/universal_handlers.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/user_click.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/utils.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/version_click.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/web_editor.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_bootstrap.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_click.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/.gitignore +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/README.md +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/angular.json +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/package.json +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/scripts/filter-sbom.js +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/app-routing.module.ts +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/app.component.html +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/app.component.scss +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/app.component.ts +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/app.module.ts +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/core/layout/app-shell.component.html +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/core/layout/app-shell.component.scss +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/core/layout/app-shell.component.ts +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/core/state/app-view-state.service.ts +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/core/systemlink/systemlink-context.service.ts +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/core/systemlink/theme-sync.service.ts +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/core/systemlink/webapp-home-data.service.ts +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/features/assets/assets-page.component.html +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/features/assets/assets-page.component.scss +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/features/assets/assets-page.component.ts +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/features/datasets/datasets-page.component.html +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/features/datasets/datasets-page.component.scss +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/features/datasets/datasets-page.component.ts +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/features/home/home-page.component.html +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/features/home/home-page.component.scss +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/features/home/home-page.component.ts +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/features/master-detail/master-detail-page.component.html +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/features/master-detail/master-detail-page.component.scss +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/features/master-detail/master-detail-page.component.ts +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/features/operations/operations-page.component.html +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/features/operations/operations-page.component.scss +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/features/operations/operations-page.component.ts +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/features/settings/settings-page.component.html +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/features/settings/settings-page.component.scss +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/features/settings/settings-page.component.ts +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/shared/components/empty-state.component.html +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/shared/components/empty-state.component.scss +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/shared/components/empty-state.component.ts +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/shared/components/error-banner.component.html +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/shared/components/error-banner.component.scss +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/shared/components/error-banner.component.ts +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/shared/components/loading-state.component.html +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/shared/components/loading-state.component.scss +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/shared/components/loading-state.component.ts +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/app/shared/states/view-state.model.ts +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/assets/README.md +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/index.html +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/main.ts +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/src/styles.scss +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/tsconfig.app.json +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/webapp_templates/angular/blank/tsconfig.json +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/workflow_preview.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/workflows_click.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/workitem_click.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/slcli/workspace_click.py +0 -0
- {systemlink_cli-1.27.6 → systemlink_cli-1.28.1}/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.28.1"
|
|
4
4
|
description = "SystemLink Integrator CLI - cross-platform CLI for SystemLink workflows and templates."
|
|
5
5
|
authors = ["Fred Visser <fred.visser@emerson.com>"]
|
|
6
6
|
packages = [{ include = "slcli" }]
|
|
@@ -68,6 +68,7 @@ pytest = ">=7.0"
|
|
|
68
68
|
pytest-cov = ">=3.0"
|
|
69
69
|
pytest-timeout = ">=2.1.0"
|
|
70
70
|
pyinstaller = "^6.14.2"
|
|
71
|
+
jsonschema = ">=4.0"
|
|
71
72
|
|
|
72
73
|
# Typed stubs for third-party libraries used by mypy in CI
|
|
73
74
|
types-requests = "*"
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# Copilot Batch Eval Prompt
|
|
2
|
+
|
|
3
|
+
Use this prompt in a single parent Copilot Chat session when you want Copilot
|
|
4
|
+
to run the entire prepared `gating` iteration, populate the `outputs/`
|
|
5
|
+
folders, grade the results, aggregate the benchmark, and regenerate the static
|
|
6
|
+
review page.
|
|
7
|
+
|
|
8
|
+
This is the recommended orchestration pattern because the repo scripts handle
|
|
9
|
+
workspace preparation, grading, aggregation, and review rendering, but they do
|
|
10
|
+
not execute the model runs themselves.
|
|
11
|
+
|
|
12
|
+
Important: the parent chat is shared context. Do not execute both
|
|
13
|
+
`with_skill` and `old_skill` runs directly in the same running thread of
|
|
14
|
+
conversation if you want a meaningful baseline. Use fresh stateless subagents
|
|
15
|
+
per run so the merge-base skill stays isolated from candidate context.
|
|
16
|
+
|
|
17
|
+
Also use a fail-fast budget per run. Do not let one struggling eval burn the
|
|
18
|
+
whole batch. A good default for the gating suite is a maximum of about 8 tool
|
|
19
|
+
calls or about 3 minutes of active work for a single run, whichever comes
|
|
20
|
+
first.
|
|
21
|
+
|
|
22
|
+
## When to use this
|
|
23
|
+
|
|
24
|
+
- You already created an iteration workspace with `prepare_eval_workspace.py`
|
|
25
|
+
- You already generated per-run `executor_prompt.txt` files with
|
|
26
|
+
`prepare_eval_prompts.py`
|
|
27
|
+
- You want one parent Copilot chat to orchestrate all prepared gating evals end
|
|
28
|
+
to end
|
|
29
|
+
|
|
30
|
+
## What this does
|
|
31
|
+
|
|
32
|
+
In one parent chat, Copilot should:
|
|
33
|
+
|
|
34
|
+
1. Read `iteration_manifest.json`.
|
|
35
|
+
2. Find every `executor_prompt.txt` under the iteration directory.
|
|
36
|
+
3. For each prepared run directory:
|
|
37
|
+
- execute the prompt in a fresh stateless subagent
|
|
38
|
+
|
|
39
|
+
- load the candidate `slcli` skill from the run-specific candidate repo for `with_skill` runs
|
|
40
|
+
- load the merge-base `slcli` skill from the run-specific baseline repo for `old_skill` runs
|
|
41
|
+
- stop early when the per-run budget is exhausted and record the failure
|
|
42
|
+
- save the final answer to `outputs/response.txt`
|
|
43
|
+
- save the complete executor trace to `outputs/transcript.jsonl`
|
|
44
|
+
- save executor identity, configuration, and completion status to `outputs/run_metadata.json`
|
|
45
|
+
- save `total_tokens`, `duration_ms`, and derived `total_duration_seconds` from the subagent completion notification to the run's `timing.json`; do not estimate these values
|
|
46
|
+
- retry infrastructure failures once; after a second failure, set status to `infrastructure_error` and continue
|
|
47
|
+
- optionally save `outputs/notes.txt` for assumptions
|
|
48
|
+
|
|
49
|
+
4. Run `benchmark_iteration.py`.
|
|
50
|
+
5. Run `render_eval_review.py`.
|
|
51
|
+
6. Summarize which runs were populated and where the review HTML was written.
|
|
52
|
+
|
|
53
|
+
## Paste This Into Copilot Chat
|
|
54
|
+
|
|
55
|
+
```text
|
|
56
|
+
Run the prepared gating eval iteration end to end.
|
|
57
|
+
|
|
58
|
+
Use one parent conversation only as the orchestrator. For each executor prompt,
|
|
59
|
+
spawn a fresh stateless subagent so the runs do not share prompt history.
|
|
60
|
+
For `with_skill`, load the skill path inside the run-specific candidate repo
|
|
61
|
+
named by the executor prompt instead of using the working checkout.
|
|
62
|
+
For `old_skill`, load the skill path inside the run-specific baseline repo named
|
|
63
|
+
by the executor prompt instead of using the candidate checkout. Use only the
|
|
64
|
+
neutral input paths named by the executor prompt for attached fixtures.
|
|
65
|
+
Run independent evals in parallel when possible, but keep concurrency modest:
|
|
66
|
+
typically 2 to 4 subagents at a time.
|
|
67
|
+
|
|
68
|
+
Iteration workspace:
|
|
69
|
+
<ITERATION_DIR>
|
|
70
|
+
|
|
71
|
+
Instructions:
|
|
72
|
+
1. Read iteration_manifest.json in that workspace.
|
|
73
|
+
2. Discover every executor_prompt.txt under the iteration directory.
|
|
74
|
+
3. For each executor prompt:
|
|
75
|
+
- execute the task described in the prompt in a fresh stateless subagent
|
|
76
|
+
- use a maximum budget of about 8 tool calls or about 3 minutes of active work for that run, whichever comes first
|
|
77
|
+
- if the run does not converge inside that budget, stop, write the best grounded response you have to response.txt, and write notes.txt explaining the failure briefly
|
|
78
|
+
- save the final user-facing answer to the sibling outputs/response.txt path named in the prompt
|
|
79
|
+
- save the complete executor trace to the sibling outputs/transcript.jsonl path named in the prompt
|
|
80
|
+
- save optional outputs/notes.txt only if assumptions or caveats matter
|
|
81
|
+
- save outputs/run_metadata.json with executor_provider, exact executor_model, harness, configuration, and status
|
|
82
|
+
- when the subagent completion notification arrives, immediately save its total_tokens and duration_ms plus derived total_duration_seconds to the sibling timing.json named in the executor prompt
|
|
83
|
+
- use status `completed` only for a completed model run; retry an infrastructure failure once, then use `infrastructure_error` and preserve partial artifacts
|
|
84
|
+
4. Do both configurations for every eval:
|
|
85
|
+
- with_skill
|
|
86
|
+
- old_skill
|
|
87
|
+
5. After all outputs are populated, run:
|
|
88
|
+
- poetry run python -m slcli.skills.slcli.scripts.benchmark_iteration <ITERATION_DIR>
|
|
89
|
+
- poetry run python -m slcli.skills.slcli.scripts.render_eval_review <ITERATION_DIR>
|
|
90
|
+
6. Report:
|
|
91
|
+
- which run directories were populated
|
|
92
|
+
- whether grading and benchmark generation succeeded
|
|
93
|
+
- where review.html was written
|
|
94
|
+
|
|
95
|
+
Execution rules:
|
|
96
|
+
- Use the existing executor_prompt.txt files as the source of truth for each run.
|
|
97
|
+
- Do not answer multiple eval runs in the parent chat context.
|
|
98
|
+
- Do not reuse a subagent across runs.
|
|
99
|
+
- Parallelize independent runs when useful, but keep concurrency to roughly 2 to 4 subagents at a time.
|
|
100
|
+
- For with_skill runs, the subagent must load only the candidate skill path named in the executor prompt.
|
|
101
|
+
- For old_skill runs, the subagent must load only the merge-base skill path named in the executor prompt.
|
|
102
|
+
- If a run exceeds its budget without a grounded answer, declare it failed quickly, persist the best grounded partial result plus a short note, and continue.
|
|
103
|
+
- Do not overwrite populated outputs unless the existing file is only a placeholder.
|
|
104
|
+
- Keep each response grounded in supported slcli commands and workflows.
|
|
105
|
+
- Save response artifacts only inside the specified outputs/ directories; save timing.json at the run path named in the executor prompt.
|
|
106
|
+
- If a single run fails, continue with the remaining runs and report the failure at the end.
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Notes
|
|
110
|
+
|
|
111
|
+
- You do not need a new top-level chat for every eval. One parent chat can
|
|
112
|
+
orchestrate the whole prepared gating suite if each run is delegated to a
|
|
113
|
+
fresh stateless subagent.
|
|
114
|
+
- Yes, the subagents can be parallelized because the prepared runs are
|
|
115
|
+
independent. Keep the batch size small so one bad run does not hide the rest.
|
|
116
|
+
- A plain single-thread conversation is not a clean `with_skill` versus
|
|
117
|
+
`old_skill` comparison because the parent chat shares context across
|
|
118
|
+
turns.
|
|
119
|
+
- You also do not need a repo script per eval. The intended split is:
|
|
120
|
+
- repo scripts prepare, grade, aggregate, and render
|
|
121
|
+
- Copilot orchestrates isolated subagent executions and writes the output
|
|
122
|
+
artifacts
|
|
123
|
+
- If you want broader coverage, swap the iteration path to a prepared
|
|
124
|
+
`regression` iteration.
|
|
125
|
+
|
|
126
|
+
Replace `<ITERATION_DIR>` with the prepared iteration path before using the
|
|
127
|
+
template.
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
# slcli Eval Workflow
|
|
2
|
+
|
|
3
|
+
This directory contains the eval corpus for the repo-local `slcli` skill.
|
|
4
|
+
Use the `gating` suite to compare a candidate skill with its merge-base version
|
|
5
|
+
after a skill edit. The default is three paired trials per configuration.
|
|
6
|
+
|
|
7
|
+
## Gating Workflow
|
|
8
|
+
|
|
9
|
+
Run the following from the repository root.
|
|
10
|
+
|
|
11
|
+
### 1. Run the single prompt
|
|
12
|
+
|
|
13
|
+
Use the repo prompt in Copilot Chat:
|
|
14
|
+
|
|
15
|
+
```text
|
|
16
|
+
/eval-skill-gating
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Optional examples:
|
|
20
|
+
|
|
21
|
+
```text
|
|
22
|
+
/eval-skill-gating iteration_dir="slcli/skills/slcli-workspace/iteration-4"
|
|
23
|
+
/eval-skill-gating max_parallel=2 max_tool_calls=6 max_minutes=2.5
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
The prompt performs the full gating workflow:
|
|
27
|
+
|
|
28
|
+
- prepare or reuse a gating iteration
|
|
29
|
+
- generate executor prompts
|
|
30
|
+
- execute `with_skill` and `old_skill` runs via isolated subagents
|
|
31
|
+
- grade and aggregate the iteration
|
|
32
|
+
- apply the regression gate
|
|
33
|
+
- regenerate `review.html`
|
|
34
|
+
|
|
35
|
+
### 2. What the prompt runs under the hood
|
|
36
|
+
|
|
37
|
+
If you need to run the flow manually, these are the underlying steps.
|
|
38
|
+
|
|
39
|
+
#### Prepare a fresh gating workspace
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
poetry run python -m slcli.skills.slcli.scripts.prepare_eval_workspace --suite gating
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
This prints a new iteration directory such as:
|
|
46
|
+
|
|
47
|
+
```text
|
|
48
|
+
slcli/skills/slcli-workspace/iteration-1
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
The iteration contains paired candidate and baseline repository templates from
|
|
52
|
+
the current candidate checkout. Only the `slcli` skill in the baseline template
|
|
53
|
+
is replaced with its version from the merge base of `origin/main` and `HEAD`.
|
|
54
|
+
Each trial receives its own copy of the appropriate template, so parallel runs
|
|
55
|
+
cannot modify another trial's repository. File-backed fixtures are copied into
|
|
56
|
+
a neutral `inputs/` directory for each run. Use
|
|
57
|
+
`--baseline-ref` when comparing against another branch. Use
|
|
58
|
+
`--baseline without_skill` only when measuring whether a new skill adds value;
|
|
59
|
+
that comparison is not a regression test. The legacy `--isolate-baseline` option
|
|
60
|
+
is accepted but no longer needed because both configurations are always isolated.
|
|
61
|
+
|
|
62
|
+
#### Generate executor prompts
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
poetry run python -m slcli.skills.slcli.scripts.prepare_eval_prompts \
|
|
66
|
+
slcli/skills/slcli-workspace/iteration-1 \
|
|
67
|
+
--max-tool-calls 8 \
|
|
68
|
+
--max-minutes 3
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
This writes one `executor_prompt.txt` per prepared run.
|
|
72
|
+
|
|
73
|
+
#### Execute the runs in Copilot
|
|
74
|
+
|
|
75
|
+
Use [COPILOT_BATCH_RUN_PROMPT.md](./COPILOT_BATCH_RUN_PROMPT.md) together with
|
|
76
|
+
the generated `executor_prompt.txt` files.
|
|
77
|
+
|
|
78
|
+
Recommended execution pattern:
|
|
79
|
+
|
|
80
|
+
1. Use one parent chat as the orchestrator.
|
|
81
|
+
2. Run each prepared eval in a fresh stateless subagent.
|
|
82
|
+
3. Point `with_skill` runs at the run-specific candidate skill path in its prompt.
|
|
83
|
+
4. Point `old_skill` runs at the run-specific baseline skill path in its prompt.
|
|
84
|
+
5. Keep concurrency modest, usually 2 to 4 runs at a time.
|
|
85
|
+
6. If a run exceeds its budget, save the best grounded `response.txt`, add a short `notes.txt`, and continue.
|
|
86
|
+
|
|
87
|
+
Each run saves response artifacts under its own `outputs/` directory and timing
|
|
88
|
+
metadata at the run root. Every run must write:
|
|
89
|
+
|
|
90
|
+
- `response.txt`: final user-facing response
|
|
91
|
+
- `transcript.jsonl`: complete executor trace for audit and diagnosis
|
|
92
|
+
- `run_metadata.json`: `executor_provider`, exact `executor_model`, `harness`,
|
|
93
|
+
`configuration`, and `status` (`completed` or `infrastructure_error`)
|
|
94
|
+
- `../timing.json`: `total_tokens` and `duration_ms` from the subagent completion
|
|
95
|
+
notification plus derived `total_duration_seconds`; these values must not be estimated
|
|
96
|
+
|
|
97
|
+
Candidate and baseline trials are incomparable when provider, model, or harness
|
|
98
|
+
metadata differs.
|
|
99
|
+
|
|
100
|
+
The gate treats a run as inconclusive when candidate/baseline hashes, the eval
|
|
101
|
+
manifest hash, executor prompt hash, run identity, classification, detailed
|
|
102
|
+
grading payload, or other recorded evidence differs from the preparation-time
|
|
103
|
+
provenance in the iteration manifest or `run_record.json`.
|
|
104
|
+
|
|
105
|
+
Retry an infrastructure failure once. If the retry also fails, preserve the
|
|
106
|
+
partial artifacts with `status: infrastructure_error`; the gate reports that
|
|
107
|
+
trial as inconclusive instead of scoring it as a skill failure.
|
|
108
|
+
|
|
109
|
+
## Harness Invariants
|
|
110
|
+
|
|
111
|
+
- Every trial uses a fresh repository sandbox and a fresh stateless subagent.
|
|
112
|
+
- Candidate and baseline sandboxes begin from the same candidate repository;
|
|
113
|
+
only the baseline skill directory differs.
|
|
114
|
+
- Input fixtures live outside both skill trees and are identical for both arms.
|
|
115
|
+
- Each trial receives its own fixture copy so one executor cannot mutate another trial's input.
|
|
116
|
+
- The eval corpus and grading harness are excluded from both runtime skill snapshots so
|
|
117
|
+
executor agents cannot use the answer key while comparing candidate and baseline skills.
|
|
118
|
+
- Copied fixture hashes must match their preparation-time input manifest.
|
|
119
|
+
- Executor prompt hashes must match both the iteration manifest and live prompt files.
|
|
120
|
+
- Critical compound workflows must pass within one command invocation.
|
|
121
|
+
- Positive controls must use supported command paths and required arguments.
|
|
122
|
+
- Executor errors and provenance mismatches are inconclusive, never passing evidence.
|
|
123
|
+
|
|
124
|
+
#### Grade and aggregate the iteration
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
poetry run python -m slcli.skills.slcli.scripts.benchmark_iteration --force \
|
|
128
|
+
slcli/skills/slcli-workspace/iteration-1
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
This grades populated runs, writes `run_record.json` per trial, generates
|
|
132
|
+
`benchmark.json` plus `benchmark.md`, and applies the regression gate. It also
|
|
133
|
+
writes `regression.json` and `regression.md`.
|
|
134
|
+
|
|
135
|
+
The gate exits with:
|
|
136
|
+
|
|
137
|
+
- `0`: no detected regression
|
|
138
|
+
- `1`: regression detected
|
|
139
|
+
- `2`: inconclusive because runs or required metadata are missing or incompatible
|
|
140
|
+
|
|
141
|
+
The default gate fails when the baseline passes the critical rules in a
|
|
142
|
+
majority of trials and any paired candidate trial introduces a critical
|
|
143
|
+
failure. It also fails when mean assertion pass rate drops by more than five
|
|
144
|
+
percentage points.
|
|
145
|
+
|
|
146
|
+
#### Regenerate the review page
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
poetry run python -m slcli.skills.slcli.scripts.render_eval_review \
|
|
150
|
+
slcli/skills/slcli-workspace/iteration-1
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
This writes `review.html` in the iteration directory.
|
|
154
|
+
|
|
155
|
+
## What Good Looks Like
|
|
156
|
+
|
|
157
|
+
- `with_skill` should be non-inferior to `old_skill` on the gating suite.
|
|
158
|
+
- Failures should point to missing skill behavior, not to ambiguous eval wording.
|
|
159
|
+
- If both configs pass easily, keep the case for regression coverage and add
|
|
160
|
+
harder cases to a separate capability suite.
|
|
161
|
+
- If both configs fail, tighten the prompt or grading rules before changing the skill.
|
|
162
|
+
|
|
163
|
+
## Files in This Directory
|
|
164
|
+
|
|
165
|
+
- `evals.json`: prompts, fixtures, and grading rules
|
|
166
|
+
- `evals.schema.json`: machine-readable corpus contract
|
|
167
|
+
- `trigger_evals.json`: balanced should-trigger and should-not-trigger prompts
|
|
168
|
+
- `files/`: input fixtures for file-backed evals
|
|
169
|
+
- `../../../../.github/prompts/eval-skill-gating.prompt.md`: one-shot gating eval prompt
|
|
170
|
+
- `COPILOT_BATCH_RUN_PROMPT.md`: parent-chat orchestration prompt
|
|
171
|
+
- `../scripts/prepare_eval_workspace.py`: scaffolds an iteration directory
|
|
172
|
+
- `../scripts/prepare_eval_prompts.py`: writes executor prompts
|
|
173
|
+
- `../scripts/benchmark_iteration.py`: grades and aggregates a full iteration
|
|
174
|
+
- `../scripts/render_eval_review.py`: writes the static review page
|
|
175
|
+
|
|
176
|
+
## Broader Coverage
|
|
177
|
+
|
|
178
|
+
Use `regression` with five trials before a release:
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
poetry run python -m slcli.skills.slcli.scripts.prepare_eval_workspace \
|
|
182
|
+
--suite regression \
|
|
183
|
+
--runs-per-config 5
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
## Trigger Evaluation
|
|
187
|
+
|
|
188
|
+
Trigger evaluation is separate from task execution because task prompts inject
|
|
189
|
+
the skill explicitly. When the Claude CLI is available, run the repository's
|
|
190
|
+
trigger evaluator with balanced thresholds:
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
python .github/skills/skill-creator/scripts/run_eval.py \
|
|
194
|
+
--eval-set slcli/skills/slcli/evals/trigger_evals.json \
|
|
195
|
+
--skill-path slcli/skills/slcli \
|
|
196
|
+
--runs-per-query 5 \
|
|
197
|
+
--trigger-threshold 0.8 \
|
|
198
|
+
--negative-trigger-threshold 0.2
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
This is a local or scheduled check until the production Copilot harness exposes
|
|
202
|
+
skill-selection events through a non-interactive executor. Do not infer routing
|
|
203
|
+
from final-answer text.
|
|
204
|
+
|
|
205
|
+
## CI Coverage
|
|
206
|
+
|
|
207
|
+
The existing CI workflow runs the deterministic manifest, grader, snapshot,
|
|
208
|
+
and comparator unit tests on every pull request. Model trials remain an
|
|
209
|
+
explicit developer workflow because this repository does not yet have a
|
|
210
|
+
credentialed non-interactive Copilot executor. Attach `benchmark.json`,
|
|
211
|
+
`regression.json`, `review.html`, run records, transcripts, and outputs to a PR
|
|
212
|
+
when reviewing a skill change.
|
|
213
|
+
|
|
214
|
+
## What To Commit
|
|
215
|
+
|
|
216
|
+
Commit the eval harness and definitions:
|
|
217
|
+
|
|
218
|
+
- `slcli/skills/slcli/SKILL.md`
|
|
219
|
+
- `slcli/skills/slcli/evals/evals.json`
|
|
220
|
+
- `slcli/skills/slcli/evals/files/`
|
|
221
|
+
- `slcli/skills/slcli/evals/README.md`
|
|
222
|
+
- `slcli/skills/slcli/evals/COPILOT_BATCH_RUN_PROMPT.md`
|
|
223
|
+
- `slcli/skills/slcli/scripts/`
|
|
224
|
+
- `slcli/skills/slcli/.github/prompts/` or repo-level prompt files that drive the workflow
|
|
225
|
+
|
|
226
|
+
Do not usually commit run artifacts:
|
|
227
|
+
|
|
228
|
+
- `slcli/skills/slcli-workspace/`
|
|
229
|
+
- per-run `outputs/response.txt`
|
|
230
|
+
- per-run `grading.json`
|
|
231
|
+
- generated `benchmark.json` and `benchmark.md`
|
|
232
|
+
- generated `review.html`
|
|
233
|
+
|
|
234
|
+
Treat the checked-in files as the reproducible test harness and the workspace
|
|
235
|
+
artifacts as local experiment output unless you intentionally want to preserve a
|
|
236
|
+
specific benchmark snapshot for review or release documentation.
|