@interf/compiler 0.6.1 → 0.6.4
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/README.md +106 -80
- package/builtin-workflows/interf/README.md +5 -5
- package/builtin-workflows/interf/compile/stages/shape/SKILL.md +4 -4
- package/builtin-workflows/interf/improve/SKILL.md +2 -2
- package/builtin-workflows/interf/use/query/SKILL.md +1 -1
- package/builtin-workflows/interf/workflow.json +6 -6
- package/builtin-workflows/interf/workflow.schema.json +1 -1
- package/dist/bin.js +2 -28
- package/dist/{commands → cli/commands}/check-draft.d.ts +2 -2
- package/dist/{commands → cli/commands}/check-draft.js +16 -16
- package/dist/{commands → cli/commands}/compile-controller.d.ts +3 -3
- package/dist/{commands → cli/commands}/compile-controller.js +37 -35
- package/dist/{commands → cli/commands}/compile.d.ts +2 -2
- package/dist/{commands → cli/commands}/compile.js +15 -11
- package/dist/{commands → cli/commands}/compiled-flow.d.ts +3 -4
- package/dist/{commands → cli/commands}/compiled-flow.js +9 -14
- package/dist/{commands → cli/commands}/create-workflow-wizard.d.ts +3 -3
- package/dist/{commands → cli/commands}/create-workflow-wizard.js +64 -37
- package/dist/{commands → cli/commands}/create.d.ts +1 -1
- package/dist/{commands → cli/commands}/create.js +15 -18
- package/dist/{commands → cli/commands}/dataset-selection.d.ts +1 -1
- package/dist/{commands → cli/commands}/default.js +3 -3
- package/dist/{commands → cli/commands}/doctor.js +5 -6
- package/dist/{commands → cli/commands}/executor-flow.d.ts +1 -1
- package/dist/{commands → cli/commands}/executor-flow.js +13 -16
- package/dist/{commands → cli/commands}/init.d.ts +4 -1
- package/dist/{commands → cli/commands}/init.js +162 -77
- package/dist/{commands → cli/commands}/list.js +6 -6
- package/dist/{commands → cli/commands}/reset.js +4 -4
- package/dist/{commands → cli/commands}/source-config-wizard.d.ts +9 -4
- package/dist/{commands → cli/commands}/source-config-wizard.js +168 -94
- package/dist/{commands → cli/commands}/status.js +20 -11
- package/dist/{commands → cli/commands}/test-flow.d.ts +13 -4
- package/dist/{commands → cli/commands}/test-flow.js +52 -48
- package/dist/cli/commands/test.d.ts +14 -0
- package/dist/{commands → cli/commands}/test.js +40 -24
- package/dist/{commands → cli/commands}/verify.js +4 -4
- package/dist/cli/index.d.ts +21 -0
- package/dist/cli/index.js +33 -0
- package/dist/index.d.ts +22 -11
- package/dist/index.js +15 -6
- package/dist/lib/agent-args.d.ts +1 -4
- package/dist/lib/agent-args.js +1 -52
- package/dist/lib/agent-constants.d.ts +1 -5
- package/dist/lib/agent-constants.js +1 -28
- package/dist/lib/agent-detection.d.ts +1 -7
- package/dist/lib/agent-detection.js +1 -65
- package/dist/lib/agent-execution.d.ts +1 -2
- package/dist/lib/agent-execution.js +1 -243
- package/dist/lib/agent-logs.d.ts +1 -2
- package/dist/lib/agent-logs.js +1 -17
- package/dist/lib/agent-preflight.d.ts +1 -7
- package/dist/lib/agent-preflight.js +1 -77
- package/dist/lib/agent-render.d.ts +1 -8
- package/dist/lib/agent-render.js +1 -218
- package/dist/lib/agent-shells.d.ts +1 -69
- package/dist/lib/agent-shells.js +1 -1021
- package/dist/lib/agent-status.d.ts +1 -3
- package/dist/lib/agent-status.js +1 -58
- package/dist/lib/agent-types.d.ts +1 -30
- package/dist/lib/agent-types.js +1 -1
- package/dist/lib/agents.d.ts +1 -6
- package/dist/lib/agents.js +1 -5
- package/dist/lib/builtin-compiled-workflow.d.ts +1 -38
- package/dist/lib/builtin-compiled-workflow.js +1 -94
- package/dist/lib/chart-guidance.d.ts +1 -1
- package/dist/lib/chart-guidance.js +1 -8
- package/dist/lib/compiled-compile.d.ts +1 -48
- package/dist/lib/compiled-compile.js +1 -255
- package/dist/lib/compiled-paths.d.ts +1 -40
- package/dist/lib/compiled-paths.js +3 -106
- package/dist/lib/compiled-raw.d.ts +1 -49
- package/dist/lib/compiled-raw.js +3 -102
- package/dist/lib/compiled-reset.d.ts +1 -2
- package/dist/lib/compiled-reset.js +3 -72
- package/dist/lib/compiled-schema.d.ts +1 -31
- package/dist/lib/compiled-schema.js +1 -141
- package/dist/lib/discovery.d.ts +1 -7
- package/dist/lib/discovery.js +1 -84
- package/dist/lib/execution-profile.d.ts +1 -17
- package/dist/lib/execution-profile.js +1 -84
- package/dist/lib/executors.d.ts +1 -32
- package/dist/lib/executors.js +1 -43
- package/dist/lib/filesystem.d.ts +1 -2
- package/dist/lib/filesystem.js +1 -55
- package/dist/lib/interf-bootstrap.d.ts +1 -3
- package/dist/lib/interf-bootstrap.js +3 -18
- package/dist/lib/interf-detect.d.ts +1 -33
- package/dist/lib/interf-detect.js +3 -176
- package/dist/lib/interf-scaffold.d.ts +1 -2
- package/dist/lib/interf-scaffold.js +3 -114
- package/dist/lib/interf-workflow-package.d.ts +1 -25
- package/dist/lib/interf-workflow-package.js +1 -342
- package/dist/lib/interf.d.ts +1 -5
- package/dist/lib/interf.js +3 -4
- package/dist/lib/local-workflows.d.ts +1 -54
- package/dist/lib/local-workflows.js +1 -422
- package/dist/lib/logger.d.ts +1 -3
- package/dist/lib/logger.js +1 -10
- package/dist/lib/package-root.d.ts +1 -0
- package/dist/lib/package-root.js +1 -0
- package/dist/lib/parse.d.ts +1 -8
- package/dist/lib/parse.js +1 -145
- package/dist/lib/project-paths.d.ts +1 -11
- package/dist/lib/project-paths.js +3 -32
- package/dist/lib/runtime-acceptance.d.ts +1 -9
- package/dist/lib/runtime-acceptance.js +1 -269
- package/dist/lib/runtime-contracts.d.ts +1 -2
- package/dist/lib/runtime-contracts.js +1 -48
- package/dist/lib/runtime-inventory.d.ts +1 -7
- package/dist/lib/runtime-inventory.js +1 -29
- package/dist/lib/runtime-paths.d.ts +1 -8
- package/dist/lib/runtime-paths.js +1 -26
- package/dist/lib/runtime-prompt.d.ts +1 -2
- package/dist/lib/runtime-prompt.js +1 -48
- package/dist/lib/runtime-reconcile.d.ts +1 -2
- package/dist/lib/runtime-reconcile.js +1 -193
- package/dist/lib/runtime-runs.d.ts +1 -11
- package/dist/lib/runtime-runs.js +1 -262
- package/dist/lib/runtime-types.d.ts +1 -43
- package/dist/lib/runtime-types.js +1 -1
- package/dist/lib/runtime.d.ts +1 -6
- package/dist/lib/runtime.js +1 -5
- package/dist/lib/schema.d.ts +4 -1073
- package/dist/lib/schema.js +6 -542
- package/dist/lib/source-config.d.ts +1 -39
- package/dist/lib/source-config.js +3 -293
- package/dist/lib/state-artifacts.d.ts +1 -8
- package/dist/lib/state-artifacts.js +1 -13
- package/dist/lib/state-health.d.ts +1 -4
- package/dist/lib/state-health.js +1 -132
- package/dist/lib/state-io.d.ts +1 -10
- package/dist/lib/state-io.js +1 -76
- package/dist/lib/state-paths.d.ts +1 -4
- package/dist/lib/state-paths.js +1 -13
- package/dist/lib/state-view.d.ts +1 -4
- package/dist/lib/state-view.js +1 -103
- package/dist/lib/state.d.ts +1 -7
- package/dist/lib/state.js +1 -12
- package/dist/lib/test-execution.d.ts +1 -14
- package/dist/lib/test-execution.js +3 -525
- package/dist/lib/test-matrices.d.ts +1 -90
- package/dist/lib/test-matrices.js +3 -96
- package/dist/lib/test-paths.d.ts +1 -12
- package/dist/lib/test-paths.js +3 -59
- package/dist/lib/test-profile-presets.d.ts +1 -57
- package/dist/lib/test-profile-presets.js +3 -50
- package/dist/lib/test-sandbox.d.ts +1 -11
- package/dist/lib/test-sandbox.js +3 -105
- package/dist/lib/test-specs.d.ts +1 -7
- package/dist/lib/test-specs.js +3 -114
- package/dist/lib/test-targets.d.ts +1 -5
- package/dist/lib/test-targets.js +3 -38
- package/dist/lib/test-types.d.ts +1 -17
- package/dist/lib/test-types.js +3 -1
- package/dist/lib/test.d.ts +1 -4
- package/dist/lib/test.js +3 -3
- package/dist/lib/util.d.ts +1 -4
- package/dist/lib/util.js +1 -25
- package/dist/lib/validate-compiled.d.ts +1 -27
- package/dist/lib/validate-compiled.js +1 -241
- package/dist/lib/validate-helpers.d.ts +1 -12
- package/dist/lib/validate-helpers.js +1 -41
- package/dist/lib/validate.d.ts +1 -21
- package/dist/lib/validate.js +1 -249
- package/dist/lib/workflow-authoring.d.ts +1 -26
- package/dist/lib/workflow-authoring.js +1 -119
- package/dist/lib/workflow-definitions.d.ts +1 -78
- package/dist/lib/workflow-definitions.js +1 -203
- package/dist/lib/workflow-edit-session.d.ts +1 -16
- package/dist/lib/workflow-edit-session.js +1 -57
- package/dist/lib/workflow-edit-utils.d.ts +1 -10
- package/dist/lib/workflow-edit-utils.js +1 -39
- package/dist/lib/workflow-helpers.d.ts +1 -38
- package/dist/lib/workflow-helpers.js +1 -167
- package/dist/lib/workflow-improvement.d.ts +1 -22
- package/dist/lib/workflow-improvement.js +1 -209
- package/dist/lib/workflow-primitives.d.ts +1 -2
- package/dist/lib/workflow-primitives.js +1 -5
- package/dist/lib/workflow-review-paths.d.ts +1 -10
- package/dist/lib/workflow-review-paths.js +1 -27
- package/dist/lib/workflow-stage-policy.d.ts +1 -5
- package/dist/lib/workflow-stage-policy.js +1 -31
- package/dist/lib/workflow-stage-runner.d.ts +1 -41
- package/dist/lib/workflow-stage-runner.js +1 -109
- package/dist/lib/workflows.d.ts +1 -15
- package/dist/lib/workflows.js +1 -31
- package/dist/packages/agents/index.d.ts +18 -0
- package/dist/packages/agents/index.js +16 -0
- package/dist/packages/agents/lib/agents.d.ts +6 -0
- package/dist/packages/agents/lib/agents.js +5 -0
- package/dist/packages/agents/lib/args.d.ts +4 -0
- package/dist/packages/agents/lib/args.js +52 -0
- package/dist/packages/agents/lib/chart-guidance.d.ts +1 -0
- package/dist/packages/agents/lib/chart-guidance.js +8 -0
- package/dist/packages/agents/lib/compiled-bootstrap.d.ts +3 -0
- package/dist/packages/agents/lib/compiled-bootstrap.js +18 -0
- package/dist/packages/agents/lib/constants.d.ts +5 -0
- package/dist/packages/agents/lib/constants.js +28 -0
- package/dist/packages/agents/lib/detection.d.ts +7 -0
- package/dist/packages/agents/lib/detection.js +65 -0
- package/dist/packages/agents/lib/execution-profile.d.ts +17 -0
- package/dist/packages/agents/lib/execution-profile.js +84 -0
- package/dist/packages/agents/lib/execution.d.ts +2 -0
- package/dist/packages/agents/lib/execution.js +243 -0
- package/dist/packages/agents/lib/executors.d.ts +32 -0
- package/dist/packages/agents/lib/executors.js +45 -0
- package/dist/packages/agents/lib/logs.d.ts +2 -0
- package/dist/packages/agents/lib/logs.js +17 -0
- package/dist/packages/agents/lib/preflight.d.ts +7 -0
- package/dist/packages/agents/lib/preflight.js +77 -0
- package/dist/packages/agents/lib/render.d.ts +8 -0
- package/dist/packages/agents/lib/render.js +218 -0
- package/dist/packages/agents/lib/schema.d.ts +8 -0
- package/dist/packages/agents/lib/schema.js +7 -0
- package/dist/packages/agents/lib/shells.d.ts +71 -0
- package/dist/packages/agents/lib/shells.js +1023 -0
- package/dist/packages/agents/lib/status.d.ts +3 -0
- package/dist/packages/agents/lib/status.js +58 -0
- package/dist/packages/agents/lib/types.d.ts +30 -0
- package/dist/packages/agents/lib/types.js +1 -0
- package/dist/{lib → packages/agents/lib}/user-config.d.ts +1 -0
- package/dist/{lib → packages/agents/lib}/user-config.js +3 -2
- package/dist/packages/compiler/compiled-compile.d.ts +4 -0
- package/dist/packages/compiler/compiled-compile.js +4 -0
- package/dist/packages/compiler/compiled-paths.d.ts +40 -0
- package/dist/packages/compiler/compiled-paths.js +106 -0
- package/dist/packages/compiler/compiled-pipeline.d.ts +39 -0
- package/dist/packages/compiler/compiled-pipeline.js +134 -0
- package/dist/packages/compiler/compiled-schema.d.ts +31 -0
- package/dist/packages/compiler/compiled-schema.js +141 -0
- package/dist/packages/compiler/compiled-stage-plan.d.ts +15 -0
- package/dist/packages/compiler/compiled-stage-plan.js +79 -0
- package/dist/packages/compiler/compiled-stage-runner.d.ts +10 -0
- package/dist/packages/compiler/compiled-stage-runner.js +46 -0
- package/dist/packages/compiler/compiled-target.d.ts +11 -0
- package/dist/packages/compiler/compiled-target.js +16 -0
- package/dist/packages/compiler/discovery.d.ts +7 -0
- package/dist/packages/compiler/discovery.js +80 -0
- package/dist/packages/compiler/index.d.ts +24 -0
- package/dist/packages/compiler/index.js +23 -0
- package/dist/packages/compiler/lib/schema.d.ts +684 -0
- package/dist/packages/compiler/lib/schema.js +363 -0
- package/dist/packages/compiler/raw-snapshot.d.ts +49 -0
- package/dist/packages/compiler/raw-snapshot.js +102 -0
- package/dist/packages/compiler/reset.d.ts +2 -0
- package/dist/packages/compiler/reset.js +72 -0
- package/dist/packages/compiler/runtime-acceptance.d.ts +9 -0
- package/dist/packages/compiler/runtime-acceptance.js +269 -0
- package/dist/packages/compiler/runtime-contracts.d.ts +2 -0
- package/dist/packages/compiler/runtime-contracts.js +48 -0
- package/dist/packages/compiler/runtime-inventory.d.ts +7 -0
- package/dist/packages/compiler/runtime-inventory.js +29 -0
- package/dist/packages/compiler/runtime-paths.d.ts +8 -0
- package/dist/packages/compiler/runtime-paths.js +26 -0
- package/dist/packages/compiler/runtime-prompt.d.ts +2 -0
- package/dist/packages/compiler/runtime-prompt.js +48 -0
- package/dist/packages/compiler/runtime-reconcile.d.ts +2 -0
- package/dist/packages/compiler/runtime-reconcile.js +193 -0
- package/dist/packages/compiler/runtime-runs.d.ts +11 -0
- package/dist/packages/compiler/runtime-runs.js +262 -0
- package/dist/packages/compiler/runtime-types.d.ts +43 -0
- package/dist/packages/compiler/runtime-types.js +1 -0
- package/dist/packages/compiler/runtime.d.ts +6 -0
- package/dist/packages/compiler/runtime.js +5 -0
- package/dist/packages/compiler/state-artifacts.d.ts +8 -0
- package/dist/packages/compiler/state-artifacts.js +13 -0
- package/dist/packages/compiler/state-health.d.ts +4 -0
- package/dist/packages/compiler/state-health.js +132 -0
- package/dist/packages/compiler/state-io.d.ts +10 -0
- package/dist/packages/compiler/state-io.js +76 -0
- package/dist/packages/compiler/state-paths.d.ts +4 -0
- package/dist/packages/compiler/state-paths.js +13 -0
- package/dist/packages/compiler/state-view.d.ts +4 -0
- package/dist/packages/compiler/state-view.js +103 -0
- package/dist/packages/compiler/state.d.ts +7 -0
- package/dist/packages/compiler/state.js +12 -0
- package/dist/packages/compiler/validate-compiled.d.ts +27 -0
- package/dist/packages/compiler/validate-compiled.js +241 -0
- package/dist/packages/compiler/validate-helpers.d.ts +12 -0
- package/dist/packages/compiler/validate-helpers.js +41 -0
- package/dist/packages/compiler/validate.d.ts +21 -0
- package/dist/packages/compiler/validate.js +249 -0
- package/dist/packages/compiler/workflow-primitives.d.ts +2 -0
- package/dist/packages/compiler/workflow-primitives.js +5 -0
- package/dist/packages/compiler/workflows.d.ts +15 -0
- package/dist/packages/compiler/workflows.js +31 -0
- package/dist/packages/project-model/compiled-paths.d.ts +1 -0
- package/dist/packages/project-model/compiled-paths.js +1 -0
- package/dist/packages/project-model/compiled-raw.d.ts +1 -0
- package/dist/packages/project-model/compiled-raw.js +1 -0
- package/dist/packages/project-model/compiled-reset.d.ts +1 -0
- package/dist/packages/project-model/compiled-reset.js +1 -0
- package/dist/packages/project-model/index.d.ts +11 -0
- package/dist/packages/project-model/index.js +10 -0
- package/dist/packages/project-model/interf-bootstrap.d.ts +1 -0
- package/dist/packages/project-model/interf-bootstrap.js +1 -0
- package/dist/packages/project-model/interf-detect.d.ts +33 -0
- package/dist/packages/project-model/interf-detect.js +176 -0
- package/dist/packages/project-model/interf-scaffold.d.ts +2 -0
- package/dist/packages/project-model/interf-scaffold.js +124 -0
- package/dist/packages/project-model/interf.d.ts +5 -0
- package/dist/packages/project-model/interf.js +4 -0
- package/dist/packages/project-model/lib/schema.d.ts +125 -0
- package/dist/packages/project-model/lib/schema.js +62 -0
- package/dist/packages/project-model/project-paths.d.ts +11 -0
- package/dist/packages/project-model/project-paths.js +32 -0
- package/dist/packages/project-model/source-config.d.ts +38 -0
- package/dist/packages/project-model/source-config.js +298 -0
- package/dist/packages/shared/file-types.d.ts +1 -0
- package/dist/packages/shared/file-types.js +4 -0
- package/dist/packages/shared/filesystem.d.ts +2 -0
- package/dist/packages/shared/filesystem.js +55 -0
- package/dist/packages/shared/index.d.ts +7 -0
- package/dist/packages/shared/index.js +7 -0
- package/dist/packages/shared/logger.d.ts +3 -0
- package/dist/packages/shared/logger.js +10 -0
- package/dist/packages/shared/naming.d.ts +1 -0
- package/dist/packages/shared/naming.js +8 -0
- package/dist/packages/shared/parse.d.ts +8 -0
- package/dist/packages/shared/parse.js +145 -0
- package/dist/packages/shared/path-guards.d.ts +2 -0
- package/dist/packages/shared/path-guards.js +14 -0
- package/dist/packages/shared/util.d.ts +3 -0
- package/dist/packages/shared/util.js +3 -0
- package/dist/packages/testing/index.d.ts +13 -0
- package/dist/packages/testing/index.js +10 -0
- package/dist/packages/testing/lib/schema.d.ts +261 -0
- package/dist/packages/testing/lib/schema.js +119 -0
- package/dist/packages/testing/test-execution.d.ts +14 -0
- package/dist/packages/testing/test-execution.js +525 -0
- package/dist/packages/testing/test-matrices.d.ts +90 -0
- package/dist/packages/testing/test-matrices.js +96 -0
- package/dist/packages/testing/test-paths.d.ts +12 -0
- package/dist/packages/testing/test-paths.js +59 -0
- package/dist/packages/testing/test-profile-presets.d.ts +57 -0
- package/dist/packages/testing/test-profile-presets.js +50 -0
- package/dist/packages/testing/test-sandbox.d.ts +11 -0
- package/dist/packages/testing/test-sandbox.js +105 -0
- package/dist/packages/testing/test-specs.d.ts +7 -0
- package/dist/packages/testing/test-specs.js +114 -0
- package/dist/packages/testing/test-targets.d.ts +5 -0
- package/dist/packages/testing/test-targets.js +38 -0
- package/dist/packages/testing/test-types.d.ts +16 -0
- package/dist/packages/testing/test-types.js +1 -0
- package/dist/packages/testing/test.d.ts +4 -0
- package/dist/packages/testing/test.js +3 -0
- package/dist/packages/workflow-authoring/index.d.ts +4 -0
- package/dist/packages/workflow-authoring/index.js +4 -0
- package/dist/packages/workflow-authoring/lib/workflow-edit-utils.d.ts +10 -0
- package/dist/packages/workflow-authoring/lib/workflow-edit-utils.js +39 -0
- package/dist/packages/workflow-authoring/workflow-authoring.d.ts +26 -0
- package/dist/packages/workflow-authoring/workflow-authoring.js +121 -0
- package/dist/packages/workflow-authoring/workflow-edit-session.d.ts +16 -0
- package/dist/packages/workflow-authoring/workflow-edit-session.js +57 -0
- package/dist/packages/workflow-authoring/workflow-improvement.d.ts +23 -0
- package/dist/packages/workflow-authoring/workflow-improvement.js +210 -0
- package/dist/packages/workflow-package/builtin-compiled-workflow.d.ts +38 -0
- package/dist/packages/workflow-package/builtin-compiled-workflow.js +94 -0
- package/dist/packages/workflow-package/context-interface.d.ts +96 -0
- package/dist/packages/workflow-package/context-interface.js +146 -0
- package/dist/packages/workflow-package/index.d.ts +11 -0
- package/dist/packages/workflow-package/index.js +11 -0
- package/dist/packages/workflow-package/interf-workflow-package.d.ts +25 -0
- package/dist/packages/workflow-package/interf-workflow-package.js +389 -0
- package/dist/{lib/config.d.ts → packages/workflow-package/lib/package-root.d.ts} +0 -1
- package/dist/packages/workflow-package/lib/package-root.js +6 -0
- package/dist/packages/workflow-package/local-workflows.d.ts +57 -0
- package/dist/packages/workflow-package/local-workflows.js +424 -0
- package/dist/packages/workflow-package/workflow-definitions.d.ts +82 -0
- package/dist/packages/workflow-package/workflow-definitions.js +210 -0
- package/dist/packages/workflow-package/workflow-helpers.d.ts +38 -0
- package/dist/packages/workflow-package/workflow-helpers.js +167 -0
- package/dist/packages/workflow-package/workflow-review-paths.d.ts +10 -0
- package/dist/packages/workflow-package/workflow-review-paths.js +27 -0
- package/dist/packages/workflow-package/workflow-stage-policy.d.ts +5 -0
- package/dist/packages/workflow-package/workflow-stage-policy.js +31 -0
- package/dist/packages/workflow-package/workflow-stage-runner.d.ts +41 -0
- package/dist/packages/workflow-package/workflow-stage-runner.js +109 -0
- package/package.json +43 -19
- package/dist/commands/test.d.ts +0 -3
- package/dist/lib/compiled-home.d.ts +0 -5
- package/dist/lib/compiled-home.js +0 -32
- package/dist/lib/config.js +0 -9
- /package/dist/{commands → cli/commands}/dataset-selection.js +0 -0
- /package/dist/{commands → cli/commands}/default.d.ts +0 -0
- /package/dist/{commands → cli/commands}/doctor.d.ts +0 -0
- /package/dist/{commands → cli/commands}/list.d.ts +0 -0
- /package/dist/{commands → cli/commands}/reset.d.ts +0 -0
- /package/dist/{commands → cli/commands}/status.d.ts +0 -0
- /package/dist/{commands → cli/commands}/verify.d.ts +0 -0
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { join, relative, resolve, sep } from "node:path";
|
|
4
|
+
import { refreshCompiledBootstrapGuidance } from "../agents/lib/compiled-bootstrap.js";
|
|
5
|
+
import { readInterfConfig, } from "./interf.js";
|
|
6
|
+
import { seedCompiledWorkflowPackage } from "../workflow-package/interf-workflow-package.js";
|
|
7
|
+
import { readJsonFileWithSchema } from "../shared/parse.js";
|
|
8
|
+
import { getCompiledWorkflow } from "../workflow-package/workflow-definitions.js";
|
|
9
|
+
import { SourceFolderConfigSchema, } from "./lib/schema.js";
|
|
10
|
+
import { slugify } from "../shared/naming.js";
|
|
11
|
+
import { assertPathWithinRoot } from "../shared/path-guards.js";
|
|
12
|
+
import { defaultControlPathForCompiled, resolveSourceControlPathForCompiled, compiledInterfConfigPath, compiledInterfRoot, } from "../compiler/compiled-paths.js";
|
|
13
|
+
export const SOURCE_FOLDER_CONFIG_FILE = "interf.json";
|
|
14
|
+
function sourceConfigPath(sourcePath) {
|
|
15
|
+
return join(sourcePath, SOURCE_FOLDER_CONFIG_FILE);
|
|
16
|
+
}
|
|
17
|
+
function normalizeTruthChecks(cases) {
|
|
18
|
+
const seen = new Set();
|
|
19
|
+
return cases.map((caseSpec, index) => {
|
|
20
|
+
const baseId = slugify(caseSpec.id ?? caseSpec.question) || `check-${index + 1}`;
|
|
21
|
+
let id = baseId;
|
|
22
|
+
let suffix = 2;
|
|
23
|
+
while (seen.has(id)) {
|
|
24
|
+
id = `${baseId}-${suffix}`;
|
|
25
|
+
suffix += 1;
|
|
26
|
+
}
|
|
27
|
+
seen.add(id);
|
|
28
|
+
return {
|
|
29
|
+
id,
|
|
30
|
+
question: caseSpec.question.trim(),
|
|
31
|
+
...(caseSpec.answer ? { answer: caseSpec.answer.trim() } : {}),
|
|
32
|
+
...(caseSpec.strictness ? { strictness: caseSpec.strictness.trim() } : {}),
|
|
33
|
+
...(caseSpec.expect ? { expect: caseSpec.expect } : {}),
|
|
34
|
+
};
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
export function fingerprintTruthChecks(checks) {
|
|
38
|
+
const normalized = checks.map((check) => ({
|
|
39
|
+
question: check.question.trim(),
|
|
40
|
+
...(check.answer ? { answer: check.answer.trim() } : {}),
|
|
41
|
+
...(check.strictness ? { strictness: check.strictness.trim() } : {}),
|
|
42
|
+
...(check.expect ? { expect: check.expect } : {}),
|
|
43
|
+
}));
|
|
44
|
+
return createHash("sha256")
|
|
45
|
+
.update(JSON.stringify(normalized))
|
|
46
|
+
.digest("hex")
|
|
47
|
+
.slice(0, 16);
|
|
48
|
+
}
|
|
49
|
+
export function loadSourceFolderConfig(sourcePath) {
|
|
50
|
+
const filePath = sourceConfigPath(sourcePath);
|
|
51
|
+
if (!existsSync(filePath))
|
|
52
|
+
return null;
|
|
53
|
+
return readJsonFileWithSchema(filePath, "Interf project config", SourceFolderConfigSchema);
|
|
54
|
+
}
|
|
55
|
+
export function listSourceDatasetConfigs(config) {
|
|
56
|
+
return config?.datasets ?? [];
|
|
57
|
+
}
|
|
58
|
+
export function resolveDatasetCompileMaxAttempts(datasetConfig, override = null) {
|
|
59
|
+
const configured = override ?? datasetConfig.max_attempts ?? null;
|
|
60
|
+
if (configured == null)
|
|
61
|
+
return null;
|
|
62
|
+
const normalized = Math.trunc(configured);
|
|
63
|
+
if (!Number.isFinite(normalized) || normalized < 1)
|
|
64
|
+
return 1;
|
|
65
|
+
return Math.min(5, normalized);
|
|
66
|
+
}
|
|
67
|
+
export function resolveDatasetCompileMaxLoops(datasetConfig, override = null) {
|
|
68
|
+
const configured = override ?? datasetConfig.max_loops ?? null;
|
|
69
|
+
if (configured == null)
|
|
70
|
+
return null;
|
|
71
|
+
const normalized = Math.trunc(configured);
|
|
72
|
+
if (!Number.isFinite(normalized) || normalized < 1)
|
|
73
|
+
return 1;
|
|
74
|
+
return Math.min(3, normalized);
|
|
75
|
+
}
|
|
76
|
+
export function getDefaultSourceDatasetConfig(config) {
|
|
77
|
+
const datasets = listSourceDatasetConfigs(config);
|
|
78
|
+
return datasets[0] ?? null;
|
|
79
|
+
}
|
|
80
|
+
export function findSourceDatasetConfig(config, datasetName) {
|
|
81
|
+
return listSourceDatasetConfigs(config).find((dataset) => dataset.name === datasetName) ?? null;
|
|
82
|
+
}
|
|
83
|
+
function toWritableSourceProjectConfig(config) {
|
|
84
|
+
const datasets = config?.datasets ?? [];
|
|
85
|
+
if (datasets.length > 0) {
|
|
86
|
+
return {
|
|
87
|
+
datasets: datasets.map((dataset) => toWritableSourceDatasetConfig(dataset)),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
return {};
|
|
91
|
+
}
|
|
92
|
+
function toWritableSourceDatasetConfig(dataset) {
|
|
93
|
+
return {
|
|
94
|
+
name: dataset.name,
|
|
95
|
+
path: dataset.path,
|
|
96
|
+
...(dataset.about ? { about: dataset.about } : {}),
|
|
97
|
+
...(dataset.workflow && dataset.workflow !== "interf" ? { workflow: dataset.workflow } : {}),
|
|
98
|
+
...(typeof dataset.max_attempts === "number" ? { max_attempts: dataset.max_attempts } : {}),
|
|
99
|
+
...(typeof dataset.max_loops === "number" ? { max_loops: dataset.max_loops } : {}),
|
|
100
|
+
checks: dataset.checks,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
export function saveSourceFolderConfig(sourcePath, config) {
|
|
104
|
+
writeFileSync(sourceConfigPath(sourcePath), JSON.stringify(toWritableSourceProjectConfig(config), null, 2) + "\n");
|
|
105
|
+
}
|
|
106
|
+
export function appendSourceDatasetChecks(sourcePath, datasetName, checks) {
|
|
107
|
+
const existing = loadSourceFolderConfig(sourcePath);
|
|
108
|
+
const currentDataset = findSourceDatasetConfig(existing, datasetName);
|
|
109
|
+
const otherDatasets = listSourceDatasetConfigs(existing).filter((dataset) => dataset.name !== datasetName);
|
|
110
|
+
const currentChecks = currentDataset?.checks ?? [];
|
|
111
|
+
const nextDataset = {
|
|
112
|
+
...toWritableSourceDatasetConfig(currentDataset ?? {
|
|
113
|
+
name: datasetName,
|
|
114
|
+
path: `./${datasetName}`,
|
|
115
|
+
checks: [],
|
|
116
|
+
}),
|
|
117
|
+
checks: [...currentChecks, ...checks],
|
|
118
|
+
};
|
|
119
|
+
saveSourceFolderConfig(sourcePath, {
|
|
120
|
+
datasets: [
|
|
121
|
+
nextDataset,
|
|
122
|
+
...otherDatasets,
|
|
123
|
+
],
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
export function upsertSourceDatasetConfig(sourcePath, datasetConfig, options = {}) {
|
|
127
|
+
const existing = loadSourceFolderConfig(sourcePath);
|
|
128
|
+
const datasets = listSourceDatasetConfigs(existing);
|
|
129
|
+
const candidateNames = Array.from(new Set([datasetConfig.name, options.matchName].filter((value) => Boolean(value))));
|
|
130
|
+
const existingIndex = datasets.findIndex((entry) => candidateNames.includes(entry.name));
|
|
131
|
+
if (existingIndex >= 0) {
|
|
132
|
+
datasets[existingIndex] = datasetConfig;
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
datasets.push(datasetConfig);
|
|
136
|
+
}
|
|
137
|
+
saveSourceFolderConfig(sourcePath, {
|
|
138
|
+
datasets,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
export function compiledMaxAttempts(maxAttempts) {
|
|
142
|
+
if (maxAttempts == null)
|
|
143
|
+
return undefined;
|
|
144
|
+
return resolveDatasetCompileMaxAttempts({ max_attempts: maxAttempts }, null) ?? 1;
|
|
145
|
+
}
|
|
146
|
+
export function compiledMaxLoops(maxLoops) {
|
|
147
|
+
if (maxLoops == null)
|
|
148
|
+
return undefined;
|
|
149
|
+
return resolveDatasetCompileMaxLoops({ max_loops: maxLoops }, null) ?? 1;
|
|
150
|
+
}
|
|
151
|
+
export function sourceDatasetConfigFromInterfConfig(config, datasetPath = `./${config.name}`) {
|
|
152
|
+
return {
|
|
153
|
+
name: config.name,
|
|
154
|
+
path: datasetPath,
|
|
155
|
+
...(config.about ? { about: config.about } : {}),
|
|
156
|
+
...(config.workflow ? { workflow: config.workflow } : {}),
|
|
157
|
+
...(typeof config.max_attempts === "number"
|
|
158
|
+
? { max_attempts: config.max_attempts }
|
|
159
|
+
: {}),
|
|
160
|
+
...(typeof config.max_loops === "number"
|
|
161
|
+
? { max_loops: config.max_loops }
|
|
162
|
+
: {}),
|
|
163
|
+
checks: config.checks ?? [],
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
export function loadCompiledDatasetConfig(compiledPath) {
|
|
167
|
+
const config = readInterfConfig(compiledPath);
|
|
168
|
+
if (!config)
|
|
169
|
+
return null;
|
|
170
|
+
const projectPath = resolveSourceControlPathForCompiled(compiledPath);
|
|
171
|
+
const configuredDatasets = listSourceDatasetConfigs(loadSourceFolderConfig(projectPath));
|
|
172
|
+
const fallbackDatasetPath = configuredDatasets.length === 1
|
|
173
|
+
? configuredDatasets[0].path
|
|
174
|
+
: `./${config.name}`;
|
|
175
|
+
const datasetPath = typeof config.source?.dataset_path === "string" && config.source.dataset_path.length > 0
|
|
176
|
+
? relative(projectPath, assertPathWithinRoot(projectPath, resolve(compiledPath, config.source.dataset_path), "Compiled context source path")).split(sep).join("/") || fallbackDatasetPath
|
|
177
|
+
: fallbackDatasetPath;
|
|
178
|
+
return sourceDatasetConfigFromInterfConfig(config, datasetPath);
|
|
179
|
+
}
|
|
180
|
+
export function saveCompiledInterfConfig(compiledPath, config) {
|
|
181
|
+
mkdirSync(compiledInterfRoot(compiledPath), { recursive: true });
|
|
182
|
+
writeFileSync(compiledInterfConfigPath(compiledPath), JSON.stringify(config, null, 2) + "\n");
|
|
183
|
+
return config;
|
|
184
|
+
}
|
|
185
|
+
export function syncCompiledInterfConfigFromSourceDatasetConfig(compiledPath, datasetConfig) {
|
|
186
|
+
const current = readInterfConfig(compiledPath);
|
|
187
|
+
const projectPath = resolveSourceControlPathForCompiled(compiledPath);
|
|
188
|
+
const datasetAbsolutePath = resolve(projectPath, datasetConfig.path);
|
|
189
|
+
const datasetRelativePath = relative(compiledPath, datasetAbsolutePath).split(sep).join("/") || ".";
|
|
190
|
+
const workflowId = datasetConfig.workflow ?? current?.workflow ?? "interf";
|
|
191
|
+
const workflowChanged = current?.workflow !== undefined && current.workflow !== workflowId;
|
|
192
|
+
const workflowOrigin = workflowChanged || !current?.workflow_origin
|
|
193
|
+
? {
|
|
194
|
+
selected: workflowId,
|
|
195
|
+
local_draft: false,
|
|
196
|
+
}
|
|
197
|
+
: current.workflow_origin;
|
|
198
|
+
const { type: _ignoredType, name: _ignoredName, about: _ignoredAbout, workflow: _ignoredWorkflow, max_attempts: _ignoredMaxAttempts, max_loops: _ignoredMaxLoops, checks: _ignoredChecks, workflow_origin: _ignoredWorkflowOrigin, source: _ignoredSource, ...passthrough } = current ?? {};
|
|
199
|
+
const nextConfig = {
|
|
200
|
+
...passthrough,
|
|
201
|
+
...(!current ? {
|
|
202
|
+
type: "compiled",
|
|
203
|
+
source: {
|
|
204
|
+
path: "./raw",
|
|
205
|
+
},
|
|
206
|
+
} : {}),
|
|
207
|
+
type: "compiled",
|
|
208
|
+
name: datasetConfig.name,
|
|
209
|
+
...(datasetConfig.about ? { about: datasetConfig.about } : {}),
|
|
210
|
+
workflow: workflowId,
|
|
211
|
+
...(typeof datasetConfig.max_attempts === "number"
|
|
212
|
+
? { max_attempts: datasetConfig.max_attempts }
|
|
213
|
+
: {}),
|
|
214
|
+
...(typeof datasetConfig.max_loops === "number"
|
|
215
|
+
? { max_loops: datasetConfig.max_loops }
|
|
216
|
+
: {}),
|
|
217
|
+
checks: datasetConfig.checks,
|
|
218
|
+
workflow_origin: workflowOrigin,
|
|
219
|
+
source: {
|
|
220
|
+
path: current?.source?.path ?? "./raw",
|
|
221
|
+
control_path: defaultControlPathForCompiled(compiledPath),
|
|
222
|
+
dataset_path: datasetRelativePath,
|
|
223
|
+
},
|
|
224
|
+
};
|
|
225
|
+
const saved = saveCompiledInterfConfig(compiledPath, nextConfig);
|
|
226
|
+
if (workflowChanged) {
|
|
227
|
+
const sourcePath = projectPath;
|
|
228
|
+
const selectedWorkflow = getCompiledWorkflow(workflowId, { sourcePath });
|
|
229
|
+
seedCompiledWorkflowPackage({
|
|
230
|
+
compiledPath,
|
|
231
|
+
sourcePath,
|
|
232
|
+
workflowId: selectedWorkflow.id,
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
refreshCompiledBootstrapGuidance(compiledPath);
|
|
236
|
+
return saved;
|
|
237
|
+
}
|
|
238
|
+
function buildLoadedTestSpec(options) {
|
|
239
|
+
if (options.checks.length === 0)
|
|
240
|
+
return null;
|
|
241
|
+
const testId = options.id ?? slugify(options.name);
|
|
242
|
+
return {
|
|
243
|
+
id: options.targetType === "raw" ? `${testId}-raw` : testId,
|
|
244
|
+
filePath: options.filePath,
|
|
245
|
+
type: options.targetType,
|
|
246
|
+
name: options.name,
|
|
247
|
+
description: options.about ?? options.fallbackDescription,
|
|
248
|
+
cases: normalizeTruthChecks(options.checks),
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
export function buildTestSpecFromSourceFolderConfig(options) {
|
|
252
|
+
const { sourcePath, targetName, targetType = "compiled" } = options;
|
|
253
|
+
const config = loadSourceFolderConfig(sourcePath);
|
|
254
|
+
if (!config)
|
|
255
|
+
return null;
|
|
256
|
+
const datasets = listSourceDatasetConfigs(config);
|
|
257
|
+
if (datasets.length === 0)
|
|
258
|
+
return null;
|
|
259
|
+
const match = targetName
|
|
260
|
+
? datasets.find((entry) => entry.name === targetName)
|
|
261
|
+
: datasets.length === 1
|
|
262
|
+
? datasets[0]
|
|
263
|
+
: getDefaultSourceDatasetConfig(config);
|
|
264
|
+
if (!match)
|
|
265
|
+
return null;
|
|
266
|
+
const configPath = sourceConfigPath(sourcePath);
|
|
267
|
+
return buildLoadedTestSpec({
|
|
268
|
+
id: match.id,
|
|
269
|
+
name: match.name,
|
|
270
|
+
about: match.about,
|
|
271
|
+
checks: match.checks,
|
|
272
|
+
targetType,
|
|
273
|
+
filePath: targetType === "raw"
|
|
274
|
+
? `${configPath}#datasets/${match.name}:file-as-is`
|
|
275
|
+
: `${configPath}#datasets/${match.name}:compiled`,
|
|
276
|
+
fallbackDescription: `Derived from saved dataset checks in ${SOURCE_FOLDER_CONFIG_FILE}`,
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
export function buildTestSpecFromCompiledDatasetConfig(options) {
|
|
280
|
+
const { compiledPath, targetType = "compiled" } = options;
|
|
281
|
+
const config = readInterfConfig(compiledPath);
|
|
282
|
+
const configPath = compiledInterfConfigPath(compiledPath);
|
|
283
|
+
if (!config)
|
|
284
|
+
return null;
|
|
285
|
+
return buildLoadedTestSpec({
|
|
286
|
+
name: config.name,
|
|
287
|
+
about: config.about,
|
|
288
|
+
checks: config.checks ?? [],
|
|
289
|
+
targetType,
|
|
290
|
+
filePath: targetType === "raw"
|
|
291
|
+
? `${configPath}#checks:file-as-is`
|
|
292
|
+
: `${configPath}#checks:compiled`,
|
|
293
|
+
fallbackDescription: "Derived from checks in the compiled context config.",
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
export function resolveSourceDatasetPath(projectPath, datasetConfig) {
|
|
297
|
+
return assertPathWithinRoot(projectPath, resolve(projectPath, datasetConfig.path), "Dataset path");
|
|
298
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function isMarkdownFile(filePath: string): boolean;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { existsSync, readdirSync, realpathSync, statSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
export function countFilesRecursive(dirPath) {
|
|
4
|
+
if (!existsSync(dirPath))
|
|
5
|
+
return 0;
|
|
6
|
+
let total = 0;
|
|
7
|
+
walkFilesRecursive(dirPath, () => {
|
|
8
|
+
total += 1;
|
|
9
|
+
});
|
|
10
|
+
return total;
|
|
11
|
+
}
|
|
12
|
+
export function listFilesRecursive(dirPath, predicate) {
|
|
13
|
+
const files = [];
|
|
14
|
+
if (!existsSync(dirPath))
|
|
15
|
+
return files;
|
|
16
|
+
walkFilesRecursive(dirPath, (filePath) => {
|
|
17
|
+
if (!predicate || predicate(filePath)) {
|
|
18
|
+
files.push(filePath);
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
return files;
|
|
22
|
+
}
|
|
23
|
+
function walkFilesRecursive(dirPath, onFile, visitedDirs = new Set()) {
|
|
24
|
+
if (!existsSync(dirPath))
|
|
25
|
+
return;
|
|
26
|
+
walkFilesRecursiveInternal(dirPath, onFile, visitedDirs);
|
|
27
|
+
}
|
|
28
|
+
function walkFilesRecursiveInternal(dirPath, onFile, visitedDirs) {
|
|
29
|
+
let resolvedDir;
|
|
30
|
+
try {
|
|
31
|
+
resolvedDir = realpathSync(dirPath);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if (visitedDirs.has(resolvedDir))
|
|
37
|
+
return;
|
|
38
|
+
visitedDirs.add(resolvedDir);
|
|
39
|
+
for (const entry of readdirSync(dirPath)) {
|
|
40
|
+
const fullPath = join(dirPath, entry);
|
|
41
|
+
let stat;
|
|
42
|
+
try {
|
|
43
|
+
stat = statSync(fullPath);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if (stat.isDirectory()) {
|
|
49
|
+
walkFilesRecursiveInternal(fullPath, onFile, visitedDirs);
|
|
50
|
+
}
|
|
51
|
+
else if (stat.isFile()) {
|
|
52
|
+
onFile(fullPath);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
const defaultWarningHandler = (message) => {
|
|
2
|
+
console.warn(message);
|
|
3
|
+
};
|
|
4
|
+
let currentWarningHandler = defaultWarningHandler;
|
|
5
|
+
export function setInterfWarningHandler(handler) {
|
|
6
|
+
currentWarningHandler = handler ?? defaultWarningHandler;
|
|
7
|
+
}
|
|
8
|
+
export function warnInterf(message) {
|
|
9
|
+
currentWarningHandler(message);
|
|
10
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function slugify(input: string): string;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ZodType } from "zod";
|
|
2
|
+
export declare function readJsonFileUnchecked<T>(filePath: string, label: string): T | null;
|
|
3
|
+
export declare function readJsonFileWithSchema<T>(filePath: string, label: string, schema: ZodType<T>): T | null;
|
|
4
|
+
export declare function renderJsonFrontmatter(frontmatter: Record<string, unknown>): string;
|
|
5
|
+
export declare function parseJsonFrontmatter(content: string): {
|
|
6
|
+
frontmatter: Record<string, unknown>;
|
|
7
|
+
body: string;
|
|
8
|
+
} | null;
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { warnInterf } from "./logger.js";
|
|
3
|
+
function formatError(error) {
|
|
4
|
+
return error instanceof Error ? error.message : String(error);
|
|
5
|
+
}
|
|
6
|
+
export function readJsonFileUnchecked(filePath, label) {
|
|
7
|
+
try {
|
|
8
|
+
return JSON.parse(readFileSync(filePath, "utf-8"));
|
|
9
|
+
}
|
|
10
|
+
catch (error) {
|
|
11
|
+
warnInterf(`Warning: failed to parse ${label} at ${filePath}: ${formatError(error)}`);
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export function readJsonFileWithSchema(filePath, label, schema) {
|
|
16
|
+
const raw = readJsonFileUnchecked(filePath, label);
|
|
17
|
+
if (raw === null)
|
|
18
|
+
return null;
|
|
19
|
+
const parsed = schema.safeParse(raw);
|
|
20
|
+
if (!parsed.success) {
|
|
21
|
+
warnInterf(`Warning: failed to validate ${label} at ${filePath}: ${parsed.error.issues.map((issue) => issue.message).join("; ")}`);
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
return parsed.data;
|
|
25
|
+
}
|
|
26
|
+
export function renderJsonFrontmatter(frontmatter) {
|
|
27
|
+
return [
|
|
28
|
+
"---",
|
|
29
|
+
JSON.stringify(frontmatter, null, 2),
|
|
30
|
+
"---",
|
|
31
|
+
].join("\n");
|
|
32
|
+
}
|
|
33
|
+
function parseQuotedString(value) {
|
|
34
|
+
if (value.length < 2)
|
|
35
|
+
return null;
|
|
36
|
+
const quote = value[0];
|
|
37
|
+
if ((quote !== "\"" && quote !== "'") || value[value.length - 1] !== quote)
|
|
38
|
+
return null;
|
|
39
|
+
const inner = value.slice(1, -1);
|
|
40
|
+
if (quote === "\"") {
|
|
41
|
+
try {
|
|
42
|
+
return JSON.parse(value);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return inner.replace(/\\'/g, "'");
|
|
49
|
+
}
|
|
50
|
+
function parseYamlScalar(value) {
|
|
51
|
+
const trimmed = value.trim();
|
|
52
|
+
if (trimmed.length === 0)
|
|
53
|
+
return "";
|
|
54
|
+
const quoted = parseQuotedString(trimmed);
|
|
55
|
+
if (quoted !== null)
|
|
56
|
+
return quoted;
|
|
57
|
+
if (trimmed === "true")
|
|
58
|
+
return true;
|
|
59
|
+
if (trimmed === "false")
|
|
60
|
+
return false;
|
|
61
|
+
if (trimmed === "null")
|
|
62
|
+
return null;
|
|
63
|
+
if (/^-?\d+(?:\.\d+)?$/.test(trimmed))
|
|
64
|
+
return Number(trimmed);
|
|
65
|
+
if ((trimmed.startsWith("[") && trimmed.endsWith("]"))
|
|
66
|
+
|| (trimmed.startsWith("{") && trimmed.endsWith("}"))) {
|
|
67
|
+
try {
|
|
68
|
+
return JSON.parse(trimmed);
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return trimmed;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return trimmed;
|
|
75
|
+
}
|
|
76
|
+
function parseYamlFrontmatter(frontmatterText) {
|
|
77
|
+
const lines = frontmatterText.split("\n");
|
|
78
|
+
const frontmatter = {};
|
|
79
|
+
for (let index = 0; index < lines.length; index += 1) {
|
|
80
|
+
const line = lines[index] ?? "";
|
|
81
|
+
const trimmed = line.trim();
|
|
82
|
+
if (trimmed.length === 0 || trimmed.startsWith("#"))
|
|
83
|
+
continue;
|
|
84
|
+
const match = line.match(/^([A-Za-z0-9_-]+):(?:\s+(.*))?$/);
|
|
85
|
+
if (!match)
|
|
86
|
+
return null;
|
|
87
|
+
const [, key, inlineValue] = match;
|
|
88
|
+
if (!key)
|
|
89
|
+
return null;
|
|
90
|
+
if (inlineValue && inlineValue.trim().length > 0) {
|
|
91
|
+
frontmatter[key] = parseYamlScalar(inlineValue);
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
const items = [];
|
|
95
|
+
let cursor = index + 1;
|
|
96
|
+
while (cursor < lines.length) {
|
|
97
|
+
const nextLine = lines[cursor] ?? "";
|
|
98
|
+
const nextTrimmed = nextLine.trim();
|
|
99
|
+
if (nextTrimmed.length === 0) {
|
|
100
|
+
cursor += 1;
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
const itemMatch = nextLine.match(/^\s*-\s+(.*)$/);
|
|
104
|
+
if (!itemMatch || !/^\s+/.test(nextLine))
|
|
105
|
+
break;
|
|
106
|
+
items.push(parseYamlScalar(itemMatch[1] ?? ""));
|
|
107
|
+
cursor += 1;
|
|
108
|
+
}
|
|
109
|
+
if (items.length > 0) {
|
|
110
|
+
frontmatter[key] = items;
|
|
111
|
+
index = cursor - 1;
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
frontmatter[key] = "";
|
|
115
|
+
}
|
|
116
|
+
return Object.keys(frontmatter).length > 0 ? frontmatter : null;
|
|
117
|
+
}
|
|
118
|
+
export function parseJsonFrontmatter(content) {
|
|
119
|
+
const normalized = content.replace(/\r\n/g, "\n");
|
|
120
|
+
const match = normalized.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);
|
|
121
|
+
if (!match)
|
|
122
|
+
return null;
|
|
123
|
+
const [, frontmatterText, body = ""] = match;
|
|
124
|
+
if (frontmatterText === undefined)
|
|
125
|
+
return null;
|
|
126
|
+
try {
|
|
127
|
+
const frontmatter = JSON.parse(frontmatterText);
|
|
128
|
+
if (!frontmatter || typeof frontmatter !== "object" || Array.isArray(frontmatter)) {
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
return {
|
|
132
|
+
frontmatter: frontmatter,
|
|
133
|
+
body,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
const frontmatter = parseYamlFrontmatter(frontmatterText);
|
|
138
|
+
if (!frontmatter)
|
|
139
|
+
return null;
|
|
140
|
+
return {
|
|
141
|
+
frontmatter,
|
|
142
|
+
body,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { isAbsolute, relative, resolve, sep } from "node:path";
|
|
2
|
+
export function isPathWithinRoot(rootPath, candidatePath) {
|
|
3
|
+
const root = resolve(rootPath);
|
|
4
|
+
const candidate = resolve(candidatePath);
|
|
5
|
+
const relativePath = relative(root, candidate);
|
|
6
|
+
return relativePath === "" || (!isAbsolute(relativePath) && relativePath !== ".." && !relativePath.startsWith(`..${sep}`));
|
|
7
|
+
}
|
|
8
|
+
export function assertPathWithinRoot(rootPath, candidatePath, label) {
|
|
9
|
+
const resolvedPath = resolve(candidatePath);
|
|
10
|
+
if (!isPathWithinRoot(rootPath, resolvedPath)) {
|
|
11
|
+
throw new Error(`${label} must stay inside ${resolve(rootPath)}: ${resolvedPath}`);
|
|
12
|
+
}
|
|
13
|
+
return resolvedPath;
|
|
14
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export * as schema from "./lib/schema.js";
|
|
2
|
+
export * as test from "./test.js";
|
|
3
|
+
export * as execution from "./test-execution.js";
|
|
4
|
+
export * as matrices from "./test-matrices.js";
|
|
5
|
+
export * as paths from "./test-paths.js";
|
|
6
|
+
export * as profilePresets from "./test-profile-presets.js";
|
|
7
|
+
export * as sandbox from "./test-sandbox.js";
|
|
8
|
+
export * as specs from "./test-specs.js";
|
|
9
|
+
export * as targets from "./test-targets.js";
|
|
10
|
+
export * as types from "./test-types.js";
|
|
11
|
+
export type { TestCase, TestCaseExpect, TestCheckResult, TestCaseResult, TestSpec, TestTargetResult, TestTargetRun, TestRunComparison, TestTargetType, } from "./lib/schema.js";
|
|
12
|
+
export type { LoadedTestSpec, TestTargetCandidate, } from "./test-types.js";
|
|
13
|
+
export type { TestSandboxRetentionMode, } from "./test-sandbox.js";
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * as schema from "./lib/schema.js";
|
|
2
|
+
export * as test from "./test.js";
|
|
3
|
+
export * as execution from "./test-execution.js";
|
|
4
|
+
export * as matrices from "./test-matrices.js";
|
|
5
|
+
export * as paths from "./test-paths.js";
|
|
6
|
+
export * as profilePresets from "./test-profile-presets.js";
|
|
7
|
+
export * as sandbox from "./test-sandbox.js";
|
|
8
|
+
export * as specs from "./test-specs.js";
|
|
9
|
+
export * as targets from "./test-targets.js";
|
|
10
|
+
export * as types from "./test-types.js";
|