@prismatic-io/lux 0.0.2-preview.3 → 0.0.2-preview.30
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.
- package/lib/answerers/claude-code/index.d.ts +15 -3
- package/lib/answerers/claude-code/index.d.ts.map +1 -1
- package/lib/answerers/claude-code/index.js +6 -5
- package/lib/answerers/claude-code/index.js.map +1 -1
- package/lib/answerers/persona/index.d.ts +44 -5
- package/lib/answerers/persona/index.d.ts.map +1 -1
- package/lib/answerers/persona/index.js +60 -34
- package/lib/answerers/persona/index.js.map +1 -1
- package/lib/answerers/terminal/index.d.ts +9 -3
- package/lib/answerers/terminal/index.d.ts.map +1 -1
- package/lib/answerers/terminal/index.js +7 -5
- package/lib/answerers/terminal/index.js.map +1 -1
- package/lib/assertions/authoring.d.ts +2 -2
- package/lib/assertions/authoring.d.ts.map +1 -1
- package/lib/assertions/authoring.js.map +1 -1
- package/lib/assertions/core/command-exits-zero.d.ts +3 -1
- package/lib/assertions/core/command-exits-zero.d.ts.map +1 -1
- package/lib/assertions/core/command-exits-zero.js +50 -7
- package/lib/assertions/core/command-exits-zero.js.map +1 -1
- package/lib/assertions/core/event-checks.d.ts +3 -0
- package/lib/assertions/core/event-checks.d.ts.map +1 -1
- package/lib/assertions/core/event-checks.js +49 -3
- package/lib/assertions/core/event-checks.js.map +1 -1
- package/lib/assertions/core/helpers.d.ts +2 -7
- package/lib/assertions/core/helpers.d.ts.map +1 -1
- package/lib/assertions/core/helpers.js +2 -6
- package/lib/assertions/core/helpers.js.map +1 -1
- package/lib/assertions/core/index.d.ts.map +1 -1
- package/lib/assertions/core/index.js +2 -1
- package/lib/assertions/core/index.js.map +1 -1
- package/lib/assertions/core/resource-checks.d.ts +19 -0
- package/lib/assertions/core/resource-checks.d.ts.map +1 -1
- package/lib/assertions/core/resource-checks.js +35 -5
- package/lib/assertions/core/resource-checks.js.map +1 -1
- package/lib/assertions/rubric/index.d.ts +26 -3
- package/lib/assertions/rubric/index.d.ts.map +1 -1
- package/lib/assertions/rubric/index.js +59 -13
- package/lib/assertions/rubric/index.js.map +1 -1
- package/lib/assertions/rubric/internal.d.ts +30 -5
- package/lib/assertions/rubric/internal.d.ts.map +1 -1
- package/lib/assertions/rubric/internal.js +181 -28
- package/lib/assertions/rubric/internal.js.map +1 -1
- package/lib/authoring.d.ts +36 -2
- package/lib/authoring.d.ts.map +1 -1
- package/lib/authoring.js +36 -1
- package/lib/authoring.js.map +1 -1
- package/lib/cli/bin.js +2 -13
- package/lib/cli/bin.js.map +1 -1
- package/lib/cli/command-runtime.d.ts +3 -3
- package/lib/cli/command-runtime.d.ts.map +1 -1
- package/lib/cli/command-runtime.js +17 -6
- package/lib/cli/command-runtime.js.map +1 -1
- package/lib/cli/doctor.d.ts +55 -0
- package/lib/cli/doctor.d.ts.map +1 -0
- package/lib/cli/doctor.js +14 -0
- package/lib/cli/doctor.js.map +1 -0
- package/lib/cli/harness-plan.d.ts +26 -0
- package/lib/cli/harness-plan.d.ts.map +1 -0
- package/lib/cli/harness-plan.js +75 -0
- package/lib/cli/harness-plan.js.map +1 -0
- package/lib/cli/init-templates.d.ts +11 -0
- package/lib/cli/init-templates.d.ts.map +1 -0
- package/lib/cli/init-templates.js +215 -0
- package/lib/cli/init-templates.js.map +1 -0
- package/lib/cli/init.d.ts +10 -0
- package/lib/cli/init.d.ts.map +1 -1
- package/lib/cli/init.js +34 -173
- package/lib/cli/init.js.map +1 -1
- package/lib/cli/output-schemas.d.ts +1406 -0
- package/lib/cli/output-schemas.d.ts.map +1 -0
- package/lib/cli/output-schemas.js +91 -0
- package/lib/cli/output-schemas.js.map +1 -0
- package/lib/cli/program.d.ts +140 -12
- package/lib/cli/program.d.ts.map +1 -1
- package/lib/cli/program.js +778 -646
- package/lib/cli/program.js.map +1 -1
- package/lib/cli/render/reporter.d.ts.map +1 -1
- package/lib/cli/render/reporter.js +40 -7
- package/lib/cli/render/reporter.js.map +1 -1
- package/lib/cli/run-options.d.ts +20 -4
- package/lib/cli/run-options.d.ts.map +1 -1
- package/lib/cli/run-options.js +100 -19
- package/lib/cli/run-options.js.map +1 -1
- package/lib/cli/view.d.ts +15 -0
- package/lib/cli/view.d.ts.map +1 -0
- package/lib/cli/view.js +168 -0
- package/lib/cli/view.js.map +1 -0
- package/lib/container/driver.d.ts +27 -0
- package/lib/container/driver.d.ts.map +1 -0
- package/lib/container/driver.js +197 -0
- package/lib/container/driver.js.map +1 -0
- package/lib/container/protocol.d.ts +12 -0
- package/lib/container/protocol.d.ts.map +1 -0
- package/lib/container/protocol.js +38 -0
- package/lib/container/protocol.js.map +1 -0
- package/lib/container/resources.d.ts +12 -0
- package/lib/container/resources.d.ts.map +1 -0
- package/lib/container/resources.js +133 -0
- package/lib/container/resources.js.map +1 -0
- package/lib/container/worker.d.ts +2 -0
- package/lib/container/worker.d.ts.map +1 -0
- package/lib/container/worker.js +85 -0
- package/lib/container/worker.js.map +1 -0
- package/lib/core/action-events.d.ts +29 -0
- package/lib/core/action-events.d.ts.map +1 -0
- package/lib/core/action-events.js +51 -0
- package/lib/core/action-events.js.map +1 -0
- package/lib/core/agent-activity.d.ts +49 -0
- package/lib/core/agent-activity.d.ts.map +1 -0
- package/lib/core/agent-activity.js +206 -0
- package/lib/core/agent-activity.js.map +1 -0
- package/lib/core/agent-environment.d.ts +5 -0
- package/lib/core/agent-environment.d.ts.map +1 -0
- package/lib/core/agent-environment.js +47 -0
- package/lib/core/agent-environment.js.map +1 -0
- package/lib/core/agent-events.d.ts +26 -0
- package/lib/core/agent-events.d.ts.map +1 -0
- package/lib/core/agent-events.js +13 -0
- package/lib/core/agent-events.js.map +1 -0
- package/lib/core/annotation.d.ts +6 -2
- package/lib/core/annotation.d.ts.map +1 -1
- package/lib/core/annotation.js +2 -1
- package/lib/core/annotation.js.map +1 -1
- package/lib/core/answerer.d.ts +12 -0
- package/lib/core/answerer.d.ts.map +1 -1
- package/lib/core/answerer.js +2 -0
- package/lib/core/answerer.js.map +1 -1
- package/lib/core/artifact-evidence.d.ts +8 -0
- package/lib/core/artifact-evidence.d.ts.map +1 -1
- package/lib/core/artifact-evidence.js +36 -4
- package/lib/core/artifact-evidence.js.map +1 -1
- package/lib/core/assertion.d.ts +15 -0
- package/lib/core/assertion.d.ts.map +1 -1
- package/lib/core/assertion.js +16 -0
- package/lib/core/assertion.js.map +1 -1
- package/lib/core/case.d.ts +106 -2
- package/lib/core/case.d.ts.map +1 -1
- package/lib/core/case.js +16 -2
- package/lib/core/case.js.map +1 -1
- package/lib/core/command-verification.d.ts +10 -0
- package/lib/core/command-verification.d.ts.map +1 -0
- package/lib/core/command-verification.js +66 -0
- package/lib/core/command-verification.js.map +1 -0
- package/lib/core/driver-execution.d.ts +83 -0
- package/lib/core/driver-execution.d.ts.map +1 -0
- package/lib/core/driver-execution.js +72 -0
- package/lib/core/driver-execution.js.map +1 -0
- package/lib/core/driver-metrics.d.ts +98 -0
- package/lib/core/driver-metrics.d.ts.map +1 -0
- package/lib/core/driver-metrics.js +36 -0
- package/lib/core/driver-metrics.js.map +1 -0
- package/lib/core/driver.d.ts +64 -0
- package/lib/core/driver.d.ts.map +1 -1
- package/lib/core/driver.js +28 -0
- package/lib/core/driver.js.map +1 -1
- package/lib/core/duration.d.ts +5 -0
- package/lib/core/duration.d.ts.map +1 -0
- package/lib/core/duration.js +49 -0
- package/lib/core/duration.js.map +1 -0
- package/lib/core/environment.d.ts +18 -0
- package/lib/core/environment.d.ts.map +1 -0
- package/lib/core/environment.js +21 -0
- package/lib/core/environment.js.map +1 -0
- package/lib/core/evaluation-clusters.d.ts +17 -0
- package/lib/core/evaluation-clusters.d.ts.map +1 -0
- package/lib/core/evaluation-clusters.js +23 -0
- package/lib/core/evaluation-clusters.js.map +1 -0
- package/lib/core/events.d.ts +36 -0
- package/lib/core/events.d.ts.map +1 -1
- package/lib/core/events.js +12 -2
- package/lib/core/events.js.map +1 -1
- package/lib/core/experiment.d.ts +32 -2
- package/lib/core/experiment.d.ts.map +1 -1
- package/lib/core/experiment.js +35 -18
- package/lib/core/experiment.js.map +1 -1
- package/lib/core/file-tree.d.ts +7 -0
- package/lib/core/file-tree.d.ts.map +1 -0
- package/lib/core/file-tree.js +35 -0
- package/lib/core/file-tree.js.map +1 -0
- package/lib/core/global-id.d.ts +6 -0
- package/lib/core/global-id.d.ts.map +1 -0
- package/lib/core/global-id.js +17 -0
- package/lib/core/global-id.js.map +1 -0
- package/lib/core/harness-catalog.d.ts +35 -0
- package/lib/core/harness-catalog.d.ts.map +1 -0
- package/lib/core/harness-catalog.js +45 -0
- package/lib/core/harness-catalog.js.map +1 -0
- package/lib/core/harness-catalogs/antigravity.d.ts +11 -0
- package/lib/core/harness-catalogs/antigravity.d.ts.map +1 -0
- package/lib/core/harness-catalogs/antigravity.js +23 -0
- package/lib/core/harness-catalogs/antigravity.js.map +1 -0
- package/lib/core/harness-catalogs/claude-code.d.ts +12 -0
- package/lib/core/harness-catalogs/claude-code.d.ts.map +1 -0
- package/lib/core/harness-catalogs/claude-code.js +24 -0
- package/lib/core/harness-catalogs/claude-code.js.map +1 -0
- package/lib/core/harness-catalogs/codex.d.ts +11 -0
- package/lib/core/harness-catalogs/codex.d.ts.map +1 -0
- package/lib/core/harness-catalogs/codex.js +26 -0
- package/lib/core/harness-catalogs/codex.js.map +1 -0
- package/lib/core/harness-catalogs/copilot.d.ts +29 -0
- package/lib/core/harness-catalogs/copilot.d.ts.map +1 -0
- package/lib/core/harness-catalogs/copilot.js +45 -0
- package/lib/core/harness-catalogs/copilot.js.map +1 -0
- package/lib/core/harness-catalogs/cursor.d.ts +2 -0
- package/lib/core/harness-catalogs/cursor.d.ts.map +1 -0
- package/lib/core/harness-catalogs/cursor.js +13 -0
- package/lib/core/harness-catalogs/cursor.js.map +1 -0
- package/lib/core/harness-catalogs/grok-build.d.ts +7 -0
- package/lib/core/harness-catalogs/grok-build.d.ts.map +1 -0
- package/lib/core/harness-catalogs/grok-build.js +18 -0
- package/lib/core/harness-catalogs/grok-build.js.map +1 -0
- package/lib/core/harness-catalogs/index.d.ts +73 -0
- package/lib/core/harness-catalogs/index.d.ts.map +1 -0
- package/lib/core/harness-catalogs/index.js +17 -0
- package/lib/core/harness-catalogs/index.js.map +1 -0
- package/lib/core/harness-matrix.d.ts +154 -0
- package/lib/core/harness-matrix.d.ts.map +1 -0
- package/lib/core/harness-matrix.js +204 -0
- package/lib/core/harness-matrix.js.map +1 -0
- package/lib/core/index.d.ts +12 -0
- package/lib/core/index.d.ts.map +1 -1
- package/lib/core/index.js +12 -0
- package/lib/core/index.js.map +1 -1
- package/lib/core/lifecycle-fixtures.d.ts.map +1 -1
- package/lib/core/lifecycle-fixtures.js +4 -2
- package/lib/core/lifecycle-fixtures.js.map +1 -1
- package/lib/core/model-cli.d.ts +9 -11
- package/lib/core/model-cli.d.ts.map +1 -1
- package/lib/core/model-cli.js +31 -19
- package/lib/core/model-cli.js.map +1 -1
- package/lib/core/platform-process.d.ts +6 -1
- package/lib/core/platform-process.d.ts.map +1 -1
- package/lib/core/platform-process.js +49 -11
- package/lib/core/platform-process.js.map +1 -1
- package/lib/core/run.d.ts +292 -1
- package/lib/core/run.d.ts.map +1 -1
- package/lib/core/run.js +27 -0
- package/lib/core/run.js.map +1 -1
- package/lib/core/secure-copy.d.ts.map +1 -0
- package/lib/core/secure-copy.js.map +1 -0
- package/lib/core/usage.d.ts +5 -0
- package/lib/core/usage.d.ts.map +1 -1
- package/lib/core/usage.js +3 -0
- package/lib/core/usage.js.map +1 -1
- package/lib/core/wire.d.ts +12 -0
- package/lib/core/wire.d.ts.map +1 -1
- package/lib/core/wire.js +5 -1
- package/lib/core/wire.js.map +1 -1
- package/lib/drivers/antigravity/artifacts.d.ts +2 -0
- package/lib/drivers/antigravity/artifacts.d.ts.map +1 -0
- package/lib/drivers/antigravity/artifacts.js +33 -0
- package/lib/drivers/antigravity/artifacts.js.map +1 -0
- package/lib/drivers/antigravity/config.d.ts +88 -0
- package/lib/drivers/antigravity/config.d.ts.map +1 -0
- package/lib/drivers/antigravity/config.js +87 -0
- package/lib/drivers/antigravity/config.js.map +1 -0
- package/lib/drivers/antigravity/events.d.ts +4 -0
- package/lib/drivers/antigravity/events.d.ts.map +1 -0
- package/lib/drivers/antigravity/events.js +241 -0
- package/lib/drivers/antigravity/events.js.map +1 -0
- package/lib/drivers/antigravity/index.d.ts +114 -0
- package/lib/drivers/antigravity/index.d.ts.map +1 -0
- package/lib/drivers/antigravity/index.js +113 -0
- package/lib/drivers/antigravity/index.js.map +1 -0
- package/lib/drivers/antigravity/runtime.d.ts +7 -0
- package/lib/drivers/antigravity/runtime.d.ts.map +1 -0
- package/lib/drivers/antigravity/runtime.js +83 -0
- package/lib/drivers/antigravity/runtime.js.map +1 -0
- package/lib/drivers/claude-code/deferred-process.d.ts +17 -0
- package/lib/drivers/claude-code/deferred-process.d.ts.map +1 -0
- package/lib/drivers/claude-code/deferred-process.js +108 -0
- package/lib/drivers/claude-code/deferred-process.js.map +1 -0
- package/lib/drivers/claude-code/index.d.ts +180 -10
- package/lib/drivers/claude-code/index.d.ts.map +1 -1
- package/lib/drivers/claude-code/index.js +186 -252
- package/lib/drivers/claude-code/index.js.map +1 -1
- package/lib/drivers/claude-code/isolation.d.ts +8 -0
- package/lib/drivers/claude-code/isolation.d.ts.map +1 -0
- package/lib/drivers/claude-code/isolation.js +199 -0
- package/lib/drivers/claude-code/isolation.js.map +1 -0
- package/lib/drivers/claude-code/parse-events.d.ts.map +1 -1
- package/lib/drivers/claude-code/parse-events.js +73 -8
- package/lib/drivers/claude-code/parse-events.js.map +1 -1
- package/lib/drivers/codex/app-events.d.ts +9 -2
- package/lib/drivers/codex/app-events.d.ts.map +1 -1
- package/lib/drivers/codex/app-events.js +104 -12
- package/lib/drivers/codex/app-events.js.map +1 -1
- package/lib/drivers/codex/config.d.ts +66 -5
- package/lib/drivers/codex/config.d.ts.map +1 -1
- package/lib/drivers/codex/config.js +39 -8
- package/lib/drivers/codex/config.js.map +1 -1
- package/lib/drivers/codex/exec-events.d.ts +4 -0
- package/lib/drivers/codex/exec-events.d.ts.map +1 -0
- package/lib/drivers/codex/exec-events.js +230 -0
- package/lib/drivers/codex/exec-events.js.map +1 -0
- package/lib/drivers/codex/index.d.ts +138 -4
- package/lib/drivers/codex/index.d.ts.map +1 -1
- package/lib/drivers/codex/index.js +112 -276
- package/lib/drivers/codex/index.js.map +1 -1
- package/lib/drivers/copilot/config.d.ts +84 -0
- package/lib/drivers/copilot/config.d.ts.map +1 -0
- package/lib/drivers/copilot/config.js +57 -0
- package/lib/drivers/copilot/config.js.map +1 -0
- package/lib/drivers/copilot/index.d.ts +107 -0
- package/lib/drivers/copilot/index.d.ts.map +1 -0
- package/lib/drivers/copilot/index.js +268 -0
- package/lib/drivers/copilot/index.js.map +1 -0
- package/lib/drivers/cursor/config.d.ts +28 -0
- package/lib/drivers/cursor/config.d.ts.map +1 -0
- package/lib/drivers/cursor/config.js +28 -0
- package/lib/drivers/cursor/config.js.map +1 -0
- package/lib/drivers/cursor/index.d.ts +44 -0
- package/lib/drivers/cursor/index.d.ts.map +1 -0
- package/lib/drivers/cursor/index.js +286 -0
- package/lib/drivers/cursor/index.js.map +1 -0
- package/lib/drivers/cursor/interaction.d.ts +6 -0
- package/lib/drivers/cursor/interaction.d.ts.map +1 -0
- package/lib/drivers/cursor/interaction.js +55 -0
- package/lib/drivers/cursor/interaction.js.map +1 -0
- package/lib/drivers/grok-build/config.d.ts +68 -0
- package/lib/drivers/grok-build/config.d.ts.map +1 -0
- package/lib/drivers/grok-build/config.js +40 -0
- package/lib/drivers/grok-build/config.js.map +1 -0
- package/lib/drivers/grok-build/index.d.ts +87 -0
- package/lib/drivers/grok-build/index.d.ts.map +1 -0
- package/lib/drivers/grok-build/index.js +293 -0
- package/lib/drivers/grok-build/index.js.map +1 -0
- package/lib/drivers/mcp/index.d.ts +37 -4
- package/lib/drivers/mcp/index.d.ts.map +1 -1
- package/lib/drivers/mcp/index.js +25 -11
- package/lib/drivers/mcp/index.js.map +1 -1
- package/lib/drivers/shared/acp-events.d.ts +15 -0
- package/lib/drivers/shared/acp-events.d.ts.map +1 -0
- package/lib/drivers/shared/acp-events.js +83 -0
- package/lib/drivers/shared/acp-events.js.map +1 -0
- package/lib/drivers/shared/acp-interaction.d.ts +7 -0
- package/lib/drivers/shared/acp-interaction.d.ts.map +1 -0
- package/lib/drivers/shared/acp-interaction.js +20 -0
- package/lib/drivers/shared/acp-interaction.js.map +1 -0
- package/lib/drivers/shared/acp-session.d.ts +4 -0
- package/lib/drivers/shared/acp-session.d.ts.map +1 -0
- package/lib/drivers/shared/acp-session.js +23 -0
- package/lib/drivers/shared/acp-session.js.map +1 -0
- package/lib/drivers/shared/acp-transport.d.ts +40 -0
- package/lib/drivers/shared/acp-transport.d.ts.map +1 -0
- package/lib/drivers/shared/acp-transport.js +152 -0
- package/lib/drivers/shared/acp-transport.js.map +1 -0
- package/lib/drivers/shared/artifacts.d.ts.map +1 -1
- package/lib/drivers/shared/artifacts.js +3 -2
- package/lib/drivers/shared/artifacts.js.map +1 -1
- package/lib/drivers/shared/experiment-behavior.d.ts +13 -0
- package/lib/drivers/shared/experiment-behavior.d.ts.map +1 -0
- package/lib/drivers/shared/experiment-behavior.js +197 -0
- package/lib/drivers/shared/experiment-behavior.js.map +1 -0
- package/lib/drivers/shared/experiment-policy.d.ts +4 -0
- package/lib/drivers/shared/experiment-policy.d.ts.map +1 -0
- package/lib/drivers/shared/experiment-policy.js +143 -0
- package/lib/drivers/shared/experiment-policy.js.map +1 -0
- package/lib/drivers/subprocess/index.d.ts +39 -4
- package/lib/drivers/subprocess/index.d.ts.map +1 -1
- package/lib/drivers/subprocess/index.js +56 -12
- package/lib/drivers/subprocess/index.js.map +1 -1
- package/lib/index.d.ts +22 -8
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +20 -6
- package/lib/index.js.map +1 -1
- package/lib/optimization/reflective.d.ts +3 -1
- package/lib/optimization/reflective.d.ts.map +1 -1
- package/lib/optimization/reflective.js +3 -2
- package/lib/optimization/reflective.js.map +1 -1
- package/lib/orchestrator/annotation-loader.d.ts +6 -2
- package/lib/orchestrator/annotation-loader.d.ts.map +1 -1
- package/lib/orchestrator/annotation-loader.js +8 -0
- package/lib/orchestrator/annotation-loader.js.map +1 -1
- package/lib/orchestrator/annotation-store.d.ts.map +1 -1
- package/lib/orchestrator/annotation-store.js +16 -2
- package/lib/orchestrator/annotation-store.js.map +1 -1
- package/lib/orchestrator/artifact-origin.d.ts +3 -0
- package/lib/orchestrator/artifact-origin.d.ts.map +1 -0
- package/lib/orchestrator/artifact-origin.js +40 -0
- package/lib/orchestrator/artifact-origin.js.map +1 -0
- package/lib/orchestrator/campaign-lifecycle.d.ts +1 -0
- package/lib/orchestrator/campaign-lifecycle.d.ts.map +1 -1
- package/lib/orchestrator/campaign-lifecycle.js +4 -1
- package/lib/orchestrator/campaign-lifecycle.js.map +1 -1
- package/lib/orchestrator/candidates.d.ts.map +1 -1
- package/lib/orchestrator/candidates.js +3 -2
- package/lib/orchestrator/candidates.js.map +1 -1
- package/lib/orchestrator/compare.d.ts +17 -1
- package/lib/orchestrator/compare.d.ts.map +1 -1
- package/lib/orchestrator/compare.js +25 -1
- package/lib/orchestrator/compare.js.map +1 -1
- package/lib/orchestrator/comparison-identity.d.ts.map +1 -1
- package/lib/orchestrator/comparison-identity.js +2 -0
- package/lib/orchestrator/comparison-identity.js.map +1 -1
- package/lib/orchestrator/config.d.ts +177 -1
- package/lib/orchestrator/config.d.ts.map +1 -1
- package/lib/orchestrator/config.js +18 -4
- package/lib/orchestrator/config.js.map +1 -1
- package/lib/orchestrator/discover.d.ts +1 -0
- package/lib/orchestrator/discover.d.ts.map +1 -1
- package/lib/orchestrator/discover.js +7 -1
- package/lib/orchestrator/discover.js.map +1 -1
- package/lib/orchestrator/doctor.d.ts +1 -0
- package/lib/orchestrator/doctor.d.ts.map +1 -1
- package/lib/orchestrator/doctor.js +121 -33
- package/lib/orchestrator/doctor.js.map +1 -1
- package/lib/orchestrator/driver-capabilities.d.ts +4 -0
- package/lib/orchestrator/driver-capabilities.d.ts.map +1 -0
- package/lib/orchestrator/driver-capabilities.js +13 -0
- package/lib/orchestrator/driver-capabilities.js.map +1 -0
- package/lib/orchestrator/driver-identity.d.ts +5 -0
- package/lib/orchestrator/driver-identity.d.ts.map +1 -0
- package/lib/orchestrator/driver-identity.js +51 -0
- package/lib/orchestrator/driver-identity.js.map +1 -0
- package/lib/orchestrator/experiment-context.d.ts +51 -3
- package/lib/orchestrator/experiment-context.d.ts.map +1 -1
- package/lib/orchestrator/experiment-context.js.map +1 -1
- package/lib/orchestrator/experiment-contracts.d.ts +30 -1
- package/lib/orchestrator/experiment-contracts.d.ts.map +1 -1
- package/lib/orchestrator/experiment-corpus.d.ts +2 -1
- package/lib/orchestrator/experiment-corpus.d.ts.map +1 -1
- package/lib/orchestrator/experiment-corpus.js +28 -22
- package/lib/orchestrator/experiment-corpus.js.map +1 -1
- package/lib/orchestrator/experiment-effects.d.ts +33 -0
- package/lib/orchestrator/experiment-effects.d.ts.map +1 -0
- package/lib/orchestrator/experiment-effects.js +44 -0
- package/lib/orchestrator/experiment-effects.js.map +1 -0
- package/lib/orchestrator/experiment-evaluation.d.ts.map +1 -1
- package/lib/orchestrator/experiment-evaluation.js +56 -5
- package/lib/orchestrator/experiment-evaluation.js.map +1 -1
- package/lib/orchestrator/experiment-identity.d.ts +3 -0
- package/lib/orchestrator/experiment-identity.d.ts.map +1 -1
- package/lib/orchestrator/experiment-identity.js +22 -33
- package/lib/orchestrator/experiment-identity.js.map +1 -1
- package/lib/orchestrator/experiment-loader.d.ts +8 -3
- package/lib/orchestrator/experiment-loader.d.ts.map +1 -1
- package/lib/orchestrator/experiment-preflight.d.ts +3 -0
- package/lib/orchestrator/experiment-preflight.d.ts.map +1 -0
- package/lib/orchestrator/experiment-preflight.js +21 -0
- package/lib/orchestrator/experiment-preflight.js.map +1 -0
- package/lib/orchestrator/experiment-report.d.ts +90 -1
- package/lib/orchestrator/experiment-report.d.ts.map +1 -1
- package/lib/orchestrator/experiment-report.js +9 -1
- package/lib/orchestrator/experiment-report.js.map +1 -1
- package/lib/orchestrator/experiment-runs.d.ts +61 -2
- package/lib/orchestrator/experiment-runs.d.ts.map +1 -1
- package/lib/orchestrator/experiment-runs.js +13 -5
- package/lib/orchestrator/experiment-runs.js.map +1 -1
- package/lib/orchestrator/experiment-runtime-identity.d.ts +0 -16
- package/lib/orchestrator/experiment-runtime-identity.d.ts.map +1 -1
- package/lib/orchestrator/experiment-runtime-identity.js +5 -220
- package/lib/orchestrator/experiment-runtime-identity.js.map +1 -1
- package/lib/orchestrator/experiment-selection.d.ts.map +1 -1
- package/lib/orchestrator/experiment-selection.js +52 -0
- package/lib/orchestrator/experiment-selection.js.map +1 -1
- package/lib/orchestrator/experiment.d.ts +3 -3
- package/lib/orchestrator/experiment.d.ts.map +1 -1
- package/lib/orchestrator/experiment.js +26 -21
- package/lib/orchestrator/experiment.js.map +1 -1
- package/lib/orchestrator/fixture-identity.d.ts +1 -0
- package/lib/orchestrator/fixture-identity.d.ts.map +1 -1
- package/lib/orchestrator/fixture-identity.js +6 -1
- package/lib/orchestrator/fixture-identity.js.map +1 -1
- package/lib/orchestrator/fs-read.d.ts +1 -6
- package/lib/orchestrator/fs-read.d.ts.map +1 -1
- package/lib/orchestrator/fs-read.js +2 -32
- package/lib/orchestrator/fs-read.js.map +1 -1
- package/lib/orchestrator/grader-experiment.d.ts +29 -1
- package/lib/orchestrator/grader-experiment.d.ts.map +1 -1
- package/lib/orchestrator/grader-experiment.js +54 -9
- package/lib/orchestrator/grader-experiment.js.map +1 -1
- package/lib/orchestrator/grading.d.ts +2 -1
- package/lib/orchestrator/grading.d.ts.map +1 -1
- package/lib/orchestrator/grading.js +27 -8
- package/lib/orchestrator/grading.js.map +1 -1
- package/lib/orchestrator/harness-catalog-drift.d.ts +22 -0
- package/lib/orchestrator/harness-catalog-drift.d.ts.map +1 -0
- package/lib/orchestrator/harness-catalog-drift.js +90 -0
- package/lib/orchestrator/harness-catalog-drift.js.map +1 -0
- package/lib/orchestrator/harness-registry.d.ts +4 -0
- package/lib/orchestrator/harness-registry.d.ts.map +1 -0
- package/lib/orchestrator/harness-registry.js +5 -0
- package/lib/orchestrator/harness-registry.js.map +1 -0
- package/lib/orchestrator/index.d.ts +1 -1
- package/lib/orchestrator/index.d.ts.map +1 -1
- package/lib/orchestrator/index.js +1 -1
- package/lib/orchestrator/index.js.map +1 -1
- package/lib/orchestrator/list-runs.d.ts +8 -1
- package/lib/orchestrator/list-runs.d.ts.map +1 -1
- package/lib/orchestrator/list-runs.js +77 -12
- package/lib/orchestrator/list-runs.js.map +1 -1
- package/lib/orchestrator/optimization-lifecycle.d.ts.map +1 -1
- package/lib/orchestrator/optimization-lifecycle.js +3 -1
- package/lib/orchestrator/optimization-lifecycle.js.map +1 -1
- package/lib/orchestrator/orchestrator.d.ts +18 -2
- package/lib/orchestrator/orchestrator.d.ts.map +1 -1
- package/lib/orchestrator/orchestrator.js +50 -168
- package/lib/orchestrator/orchestrator.js.map +1 -1
- package/lib/orchestrator/paired-effects.d.ts +34 -0
- package/lib/orchestrator/paired-effects.d.ts.map +1 -0
- package/lib/orchestrator/paired-effects.js +158 -0
- package/lib/orchestrator/paired-effects.js.map +1 -0
- package/lib/orchestrator/provenance.d.ts +5 -1
- package/lib/orchestrator/provenance.d.ts.map +1 -1
- package/lib/orchestrator/provenance.js +16 -3
- package/lib/orchestrator/provenance.js.map +1 -1
- package/lib/orchestrator/regrade.d.ts +7 -0
- package/lib/orchestrator/regrade.d.ts.map +1 -1
- package/lib/orchestrator/rubric-loader.js +1 -1
- package/lib/orchestrator/rubric-loader.js.map +1 -1
- package/lib/orchestrator/run-dir.d.ts +2 -0
- package/lib/orchestrator/run-dir.d.ts.map +1 -1
- package/lib/orchestrator/run-dir.js +1 -1
- package/lib/orchestrator/run-dir.js.map +1 -1
- package/lib/orchestrator/run-execution.d.ts +3 -0
- package/lib/orchestrator/run-execution.d.ts.map +1 -1
- package/lib/orchestrator/run-execution.js +66 -12
- package/lib/orchestrator/run-execution.js.map +1 -1
- package/lib/orchestrator/run-lifecycle.d.ts +1 -0
- package/lib/orchestrator/run-lifecycle.d.ts.map +1 -1
- package/lib/orchestrator/run-lifecycle.js +3 -2
- package/lib/orchestrator/run-lifecycle.js.map +1 -1
- package/lib/orchestrator/run-workspace.d.ts +10 -0
- package/lib/orchestrator/run-workspace.d.ts.map +1 -0
- package/lib/orchestrator/run-workspace.js +58 -0
- package/lib/orchestrator/run-workspace.js.map +1 -0
- package/lib/orchestrator/suite-compare.d.ts +37 -0
- package/lib/orchestrator/suite-compare.d.ts.map +1 -1
- package/lib/orchestrator/suite-compare.js +27 -17
- package/lib/orchestrator/suite-compare.js.map +1 -1
- package/lib/orchestrator/suite-runs.d.ts +6 -1
- package/lib/orchestrator/suite-runs.d.ts.map +1 -1
- package/lib/orchestrator/suite-runs.js +14 -2
- package/lib/orchestrator/suite-runs.js.map +1 -1
- package/lib/orchestrator/suite-summary.d.ts +77 -0
- package/lib/orchestrator/suite-summary.d.ts.map +1 -1
- package/lib/orchestrator/suite-summary.js +61 -12
- package/lib/orchestrator/suite-summary.js.map +1 -1
- package/lib/previewer/artifacts.d.ts +25 -0
- package/lib/previewer/artifacts.d.ts.map +1 -0
- package/lib/previewer/artifacts.js +180 -0
- package/lib/previewer/artifacts.js.map +1 -0
- package/lib/previewer/server.d.ts +111 -0
- package/lib/previewer/server.d.ts.map +1 -0
- package/lib/previewer/server.js +558 -0
- package/lib/previewer/server.js.map +1 -0
- package/package.json +3 -3
- package/skills/lux-answerer/SKILL.md +2 -2
- package/src/answerers/claude-code/index.ts +6 -5
- package/src/answerers/persona/index.ts +75 -34
- package/src/answerers/terminal/index.ts +8 -12
- package/src/assertions/authoring.ts +2 -0
- package/src/assertions/core/command-exits-zero.ts +61 -7
- package/src/assertions/core/event-checks.ts +64 -3
- package/src/assertions/core/helpers.ts +3 -6
- package/src/assertions/core/index.ts +2 -0
- package/src/assertions/core/resource-checks.ts +38 -5
- package/src/assertions/rubric/index.ts +68 -13
- package/src/assertions/rubric/internal.ts +227 -27
- package/src/authoring.ts +345 -2
- package/src/cli/bin.ts +2 -12
- package/src/cli/command-runtime.ts +20 -9
- package/src/cli/doctor.ts +17 -0
- package/src/cli/harness-plan.ts +117 -0
- package/src/cli/init-templates.ts +238 -0
- package/src/cli/init.ts +53 -184
- package/src/cli/output-schemas.ts +106 -0
- package/src/cli/program.ts +689 -721
- package/src/cli/render/reporter.ts +43 -7
- package/src/cli/run-options.ts +132 -25
- package/src/cli/view.ts +129 -0
- package/src/container/driver.ts +211 -0
- package/src/container/protocol.ts +48 -0
- package/src/container/resources.ts +153 -0
- package/src/container/worker.ts +107 -0
- package/src/core/action-events.ts +59 -0
- package/src/core/agent-activity.ts +236 -0
- package/src/core/agent-environment.ts +64 -0
- package/src/core/agent-events.ts +17 -0
- package/src/core/annotation.ts +2 -1
- package/src/core/answerer.ts +9 -0
- package/src/core/artifact-evidence.ts +47 -4
- package/src/core/assertion.ts +18 -0
- package/src/core/case.ts +16 -2
- package/src/core/command-verification.ts +74 -0
- package/src/core/driver-execution.ts +84 -0
- package/src/core/driver-metrics.ts +51 -0
- package/src/core/driver.ts +76 -0
- package/src/core/duration.ts +52 -0
- package/src/core/environment.ts +22 -0
- package/src/core/evaluation-clusters.ts +35 -0
- package/src/core/events.ts +14 -2
- package/src/core/experiment.ts +64 -24
- package/src/core/file-tree.ts +35 -0
- package/src/core/global-id.ts +26 -0
- package/src/core/harness-catalog.ts +100 -0
- package/src/core/harness-catalogs/antigravity.ts +24 -0
- package/src/core/harness-catalogs/claude-code.ts +25 -0
- package/src/core/harness-catalogs/codex.ts +27 -0
- package/src/core/harness-catalogs/copilot.ts +46 -0
- package/src/core/harness-catalogs/cursor.ts +13 -0
- package/src/core/harness-catalogs/grok-build.ts +19 -0
- package/src/core/harness-catalogs/index.ts +31 -0
- package/src/core/harness-matrix.ts +316 -0
- package/src/core/index.ts +12 -0
- package/src/core/lifecycle-fixtures.ts +4 -2
- package/src/core/model-cli.ts +52 -23
- package/src/core/platform-process.ts +58 -10
- package/src/core/run.ts +31 -0
- package/src/core/usage.ts +8 -0
- package/src/core/wire.ts +5 -1
- package/src/drivers/antigravity/README.md +171 -0
- package/src/drivers/antigravity/artifacts.ts +37 -0
- package/src/drivers/antigravity/config.ts +92 -0
- package/src/drivers/antigravity/events.ts +290 -0
- package/src/drivers/antigravity/index.ts +132 -0
- package/src/drivers/antigravity/runtime.ts +94 -0
- package/src/drivers/claude-code/deferred-process.ts +118 -0
- package/src/drivers/claude-code/index.ts +216 -281
- package/src/drivers/claude-code/isolation.ts +228 -0
- package/src/drivers/claude-code/parse-events.ts +98 -12
- package/src/drivers/codex/app-events.ts +126 -16
- package/src/drivers/codex/config.ts +50 -8
- package/src/drivers/codex/exec-events.ts +258 -0
- package/src/drivers/codex/index.ts +144 -312
- package/src/drivers/copilot/README.md +60 -0
- package/src/drivers/copilot/config.ts +61 -0
- package/src/drivers/copilot/index.ts +310 -0
- package/src/drivers/cursor/README.md +66 -0
- package/src/drivers/cursor/config.ts +31 -0
- package/src/drivers/cursor/index.ts +326 -0
- package/src/drivers/cursor/interaction.ts +74 -0
- package/src/drivers/grok-build/README.md +112 -0
- package/src/drivers/grok-build/config.ts +43 -0
- package/src/drivers/grok-build/index.ts +331 -0
- package/src/drivers/mcp/index.ts +25 -11
- package/src/drivers/shared/acp-events.ts +94 -0
- package/src/drivers/shared/acp-interaction.ts +27 -0
- package/src/drivers/shared/acp-session.ts +40 -0
- package/src/drivers/shared/acp-transport.ts +187 -0
- package/src/drivers/shared/artifacts.ts +6 -2
- package/src/drivers/shared/experiment-behavior.ts +214 -0
- package/src/drivers/shared/experiment-policy.ts +195 -0
- package/src/drivers/subprocess/index.ts +55 -12
- package/src/index.ts +115 -10
- package/src/optimization/reflective.ts +3 -2
- package/src/orchestrator/annotation-loader.ts +10 -0
- package/src/orchestrator/annotation-store.ts +24 -3
- package/src/orchestrator/artifact-origin.ts +50 -0
- package/src/orchestrator/campaign-lifecycle.ts +5 -1
- package/src/orchestrator/candidates.ts +3 -2
- package/src/orchestrator/compare.ts +34 -1
- package/src/orchestrator/comparison-identity.ts +2 -0
- package/src/orchestrator/config.ts +20 -3
- package/src/orchestrator/discover.ts +8 -1
- package/src/orchestrator/doctor.ts +189 -28
- package/src/orchestrator/driver-capabilities.ts +21 -0
- package/src/orchestrator/driver-identity.ts +69 -0
- package/src/orchestrator/experiment-context.ts +3 -2
- package/src/orchestrator/experiment-corpus.ts +53 -37
- package/src/orchestrator/experiment-effects.ts +61 -0
- package/src/orchestrator/experiment-evaluation.ts +71 -10
- package/src/orchestrator/experiment-identity.ts +42 -48
- package/src/orchestrator/experiment-preflight.ts +27 -0
- package/src/orchestrator/experiment-report.ts +21 -1
- package/src/orchestrator/experiment-runs.ts +11 -4
- package/src/orchestrator/experiment-runtime-identity.ts +5 -243
- package/src/orchestrator/experiment-selection.ts +77 -0
- package/src/orchestrator/experiment.ts +29 -29
- package/src/orchestrator/fixture-identity.ts +9 -1
- package/src/orchestrator/fs-read.ts +2 -32
- package/src/orchestrator/grader-experiment.ts +74 -13
- package/src/orchestrator/grading.ts +35 -7
- package/src/orchestrator/harness-catalog-drift.ts +132 -0
- package/src/orchestrator/harness-registry.ts +12 -0
- package/src/orchestrator/index.ts +1 -0
- package/src/orchestrator/list-runs.ts +95 -11
- package/src/orchestrator/optimization-lifecycle.ts +4 -1
- package/src/orchestrator/orchestrator.ts +92 -216
- package/src/orchestrator/paired-effects.ts +209 -0
- package/src/orchestrator/provenance.ts +23 -3
- package/src/orchestrator/rubric-loader.ts +1 -1
- package/src/orchestrator/run-dir.ts +8 -1
- package/src/orchestrator/run-execution.ts +77 -11
- package/src/orchestrator/run-lifecycle.ts +4 -2
- package/src/orchestrator/run-workspace.ts +62 -0
- package/src/orchestrator/suite-compare.ts +29 -19
- package/src/orchestrator/suite-runs.ts +13 -2
- package/src/orchestrator/suite-summary.ts +122 -13
- package/src/previewer/artifacts.ts +221 -0
- package/src/previewer/server.ts +787 -0
- package/viewer/app.css +2075 -0
- package/viewer/app.js +627 -0
- package/viewer/artifact-view.js +48 -0
- package/viewer/charts.js +86 -0
- package/viewer/detail.js +1231 -0
- package/viewer/format.js +129 -0
- package/viewer/index.html +151 -0
- package/lib/answerers/scripted/index.d.ts +0 -8
- package/lib/answerers/scripted/index.d.ts.map +0 -1
- package/lib/answerers/scripted/index.js +0 -163
- package/lib/answerers/scripted/index.js.map +0 -1
- package/lib/cli/skills.d.ts +0 -38
- package/lib/cli/skills.d.ts.map +0 -1
- package/lib/cli/skills.js +0 -84
- package/lib/cli/skills.js.map +0 -1
- package/lib/drivers/shared/secure-copy.d.ts.map +0 -1
- package/lib/drivers/shared/secure-copy.js.map +0 -1
- package/skills/lux/SKILL.md +0 -85
- package/skills/lux/references/cli.md +0 -102
- package/skills/lux/references/eval-authoring.md +0 -105
- package/src/answerers/scripted/index.ts +0 -186
- package/src/cli/skills.ts +0 -129
- /package/lib/{drivers/shared → core}/secure-copy.d.ts +0 -0
- /package/lib/{drivers/shared → core}/secure-copy.js +0 -0
- /package/src/{drivers/shared → core}/secure-copy.ts +0 -0
package/skills/lux/SKILL.md
DELETED
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: lux
|
|
3
|
-
description: Author, validate, run, inspect, compare, and improve coding-agent evaluations with the Lux CLI. Use when creating Lux cases or campaigns, choosing assertions/personas/drivers, diagnosing eval failures, comparing runs, or running Lux experiments.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Lux
|
|
7
|
-
|
|
8
|
-
Use Lux as an eval test runner and evidence system for coding agents. Prefer
|
|
9
|
-
small, discriminating cases with deterministic assertions; add an LLM rubric
|
|
10
|
-
only for qualities that artifacts and commands cannot establish.
|
|
11
|
-
|
|
12
|
-
## Start here
|
|
13
|
-
|
|
14
|
-
1. Inspect the repository and its existing `lux.config.ts`, cases, fixtures,
|
|
15
|
-
prompts, and experiments before adding files.
|
|
16
|
-
2. If Lux is not initialized, run `npm exec -- lux init` for ordinary evals or
|
|
17
|
-
`npm exec -- lux init --experiment` for an improvement campaign.
|
|
18
|
-
3. Read [references/eval-authoring.md](references/eval-authoring.md) before
|
|
19
|
-
authoring or reviewing a case.
|
|
20
|
-
4. Read [references/cli.md](references/cli.md) before running, diagnosing,
|
|
21
|
-
comparing, or promoting results.
|
|
22
|
-
5. Run `npm exec -- lux doctor` before model calls. Treat its errors as
|
|
23
|
-
authoring problems, not as permission to bypass validation.
|
|
24
|
-
|
|
25
|
-
## Workflow
|
|
26
|
-
|
|
27
|
-
### Author an eval
|
|
28
|
-
|
|
29
|
-
- Define the behavior and likely failure mode first.
|
|
30
|
-
- Make the prompt realistic and self-contained.
|
|
31
|
-
- Give the persona only facts and preferences the simulated user should know.
|
|
32
|
-
- Assert observable outcomes, not implementation details.
|
|
33
|
-
- Use stable assertion IDs so grading evidence remains intelligible.
|
|
34
|
-
- Use the cheapest deterministic assertion that proves each requirement.
|
|
35
|
-
- Include a rubric assertion only when semantic judgment is unavoidable, and
|
|
36
|
-
write one narrow, falsifiable criterion per assertion.
|
|
37
|
-
- Pin the subject driver model explicitly when comparability matters.
|
|
38
|
-
|
|
39
|
-
### Run and diagnose
|
|
40
|
-
|
|
41
|
-
```bash
|
|
42
|
-
npm exec -- lux doctor
|
|
43
|
-
npm exec -- lux run <case-or-filter> --loop 3
|
|
44
|
-
npm exec -- lux view <run-or-suite>
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
Inspect `case.json`, `run.json`, `events.jsonl`, `grading.json`, and `artifacts/`
|
|
48
|
-
before changing the case. Separate subject failure from harness failure:
|
|
49
|
-
|
|
50
|
-
- Subject failure: the agent misunderstood, asked poorly, used the wrong tools,
|
|
51
|
-
or left incorrect artifacts.
|
|
52
|
-
- Harness failure: the prompt was underspecified, the persona lacked a needed
|
|
53
|
-
fact, an assertion measured a proxy, or the judge criterion was ambiguous.
|
|
54
|
-
|
|
55
|
-
Do not weaken a valid assertion merely to make a run pass.
|
|
56
|
-
|
|
57
|
-
### Improve with evidence
|
|
58
|
-
|
|
59
|
-
Use repeated runs and held-out splits for noisy agent behavior. For skill,
|
|
60
|
-
prompt, or agent-source changes, use `subjectPath()` in cases and an experiment
|
|
61
|
-
campaign with immutable candidates. Plan first, run the experiment, inspect the
|
|
62
|
-
report, and apply a promoted candidate as a separate action:
|
|
63
|
-
|
|
64
|
-
```bash
|
|
65
|
-
npm exec -- lux experiment experiments/example.experiment.ts --plan
|
|
66
|
-
npm exec -- lux experiment experiments/example.experiment.ts
|
|
67
|
-
npm exec -- lux report <experiment-dir>
|
|
68
|
-
npm exec -- lux apply <experiment-dir>
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
Never edit a materialized candidate or managed experiment record by hand.
|
|
72
|
-
|
|
73
|
-
## Guardrails
|
|
74
|
-
|
|
75
|
-
- Lux eval projects execute project-authored commands and agent-generated work.
|
|
76
|
-
Run untrusted evals only in a disposable environment.
|
|
77
|
-
- Do not infer success from agent prose. Grade the final artifacts and recorded
|
|
78
|
-
behavior.
|
|
79
|
-
- Do not use only `run-succeeded` for a case that claims to verify a concrete
|
|
80
|
-
result.
|
|
81
|
-
- Do not let train examples leak into validation or test splits.
|
|
82
|
-
- Do not combine evidence across changed models, harnesses, cases, or subjects;
|
|
83
|
-
Lux identity checks exist to prevent that.
|
|
84
|
-
- Prefer `--plan`, `doctor`, `view`, and `report` before expensive or mutating
|
|
85
|
-
commands.
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
# Lux CLI runbook
|
|
2
|
-
|
|
3
|
-
Invoke the project-local CLI with `npm exec -- lux ...` unless the repository
|
|
4
|
-
uses another package-manager convention.
|
|
5
|
-
|
|
6
|
-
## Author and preflight
|
|
7
|
-
|
|
8
|
-
```bash
|
|
9
|
-
lux init
|
|
10
|
-
lux init --experiment
|
|
11
|
-
lux doctor
|
|
12
|
-
lux doctor experiments/campaign.experiment.ts --json
|
|
13
|
-
lux run --list
|
|
14
|
-
lux run --list-tags
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
`init` is conservative around existing files. `doctor` validates configuration,
|
|
18
|
-
case discovery, driver executables, campaign splits, confidence feasibility,
|
|
19
|
-
and projected budgets without model calls.
|
|
20
|
-
|
|
21
|
-
## Run
|
|
22
|
-
|
|
23
|
-
```bash
|
|
24
|
-
lux run
|
|
25
|
-
lux run retry-flag
|
|
26
|
-
lux run cases/retry-flag.ts
|
|
27
|
-
lux run --tag smoke
|
|
28
|
-
lux run retry --loop 5 --concurrency 2
|
|
29
|
-
lux run one-case --interactive
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
Filters match case IDs and paths. Tags come from `meta.tags`. A run invocation
|
|
33
|
-
also creates a suite record, which is the right unit for repeated or multi-case
|
|
34
|
-
comparison.
|
|
35
|
-
|
|
36
|
-
## Inspect and compare
|
|
37
|
-
|
|
38
|
-
```bash
|
|
39
|
-
lux view
|
|
40
|
-
lux view <run-or-suite>
|
|
41
|
-
lux view --experiments
|
|
42
|
-
lux compare <run-or-suite-a> <run-or-suite-b>
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
Use `view` before opening raw files. When diagnosing, inspect:
|
|
46
|
-
|
|
47
|
-
- `case.json`: frozen authored inputs;
|
|
48
|
-
- `run.json`: exit reason, timing, usage, source identity;
|
|
49
|
-
- `events.jsonl`: trajectory, tools, and interrupts;
|
|
50
|
-
- `grading.json`: assertion evidence;
|
|
51
|
-
- `artifacts/`: the subject workspace output.
|
|
52
|
-
|
|
53
|
-
`compare` exits nonzero on a gated regression, making it suitable for CI.
|
|
54
|
-
|
|
55
|
-
## Regrade and annotate
|
|
56
|
-
|
|
57
|
-
```bash
|
|
58
|
-
lux grade <run>
|
|
59
|
-
lux grade <run> --case cases/changed-grader.ts
|
|
60
|
-
lux annotate <run> \
|
|
61
|
-
--out evals/annotations.json \
|
|
62
|
-
--rubric evals/rubrics/case.json \
|
|
63
|
-
--label pass
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
Regrading preserves subject evidence and changes only grading. Human annotations
|
|
67
|
-
support grader-alignment experiments; keep assertion IDs aligned with the
|
|
68
|
-
rubric and record reviewer context where available.
|
|
69
|
-
|
|
70
|
-
## Experiment lifecycle
|
|
71
|
-
|
|
72
|
-
```bash
|
|
73
|
-
lux experiment <campaign> --plan
|
|
74
|
-
lux experiment <campaign>
|
|
75
|
-
lux optimize <campaign> --plan
|
|
76
|
-
lux optimize <campaign>
|
|
77
|
-
lux optimize <campaign> --resume <experiment-dir>
|
|
78
|
-
lux view <experiment-dir>
|
|
79
|
-
lux report <experiment-dir> --out .lux-runs/reports/decision.md
|
|
80
|
-
lux apply <experiment-dir>
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
`experiment` compares authored variants. `optimize` searches proposed changes.
|
|
84
|
-
Both create durable, resumable, integrity-checked records. `report` re-verifies
|
|
85
|
-
the ledger and promotion decision. `apply` is deliberately separate and
|
|
86
|
-
hash-guards the source it changes.
|
|
87
|
-
|
|
88
|
-
Use the exact resume, report, and apply commands printed by Lux. Do not edit
|
|
89
|
-
`.lux-runs/.experiments/` manually.
|
|
90
|
-
|
|
91
|
-
## Failure triage
|
|
92
|
-
|
|
93
|
-
- Discovery/config error: run `doctor`, verify paths and exported definitions.
|
|
94
|
-
- Driver unavailable: verify the selected CLI is installed and the model is
|
|
95
|
-
explicitly configured where required.
|
|
96
|
-
- Agent exit/error: inspect `events.jsonl` and the driver section of `run.json`.
|
|
97
|
-
- Assertion failure: inspect the assertion evidence and final artifact; decide
|
|
98
|
-
whether the subject or measurement is wrong.
|
|
99
|
-
- Judge disagreement: narrow the rubric, regrade stored evidence, and collect
|
|
100
|
-
human annotations before changing the subject.
|
|
101
|
-
- Interrupted experiment: resume the printed experiment directory; do not start
|
|
102
|
-
a nominally identical campaign and combine results yourself.
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
# Authoring useful Lux evals
|
|
2
|
-
|
|
3
|
-
## Case shape
|
|
4
|
-
|
|
5
|
-
A case default-exports `defineEvalCase`:
|
|
6
|
-
|
|
7
|
-
```ts
|
|
8
|
-
import { defineEvalCase } from "@prismatic-io/lux";
|
|
9
|
-
|
|
10
|
-
export default defineEvalCase({
|
|
11
|
-
id: "retry-flag",
|
|
12
|
-
prompt: "Add a --retry <n> flag to the fetch command.",
|
|
13
|
-
persona: "You are the maintainer. If asked, retries default to 3.",
|
|
14
|
-
driver: { name: "codex", config: { model: "YOUR_CODEX_MODEL" } },
|
|
15
|
-
assertions: [
|
|
16
|
-
{ id: "flag-present", type: "file-contains", path: "src/cli.ts", text: "--retry" },
|
|
17
|
-
{ id: "tests-pass", type: "command-exits-zero", command: "npm test" },
|
|
18
|
-
{ id: "test-coverage", type: "rubric", criteria: "A test covers the new retry flag." },
|
|
19
|
-
],
|
|
20
|
-
meta: { tags: ["cli", "validation"] },
|
|
21
|
-
});
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
Use the project-level default driver when all cases share it. Case-level
|
|
25
|
-
drivers are useful for intentional cross-agent or cross-model comparisons.
|
|
26
|
-
|
|
27
|
-
## Design checklist
|
|
28
|
-
|
|
29
|
-
Before writing:
|
|
30
|
-
|
|
31
|
-
1. State the capability or regression in one sentence.
|
|
32
|
-
2. Identify the artifact, command result, or interaction that proves it.
|
|
33
|
-
3. List plausible false positives. Adjust assertions to reject them.
|
|
34
|
-
4. Decide whether the case needs a fixture and whether each run must begin from
|
|
35
|
-
an isolated copy.
|
|
36
|
-
5. Identify any question a competent agent must ask. Put only the answer and
|
|
37
|
-
relevant preferences in the persona.
|
|
38
|
-
|
|
39
|
-
After writing:
|
|
40
|
-
|
|
41
|
-
1. Run `lux doctor`.
|
|
42
|
-
2. List discovery with `lux run <filter> --list`.
|
|
43
|
-
3. Run the case more than once if agent behavior can vary.
|
|
44
|
-
4. Inspect events and artifacts, including failed runs.
|
|
45
|
-
5. Confirm each assertion fails when its requirement is deliberately absent.
|
|
46
|
-
|
|
47
|
-
## Assertion selection
|
|
48
|
-
|
|
49
|
-
Prefer deterministic assertions:
|
|
50
|
-
|
|
51
|
-
- `run-succeeded`: the driver completed; necessary but rarely sufficient.
|
|
52
|
-
- `file-exists`: a required artifact exists.
|
|
53
|
-
- `file-contains`: a stable literal is present.
|
|
54
|
-
- `json-path-equals`: structured output contains the expected value.
|
|
55
|
-
- `command-exits-zero`: project-authored validation succeeds.
|
|
56
|
-
|
|
57
|
-
Use `rubric` for semantic properties such as design quality, completeness, or
|
|
58
|
-
whether a test meaningfully covers behavior. Keep criteria narrow. Avoid words
|
|
59
|
-
like “good,” “proper,” or “best practice” without observable conditions.
|
|
60
|
-
|
|
61
|
-
Assertions should test user-visible behavior and durable contracts. Avoid
|
|
62
|
-
requiring a specific function name, file layout, or algorithm unless that is
|
|
63
|
-
the contract under evaluation.
|
|
64
|
-
|
|
65
|
-
## Human-in-the-loop behavior
|
|
66
|
-
|
|
67
|
-
The persona is simulated user state, not another system prompt. Include:
|
|
68
|
-
|
|
69
|
-
- facts the user would know;
|
|
70
|
-
- preferences needed to resolve legitimate ambiguity;
|
|
71
|
-
- approval boundaries relevant to the task.
|
|
72
|
-
|
|
73
|
-
Do not tell the persona how to help the agent solve the task. If no interaction
|
|
74
|
-
is part of the capability being evaluated, omit the persona or keep it minimal.
|
|
75
|
-
|
|
76
|
-
Use `interactionMode: "defer-resume"` for automated Claude Code question-tool
|
|
77
|
-
handling. Use `textQuestionFallback: true` only when intentionally evaluating
|
|
78
|
-
models that ask in prose instead of using the supported tool.
|
|
79
|
-
|
|
80
|
-
## Experiments for prompts, skills, and agent source
|
|
81
|
-
|
|
82
|
-
Bind mutable source through `subjectPath()`:
|
|
83
|
-
|
|
84
|
-
```ts
|
|
85
|
-
import { defineEvalCase, subjectPath } from "@prismatic-io/lux";
|
|
86
|
-
|
|
87
|
-
export default defineEvalCase({
|
|
88
|
-
id: "skill-routing",
|
|
89
|
-
prompt: `Use the skill at ${subjectPath("plugin/skills/routing/SKILL.md")} to complete the task.`,
|
|
90
|
-
assertions: [{ id: "completed", type: "run-succeeded" }],
|
|
91
|
-
meta: { tags: ["validation"] },
|
|
92
|
-
});
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
Campaigns should:
|
|
96
|
-
|
|
97
|
-
- restrict `subject.mutable` to the intended source;
|
|
98
|
-
- define named, explicit driver/model profiles;
|
|
99
|
-
- keep train, validation, and test selectors disjoint;
|
|
100
|
-
- budget calls, tokens, cost, and wall time;
|
|
101
|
-
- use repetitions and confidence gates appropriate to stochastic outcomes;
|
|
102
|
-
- reserve held-out cases for promotion and final confirmation.
|
|
103
|
-
|
|
104
|
-
Use `experiment` for authored variants and `optimize` for model-proposed source
|
|
105
|
-
changes. Always run the corresponding `--plan` command first.
|
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
import { readFile } from "node:fs/promises";
|
|
2
|
-
import { resolve } from "node:path";
|
|
3
|
-
import { load as loadYaml } from "js-yaml";
|
|
4
|
-
import { z } from "zod";
|
|
5
|
-
import {
|
|
6
|
-
type Answer,
|
|
7
|
-
type Answerer,
|
|
8
|
-
type AnswererPlugin,
|
|
9
|
-
formatZodIssues,
|
|
10
|
-
type Interrupt,
|
|
11
|
-
InterruptKindSchema,
|
|
12
|
-
} from "../../core/index.js";
|
|
13
|
-
import { approveAnswer } from "../shared.js";
|
|
14
|
-
|
|
15
|
-
const MatchSchema = z
|
|
16
|
-
.object({
|
|
17
|
-
kind: InterruptKindSchema.optional(),
|
|
18
|
-
id: z.string().optional(),
|
|
19
|
-
question_contains: z.string().optional(),
|
|
20
|
-
question_matches: z.string().optional(),
|
|
21
|
-
request_contains: z.string().optional(),
|
|
22
|
-
})
|
|
23
|
-
.strict();
|
|
24
|
-
|
|
25
|
-
const AnsweredAskSchema = z.object({ answer: z.string() }).strict();
|
|
26
|
-
const AnsweredApproveSchema = z
|
|
27
|
-
.object({ approved: z.boolean(), reason: z.string().optional() })
|
|
28
|
-
.strict();
|
|
29
|
-
const AnsweredCustomSchema = z.object({ payload: z.unknown() }).strict();
|
|
30
|
-
|
|
31
|
-
const RuleSchema = z.union([
|
|
32
|
-
z.object({ match: MatchSchema, answer: z.string() }).strict(),
|
|
33
|
-
z.object({ match: MatchSchema, approved: z.boolean(), reason: z.string().optional() }).strict(),
|
|
34
|
-
z.object({ match: MatchSchema, payload: z.unknown() }).strict(),
|
|
35
|
-
z.object({ default: AnsweredAskSchema }).strict(),
|
|
36
|
-
z.object({ default: AnsweredApproveSchema }).strict(),
|
|
37
|
-
z.object({ default: AnsweredCustomSchema }).strict(),
|
|
38
|
-
]);
|
|
39
|
-
|
|
40
|
-
const FixtureSchema = z.array(RuleSchema);
|
|
41
|
-
|
|
42
|
-
export const ScriptedAnswererConfigSchema = z.object({ fixturePath: z.string() }).strict();
|
|
43
|
-
|
|
44
|
-
export type ScriptedAnswererConfig = z.infer<typeof ScriptedAnswererConfigSchema>;
|
|
45
|
-
|
|
46
|
-
type Rule = z.infer<typeof RuleSchema>;
|
|
47
|
-
|
|
48
|
-
/** A rule vetted at load time: kind/body cross-checked, regex pre-compiled. */
|
|
49
|
-
type PreparedRule = { rule: Rule; questionPattern: RegExp | undefined };
|
|
50
|
-
|
|
51
|
-
const ruleLabel = (path: string, index: number): string => `rule ${index + 1} of ${path}`;
|
|
52
|
-
|
|
53
|
-
const bodyKind = (rule: Rule): Interrupt["kind"] => {
|
|
54
|
-
const body = "default" in rule ? rule.default : rule;
|
|
55
|
-
if ("answer" in body) return "ask";
|
|
56
|
-
if ("approved" in body) return "approve";
|
|
57
|
-
return "custom";
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
const matchableKind = (m: z.infer<typeof MatchSchema>): Interrupt["kind"] | undefined => {
|
|
61
|
-
if (m.kind) return m.kind;
|
|
62
|
-
if (m.question_contains !== undefined || m.question_matches !== undefined) return "ask";
|
|
63
|
-
if (m.request_contains !== undefined) return "approve";
|
|
64
|
-
return undefined;
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
const compileQuestionPattern = (rule: Rule, path: string, index: number): RegExp | undefined => {
|
|
68
|
-
if (!("match" in rule) || rule.match.question_matches === undefined) return undefined;
|
|
69
|
-
try {
|
|
70
|
-
return new RegExp(rule.match.question_matches);
|
|
71
|
-
} catch (err) {
|
|
72
|
-
throw new Error(
|
|
73
|
-
`scripted: invalid question_matches in ${ruleLabel(path, index)}: ${
|
|
74
|
-
err instanceof Error ? err.message : String(err)
|
|
75
|
-
}`,
|
|
76
|
-
);
|
|
77
|
-
}
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
// The rule's match fields and answer body are independently valid shapes, so
|
|
81
|
-
// their interrupt kinds still need a semantic cross-check.
|
|
82
|
-
const prepareRule = (rule: Rule, path: string, index: number): PreparedRule => {
|
|
83
|
-
if ("match" in rule) {
|
|
84
|
-
const wanted = matchableKind(rule.match);
|
|
85
|
-
const answered = bodyKind(rule);
|
|
86
|
-
if (wanted !== undefined && wanted !== answered) {
|
|
87
|
-
throw new Error(
|
|
88
|
-
`scripted: ${ruleLabel(path, index)} matches ${wanted} interrupts but its body answers ${answered}`,
|
|
89
|
-
);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
return { rule, questionPattern: compileQuestionPattern(rule, path, index) };
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
const matches = ({ rule, questionPattern }: PreparedRule, interrupt: Interrupt): boolean => {
|
|
96
|
-
if (!("match" in rule)) return false;
|
|
97
|
-
const m = rule.match;
|
|
98
|
-
if (m.kind && m.kind !== interrupt.kind) return false;
|
|
99
|
-
if (m.id && m.id !== interrupt.id) return false;
|
|
100
|
-
if (m.question_contains) {
|
|
101
|
-
if (interrupt.kind !== "ask") return false;
|
|
102
|
-
if (!interrupt.question.includes(m.question_contains)) return false;
|
|
103
|
-
}
|
|
104
|
-
if (questionPattern) {
|
|
105
|
-
if (interrupt.kind !== "ask") return false;
|
|
106
|
-
if (!questionPattern.test(interrupt.question)) return false;
|
|
107
|
-
}
|
|
108
|
-
if (m.request_contains) {
|
|
109
|
-
if (interrupt.kind !== "approve") return false;
|
|
110
|
-
if (!interrupt.request.includes(m.request_contains)) return false;
|
|
111
|
-
}
|
|
112
|
-
return true;
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
// A fixture may carry one default per interrupt kind; the shape of the
|
|
116
|
-
// default's body is what says which kind it can answer.
|
|
117
|
-
const defaultAnswersKind = (rule: Rule, kind: Interrupt["kind"]): boolean => {
|
|
118
|
-
if (!("default" in rule)) return false;
|
|
119
|
-
const body = rule.default;
|
|
120
|
-
if (kind === "ask") return "answer" in body;
|
|
121
|
-
if (kind === "approve") return "approved" in body;
|
|
122
|
-
return "payload" in body;
|
|
123
|
-
};
|
|
124
|
-
|
|
125
|
-
const buildAnswer = (rule: Rule, interrupt: Interrupt): Answer => {
|
|
126
|
-
const body = "default" in rule ? rule.default : rule;
|
|
127
|
-
if (interrupt.kind === "ask") {
|
|
128
|
-
if (!("answer" in body)) {
|
|
129
|
-
throw new Error(`scripted: rule for ask interrupt missing 'answer' (id=${interrupt.id})`);
|
|
130
|
-
}
|
|
131
|
-
return { kind: "ask", id: interrupt.id, text: body.answer };
|
|
132
|
-
}
|
|
133
|
-
if (interrupt.kind === "approve") {
|
|
134
|
-
if (!("approved" in body)) {
|
|
135
|
-
throw new Error(
|
|
136
|
-
`scripted: rule for approve interrupt missing 'approved' (id=${interrupt.id})`,
|
|
137
|
-
);
|
|
138
|
-
}
|
|
139
|
-
return approveAnswer(interrupt.id, body.approved, body.reason);
|
|
140
|
-
}
|
|
141
|
-
if (!("payload" in body)) {
|
|
142
|
-
throw new Error(`scripted: rule for custom interrupt missing 'payload' (id=${interrupt.id})`);
|
|
143
|
-
}
|
|
144
|
-
return { kind: "custom", id: interrupt.id, payload: body.payload };
|
|
145
|
-
};
|
|
146
|
-
|
|
147
|
-
class ScriptedAnswererImpl implements Answerer {
|
|
148
|
-
private rules: PreparedRule[] = [];
|
|
149
|
-
private readonly config: ScriptedAnswererConfig;
|
|
150
|
-
|
|
151
|
-
constructor(config: ScriptedAnswererConfig) {
|
|
152
|
-
this.config = config;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
async prepare(): Promise<void> {
|
|
156
|
-
const path = resolve(this.config.fixturePath);
|
|
157
|
-
const raw = loadYaml(await readFile(path, "utf-8"));
|
|
158
|
-
const parsed = FixtureSchema.safeParse(raw);
|
|
159
|
-
if (!parsed.success) {
|
|
160
|
-
throw new Error(`scripted: invalid fixture at ${path}: ${formatZodIssues(parsed.error)}`);
|
|
161
|
-
}
|
|
162
|
-
this.rules = parsed.data.map((rule, index) => prepareRule(rule, path, index));
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
async answer(interrupt: Interrupt): Promise<Answer> {
|
|
166
|
-
const matched = this.rules.find((r) => matches(r, interrupt));
|
|
167
|
-
if (matched) {
|
|
168
|
-
return buildAnswer(matched.rule, interrupt);
|
|
169
|
-
}
|
|
170
|
-
const fallback = this.rules.find((r) => defaultAnswersKind(r.rule, interrupt.kind));
|
|
171
|
-
if (fallback) {
|
|
172
|
-
return buildAnswer(fallback.rule, interrupt);
|
|
173
|
-
}
|
|
174
|
-
throw new Error(
|
|
175
|
-
`scripted: no rule matched interrupt (kind=${interrupt.kind}, id=${interrupt.id}) and no default provided`,
|
|
176
|
-
);
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
async close(): Promise<void> {}
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
export const scriptedAnswerer: AnswererPlugin<ScriptedAnswererConfig> = {
|
|
183
|
-
name: "scripted",
|
|
184
|
-
configSchema: ScriptedAnswererConfigSchema,
|
|
185
|
-
create: (config) => new ScriptedAnswererImpl(config),
|
|
186
|
-
};
|
package/src/cli/skills.ts
DELETED
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
import { lstat, mkdir, readdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
-
import { homedir } from "node:os";
|
|
3
|
-
import { dirname, join, relative, resolve, sep } from "node:path";
|
|
4
|
-
import { fileURLToPath } from "node:url";
|
|
5
|
-
import { z } from "zod";
|
|
6
|
-
|
|
7
|
-
const PlatformSchema = z.enum(["claude", "claude-code", "codex", "all"]);
|
|
8
|
-
export type SkillsPlatform = z.infer<typeof PlatformSchema>;
|
|
9
|
-
const SkillNameSchema = z.enum(["lux", "lux-answerer"]);
|
|
10
|
-
export type BundledSkillName = z.infer<typeof SkillNameSchema>;
|
|
11
|
-
|
|
12
|
-
const InstallSkillsOptionsSchema = z
|
|
13
|
-
.object({
|
|
14
|
-
cwd: z.string().min(1),
|
|
15
|
-
platform: PlatformSchema,
|
|
16
|
-
project: z.boolean().default(false),
|
|
17
|
-
dir: z.string().min(1).optional(),
|
|
18
|
-
name: SkillNameSchema.optional(),
|
|
19
|
-
})
|
|
20
|
-
.strict();
|
|
21
|
-
|
|
22
|
-
export interface InstalledSkill {
|
|
23
|
-
name: BundledSkillName;
|
|
24
|
-
platform: "claude-code" | "codex";
|
|
25
|
-
path: string;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const BUNDLED_SKILLS = [
|
|
29
|
-
{
|
|
30
|
-
name: "lux",
|
|
31
|
-
description: "Author and drive coding-agent evals with Lux",
|
|
32
|
-
platforms: ["claude-code", "codex"],
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
name: "lux-answerer",
|
|
36
|
-
description: "Play a simulated user for a running Lux eval",
|
|
37
|
-
platforms: ["claude-code"],
|
|
38
|
-
},
|
|
39
|
-
] as const satisfies readonly {
|
|
40
|
-
name: BundledSkillName;
|
|
41
|
-
description: string;
|
|
42
|
-
platforms: readonly ("claude-code" | "codex")[];
|
|
43
|
-
}[];
|
|
44
|
-
|
|
45
|
-
export const formatSkillsList = (): string =>
|
|
46
|
-
BUNDLED_SKILLS.map(
|
|
47
|
-
({ name, description, platforms }) => `${name}\t${description}\t${platforms.join(",")}`,
|
|
48
|
-
).join("\n");
|
|
49
|
-
|
|
50
|
-
const targetsFor = (
|
|
51
|
-
platform: SkillsPlatform,
|
|
52
|
-
cwd: string,
|
|
53
|
-
project: boolean,
|
|
54
|
-
dir?: string,
|
|
55
|
-
name?: BundledSkillName,
|
|
56
|
-
): (InstalledSkill & { source: string })[] => {
|
|
57
|
-
const platforms =
|
|
58
|
-
platform === "all"
|
|
59
|
-
? (["claude-code", "codex"] as const)
|
|
60
|
-
: ([platform === "claude" ? "claude-code" : platform] as const);
|
|
61
|
-
const scopeRoot = project ? resolve(cwd) : homedir();
|
|
62
|
-
const skills = name ? BUNDLED_SKILLS.filter((skill) => skill.name === name) : BUNDLED_SKILLS;
|
|
63
|
-
return platforms.flatMap((platformName) =>
|
|
64
|
-
skills
|
|
65
|
-
.filter((skill) =>
|
|
66
|
-
(skill.platforms as readonly ("claude-code" | "codex")[]).includes(platformName),
|
|
67
|
-
)
|
|
68
|
-
.map((skill) => ({
|
|
69
|
-
name: skill.name,
|
|
70
|
-
platform: platformName,
|
|
71
|
-
source: fileURLToPath(new URL(`../../skills/${skill.name}`, import.meta.url)),
|
|
72
|
-
path: dir
|
|
73
|
-
? join(resolve(dir), skill.name)
|
|
74
|
-
: join(
|
|
75
|
-
scopeRoot,
|
|
76
|
-
platformName === "claude-code" ? ".claude" : ".codex",
|
|
77
|
-
"skills",
|
|
78
|
-
skill.name,
|
|
79
|
-
),
|
|
80
|
-
})),
|
|
81
|
-
);
|
|
82
|
-
};
|
|
83
|
-
|
|
84
|
-
const copySkillDirectory = async (source: string, target: string): Promise<void> => {
|
|
85
|
-
const sourceInfo = await lstat(source);
|
|
86
|
-
if (!sourceInfo.isDirectory() || sourceInfo.isSymbolicLink()) {
|
|
87
|
-
throw new Error(`lux skills: bundled skill source is not a real directory: ${source}`);
|
|
88
|
-
}
|
|
89
|
-
await mkdir(target, { recursive: true });
|
|
90
|
-
for (const entry of await readdir(source, { withFileTypes: true })) {
|
|
91
|
-
const sourcePath = join(source, entry.name);
|
|
92
|
-
const targetPath = join(target, entry.name);
|
|
93
|
-
if (entry.isSymbolicLink()) {
|
|
94
|
-
throw new Error(`lux skills: bundled skill contains a symbolic link: ${sourcePath}`);
|
|
95
|
-
}
|
|
96
|
-
if (entry.isDirectory()) {
|
|
97
|
-
await copySkillDirectory(sourcePath, targetPath);
|
|
98
|
-
} else if (entry.isFile()) {
|
|
99
|
-
await mkdir(dirname(targetPath), { recursive: true });
|
|
100
|
-
await writeFile(targetPath, await readFile(sourcePath));
|
|
101
|
-
} else {
|
|
102
|
-
throw new Error(`lux skills: bundled skill contains an unsupported entry: ${sourcePath}`);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
export const installSkills = async (
|
|
108
|
-
options: z.input<typeof InstallSkillsOptionsSchema>,
|
|
109
|
-
): Promise<InstalledSkill[]> => {
|
|
110
|
-
const parsed = InstallSkillsOptionsSchema.parse(options);
|
|
111
|
-
const targets = targetsFor(parsed.platform, parsed.cwd, parsed.project, parsed.dir, parsed.name);
|
|
112
|
-
if (targets.length === 0) {
|
|
113
|
-
throw new Error(
|
|
114
|
-
`lux skills: '${parsed.name}' is not available for platform '${parsed.platform}'`,
|
|
115
|
-
);
|
|
116
|
-
}
|
|
117
|
-
for (const target of targets) await copySkillDirectory(target.source, target.path);
|
|
118
|
-
return targets.map(({ source: _, ...installed }) => installed);
|
|
119
|
-
};
|
|
120
|
-
|
|
121
|
-
export const formatSkillsInstall = (installed: InstalledSkill[], cwd: string): string =>
|
|
122
|
-
installed
|
|
123
|
-
.map(
|
|
124
|
-
({ name, platform, path }) =>
|
|
125
|
-
`installed ${name} skill for ${platform} at ${
|
|
126
|
-
relative(cwd, path).split(sep).join("/") || "."
|
|
127
|
-
}`,
|
|
128
|
-
)
|
|
129
|
-
.join("\n");
|
|
File without changes
|
|
File without changes
|
|
File without changes
|