@interf/compiler 0.3.1 → 0.3.2
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 +48 -17
- package/dist/commands/compile.d.ts +10 -0
- package/dist/commands/compile.d.ts.map +1 -1
- package/dist/commands/compile.js +200 -28
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +17 -8
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/executor-flow.d.ts +2 -0
- package/dist/commands/executor-flow.d.ts.map +1 -1
- package/dist/commands/executor-flow.js +71 -22
- package/dist/commands/executor-flow.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +51 -9
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/reset.d.ts.map +1 -1
- package/dist/commands/reset.js +2 -18
- package/dist/commands/reset.js.map +1 -1
- package/dist/commands/source-config-wizard.d.ts +1 -1
- package/dist/commands/source-config-wizard.d.ts.map +1 -1
- package/dist/commands/source-config-wizard.js +69 -0
- package/dist/commands/source-config-wizard.js.map +1 -1
- package/dist/commands/test-flow.d.ts +1 -0
- package/dist/commands/test-flow.d.ts.map +1 -1
- package/dist/commands/test-flow.js +27 -4
- package/dist/commands/test-flow.js.map +1 -1
- package/dist/commands/test.d.ts.map +1 -1
- package/dist/commands/test.js +2 -0
- package/dist/commands/test.js.map +1 -1
- package/dist/commands/workspace-flow.d.ts +1 -1
- package/dist/commands/workspace-flow.d.ts.map +1 -1
- package/dist/commands/workspace-flow.js +1 -1
- package/dist/commands/workspace-flow.js.map +1 -1
- package/dist/lib/schema.d.ts +10 -0
- package/dist/lib/schema.d.ts.map +1 -1
- package/dist/lib/schema.js +16 -0
- package/dist/lib/schema.js.map +1 -1
- package/dist/lib/source-config.d.ts +3 -1
- package/dist/lib/source-config.d.ts.map +1 -1
- package/dist/lib/source-config.js +16 -0
- package/dist/lib/source-config.js.map +1 -1
- package/dist/lib/workspace-reset.d.ts +2 -0
- package/dist/lib/workspace-reset.d.ts.map +1 -0
- package/dist/lib/workspace-reset.js +21 -0
- package/dist/lib/workspace-reset.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
# Interf
|
|
2
2
|
|
|
3
|
-
Open-source knowledge compiler for
|
|
3
|
+
Open-source knowledge compiler for local agents.
|
|
4
4
|
|
|
5
5
|
Interf measures and improves how accurately local agents answer questions from your files.
|
|
6
6
|
|
|
7
7
|
If you use Claude Code, Codex, OpenClaw, Hermes, or your own local agent setup on folders full of PDFs, docs, spreadsheets, and notes, the failure often shows up late: missed evidence, shallow analysis, bad comparisons, or answers that sound confident but are wrong.
|
|
8
8
|
|
|
9
|
-
Interf lets you
|
|
9
|
+
Interf lets you define a few checks over your files, measure the raw baseline first if you want it, compile a workspace on top of those files, and see whether the result actually passes.
|
|
10
10
|
|
|
11
11
|
- your files stay on your machine
|
|
12
12
|
- you choose the local agent
|
|
13
13
|
- your raw files stay the source of truth
|
|
14
14
|
- Interf adds a file-based layer on top
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
`interf compile` runs a local data-processing pipeline with your agents as executors and produces a compiled workspace: a file-based layer on top of your raw files that agents can navigate, inspect, and work from.
|
|
17
|
+
|
|
18
|
+
In the advanced looped mode, Interf can keep rerunning that pipeline, testing the result, and trying improved preparation attempts until it finds the best-performing workspace within the attempt budget.
|
|
17
19
|
|
|
18
20
|
## Quick Start
|
|
19
21
|
|
|
@@ -43,6 +45,9 @@ If you want to see the config shape first, this is what Interf writes:
|
|
|
43
45
|
{
|
|
44
46
|
"name": "default",
|
|
45
47
|
"about": "General compiled workspace for the quarterly results folder.",
|
|
48
|
+
"retry_policy": {
|
|
49
|
+
"max_attempts": 3
|
|
50
|
+
},
|
|
46
51
|
"checks": [
|
|
47
52
|
{
|
|
48
53
|
"question": "What full-year revenue range did the company maintain?",
|
|
@@ -71,6 +76,7 @@ The first guided run can:
|
|
|
71
76
|
- save a few questions and expected answers for this folder
|
|
72
77
|
- run a baseline test on the raw files
|
|
73
78
|
- compile the workspace
|
|
79
|
+
- optionally keep compiling and retesting until it passes or reaches the attempt limit
|
|
74
80
|
- run the same test against the compiled workspace
|
|
75
81
|
|
|
76
82
|
That gives you three concrete things:
|
|
@@ -79,6 +85,13 @@ That gives you three concrete things:
|
|
|
79
85
|
- `interf/benchmarks/runs/...` with the saved test result
|
|
80
86
|
- a pass/fail score on the same questions and expected answers you wrote
|
|
81
87
|
|
|
88
|
+
Saved test runs keep the details you need later:
|
|
89
|
+
|
|
90
|
+
- whether the run tested `raw`, `workspace`, or both
|
|
91
|
+
- per-question pass/fail results
|
|
92
|
+
- the saved run path under `interf/benchmarks/runs/...`
|
|
93
|
+
- executor metadata such as agent, command, model, effort, and profile when available
|
|
94
|
+
|
|
82
95
|
If `interf.config.json` is missing, `interf` or `interf init` can draft it with you before the first compile. If Interf cannot find your local agent or compile setup, run:
|
|
83
96
|
|
|
84
97
|
```bash
|
|
@@ -116,21 +129,21 @@ interf compile
|
|
|
116
129
|
interf test
|
|
117
130
|
```
|
|
118
131
|
|
|
119
|
-
## Start With
|
|
132
|
+
## Start With Your Own Checks
|
|
120
133
|
|
|
121
|
-
|
|
134
|
+
Start with your own checks over the files: questions where you already know the correct answer from the dataset.
|
|
135
|
+
|
|
136
|
+
`interf.config.json` is where you save those checks for a folder.
|
|
122
137
|
|
|
123
138
|
That file uses one `workspaces` array:
|
|
124
139
|
|
|
125
140
|
- most folders only need one workspace
|
|
126
141
|
- add another workspace only if you want a separate compiled setup with different checks
|
|
127
142
|
- each workspace carries its own `checks`
|
|
143
|
+
- each workspace can optionally carry `retry_policy.max_attempts` for the self-improving compile loop
|
|
128
144
|
|
|
129
145
|
If the file is missing, `interf init` can draft it with you before the first compile. You can edit it any time.
|
|
130
146
|
|
|
131
|
-
That example is just `interf.config.json`.
|
|
132
|
-
Advanced retry settings do not live there.
|
|
133
|
-
|
|
134
147
|
Good first checks are small and practical:
|
|
135
148
|
|
|
136
149
|
- one exact number from a chart, table, or filing
|
|
@@ -144,9 +157,9 @@ interf compile
|
|
|
144
157
|
interf test
|
|
145
158
|
```
|
|
146
159
|
|
|
147
|
-
## What `interf test`
|
|
160
|
+
## What `interf test` Does
|
|
148
161
|
|
|
149
|
-
`interf test` scores either the raw files, a compiled workspace, or both on the same saved
|
|
162
|
+
`interf test` scores either the raw files, a compiled workspace, or both on the same saved checks.
|
|
150
163
|
|
|
151
164
|
It lets you answer a simple question:
|
|
152
165
|
|
|
@@ -157,6 +170,12 @@ It lets you answer a simple question:
|
|
|
157
170
|
|
|
158
171
|
By default it loads checks from `interf.config.json`, can run a raw baseline in an isolated raw-files sandbox, can test eligible compiled workspaces under `interf/workspaces/`, and saves the run under `interf/benchmarks/runs/`.
|
|
159
172
|
|
|
173
|
+
Each saved run includes:
|
|
174
|
+
|
|
175
|
+
- the benchmark target and mode
|
|
176
|
+
- per-question results and traces
|
|
177
|
+
- the executor metadata for that run
|
|
178
|
+
|
|
160
179
|
If you run `interf test` from inside a workspace, it uses that workspace's checks and tests that workspace. If you run it from the source folder, it lets you choose a saved workspace and then choose raw files, the compiled workspace, or both.
|
|
161
180
|
|
|
162
181
|
Live test runs use an isolated sandbox. For raw baselines, Interf gives the agent sanitized raw files only. For compiled-workspace tests, it gives the agent a copied workspace plus sanitized raw files. The source-folder control plane, `interf.config.json`, and saved test runs are not part of those sandboxes.
|
|
@@ -183,6 +202,8 @@ In public docs, `pipeline` is the thing Interf runs. `workflow` is the saved met
|
|
|
183
202
|
|
|
184
203
|
The default workflow is built in. If you want a different method, you can define your own workflow package and benchmark it on the same folder.
|
|
185
204
|
|
|
205
|
+
If a workspace has `retry_policy.max_attempts`, or if you run `interf compile --max-attempts <n>`, Interf can keep compiling, testing, and retrying until that workspace passes or reaches the attempt limit. If several attempts fail, Interf keeps the best-performing compiled workspace from that run.
|
|
206
|
+
|
|
186
207
|
## What Gets Created
|
|
187
208
|
|
|
188
209
|
After compile, Interf writes into `./interf/` beside your source files.
|
|
@@ -238,16 +259,26 @@ Why create another one:
|
|
|
238
259
|
|
|
239
260
|
## Advanced: Keep Improving Until It Passes
|
|
240
261
|
|
|
241
|
-
Interf also supports
|
|
262
|
+
Interf also supports a deeper loop above the normal compile + test flow.
|
|
263
|
+
|
|
264
|
+
The normal workspace flow already supports `retry_policy.max_attempts` inside `interf.config.json` or `interf compile --max-attempts <n>`.
|
|
242
265
|
|
|
243
266
|
Give it the same folder and the same checks. Interf can keep rerunning compile + test attempts until the test passes or the attempt budget runs out.
|
|
244
267
|
|
|
268
|
+
That loop is the self-improving part of the product:
|
|
269
|
+
|
|
270
|
+
- it reruns the local data-processing pipeline over the same files
|
|
271
|
+
- it keeps the checks fixed, so the target does not move
|
|
272
|
+
- it can vary the compile profile and follow-up diagnostics
|
|
273
|
+
- it records which attempt performed best on the same saved test
|
|
274
|
+
|
|
245
275
|
In practice:
|
|
246
276
|
|
|
247
|
-
- `retry_policy.
|
|
277
|
+
- `retry_policy.max_attempts` controls how many total attempts a normal workspace compile gets
|
|
278
|
+
- `retry_policy.max_attempts_per_profile` controls how many attempts each compile profile gets in eval packs
|
|
248
279
|
- stronger diagnostic profiles can be used only after the default ones fail
|
|
249
280
|
- the checks stay the same across every attempt
|
|
250
|
-
- each attempt records what changed
|
|
281
|
+
- each attempt records what changed and which attempt performed best
|
|
251
282
|
|
|
252
283
|
Example eval-pack shape:
|
|
253
284
|
|
|
@@ -256,6 +287,9 @@ Example eval-pack shape:
|
|
|
256
287
|
"workspaces": [
|
|
257
288
|
{
|
|
258
289
|
"name": "default",
|
|
290
|
+
"retry_policy": {
|
|
291
|
+
"max_attempts": 3
|
|
292
|
+
},
|
|
259
293
|
"checks": [
|
|
260
294
|
{
|
|
261
295
|
"question": "What full-year revenue range did the company maintain?",
|
|
@@ -264,16 +298,13 @@ Example eval-pack shape:
|
|
|
264
298
|
]
|
|
265
299
|
}
|
|
266
300
|
],
|
|
267
|
-
// Advanced only: retry settings live in eval packs, not in interf.config.json.
|
|
268
301
|
"retry_policy": {
|
|
269
302
|
"max_attempts_per_profile": 3
|
|
270
303
|
}
|
|
271
304
|
}
|
|
272
305
|
```
|
|
273
306
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
Use the normal test flow first. Use this advanced path when you want Interf to keep improving the local preparation workflow until the workspace is good enough for your task or the attempt budget runs out. It spends more tokens, so use it when that extra spend is worth the accuracy target.
|
|
307
|
+
Use the normal workspace retry loop first. Use the eval-pack path when you want Interf to compare multiple compile profiles, add diagnostics, or keep iterating in a more controlled experiment loop. It spends more tokens, so use it when that extra spend is worth the accuracy target.
|
|
277
308
|
|
|
278
309
|
## Use It With Your Agent
|
|
279
310
|
|
|
@@ -1,4 +1,14 @@
|
|
|
1
|
+
import type { WorkflowExecutionProfile, WorkflowExecutor } from "../lib/executors.js";
|
|
2
|
+
import type { SourceWorkspaceConfig } from "../lib/schema.js";
|
|
1
3
|
import type { CommandModule } from "yargs";
|
|
2
4
|
export declare const compileCommand: CommandModule;
|
|
3
5
|
export declare function runCompileCommand(argv?: Record<string, unknown>): Promise<void>;
|
|
6
|
+
export declare function runConfiguredWorkspaceCompile(options: {
|
|
7
|
+
executor: WorkflowExecutor;
|
|
8
|
+
workspacePath: string;
|
|
9
|
+
sourcePath: string;
|
|
10
|
+
workspaceConfig: SourceWorkspaceConfig | null;
|
|
11
|
+
executionProfile?: WorkflowExecutionProfile;
|
|
12
|
+
maxAttemptsOverride: number | null;
|
|
13
|
+
}): Promise<boolean>;
|
|
4
14
|
//# sourceMappingURL=compile.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAMtF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAM9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAa3C,eAAO,MAAM,cAAc,EAAE,aAa5B,CAAC;AAEF,wBAAsB,iBAAiB,CAAC,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+EzF;AA6CD,wBAAsB,6BAA6B,CACjD,OAAO,EAAE;IACP,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAC9C,gBAAgB,CAAC,EAAE,wBAAwB,CAAC;IAC5C,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC,GACA,OAAO,CAAC,OAAO,CAAC,CA+GlB"}
|
package/dist/commands/compile.js
CHANGED
|
@@ -1,62 +1,234 @@
|
|
|
1
|
+
import { cpSync, mkdtempSync, rmSync } from "node:fs";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
1
4
|
import chalk from "chalk";
|
|
5
|
+
import * as p from "@clack/prompts";
|
|
2
6
|
import { detectInterf, readInterfConfig, resolveSourceFolderPath, } from "../lib/interf.js";
|
|
7
|
+
import { findSourceWorkspaceConfig, loadSourceFolderConfig, resolveWorkspaceCompileMaxAttempts, } from "../lib/source-config.js";
|
|
8
|
+
import { resetWorkspaceGeneratedState } from "../lib/workspace-reset.js";
|
|
3
9
|
import { formatWorkspaceWorkflowStageStep, resolveWorkspaceWorkflowFromConfig, } from "../lib/workflow-definitions.js";
|
|
4
10
|
import { addExecutionProfileOptions, executionProfileFromArgv, } from "../lib/execution-profile.js";
|
|
5
11
|
import { chooseWorkspaceConfigToBuild, compileWorkspaceWithReporter, ensureWorkspaceFromConfig, } from "./workspace-flow.js";
|
|
6
12
|
import { resolveOrConfigureLocalExecutor } from "./executor-flow.js";
|
|
13
|
+
import { printSavedTestOutcome, runSavedWorkspaceTest } from "./test-flow.js";
|
|
7
14
|
export const compileCommand = {
|
|
8
15
|
command: "compile",
|
|
9
16
|
describe: "Build a workspace for this folder",
|
|
10
|
-
builder: (yargs) => addExecutionProfileOptions(yargs),
|
|
17
|
+
builder: (yargs) => addExecutionProfileOptions(yargs).option("max-attempts", {
|
|
18
|
+
alias: "max-retries",
|
|
19
|
+
type: "number",
|
|
20
|
+
describe: "Compile, test, and retry until the workspace passes or reaches this total attempt limit",
|
|
21
|
+
}),
|
|
11
22
|
handler: async (argv) => {
|
|
12
23
|
await runCompileCommand(argv);
|
|
13
24
|
},
|
|
14
25
|
};
|
|
15
26
|
export async function runCompileCommand(argv = {}) {
|
|
16
|
-
const executionProfile = executionProfileFromArgv(argv);
|
|
17
|
-
const { executor, error } = await resolveOrConfigureLocalExecutor({ executionProfile });
|
|
18
|
-
if (!executor) {
|
|
19
|
-
process.exitCode = 1;
|
|
20
|
-
console.log(chalk.red(error ?? "No coding agent detected."));
|
|
21
|
-
return;
|
|
22
|
-
}
|
|
23
27
|
let workspacePath = null;
|
|
28
|
+
let sourcePath = process.cwd();
|
|
29
|
+
let workspaceConfig = null;
|
|
24
30
|
const detected = detectInterf(process.cwd());
|
|
25
31
|
if (detected) {
|
|
26
32
|
workspacePath = detected.path;
|
|
33
|
+
sourcePath = resolveSourceFolderPath(detected.path, detected.config);
|
|
34
|
+
workspaceConfig = findSourceWorkspaceConfig(loadSourceFolderConfig(sourcePath), detected.config.name) ?? {
|
|
35
|
+
name: detected.config.name,
|
|
36
|
+
...(detected.config.about ? { about: detected.config.about } : {}),
|
|
37
|
+
...(detected.config.workflow ? { workflow: detected.config.workflow } : {}),
|
|
38
|
+
checks: [],
|
|
39
|
+
};
|
|
40
|
+
if (process.stdin.isTTY && process.stdout.isTTY) {
|
|
41
|
+
const confirmed = await p.confirm({
|
|
42
|
+
message: `Compile workspace "${detected.config.name}" now?`,
|
|
43
|
+
initialValue: true,
|
|
44
|
+
});
|
|
45
|
+
if (p.isCancel(confirmed) || !confirmed)
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
27
48
|
}
|
|
28
49
|
else {
|
|
29
|
-
|
|
30
|
-
|
|
50
|
+
const selectedWorkspace = await chooseWorkspaceConfigToBuild({
|
|
51
|
+
sourcePath: process.cwd(),
|
|
52
|
+
selectMessage: "Which workspace do you want to compile?",
|
|
53
|
+
});
|
|
54
|
+
if (selectedWorkspace === undefined)
|
|
55
|
+
return;
|
|
56
|
+
if (!selectedWorkspace) {
|
|
31
57
|
process.exitCode = 1;
|
|
32
58
|
console.log(chalk.red(" No workspaces are set up for this folder yet."));
|
|
33
59
|
console.log(chalk.dim(" Start with `interf` or `interf init` to set up this folder."));
|
|
34
60
|
return;
|
|
35
61
|
}
|
|
62
|
+
if (process.stdin.isTTY && process.stdout.isTTY) {
|
|
63
|
+
const confirmed = await p.confirm({
|
|
64
|
+
message: `Compile workspace "${selectedWorkspace.name}" now?`,
|
|
65
|
+
initialValue: true,
|
|
66
|
+
});
|
|
67
|
+
if (p.isCancel(confirmed) || !confirmed)
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
workspaceConfig = selectedWorkspace;
|
|
71
|
+
workspacePath = ensureWorkspaceFromConfig(process.cwd(), selectedWorkspace);
|
|
72
|
+
console.log(chalk.dim(` Workspace: ${selectedWorkspace.name}`));
|
|
36
73
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
74
|
+
let maxAttemptsOverride = null;
|
|
75
|
+
try {
|
|
76
|
+
maxAttemptsOverride = readCompileMaxAttemptsOverride(argv);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
process.exitCode = 1;
|
|
80
|
+
console.log(chalk.red(error instanceof Error ? error.message : String(error)));
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const executionProfile = executionProfileFromArgv(argv);
|
|
84
|
+
const { executor, error } = await resolveOrConfigureLocalExecutor({
|
|
85
|
+
executionProfile,
|
|
86
|
+
purpose: "compile",
|
|
87
|
+
});
|
|
88
|
+
if (!executor && !error)
|
|
89
|
+
return;
|
|
90
|
+
if (!executor) {
|
|
91
|
+
process.exitCode = 1;
|
|
92
|
+
console.log(chalk.red(error ?? "No coding agent detected."));
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
await runConfiguredWorkspaceCompile({
|
|
96
|
+
executor,
|
|
97
|
+
workspacePath,
|
|
41
98
|
sourcePath,
|
|
42
|
-
|
|
99
|
+
workspaceConfig,
|
|
100
|
+
executionProfile,
|
|
101
|
+
maxAttemptsOverride,
|
|
43
102
|
});
|
|
44
|
-
|
|
103
|
+
}
|
|
104
|
+
function readCompileMaxAttemptsOverride(argv) {
|
|
105
|
+
const raw = argv["max-attempts"] ??
|
|
106
|
+
argv.maxAttempts ??
|
|
107
|
+
argv["max-retries"] ??
|
|
108
|
+
argv.maxRetries;
|
|
109
|
+
if (raw == null)
|
|
45
110
|
return null;
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
111
|
+
const parsed = Number.parseInt(String(raw), 10);
|
|
112
|
+
if (!Number.isInteger(parsed) || parsed < 1 || parsed > 5) {
|
|
113
|
+
throw new Error("`--max-attempts` must be a whole number from 1 to 5.");
|
|
114
|
+
}
|
|
115
|
+
return parsed;
|
|
116
|
+
}
|
|
117
|
+
function printCompileFailure(workspacePath, failedStage) {
|
|
118
|
+
const workflowId = resolveWorkspaceWorkflowFromConfig(readInterfConfig(workspacePath));
|
|
119
|
+
const failedStageLabel = formatWorkspaceWorkflowStageStep(workflowId, failedStage ?? "compile", {
|
|
120
|
+
sourcePath: resolveSourceFolderPath(workspacePath),
|
|
121
|
+
});
|
|
122
|
+
console.log(chalk.red(` ${failedStageLabel} failed.`));
|
|
123
|
+
}
|
|
124
|
+
function testScore(outcome) {
|
|
125
|
+
return (outcome.result.passedChecks * 1000) + outcome.result.passedCases;
|
|
126
|
+
}
|
|
127
|
+
function snapshotWorkspace(workspacePath) {
|
|
128
|
+
const snapshotRoot = mkdtempSync(join(tmpdir(), "interf-compile-attempt-"));
|
|
129
|
+
const snapshotPath = join(snapshotRoot, "workspace");
|
|
130
|
+
cpSync(workspacePath, snapshotPath, { recursive: true });
|
|
131
|
+
return snapshotPath;
|
|
49
132
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
133
|
+
function restoreWorkspaceSnapshot(snapshotPath, workspacePath) {
|
|
134
|
+
rmSync(workspacePath, { recursive: true, force: true });
|
|
135
|
+
cpSync(snapshotPath, workspacePath, { recursive: true });
|
|
136
|
+
}
|
|
137
|
+
export async function runConfiguredWorkspaceCompile(options) {
|
|
138
|
+
const maxAttempts = resolveWorkspaceCompileMaxAttempts(options.workspaceConfig ?? { retry_policy: undefined }, options.maxAttemptsOverride);
|
|
139
|
+
const loopEnabled = maxAttempts != null;
|
|
140
|
+
const checks = options.workspaceConfig?.checks ?? [];
|
|
141
|
+
if (loopEnabled && checks.length === 0) {
|
|
142
|
+
console.log(chalk.yellow(" Self-improving mode needs saved questions. Building once without the retry loop."));
|
|
143
|
+
}
|
|
144
|
+
else if (loopEnabled) {
|
|
145
|
+
console.log(chalk.dim(` Self-improving mode: up to ${maxAttempts} compile attempts.`));
|
|
146
|
+
console.log(chalk.dim(" Interf will compile, test the workspace, and retry until it passes or reaches the limit."));
|
|
147
|
+
}
|
|
148
|
+
if (!loopEnabled || checks.length === 0) {
|
|
149
|
+
const result = await compileWorkspaceWithReporter(options.executor, options.workspacePath);
|
|
150
|
+
if (!result.ok) {
|
|
151
|
+
process.exitCode = 1;
|
|
152
|
+
printCompileFailure(options.workspacePath, result.failedStage);
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
157
|
+
let bestOutcome = null;
|
|
158
|
+
let bestSnapshotPath = null;
|
|
159
|
+
let bestAttempt = 0;
|
|
160
|
+
try {
|
|
161
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
|
|
162
|
+
if (attempt > 1) {
|
|
163
|
+
console.log();
|
|
164
|
+
console.log(chalk.dim(` Resetting generated workspace state before attempt ${attempt}/${maxAttempts}...`));
|
|
165
|
+
resetWorkspaceGeneratedState(options.workspacePath, "compile");
|
|
166
|
+
}
|
|
167
|
+
const result = await compileWorkspaceWithReporter(options.executor, options.workspacePath, {
|
|
168
|
+
heading: maxAttempts > 1
|
|
169
|
+
? `Building compiled workspace (attempt ${attempt}/${maxAttempts})...`
|
|
170
|
+
: "Building compiled workspace...",
|
|
171
|
+
successMessage: maxAttempts > 1
|
|
172
|
+
? `Compiled workspace ready for attempt ${attempt}.`
|
|
173
|
+
: "Compiled workspace ready.",
|
|
174
|
+
});
|
|
175
|
+
if (!result.ok) {
|
|
176
|
+
printCompileFailure(options.workspacePath, result.failedStage);
|
|
177
|
+
if (attempt < maxAttempts) {
|
|
178
|
+
console.log(chalk.yellow(` Attempt ${attempt}/${maxAttempts} failed. Retrying with a fresh compile.`));
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
process.exitCode = 1;
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
const outcome = await runSavedWorkspaceTest({
|
|
185
|
+
sourcePath: options.sourcePath,
|
|
186
|
+
workspaceConfig: options.workspaceConfig ?? {
|
|
187
|
+
name: readInterfConfig(options.workspacePath)?.name ?? "workspace",
|
|
188
|
+
checks: [],
|
|
189
|
+
},
|
|
190
|
+
executionProfile: options.executionProfile,
|
|
191
|
+
workspacePath: options.workspacePath,
|
|
192
|
+
});
|
|
193
|
+
if (!outcome) {
|
|
194
|
+
process.exitCode = 1;
|
|
195
|
+
console.log(chalk.red(" Could not run the saved workspace test after compile."));
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
console.log();
|
|
199
|
+
printSavedTestOutcome(`Compiled workspace · attempt ${attempt}/${maxAttempts}`, outcome);
|
|
200
|
+
if (!bestOutcome || testScore(outcome) > testScore(bestOutcome)) {
|
|
201
|
+
if (bestSnapshotPath) {
|
|
202
|
+
rmSync(bestSnapshotPath, { recursive: true, force: true });
|
|
203
|
+
}
|
|
204
|
+
bestOutcome = outcome;
|
|
205
|
+
bestSnapshotPath = snapshotWorkspace(options.workspacePath);
|
|
206
|
+
bestAttempt = attempt;
|
|
207
|
+
}
|
|
208
|
+
if (outcome.result.ok) {
|
|
209
|
+
console.log();
|
|
210
|
+
console.log(chalk.green(` Workspace passed on attempt ${attempt}/${maxAttempts}.`));
|
|
211
|
+
return true;
|
|
212
|
+
}
|
|
213
|
+
if (attempt < maxAttempts) {
|
|
214
|
+
console.log();
|
|
215
|
+
console.log(chalk.yellow(` Attempt ${attempt}/${maxAttempts} did not pass. Retrying with a fresh compile.`));
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
if (bestSnapshotPath && bestAttempt > 0 && bestAttempt !== maxAttempts) {
|
|
219
|
+
restoreWorkspaceSnapshot(bestSnapshotPath, options.workspacePath);
|
|
220
|
+
console.log();
|
|
221
|
+
console.log(chalk.dim(` Restored the best-performing compiled workspace from attempt ${bestAttempt}/${maxAttempts}.`));
|
|
222
|
+
}
|
|
53
223
|
process.exitCode = 1;
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
224
|
+
console.log();
|
|
225
|
+
console.log(chalk.red(` Workspace did not pass within ${maxAttempts} attempts.`));
|
|
226
|
+
return false;
|
|
227
|
+
}
|
|
228
|
+
finally {
|
|
229
|
+
if (bestSnapshotPath) {
|
|
230
|
+
rmSync(bestSnapshotPath, { recursive: true, force: true });
|
|
231
|
+
}
|
|
60
232
|
}
|
|
61
233
|
}
|
|
62
234
|
//# sourceMappingURL=compile.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,gCAAgC,EAChC,kCAAkC,GACnC,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,4BAA4B,EAC5B,4BAA4B,EAC5B,yBAAyB,GAC1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,+BAA+B,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAM3C,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAM3C,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAiDpE,eAAO,MAAM,aAAa,EAAE,aAmC3B,CAAC;AAEF,wBAAsB,qBAAqB,CACzC,OAAO,GAAE;IACP,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gBAAgB,CAAC,EAAE,wBAAwB,CAAC;CACxC,iBA6FP;AAuBD,OAAO,EACL,KAAK,qBAAqB,EAC1B,mBAAmB,EACnB,uBAAuB,EACvB,oBAAoB,EACpB,6BAA6B,GAC9B,MAAM,6BAA6B,CAAC"}
|
package/dist/commands/create.js
CHANGED
|
@@ -6,9 +6,10 @@ import { slugify } from "../lib/util.js";
|
|
|
6
6
|
import { addExecutionProfileOptions, executionProfileFromArgv, } from "../lib/execution-profile.js";
|
|
7
7
|
import { loadSourceFolderConfig, upsertSourceWorkspaceConfig } from "../lib/source-config.js";
|
|
8
8
|
import { chooseWorkspaceWorkflow, createWorkflowWizard, } from "./create-workflow-wizard.js";
|
|
9
|
-
import {
|
|
9
|
+
import { ensureWorkspaceFromConfig, } from "./workspace-flow.js";
|
|
10
10
|
import { promptSingleWorkspaceConfig } from "./source-config-wizard.js";
|
|
11
11
|
import { resolveOrConfigureLocalExecutor } from "./executor-flow.js";
|
|
12
|
+
import { runConfiguredWorkspaceCompile } from "./compile.js";
|
|
12
13
|
function normalizeCreateTarget(value) {
|
|
13
14
|
if (!value)
|
|
14
15
|
return null;
|
|
@@ -109,8 +110,6 @@ export async function createWorkspaceWizard(options = {}) {
|
|
|
109
110
|
return;
|
|
110
111
|
}
|
|
111
112
|
upsertSourceWorkspaceConfig(cwd, configToSave);
|
|
112
|
-
const name = configToSave.name;
|
|
113
|
-
const about = configToSave.about;
|
|
114
113
|
const spinner = p.spinner();
|
|
115
114
|
spinner.start("Creating workspace...");
|
|
116
115
|
let workspacePath = "";
|
|
@@ -136,19 +135,29 @@ export async function createWorkspaceWizard(options = {}) {
|
|
|
136
135
|
}
|
|
137
136
|
const { executor, error } = await resolveOrConfigureLocalExecutor({
|
|
138
137
|
executionProfile: options.executionProfile,
|
|
138
|
+
purpose: "compile",
|
|
139
139
|
});
|
|
140
|
+
if (!executor && !error) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
140
143
|
if (!executor) {
|
|
141
144
|
process.exitCode = 1;
|
|
142
145
|
p.log.error(error ?? "No coding agent detected.");
|
|
143
146
|
return;
|
|
144
147
|
}
|
|
145
|
-
await compileWorkspaceAfterCreate(executor, workspacePath);
|
|
148
|
+
await compileWorkspaceAfterCreate(executor, cwd, configToSave, workspacePath, options.executionProfile);
|
|
146
149
|
}
|
|
147
|
-
async function compileWorkspaceAfterCreate(executor, workspacePath) {
|
|
148
|
-
const compiled = await
|
|
149
|
-
|
|
150
|
+
async function compileWorkspaceAfterCreate(executor, sourcePath, workspaceConfig, workspacePath, executionProfile) {
|
|
151
|
+
const compiled = await runConfiguredWorkspaceCompile({
|
|
152
|
+
executor,
|
|
153
|
+
workspacePath,
|
|
154
|
+
sourcePath,
|
|
155
|
+
workspaceConfig,
|
|
156
|
+
executionProfile,
|
|
157
|
+
maxAttemptsOverride: null,
|
|
158
|
+
});
|
|
159
|
+
if (!compiled) {
|
|
150
160
|
process.exitCode = 1;
|
|
151
|
-
console.log(chalk.red(" Workspace compile failed."));
|
|
152
161
|
return;
|
|
153
162
|
}
|
|
154
163
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EACL,YAAY,EACZ,6BAA6B,EAC7B,6BAA6B,GAC9B,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,8 +2,10 @@ import { type WorkflowExecutionProfile, type WorkflowExecutor } from "../lib/exe
|
|
|
2
2
|
export declare function resolveOrConfigureLocalExecutor(options?: {
|
|
3
3
|
preflight?: boolean;
|
|
4
4
|
executionProfile?: WorkflowExecutionProfile;
|
|
5
|
+
purpose?: "compile" | "test";
|
|
5
6
|
}): Promise<{
|
|
6
7
|
executor: WorkflowExecutor | null;
|
|
7
8
|
error?: string;
|
|
9
|
+
cancelled?: boolean;
|
|
8
10
|
}>;
|
|
9
11
|
//# sourceMappingURL=executor-flow.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor-flow.d.ts","sourceRoot":"","sources":["../../src/commands/executor-flow.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,EACtB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"executor-flow.d.ts","sourceRoot":"","sources":["../../src/commands/executor-flow.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,EACtB,MAAM,qBAAqB,CAAC;AAoF7B,wBAAsB,+BAA+B,CACnD,OAAO,GAAE;IACP,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,wBAAwB,CAAC;IAC5C,OAAO,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;CACzB,GACL,OAAO,CAAC;IAAE,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAsCrF"}
|