@interf/compiler 0.5.1 → 0.6.3
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 +160 -201
- package/builtin-workflows/interf/README.md +22 -10
- package/builtin-workflows/interf/compile/stages/shape/SKILL.md +8 -5
- package/builtin-workflows/interf/compile/stages/structure/SKILL.md +3 -0
- package/builtin-workflows/interf/compile/stages/summarize/SKILL.md +18 -2
- package/builtin-workflows/interf/improve/SKILL.md +4 -4
- package/builtin-workflows/interf/use/query/SKILL.md +1 -1
- package/builtin-workflows/interf/workflow.json +19 -5
- package/builtin-workflows/interf/{compiled.schema.json → workflow.schema.json} +10 -3
- 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 +13 -13
- package/dist/{commands → cli/commands}/compile-controller.d.ts +3 -3
- package/dist/{commands → cli/commands}/compile-controller.js +39 -44
- package/dist/cli/commands/compile.d.ts +33 -0
- package/dist/{commands → cli/commands}/compile.js +107 -33
- 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 +20 -2
- package/dist/cli/commands/create-workflow-wizard.js +288 -0
- package/dist/{commands → cli/commands}/create.d.ts +2 -2
- package/dist/cli/commands/create.js +166 -0
- package/dist/cli/commands/dataset-selection.d.ts +6 -0
- package/dist/cli/commands/dataset-selection.js +11 -0
- package/dist/{commands → cli/commands}/default.js +5 -5
- package/dist/{commands → cli/commands}/doctor.js +12 -13
- package/dist/{commands → cli/commands}/executor-flow.d.ts +2 -2
- package/dist/{commands → cli/commands}/executor-flow.js +17 -17
- package/dist/cli/commands/init.d.ts +11 -0
- package/dist/{commands → cli/commands}/init.js +202 -109
- package/dist/{commands → cli/commands}/list.js +9 -6
- package/dist/{commands → cli/commands}/reset.js +5 -5
- package/dist/{commands → cli/commands}/source-config-wizard.d.ts +10 -5
- package/dist/{commands → cli/commands}/source-config-wizard.js +202 -95
- 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 +30 -26
- package/dist/cli/commands/test.d.ts +14 -0
- package/dist/{commands → cli/commands}/test.js +48 -40
- 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 -3
- package/dist/lib/agent-args.js +1 -42
- 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 -242
- 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 -76
- 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 -44
- package/dist/lib/agent-shells.js +1 -847
- 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 -129
- package/dist/lib/builtin-compiled-workflow.js +1 -153
- package/dist/lib/compiled-compile.d.ts +1 -52
- package/dist/lib/compiled-compile.js +1 -274
- package/dist/lib/compiled-paths.d.ts +1 -39
- package/dist/lib/compiled-paths.js +3 -103
- 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 -1
- package/dist/lib/compiled-reset.js +3 -44
- package/dist/lib/compiled-schema.d.ts +1 -27
- package/dist/lib/compiled-schema.js +1 -110
- package/dist/lib/discovery.d.ts +1 -1
- package/dist/lib/discovery.js +2 -2
- 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/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 -121
- package/dist/lib/interf-workflow-package.d.ts +1 -20
- package/dist/lib/interf-workflow-package.js +1 -276
- package/dist/lib/interf.d.ts +1 -5
- package/dist/lib/interf.js +3 -4
- package/dist/lib/local-workflows.d.ts +1 -53
- package/dist/lib/local-workflows.js +1 -399
- package/dist/lib/package-root.d.ts +1 -0
- package/dist/lib/package-root.js +1 -0
- 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 -257
- package/dist/lib/runtime-contracts.d.ts +1 -2
- package/dist/lib/runtime-contracts.js +1 -47
- 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 -7
- package/dist/lib/runtime-paths.js +1 -23
- package/dist/lib/runtime-prompt.d.ts +1 -2
- package/dist/lib/runtime-prompt.js +1 -46
- package/dist/lib/runtime-reconcile.d.ts +1 -2
- package/dist/lib/runtime-reconcile.js +1 -156
- package/dist/lib/runtime-runs.d.ts +1 -11
- package/dist/lib/runtime-runs.js +1 -250
- 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 -1016
- package/dist/lib/schema.js +6 -539
- 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 -6
- package/dist/lib/state.js +1 -5
- 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/validate-compiled.d.ts +1 -27
- package/dist/lib/validate-compiled.js +1 -238
- package/dist/lib/validate-helpers.d.ts +1 -12
- package/dist/lib/validate-helpers.js +1 -41
- package/dist/lib/validate.d.ts +1 -19
- package/dist/lib/validate.js +1 -256
- package/dist/lib/workflow-authoring.d.ts +1 -0
- package/dist/lib/workflow-authoring.js +1 -0
- package/dist/lib/workflow-definitions.d.ts +1 -68
- package/dist/lib/workflow-definitions.js +1 -206
- package/dist/lib/workflow-edit-session.d.ts +1 -0
- package/dist/lib/workflow-edit-session.js +1 -0
- package/dist/lib/workflow-edit-utils.d.ts +1 -0
- package/dist/lib/workflow-edit-utils.js +1 -0
- 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 -396
- 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 -0
- package/dist/lib/workflow-stage-policy.js +1 -0
- 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 +17 -0
- package/dist/packages/agents/index.js +15 -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/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 +69 -0
- package/dist/packages/agents/lib/shells.js +1021 -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 +48 -0
- package/dist/packages/compiler/compiled-compile.js +256 -0
- package/dist/packages/compiler/compiled-schema.d.ts +31 -0
- package/dist/packages/compiler/compiled-schema.js +141 -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 +361 -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 +40 -0
- package/dist/packages/project-model/compiled-paths.js +106 -0
- package/dist/packages/project-model/compiled-raw.d.ts +49 -0
- package/dist/packages/project-model/compiled-raw.js +102 -0
- package/dist/packages/project-model/compiled-reset.d.ts +2 -0
- package/dist/packages/project-model/compiled-reset.js +72 -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 +3 -0
- package/dist/packages/project-model/interf-bootstrap.js +18 -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 +297 -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 +120 -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 +209 -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/index.d.ts +9 -0
- package/dist/packages/workflow-package/index.js +9 -0
- package/dist/packages/workflow-package/interf-workflow-package.d.ts +25 -0
- package/dist/packages/workflow-package/interf-workflow-package.js +342 -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 +54 -0
- package/dist/packages/workflow-package/local-workflows.js +422 -0
- package/dist/packages/workflow-package/workflow-definitions.d.ts +78 -0
- package/dist/packages/workflow-package/workflow-definitions.js +203 -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 +44 -21
- package/dist/commands/compile.d.ts +0 -15
- package/dist/commands/create-workflow-wizard.js +0 -125
- package/dist/commands/create.js +0 -162
- package/dist/commands/init.d.ts +0 -3
- package/dist/commands/test.d.ts +0 -9
- 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/lib/obsidian.d.ts +0 -1
- package/dist/lib/obsidian.js +0 -15
- package/dist/lib/summarize-plan.d.ts +0 -17
- package/dist/lib/summarize-plan.js +0 -120
- /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
|
@@ -1,24 +1,25 @@
|
|
|
1
1
|
import { existsSync, readdirSync, statSync } from "node:fs";
|
|
2
|
-
import { join } from "node:path";
|
|
2
|
+
import { join, relative, sep } from "node:path";
|
|
3
3
|
import * as p from "@clack/prompts";
|
|
4
|
-
import {
|
|
5
|
-
import { slugify } from "
|
|
4
|
+
import { sourceConfig as projectSourceConfig, } from "../../packages/project-model/index.js";
|
|
5
|
+
import { slugify } from "../../lib/util.js";
|
|
6
6
|
import { resolveOrConfigureLocalExecutor } from "./executor-flow.js";
|
|
7
7
|
import { draftTruthChecks } from "./check-draft.js";
|
|
8
8
|
export const DEFAULT_COMPILED_NAME = "dataset1";
|
|
9
|
-
export const DEFAULT_COMPILED_CHECK_QUESTION_PLACEHOLDER = "A question you can already verify from this
|
|
9
|
+
export const DEFAULT_COMPILED_CHECK_QUESTION_PLACEHOLDER = "A question you can already verify from this source folder";
|
|
10
10
|
export const DEFAULT_COMPILED_CHECK_ANSWER_PLACEHOLDER = "The expected answer in plain English";
|
|
11
|
-
export const DEFAULT_COMPILED_ABOUT_PLACEHOLDER = "Example:
|
|
11
|
+
export const DEFAULT_COMPILED_ABOUT_PLACEHOLDER = "Example: board-prep questions from these files, chart reads from this report, or tax review from these exports.";
|
|
12
12
|
export const DEFAULT_DATASET_PATH_PLACEHOLDER = "./dataset1";
|
|
13
|
-
export const DEFAULT_COMPILE_RETRY_ATTEMPTS =
|
|
13
|
+
export const DEFAULT_COMPILE_RETRY_ATTEMPTS = 3;
|
|
14
14
|
export const DEFAULT_SELF_IMPROVING_LOOPS = 3;
|
|
15
|
+
const DEFAULT_SELF_IMPROVING_ATTEMPTS = 1;
|
|
15
16
|
function normalizeOptionalPromptText(value) {
|
|
16
17
|
if (typeof value !== "string")
|
|
17
18
|
return undefined;
|
|
18
19
|
const normalized = value.trim();
|
|
19
20
|
return normalized.length > 0 ? normalized : undefined;
|
|
20
21
|
}
|
|
21
|
-
function
|
|
22
|
+
function listVisibleDatasetFolders(cwd) {
|
|
22
23
|
const ignoredEntries = new Set([
|
|
23
24
|
".DS_Store",
|
|
24
25
|
".git",
|
|
@@ -32,10 +33,9 @@ function findSingleDatasetFolderCandidate(cwd) {
|
|
|
32
33
|
rootEntries = readdirSync(cwd);
|
|
33
34
|
}
|
|
34
35
|
catch {
|
|
35
|
-
return
|
|
36
|
+
return [];
|
|
36
37
|
}
|
|
37
|
-
const visibleEntries = rootEntries.filter((entry) => !ignoredEntries.has(entry));
|
|
38
|
-
const visibleFiles = [];
|
|
38
|
+
const visibleEntries = rootEntries.filter((entry) => !ignoredEntries.has(entry) && !entry.startsWith("."));
|
|
39
39
|
const visibleDirectories = [];
|
|
40
40
|
for (const entry of visibleEntries) {
|
|
41
41
|
try {
|
|
@@ -43,19 +43,56 @@ function findSingleDatasetFolderCandidate(cwd) {
|
|
|
43
43
|
if (statSync(entryPath).isDirectory()) {
|
|
44
44
|
visibleDirectories.push(entry);
|
|
45
45
|
}
|
|
46
|
-
else {
|
|
47
|
-
visibleFiles.push(entry);
|
|
48
|
-
}
|
|
49
46
|
}
|
|
50
47
|
catch {
|
|
51
48
|
// ignore unreadable entries
|
|
52
49
|
}
|
|
53
50
|
}
|
|
54
|
-
|
|
51
|
+
return visibleDirectories.sort((left, right) => left.localeCompare(right));
|
|
52
|
+
}
|
|
53
|
+
function isReservedDatasetPath(relativePath) {
|
|
54
|
+
const normalized = relativePath.replace(/\\/g, "/").replace(/^\.\/+/, "");
|
|
55
|
+
return normalized === "interf" || normalized.startsWith("interf/") || normalized === ".interf" || normalized.startsWith(".interf/");
|
|
56
|
+
}
|
|
57
|
+
export function normalizeDatasetPathForConfig(projectPath, value) {
|
|
58
|
+
const resolvedPath = projectSourceConfig.resolveSourceDatasetPath(projectPath, { path: value.trim() });
|
|
59
|
+
const relativePath = relative(projectPath, resolvedPath).split(sep).join("/") || ".";
|
|
60
|
+
if (relativePath === ".") {
|
|
61
|
+
throw new Error("Pick a source folder inside this project, not the project root.");
|
|
62
|
+
}
|
|
63
|
+
if (isReservedDatasetPath(relativePath)) {
|
|
64
|
+
throw new Error("Pick an existing source folder under the project root, not `interf/` or `.interf/`.");
|
|
65
|
+
}
|
|
66
|
+
if (!existsSync(resolvedPath)) {
|
|
67
|
+
throw new Error("Pick an existing source folder under the project root.");
|
|
68
|
+
}
|
|
69
|
+
if (!statSync(resolvedPath).isDirectory()) {
|
|
70
|
+
throw new Error("Source folder must be a directory.");
|
|
71
|
+
}
|
|
72
|
+
return relativePath.startsWith("./") ? relativePath : `./${relativePath}`;
|
|
73
|
+
}
|
|
74
|
+
function defaultDatasetNameForPath(datasetPath) {
|
|
75
|
+
const segments = datasetPath
|
|
76
|
+
.replace(/\\/g, "/")
|
|
77
|
+
.replace(/\/+$/g, "")
|
|
78
|
+
.split("/")
|
|
79
|
+
.filter((segment) => segment.length > 0 && segment !== ".");
|
|
80
|
+
return slugify(segments[segments.length - 1] ?? "") || DEFAULT_COMPILED_NAME;
|
|
81
|
+
}
|
|
82
|
+
function findSingleDatasetFolderCandidate(cwd) {
|
|
83
|
+
const visibleDirectories = listVisibleDatasetFolders(cwd);
|
|
84
|
+
if (visibleDirectories.length !== 1) {
|
|
55
85
|
return null;
|
|
56
86
|
}
|
|
57
87
|
return `./${visibleDirectories[0]}`;
|
|
58
88
|
}
|
|
89
|
+
export function listDatasetFolderChoices(cwd = process.cwd()) {
|
|
90
|
+
return listVisibleDatasetFolders(cwd).map((entry) => ({
|
|
91
|
+
value: `./${entry}`,
|
|
92
|
+
label: entry,
|
|
93
|
+
hint: `Use ./${entry} as the source folder`,
|
|
94
|
+
}));
|
|
95
|
+
}
|
|
59
96
|
export function defaultDatasetPathForPrompt(name, introStyle, cwd = process.cwd()) {
|
|
60
97
|
const namedFolderPath = join(cwd, name);
|
|
61
98
|
if (existsSync(namedFolderPath)) {
|
|
@@ -69,15 +106,65 @@ export function defaultDatasetPathForPrompt(name, introStyle, cwd = process.cwd(
|
|
|
69
106
|
}
|
|
70
107
|
}
|
|
71
108
|
if (introStyle === "first") {
|
|
72
|
-
return findSingleDatasetFolderCandidate(cwd) ??
|
|
109
|
+
return findSingleDatasetFolderCandidate(cwd) ?? `./${name}`;
|
|
73
110
|
}
|
|
74
111
|
return `./${name}`;
|
|
75
112
|
}
|
|
113
|
+
async function promptDatasetFolderPath(options) {
|
|
114
|
+
const folderChoices = listDatasetFolderChoices(options.projectPath);
|
|
115
|
+
if (folderChoices.length > 0) {
|
|
116
|
+
const selected = await p.select({
|
|
117
|
+
message: "Which source folder should Interf use?",
|
|
118
|
+
options: [
|
|
119
|
+
...folderChoices,
|
|
120
|
+
{
|
|
121
|
+
value: "__manual__",
|
|
122
|
+
label: "Enter a different path",
|
|
123
|
+
hint: "Use a relative path if the source folder is not listed here",
|
|
124
|
+
},
|
|
125
|
+
],
|
|
126
|
+
initialValue: folderChoices.some((choice) => choice.value === options.initialPath)
|
|
127
|
+
? options.initialPath
|
|
128
|
+
: undefined,
|
|
129
|
+
});
|
|
130
|
+
if (p.isCancel(selected))
|
|
131
|
+
return null;
|
|
132
|
+
if (selected !== "__manual__") {
|
|
133
|
+
try {
|
|
134
|
+
return normalizeDatasetPathForConfig(options.projectPath, String(selected));
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
p.log.error(error instanceof Error ? error.message : String(error));
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
const datasetPath = await p.text({
|
|
143
|
+
message: "Which source folder should Interf use?",
|
|
144
|
+
placeholder: DEFAULT_DATASET_PATH_PLACEHOLDER,
|
|
145
|
+
initialValue: options.initialPath,
|
|
146
|
+
validate: (value) => {
|
|
147
|
+
const normalized = value.trim();
|
|
148
|
+
if (normalized.length === 0)
|
|
149
|
+
return "Source folder is required";
|
|
150
|
+
try {
|
|
151
|
+
normalizeDatasetPathForConfig(options.projectPath, normalized);
|
|
152
|
+
return undefined;
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
return error instanceof Error ? error.message : String(error);
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
});
|
|
159
|
+
if (p.isCancel(datasetPath))
|
|
160
|
+
return null;
|
|
161
|
+
return normalizeDatasetPathForConfig(options.projectPath, String(datasetPath));
|
|
162
|
+
}
|
|
76
163
|
export function datasetAboutPromptMessage(introStyle) {
|
|
77
164
|
if (introStyle === "edit") {
|
|
78
|
-
return "What should this
|
|
165
|
+
return "What task should this source folder stay focused on?";
|
|
79
166
|
}
|
|
80
|
-
return "What should this
|
|
167
|
+
return "What task should this source folder help with?";
|
|
81
168
|
}
|
|
82
169
|
function formatAttemptLabel(count, noun) {
|
|
83
170
|
return `${count} ${noun}${count === 1 ? "" : "s"}`;
|
|
@@ -95,10 +182,30 @@ export function describeCompileLoopSelection(options) {
|
|
|
95
182
|
return "Compile once.";
|
|
96
183
|
}
|
|
97
184
|
if (mode === "retry") {
|
|
98
|
-
|
|
185
|
+
const attempts = options.maxAttempts ?? DEFAULT_COMPILE_RETRY_ATTEMPTS;
|
|
186
|
+
return `Compile retries are enabled here (${formatAttemptLabel(attempts, "total attempt")}).`;
|
|
99
187
|
}
|
|
100
188
|
const loops = options.maxLoops ?? DEFAULT_SELF_IMPROVING_LOOPS;
|
|
101
|
-
|
|
189
|
+
const attempts = options.maxAttempts ?? DEFAULT_SELF_IMPROVING_ATTEMPTS;
|
|
190
|
+
return `Self-improving loops are enabled here (${formatAttemptLabel(attempts, "attempt")} per variation, ${formatAttemptLabel(loops, "workflow revision")}).`;
|
|
191
|
+
}
|
|
192
|
+
async function promptCompileRetryAttempts(options) {
|
|
193
|
+
const maxAttempts = await p.text({
|
|
194
|
+
message: options.message,
|
|
195
|
+
placeholder: String(DEFAULT_COMPILE_RETRY_ATTEMPTS),
|
|
196
|
+
initialValue: String(options.initialMaxAttempts ?? DEFAULT_COMPILE_RETRY_ATTEMPTS),
|
|
197
|
+
validate: (value) => {
|
|
198
|
+
const parsed = Number.parseInt(value.trim(), 10);
|
|
199
|
+
if (!Number.isInteger(parsed) || parsed < 2 || parsed > 5) {
|
|
200
|
+
return "Enter a whole number from 2 to 5";
|
|
201
|
+
}
|
|
202
|
+
return undefined;
|
|
203
|
+
},
|
|
204
|
+
});
|
|
205
|
+
if (p.isCancel(maxAttempts))
|
|
206
|
+
return null;
|
|
207
|
+
return projectSourceConfig.compiledMaxAttempts(Number.parseInt(String(maxAttempts).trim(), 10))
|
|
208
|
+
?? DEFAULT_COMPILE_RETRY_ATTEMPTS;
|
|
102
209
|
}
|
|
103
210
|
export async function promptCheckCases(options) {
|
|
104
211
|
p.log.info(options.heading);
|
|
@@ -139,7 +246,7 @@ export async function promptCheckCases(options) {
|
|
|
139
246
|
}
|
|
140
247
|
function printDraftTruthChecks(checks) {
|
|
141
248
|
console.log();
|
|
142
|
-
p.log.info(`Draft
|
|
249
|
+
p.log.info(`Draft checks: ${checks.length}`);
|
|
143
250
|
for (const [index, check] of checks.entries()) {
|
|
144
251
|
console.log(` ${index + 1}. ${check.question}`);
|
|
145
252
|
console.log(` Expected: ${check.answer ?? ""}`);
|
|
@@ -151,7 +258,7 @@ async function promptDraftTruthChecks(options) {
|
|
|
151
258
|
const datasetConfig = {
|
|
152
259
|
path: options.datasetPath,
|
|
153
260
|
};
|
|
154
|
-
resolvedDatasetPath = resolveSourceDatasetPath(options.projectPath, datasetConfig);
|
|
261
|
+
resolvedDatasetPath = projectSourceConfig.resolveSourceDatasetPath(options.projectPath, datasetConfig);
|
|
155
262
|
}
|
|
156
263
|
catch (error) {
|
|
157
264
|
p.log.error(error instanceof Error ? error.message : String(error));
|
|
@@ -164,19 +271,19 @@ async function promptDraftTruthChecks(options) {
|
|
|
164
271
|
if (!resolved.executor) {
|
|
165
272
|
if (resolved.cancelled)
|
|
166
273
|
return null;
|
|
167
|
-
p.log.error(resolved.error ?? "No local agent detected for
|
|
274
|
+
p.log.error(resolved.error ?? "No local agent detected for check drafting.");
|
|
168
275
|
const fallback = await p.select({
|
|
169
276
|
message: "How do you want to continue?",
|
|
170
277
|
options: [
|
|
171
278
|
{
|
|
172
279
|
value: "manual",
|
|
173
|
-
label: "Add
|
|
280
|
+
label: "Add checks manually",
|
|
174
281
|
hint: "Write the questions and expected answers yourself",
|
|
175
282
|
},
|
|
176
283
|
{
|
|
177
284
|
value: "skip",
|
|
178
285
|
label: "Skip for now",
|
|
179
|
-
hint: "Save this dataset without
|
|
286
|
+
hint: "Save this dataset without checks",
|
|
180
287
|
},
|
|
181
288
|
],
|
|
182
289
|
});
|
|
@@ -185,7 +292,7 @@ async function promptDraftTruthChecks(options) {
|
|
|
185
292
|
return fallback === "manual" ? "manual" : [];
|
|
186
293
|
}
|
|
187
294
|
while (true) {
|
|
188
|
-
p.log.info("Drafting
|
|
295
|
+
p.log.info("Drafting checks from the source files.");
|
|
189
296
|
const drafted = await draftTruthChecks({
|
|
190
297
|
datasetName: options.datasetName,
|
|
191
298
|
datasetPath: resolvedDatasetPath,
|
|
@@ -194,24 +301,24 @@ async function promptDraftTruthChecks(options) {
|
|
|
194
301
|
targetCount: 4,
|
|
195
302
|
});
|
|
196
303
|
if (!drafted.checks) {
|
|
197
|
-
p.log.error(drafted.error ?? "Could not draft
|
|
304
|
+
p.log.error(drafted.error ?? "Could not draft checks from this source folder.");
|
|
198
305
|
const retryMode = await p.select({
|
|
199
306
|
message: "How do you want to continue?",
|
|
200
307
|
options: [
|
|
201
308
|
{
|
|
202
309
|
value: "retry",
|
|
203
310
|
label: "Try auto-create again",
|
|
204
|
-
hint: "Run the same local agent again on the
|
|
311
|
+
hint: "Run the same local agent again on the source folder",
|
|
205
312
|
},
|
|
206
313
|
{
|
|
207
314
|
value: "manual",
|
|
208
|
-
label: "Add
|
|
315
|
+
label: "Add checks manually",
|
|
209
316
|
hint: "Write the checks yourself instead",
|
|
210
317
|
},
|
|
211
318
|
{
|
|
212
319
|
value: "skip",
|
|
213
320
|
label: "Skip for now",
|
|
214
|
-
hint: "Save this dataset without
|
|
321
|
+
hint: "Save this dataset without checks",
|
|
215
322
|
},
|
|
216
323
|
],
|
|
217
324
|
});
|
|
@@ -223,7 +330,7 @@ async function promptDraftTruthChecks(options) {
|
|
|
223
330
|
}
|
|
224
331
|
printDraftTruthChecks(drafted.checks);
|
|
225
332
|
const nextStep = await p.select({
|
|
226
|
-
message: "Use these
|
|
333
|
+
message: "Use these checks?",
|
|
227
334
|
options: [
|
|
228
335
|
{
|
|
229
336
|
value: "use",
|
|
@@ -233,17 +340,17 @@ async function promptDraftTruthChecks(options) {
|
|
|
233
340
|
{
|
|
234
341
|
value: "retry",
|
|
235
342
|
label: "Draft again",
|
|
236
|
-
hint: "Run the same local agent again on the
|
|
343
|
+
hint: "Run the same local agent again on the source folder",
|
|
237
344
|
},
|
|
238
345
|
{
|
|
239
346
|
value: "manual",
|
|
240
|
-
label: "Add
|
|
347
|
+
label: "Add checks manually instead",
|
|
241
348
|
hint: "Discard this draft and write the checks yourself",
|
|
242
349
|
},
|
|
243
350
|
{
|
|
244
351
|
value: "skip",
|
|
245
352
|
label: "Skip for now",
|
|
246
|
-
hint: "Save this dataset without
|
|
353
|
+
hint: "Save this dataset without checks",
|
|
247
354
|
},
|
|
248
355
|
],
|
|
249
356
|
});
|
|
@@ -263,18 +370,18 @@ async function promptCompiledChecks(options) {
|
|
|
263
370
|
if (options.initialAbout) {
|
|
264
371
|
p.log.info(`About: ${options.initialAbout}`);
|
|
265
372
|
}
|
|
266
|
-
p.log.info("
|
|
373
|
+
p.log.info("Checks are the questions your agents should be able to answer from the files behind this task.");
|
|
267
374
|
const mode = await p.select({
|
|
268
|
-
message: "How
|
|
375
|
+
message: "How should Interf create them?",
|
|
269
376
|
options: [
|
|
270
377
|
{
|
|
271
378
|
value: "draft",
|
|
272
379
|
label: "Auto-create a draft (Recommended)",
|
|
273
|
-
hint: "Let
|
|
380
|
+
hint: "Let your chosen local agent draft a few clear, verifiable checks from this source folder",
|
|
274
381
|
},
|
|
275
382
|
{
|
|
276
383
|
value: "manual",
|
|
277
|
-
label: "Add
|
|
384
|
+
label: "Add checks manually",
|
|
278
385
|
hint: "Write the questions and expected answers yourself",
|
|
279
386
|
},
|
|
280
387
|
{
|
|
@@ -299,7 +406,7 @@ async function promptCompiledChecks(options) {
|
|
|
299
406
|
return null;
|
|
300
407
|
if (drafted === "manual") {
|
|
301
408
|
return promptCheckCases({
|
|
302
|
-
heading: "
|
|
409
|
+
heading: "Checks",
|
|
303
410
|
questionMessage: "Question 1?",
|
|
304
411
|
questionPlaceholder: DEFAULT_COMPILED_CHECK_QUESTION_PLACEHOLDER,
|
|
305
412
|
answerMessage: "Expected answer 1?",
|
|
@@ -310,7 +417,7 @@ async function promptCompiledChecks(options) {
|
|
|
310
417
|
return drafted;
|
|
311
418
|
}
|
|
312
419
|
return promptCheckCases({
|
|
313
|
-
heading: "
|
|
420
|
+
heading: "Checks",
|
|
314
421
|
questionMessage: "Question 1?",
|
|
315
422
|
questionPlaceholder: DEFAULT_COMPILED_CHECK_QUESTION_PLACEHOLDER,
|
|
316
423
|
answerMessage: "Expected answer 1?",
|
|
@@ -321,24 +428,24 @@ async function promptCompiledChecks(options) {
|
|
|
321
428
|
if (options.initialAbout) {
|
|
322
429
|
p.log.info(`About: ${options.initialAbout}`);
|
|
323
430
|
}
|
|
324
|
-
p.log.info(`Current
|
|
431
|
+
p.log.info(`Current checks: ${options.initialChecks.length}`);
|
|
325
432
|
const mode = await p.select({
|
|
326
433
|
message: "What do you want to do with them?",
|
|
327
434
|
options: [
|
|
328
435
|
{
|
|
329
436
|
value: "keep",
|
|
330
437
|
label: "Keep them",
|
|
331
|
-
hint: "Leave the current
|
|
438
|
+
hint: "Leave the current checks as-is",
|
|
332
439
|
},
|
|
333
440
|
{
|
|
334
441
|
value: "add",
|
|
335
442
|
label: "Add more",
|
|
336
|
-
hint: "Append more
|
|
443
|
+
hint: "Append more checks",
|
|
337
444
|
},
|
|
338
445
|
{
|
|
339
446
|
value: "replace",
|
|
340
447
|
label: "Replace all",
|
|
341
|
-
hint: "Rewrite the
|
|
448
|
+
hint: "Rewrite the checks from scratch",
|
|
342
449
|
},
|
|
343
450
|
{
|
|
344
451
|
value: "redraft",
|
|
@@ -348,7 +455,7 @@ async function promptCompiledChecks(options) {
|
|
|
348
455
|
{
|
|
349
456
|
value: "clear",
|
|
350
457
|
label: "Clear them for now",
|
|
351
|
-
hint: "Keep this
|
|
458
|
+
hint: "Keep this setup without checks",
|
|
352
459
|
},
|
|
353
460
|
],
|
|
354
461
|
});
|
|
@@ -371,7 +478,7 @@ async function promptCompiledChecks(options) {
|
|
|
371
478
|
return null;
|
|
372
479
|
if (drafted === "manual") {
|
|
373
480
|
return promptCheckCases({
|
|
374
|
-
heading: "Replace
|
|
481
|
+
heading: "Replace checks",
|
|
375
482
|
questionMessage: "Question 1?",
|
|
376
483
|
questionPlaceholder: DEFAULT_COMPILED_CHECK_QUESTION_PLACEHOLDER,
|
|
377
484
|
answerMessage: "Expected answer 1?",
|
|
@@ -382,7 +489,7 @@ async function promptCompiledChecks(options) {
|
|
|
382
489
|
return drafted;
|
|
383
490
|
}
|
|
384
491
|
const nextChecks = await promptCheckCases({
|
|
385
|
-
heading: mode === "add" ? "Add more
|
|
492
|
+
heading: mode === "add" ? "Add more checks" : "Replace checks",
|
|
386
493
|
questionMessage: mode === "add"
|
|
387
494
|
? `Question ${options.initialChecks.length + 1}?`
|
|
388
495
|
: "Question 1?",
|
|
@@ -413,15 +520,16 @@ async function promptSelfImprovingLoops(options) {
|
|
|
413
520
|
});
|
|
414
521
|
if (p.isCancel(maxLoops))
|
|
415
522
|
return null;
|
|
416
|
-
return compiledMaxLoops(Number.parseInt(String(maxLoops).trim(), 10))
|
|
523
|
+
return projectSourceConfig.compiledMaxLoops(Number.parseInt(String(maxLoops).trim(), 10))
|
|
524
|
+
?? DEFAULT_SELF_IMPROVING_LOOPS;
|
|
417
525
|
}
|
|
418
526
|
export async function promptCompileLoopSelection(options) {
|
|
419
527
|
if (!options.hasChecks) {
|
|
420
528
|
return {};
|
|
421
529
|
}
|
|
422
530
|
const currentMode = resolveCompileLoopMode(options.initialMaxAttempts, options.initialMaxLoops);
|
|
423
|
-
const currentPromptMode = currentMode
|
|
424
|
-
const recommendedMode = options.recommendedMode ?? "
|
|
531
|
+
const currentPromptMode = currentMode;
|
|
532
|
+
const recommendedMode = options.recommendedMode ?? "once";
|
|
425
533
|
const includeCompileOnce = options.includeCompileOnce !== false;
|
|
426
534
|
const hasSavedPolicy = typeof options.initialMaxAttempts === "number" ||
|
|
427
535
|
typeof options.initialMaxLoops === "number";
|
|
@@ -436,7 +544,7 @@ export async function promptCompileLoopSelection(options) {
|
|
|
436
544
|
once: {
|
|
437
545
|
value: "once",
|
|
438
546
|
label: "Compile once",
|
|
439
|
-
hint: "Build the compiled
|
|
547
|
+
hint: "Build the compiled context once with the selected workflow",
|
|
440
548
|
},
|
|
441
549
|
"self-improving": {
|
|
442
550
|
value: "self-improving",
|
|
@@ -447,23 +555,25 @@ export async function promptCompileLoopSelection(options) {
|
|
|
447
555
|
},
|
|
448
556
|
retry: {
|
|
449
557
|
value: "retry",
|
|
450
|
-
label: "
|
|
451
|
-
hint:
|
|
558
|
+
label: "Retry same workflow",
|
|
559
|
+
hint: `Retry compile and compiled-context checks up to ${options.initialMaxAttempts ?? DEFAULT_COMPILE_RETRY_ATTEMPTS} total time${(options.initialMaxAttempts ?? DEFAULT_COMPILE_RETRY_ATTEMPTS) === 1 ? "" : "s"} without editing the workflow`,
|
|
452
560
|
},
|
|
453
561
|
};
|
|
454
562
|
const orderedModes = (hasSavedPolicy
|
|
455
563
|
? [
|
|
456
564
|
currentPromptMode,
|
|
457
565
|
...(recommendedMode !== currentPromptMode ? [recommendedMode] : []),
|
|
566
|
+
"retry",
|
|
458
567
|
"once",
|
|
459
568
|
]
|
|
460
569
|
: [
|
|
461
570
|
recommendedMode,
|
|
571
|
+
"retry",
|
|
462
572
|
"once",
|
|
463
573
|
]).filter((mode, index, list) => list.indexOf(mode) === index)
|
|
464
574
|
.filter((mode) => includeCompileOnce || mode !== "once");
|
|
465
575
|
const selectedMode = await p.select({
|
|
466
|
-
message: options.message ?? "How should this
|
|
576
|
+
message: options.message ?? "How should this compile run work?",
|
|
467
577
|
options: orderedModes.map((mode) => optionsByMode[mode]),
|
|
468
578
|
});
|
|
469
579
|
if (p.isCancel(selectedMode))
|
|
@@ -471,6 +581,17 @@ export async function promptCompileLoopSelection(options) {
|
|
|
471
581
|
if (selectedMode === "once") {
|
|
472
582
|
return {};
|
|
473
583
|
}
|
|
584
|
+
if (selectedMode === "retry") {
|
|
585
|
+
const maxAttempts = await promptCompileRetryAttempts({
|
|
586
|
+
initialMaxAttempts: options.initialMaxAttempts ?? DEFAULT_COMPILE_RETRY_ATTEMPTS,
|
|
587
|
+
message: "How many total attempts should Interf try before stopping?",
|
|
588
|
+
});
|
|
589
|
+
if (maxAttempts === null)
|
|
590
|
+
return null;
|
|
591
|
+
return {
|
|
592
|
+
max_attempts: maxAttempts,
|
|
593
|
+
};
|
|
594
|
+
}
|
|
474
595
|
const maxLoops = await promptSelfImprovingLoops({
|
|
475
596
|
initialMaxLoops: options.initialMaxLoops ?? DEFAULT_SELF_IMPROVING_LOOPS,
|
|
476
597
|
message: "How many workflow revisions should Interf try?",
|
|
@@ -478,7 +599,7 @@ export async function promptCompileLoopSelection(options) {
|
|
|
478
599
|
if (maxLoops === null)
|
|
479
600
|
return null;
|
|
480
601
|
return {
|
|
481
|
-
max_attempts:
|
|
602
|
+
max_attempts: DEFAULT_SELF_IMPROVING_ATTEMPTS,
|
|
482
603
|
max_loops: maxLoops,
|
|
483
604
|
};
|
|
484
605
|
}
|
|
@@ -486,64 +607,53 @@ export async function promptSingleCompiledConfig(options = {}) {
|
|
|
486
607
|
const initial = options.initial;
|
|
487
608
|
const introStyle = options.introStyle ?? "first";
|
|
488
609
|
if (introStyle === "first") {
|
|
489
|
-
p.log.info("Pick the
|
|
490
|
-
p.log.info("Then say what this
|
|
610
|
+
p.log.info("Pick the source folder for this task.");
|
|
611
|
+
p.log.info("Then say what task this source folder should help with and save a few checks you can verify.");
|
|
491
612
|
}
|
|
492
613
|
else if (introStyle === "additional") {
|
|
493
|
-
p.log.info("Add another
|
|
614
|
+
p.log.info("Add another setup only if this project needs a separate folder or set of checks.");
|
|
494
615
|
}
|
|
495
616
|
const fixedName = options.fixedName ? slugify(String(options.fixedName)) : undefined;
|
|
496
617
|
if (options.fixedName && !fixedName) {
|
|
497
|
-
p.log.error("Current dataset
|
|
618
|
+
p.log.error("Current dataset name needs letters, numbers, or dashes.");
|
|
498
619
|
return null;
|
|
499
620
|
}
|
|
500
|
-
let name = fixedName
|
|
501
|
-
if (name) {
|
|
502
|
-
|
|
503
|
-
p.log.info(`Editing truth checks for dataset "${name}".`);
|
|
504
|
-
}
|
|
621
|
+
let name = fixedName;
|
|
622
|
+
if (name && options.fixedName) {
|
|
623
|
+
p.log.info(`Editing checks for dataset "${name}".`);
|
|
505
624
|
}
|
|
506
|
-
|
|
507
|
-
|
|
625
|
+
let about = normalizeOptionalPromptText(initial?.about);
|
|
626
|
+
const projectPath = options.projectPath ?? process.cwd();
|
|
627
|
+
const defaultNameSeed = slugify(String(initial?.name ?? DEFAULT_COMPILED_NAME)) || DEFAULT_COMPILED_NAME;
|
|
628
|
+
const defaultDatasetPath = initial?.path ?? defaultDatasetPathForPrompt(defaultNameSeed, introStyle, projectPath);
|
|
629
|
+
const normalizedDatasetPath = await promptDatasetFolderPath({
|
|
630
|
+
projectPath,
|
|
631
|
+
initialPath: defaultDatasetPath,
|
|
632
|
+
});
|
|
633
|
+
if (!normalizedDatasetPath)
|
|
634
|
+
return null;
|
|
635
|
+
if (!name) {
|
|
636
|
+
const suggestedName = defaultDatasetNameForPath(normalizedDatasetPath);
|
|
508
637
|
const rawName = await p.text({
|
|
509
|
-
message: "Dataset
|
|
638
|
+
message: "Dataset name?",
|
|
510
639
|
placeholder: suggestedName,
|
|
511
640
|
initialValue: suggestedName,
|
|
512
|
-
validate: (value) => (value.trim().length === 0 ? "
|
|
641
|
+
validate: (value) => (value.trim().length === 0 ? "Dataset name is required" : undefined),
|
|
513
642
|
});
|
|
514
643
|
if (p.isCancel(rawName))
|
|
515
644
|
return null;
|
|
516
645
|
name = slugify(String(rawName));
|
|
517
646
|
if (!name) {
|
|
518
|
-
p.log.error("Dataset
|
|
647
|
+
p.log.error("Dataset name needs letters, numbers, or dashes.");
|
|
519
648
|
return null;
|
|
520
649
|
}
|
|
521
650
|
if (name !== rawName) {
|
|
522
|
-
p.log.info(`Dataset
|
|
651
|
+
p.log.info(`Dataset name: ${name}`);
|
|
523
652
|
}
|
|
524
653
|
}
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
message: "Dataset folder?",
|
|
529
|
-
placeholder: DEFAULT_DATASET_PATH_PLACEHOLDER,
|
|
530
|
-
initialValue: defaultDatasetPath,
|
|
531
|
-
validate: (value) => {
|
|
532
|
-
const normalized = value.trim();
|
|
533
|
-
if (normalized.length === 0)
|
|
534
|
-
return "Dataset folder is required";
|
|
535
|
-
try {
|
|
536
|
-
resolveSourceDatasetPath(options.projectPath ?? process.cwd(), { path: normalized });
|
|
537
|
-
return undefined;
|
|
538
|
-
}
|
|
539
|
-
catch (error) {
|
|
540
|
-
return error instanceof Error ? error.message : String(error);
|
|
541
|
-
}
|
|
542
|
-
},
|
|
543
|
-
});
|
|
544
|
-
if (p.isCancel(datasetPath))
|
|
545
|
-
return null;
|
|
546
|
-
const normalizedDatasetPath = String(datasetPath).trim();
|
|
654
|
+
if (options.selectedWorkflowLabel) {
|
|
655
|
+
p.log.info(`Workflow: ${options.selectedWorkflowLabel}`);
|
|
656
|
+
}
|
|
547
657
|
let compileLoopSelection = {
|
|
548
658
|
...(typeof initial?.max_attempts === "number" ? { max_attempts: initial.max_attempts } : {}),
|
|
549
659
|
...(typeof initial?.max_loops === "number" ? { max_loops: initial.max_loops } : {}),
|
|
@@ -573,11 +683,8 @@ export async function promptSingleCompiledConfig(options = {}) {
|
|
|
573
683
|
initialMaxLoops: initial?.max_loops,
|
|
574
684
|
hasChecks: checks.length > 0,
|
|
575
685
|
intro: [
|
|
576
|
-
...(options.selectedWorkflowLabel
|
|
577
|
-
? [`Workflow: ${options.selectedWorkflowLabel}`]
|
|
578
|
-
: []),
|
|
579
686
|
"Compile mode",
|
|
580
|
-
"Choose whether
|
|
687
|
+
"Choose whether Interf should compile once, retry the same workflow, or try self-improving workflow variations on the same checks.",
|
|
581
688
|
],
|
|
582
689
|
});
|
|
583
690
|
if (compileLoopSelection === null)
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import chalk from "chalk";
|
|
2
2
|
import * as p from "@clack/prompts";
|
|
3
|
-
import { detectInterf, listCompiledDatasetsForSourceFolder, readInterfConfig, resolveSourceControlPath, } from "
|
|
4
|
-
import { computeCompiledHealth } from "
|
|
5
|
-
import {
|
|
3
|
+
import { detectInterf, listCompiledDatasetsForSourceFolder, readInterfConfig, resolveSourceControlPath, } from "../../packages/project-model/interf.js";
|
|
4
|
+
import { computeCompiledHealth } from "../../packages/compiler/state.js";
|
|
5
|
+
import { sourceDatasetConfigFromInterfConfig, loadCompiledDatasetConfig, } from "../../packages/project-model/source-config.js";
|
|
6
|
+
import { printSavedTestComparisonState, readCurrentSavedTestComparison } from "./test-flow.js";
|
|
6
7
|
function statusColor(status) {
|
|
7
8
|
switch (status) {
|
|
8
9
|
case "compiled":
|
|
@@ -17,7 +18,7 @@ function statusColor(status) {
|
|
|
17
18
|
}
|
|
18
19
|
export const statusCommand = {
|
|
19
20
|
command: "status",
|
|
20
|
-
describe: "Show deterministic health for a compiled
|
|
21
|
+
describe: "Show deterministic health for a compiled context",
|
|
21
22
|
handler: async () => {
|
|
22
23
|
let compiledPath = null;
|
|
23
24
|
const detected = detectInterf(process.cwd());
|
|
@@ -32,8 +33,8 @@ export const statusCommand = {
|
|
|
32
33
|
}));
|
|
33
34
|
if (local.length === 0) {
|
|
34
35
|
process.exitCode = 1;
|
|
35
|
-
console.log(chalk.red(" No compiled
|
|
36
|
-
console.log(chalk.dim(" Run `interf`, save
|
|
36
|
+
console.log(chalk.red(" No compiled contexts found."));
|
|
37
|
+
console.log(chalk.dim(" Run `interf`, save checks, and compile a context folder first."));
|
|
37
38
|
return;
|
|
38
39
|
}
|
|
39
40
|
if (local.length === 1) {
|
|
@@ -41,7 +42,7 @@ export const statusCommand = {
|
|
|
41
42
|
}
|
|
42
43
|
else {
|
|
43
44
|
const selected = await p.select({
|
|
44
|
-
message: "Which
|
|
45
|
+
message: "Which setup?",
|
|
45
46
|
options: local.map((entry) => ({ value: entry.path, label: entry.name })),
|
|
46
47
|
});
|
|
47
48
|
if (p.isCancel(selected))
|
|
@@ -58,15 +59,23 @@ export const statusCommand = {
|
|
|
58
59
|
console.log(chalk.dim(` ${health.summary}`));
|
|
59
60
|
const compiledConfig = readInterfConfig(compiledPath);
|
|
60
61
|
const sourcePath = resolveSourceControlPath(compiledPath);
|
|
61
|
-
const
|
|
62
|
-
?
|
|
63
|
-
|
|
62
|
+
const latestComparisonState = compiledConfig
|
|
63
|
+
? readCurrentSavedTestComparison({
|
|
64
|
+
projectPath: sourcePath,
|
|
65
|
+
datasetName: compiledConfig.name,
|
|
66
|
+
checks: (loadCompiledDatasetConfig(compiledPath)
|
|
67
|
+
?? sourceDatasetConfigFromInterfConfig(compiledConfig)).checks,
|
|
68
|
+
})
|
|
69
|
+
: { comparison: null, stale: false };
|
|
70
|
+
const latestComparison = latestComparisonState.comparison;
|
|
64
71
|
if (latestComparison) {
|
|
65
72
|
printSavedTestComparisonState(latestComparison);
|
|
66
73
|
}
|
|
67
74
|
else {
|
|
68
75
|
console.log();
|
|
69
|
-
console.log(chalk.dim(
|
|
76
|
+
console.log(chalk.dim(latestComparisonState.stale
|
|
77
|
+
? " Saved test results are stale for the current checks. Run `interf test` again."
|
|
78
|
+
: " No saved test result yet. Run `interf test` to measure files as-is and the compiled context."));
|
|
70
79
|
}
|
|
71
80
|
console.log();
|
|
72
81
|
const metricOrder = [
|