flakelab 0.1.5 → 0.1.6
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 +7 -1
- package/dist/commands/repair.js +8 -1
- package/dist/commands/repair.js.map +1 -1
- package/dist/commands/replay.js +6 -0
- package/dist/commands/replay.js.map +1 -1
- package/dist/repair/workspace.d.ts +2 -0
- package/dist/repair/workspace.js +12 -0
- package/dist/repair/workspace.js.map +1 -1
- package/dist/ui/diff.d.ts +3 -0
- package/dist/ui/diff.js +36 -0
- package/dist/ui/diff.js.map +1 -0
- package/dist/ui/progress.d.ts +9 -3
- package/dist/ui/progress.js +50 -4
- package/dist/ui/progress.js.map +1 -1
- package/dist/ui/theme.d.ts +2 -0
- package/dist/ui/theme.js +4 -0
- package/dist/ui/theme.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -350,13 +350,19 @@ received. FlakeLab rejects test changes,
|
|
|
350
350
|
assertion weakening, lint suppressions, credential-like additions, path escapes, and numeric-only
|
|
351
351
|
timeout increases before execution.
|
|
352
352
|
|
|
353
|
-
The candidate is
|
|
353
|
+
The candidate diff is rendered in an interactive terminal and saved to `candidate.diff` before
|
|
354
|
+
proof begins, without changing the working tree. The candidate is then copied into a disposable
|
|
355
|
+
Solari microVM. Typecheck, lint, hostile trials, clean
|
|
354
356
|
controls, and up to 50 nested or co-located `.spec.*` and `.test.*` regression files all run there.
|
|
355
357
|
The machine is destroyed afterward, and the
|
|
356
358
|
candidate is returned as a reviewable diff; FlakeLab never applies it to the local checkout.
|
|
357
359
|
Cold validation installs the pinned Node/pnpm toolchain and Chromium, so it is intentionally
|
|
358
360
|
slower than the future snapshot-backed warm path.
|
|
359
361
|
|
|
362
|
+
While an interactive stage is waiting on Playwright, Groq, or Solari, FlakeLab prints a small
|
|
363
|
+
`working...` pulse. Redirected output and CI logs remain static, and machine-readable stdout is
|
|
364
|
+
unchanged.
|
|
365
|
+
|
|
360
366
|
## Evidence report
|
|
361
367
|
|
|
362
368
|
Turn the validated investigation, reproducer, candidate, and proof into one portable report:
|
package/dist/commands/repair.js
CHANGED
|
@@ -10,9 +10,11 @@ import { withSolariTransport } from "../solari/transport.js";
|
|
|
10
10
|
import { formatProviderBoundary } from "../ui/boundary.js";
|
|
11
11
|
import { writeStderr } from "../ui/console.js";
|
|
12
12
|
import { formatCount } from "../ui/format.js";
|
|
13
|
+
import { formatCandidateDiff } from "../ui/diff.js";
|
|
13
14
|
import { ProgressReporter } from "../ui/progress.js";
|
|
14
|
-
import { stderrTheme } from "../ui/theme.js";
|
|
15
|
+
import { stderrTheme, terminalActivityEnabled } from "../ui/theme.js";
|
|
15
16
|
import { formatProofSummary } from "../repair/summary.js";
|
|
17
|
+
import { createCandidateDiff } from "../repair/workspace.js";
|
|
16
18
|
import { integerOption, positiveNumberOption, withInterruption } from "./options.js";
|
|
17
19
|
export async function repair(investigationPath, values) {
|
|
18
20
|
writeStderr(formatProviderBoundary({
|
|
@@ -53,6 +55,11 @@ export async function repair(investigationPath, values) {
|
|
|
53
55
|
sourcePaths: values.source,
|
|
54
56
|
});
|
|
55
57
|
progress.done(formatCount(generated.candidate.edits.length, "source edit"));
|
|
58
|
+
const previewDiff = await createCandidateDiff(projectRoot, generated.candidate);
|
|
59
|
+
await writeFile(patchPath, previewDiff, "utf8");
|
|
60
|
+
if (terminalActivityEnabled()) {
|
|
61
|
+
writeStderr(formatCandidateDiff(previewDiff, values.patch, stderrTheme()));
|
|
62
|
+
}
|
|
56
63
|
progress.start("isolated proof", "Solari microVM");
|
|
57
64
|
const validated = await withSolariTransport(async () => validateProofOfFix({
|
|
58
65
|
apiKey: solariApiKey,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repair.js","sourceRoot":"","sources":["../../src/commands/repair.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAA;AACjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAA;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAE/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"repair.js","sourceRoot":"","sources":["../../src/commands/repair.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/replay.js
CHANGED
|
@@ -4,6 +4,8 @@ import { readReproducer } from "../reproducer/file.js";
|
|
|
4
4
|
import { createPlaywrightExecutor } from "../runner/playwright-executor.js";
|
|
5
5
|
import { writeStderr } from "../ui/console.js";
|
|
6
6
|
import { TerminalDocument } from "../ui/document.js";
|
|
7
|
+
import { formatCount } from "../ui/format.js";
|
|
8
|
+
import { ProgressReporter } from "../ui/progress.js";
|
|
7
9
|
import { stderrTheme } from "../ui/theme.js";
|
|
8
10
|
import { integerOption, withInterruption } from "./options.js";
|
|
9
11
|
function replaySummary(verdict) {
|
|
@@ -18,6 +20,8 @@ function replaySummary(verdict) {
|
|
|
18
20
|
export async function replay(filePath, values) {
|
|
19
21
|
const projectRoot = process.cwd();
|
|
20
22
|
const reproducer = await readReproducer(resolve(projectRoot, filePath));
|
|
23
|
+
const progress = new ProgressReporter();
|
|
24
|
+
progress.start("reproducer replay", `${formatCount(reproducer.trials, "trial")} under the recorded fault`);
|
|
21
25
|
const result = await withInterruption(async (signal) => evaluateExperiment(createPlaywrightExecutor(projectRoot, reproducer.test, { signal }), {
|
|
22
26
|
concurrency: integerOption(values.concurrency, "concurrency"),
|
|
23
27
|
faults: reproducer.faults,
|
|
@@ -29,6 +33,8 @@ export async function replay(filePath, values) {
|
|
|
29
33
|
const signatureMatches = !reproducer.expectedFailure.signature
|
|
30
34
|
|| reproducer.expectedFailure.signature === result.dominantFailureSignature;
|
|
31
35
|
const reproduced = result.confirmed && signatureMatches;
|
|
36
|
+
progress.done(`${result.failed}/${result.trials} failed · signature `
|
|
37
|
+
+ `${signatureMatches ? "matched" : "did not match"}`);
|
|
32
38
|
writeStderr(replaySummary({ failed: result.failed, path: filePath, reproduced, signatureMatches, test: reproducer.test,
|
|
33
39
|
trials: result.trials }));
|
|
34
40
|
console.log(JSON.stringify({ reproduced, signatureMatches, result }, null, 2));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replay.js","sourceRoot":"","sources":["../../src/commands/replay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAA;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5C,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAW9D,SAAS,aAAa,CAAC,OAAsB;IAC3C,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,WAAW,EAAE,CAAC,CAAA;IACpD,QAAQ,CAAC,KAAK,CACZ,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAC1C,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,0BAA0B,EACxE,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,qCAAqC;UACtE,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,EAAE,CAC/D,CAAA;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC;QACnB,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE;QAC5C,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE;KACvC,CAAC,CAAC,MAAM,EAAE,CAAA;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,QAAgB,EAAE,MAAqB;IAClE,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;IACjC,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAA;IACvE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,kBAAkB,CACxE,wBAAwB,CAAC,WAAW,EAAE,UAAU,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,EAClE;QACE,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC;QAC7D,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,kBAAkB,EAAE,UAAU,CAAC,eAAe,CAAC,WAAW;QAC1D,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,MAAM;QACN,MAAM,EAAE,UAAU,CAAC,MAAM;KAC1B,CACF,CAAC,CAAA;IACF,MAAM,gBAAgB,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC,SAAS;WACzD,UAAU,CAAC,eAAe,CAAC,SAAS,KAAK,MAAM,CAAC,wBAAwB,CAAA;IAC7E,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,IAAI,gBAAgB,CAAA;IACvD,WAAW,CAAC,aAAa,CACvB,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,gBAAgB,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI;QAC1F,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAC1B,CAAC,CAAA;IACF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;IAC9E,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;IACtB,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"replay.js","sourceRoot":"","sources":["../../src/commands/replay.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,3 +5,5 @@ export interface PatchWorkspace {
|
|
|
5
5
|
}
|
|
6
6
|
export declare function createPatchWorkspace(projectRoot: string): Promise<PatchWorkspace>;
|
|
7
7
|
export declare function applyCandidatePatch(workspaceRoot: string, candidate: CandidatePatch): Promise<string>;
|
|
8
|
+
/** Builds the exact patch without changing the developer's working tree. */
|
|
9
|
+
export declare function createCandidateDiff(projectRoot: string, candidate: CandidatePatch): Promise<string>;
|
package/dist/repair/workspace.js
CHANGED
|
@@ -37,4 +37,16 @@ export async function applyCandidatePatch(workspaceRoot, candidate) {
|
|
|
37
37
|
}
|
|
38
38
|
return patches.join("\n");
|
|
39
39
|
}
|
|
40
|
+
/** Builds the exact patch without changing the developer's working tree. */
|
|
41
|
+
export async function createCandidateDiff(projectRoot, candidate) {
|
|
42
|
+
const patches = await Promise.all(candidate.edits.map(async (edit) => {
|
|
43
|
+
const beforeFile = await readFile(resolve(projectRoot, edit.path), "utf8");
|
|
44
|
+
const afterFile = beforeFile.replace(edit.before, edit.after);
|
|
45
|
+
if (afterFile === beforeFile) {
|
|
46
|
+
throw new Error(`Candidate edit did not change ${edit.path}`);
|
|
47
|
+
}
|
|
48
|
+
return createTwoFilesPatch(`a/${edit.path}`, `b/${edit.path}`, beforeFile, afterFile, "before", "candidate", { context: 3 });
|
|
49
|
+
}));
|
|
50
|
+
return patches.join("\n");
|
|
51
|
+
}
|
|
40
52
|
//# sourceMappingURL=workspace.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/repair/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,MAAM,CAAA;AAC1C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC9E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAInC,MAAM,YAAY,GAAG;IACnB,KAAK;IACL,OAAO;IACP,mBAAmB;IACnB,cAAc;IACd,gBAAgB;IAChB,qBAAqB;IACrB,sBAAsB;IACtB,eAAe;CACP,CAAA;AAOV,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,WAAmB;IAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAA;IACnE,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACxC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAA;IACzD,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;QACjC,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAClF,CAAC;IACD,OAAO;QACL,IAAI;QACJ,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;KAChE,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,aAAqB,EACrB,SAAyB;IAEzB,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;QAClD,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QACnD,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;QAC7D,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;QAC/D,CAAC;QACD,MAAM,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;QAC5C,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAC9B,KAAK,IAAI,CAAC,IAAI,EAAE,EAChB,KAAK,IAAI,CAAC,IAAI,EAAE,EAChB,UAAU,EACV,SAAS,EACT,QAAQ,EACR,WAAW,EACX,EAAE,OAAO,EAAE,CAAC,EAAE,CACf,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC3B,CAAC"}
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/repair/workspace.ts"],"names":[],"mappings":"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"}
|
package/dist/ui/diff.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { paint } from "./style.js";
|
|
2
|
+
import { sanitizeText } from "./text.js";
|
|
3
|
+
import { PLAIN_THEME } from "./theme.js";
|
|
4
|
+
const MAXIMUM_RENDERED_LINES = 240;
|
|
5
|
+
function diffStyle(line) {
|
|
6
|
+
if (line.startsWith("+++ ") || line.startsWith("--- ")) {
|
|
7
|
+
return "bold";
|
|
8
|
+
}
|
|
9
|
+
if (line.startsWith("@@")) {
|
|
10
|
+
return "cyan";
|
|
11
|
+
}
|
|
12
|
+
if (line.startsWith("+")) {
|
|
13
|
+
return "green";
|
|
14
|
+
}
|
|
15
|
+
if (line.startsWith("-")) {
|
|
16
|
+
return "red";
|
|
17
|
+
}
|
|
18
|
+
if (line.startsWith("Index:") || line.startsWith("=")) {
|
|
19
|
+
return "dim";
|
|
20
|
+
}
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
/** A bounded, sanitized terminal preview; the complete exact patch remains on disk. */
|
|
24
|
+
export function formatCandidateDiff(diff, patchPath, theme = PLAIN_THEME) {
|
|
25
|
+
const lines = sanitizeText(diff).split("\n");
|
|
26
|
+
const visible = lines.slice(0, MAXIMUM_RENDERED_LINES);
|
|
27
|
+
const rendered = visible.map((line) => {
|
|
28
|
+
const style = diffStyle(line);
|
|
29
|
+
return style ? paint(theme, style, line) : line;
|
|
30
|
+
});
|
|
31
|
+
if (lines.length > MAXIMUM_RENDERED_LINES) {
|
|
32
|
+
rendered.push(paint(theme, "dim", `... preview truncated; complete diff saved to ${patchPath}`));
|
|
33
|
+
}
|
|
34
|
+
return ["", paint(theme, "bold", "Candidate diff"), ...rendered].join("\n");
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/ui/diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAElC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAExC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAExC,MAAM,sBAAsB,GAAG,GAAG,CAAA;AAElC,SAAS,SAAS,CAAC,IAAY;IAC7B,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACvD,OAAO,MAAM,CAAA;IACf,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAA;IACf,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,OAAO,CAAA;IAChB,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAA;IACd,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACtD,OAAO,KAAK,CAAA;IACd,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,mBAAmB,CACjC,IAAY,EACZ,SAAiB,EACjB,QAAuB,WAAW;IAElC,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAAA;IACtD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACpC,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;QAC7B,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACjD,CAAC,CAAC,CAAA;IACF,IAAI,KAAK,CAAC,MAAM,GAAG,sBAAsB,EAAE,CAAC;QAC1C,QAAQ,CAAC,IAAI,CAAC,KAAK,CACjB,KAAK,EACL,KAAK,EACL,iDAAiD,SAAS,EAAE,CAC7D,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC7E,CAAC"}
|
package/dist/ui/progress.d.ts
CHANGED
|
@@ -2,13 +2,18 @@ import type { StatusTone } from "./status.js";
|
|
|
2
2
|
import type { TerminalTheme } from "./theme.js";
|
|
3
3
|
export type ProgressWriter = (chunk: string) => void;
|
|
4
4
|
export interface ProgressOptions {
|
|
5
|
+
animate?: boolean;
|
|
6
|
+
pulseIntervalMs?: number;
|
|
7
|
+
schedulePulse?: PulseScheduler;
|
|
5
8
|
theme?: TerminalTheme;
|
|
6
9
|
write?: ProgressWriter;
|
|
7
10
|
}
|
|
11
|
+
type CancelPulse = () => void;
|
|
12
|
+
type PulseScheduler = (pulse: () => void, intervalMs: number) => CancelPulse;
|
|
8
13
|
/**
|
|
9
|
-
* Line-oriented stage progress on stderr.
|
|
10
|
-
*
|
|
11
|
-
*
|
|
14
|
+
* Line-oriented stage progress on stderr. Interactive terminals receive a
|
|
15
|
+
* growing dot pulse during quiet work; redirected and CI output stays static.
|
|
16
|
+
* It never emits cursor movement, carriage returns, or erase sequences.
|
|
12
17
|
*/
|
|
13
18
|
export declare class ProgressReporter {
|
|
14
19
|
#private;
|
|
@@ -19,3 +24,4 @@ export declare class ProgressReporter {
|
|
|
19
24
|
done(detail?: string): void;
|
|
20
25
|
fail(detail?: string): void;
|
|
21
26
|
}
|
|
27
|
+
export {};
|
package/dist/ui/progress.js
CHANGED
|
@@ -2,32 +2,51 @@ import { formatDuration } from "./format.js";
|
|
|
2
2
|
import { statusMark } from "./status.js";
|
|
3
3
|
import { paint } from "./style.js";
|
|
4
4
|
import { sanitizeLine, truncate } from "./text.js";
|
|
5
|
-
import { stderrTheme } from "./theme.js";
|
|
5
|
+
import { stderrTheme, terminalActivityEnabled } from "./theme.js";
|
|
6
6
|
const MAXIMUM_DETAIL_LENGTH = 200;
|
|
7
7
|
function defaultWriter(chunk) {
|
|
8
8
|
process.stderr.write(chunk);
|
|
9
9
|
}
|
|
10
|
+
function defaultPulseScheduler(pulse, intervalMs) {
|
|
11
|
+
const timer = setInterval(pulse, intervalMs);
|
|
12
|
+
timer.unref();
|
|
13
|
+
return () => clearInterval(timer);
|
|
14
|
+
}
|
|
10
15
|
/**
|
|
11
|
-
* Line-oriented stage progress on stderr.
|
|
12
|
-
*
|
|
13
|
-
*
|
|
16
|
+
* Line-oriented stage progress on stderr. Interactive terminals receive a
|
|
17
|
+
* growing dot pulse during quiet work; redirected and CI output stays static.
|
|
18
|
+
* It never emits cursor movement, carriage returns, or erase sequences.
|
|
14
19
|
*/
|
|
15
20
|
export class ProgressReporter {
|
|
21
|
+
#animate;
|
|
22
|
+
#cancelPulse;
|
|
16
23
|
#label;
|
|
24
|
+
#pulseDots = 0;
|
|
25
|
+
#pulseLineOpen = false;
|
|
26
|
+
#pulseIntervalMs;
|
|
27
|
+
#schedulePulse;
|
|
17
28
|
#startedAt = 0;
|
|
18
29
|
#theme;
|
|
19
30
|
#write;
|
|
20
31
|
constructor(options = {}) {
|
|
32
|
+
this.#animate = options.animate ?? terminalActivityEnabled();
|
|
33
|
+
this.#pulseIntervalMs = options.pulseIntervalMs ?? 1_000;
|
|
34
|
+
this.#schedulePulse = options.schedulePulse ?? defaultPulseScheduler;
|
|
21
35
|
this.#theme = options.theme ?? stderrTheme();
|
|
22
36
|
this.#write = options.write ?? defaultWriter;
|
|
23
37
|
}
|
|
24
38
|
start(label, detail) {
|
|
39
|
+
this.#stopPulse();
|
|
25
40
|
this.#label = sanitizeLine(label);
|
|
26
41
|
this.#startedAt = Date.now();
|
|
27
42
|
this.#line("running", this.#label, detail);
|
|
43
|
+
if (this.#animate) {
|
|
44
|
+
this.#cancelPulse = this.#schedulePulse(() => this.#pulse(), this.#pulseIntervalMs);
|
|
45
|
+
}
|
|
28
46
|
}
|
|
29
47
|
/** A subordinate observation inside the running stage. */
|
|
30
48
|
step(text, tone = "muted") {
|
|
49
|
+
this.#finishPulseLine();
|
|
31
50
|
this.#write(` ${statusMark(this.#theme, tone)} ${this.#detail(text)}\n`);
|
|
32
51
|
}
|
|
33
52
|
done(detail) {
|
|
@@ -41,9 +60,36 @@ export class ProgressReporter {
|
|
|
41
60
|
if (!label) {
|
|
42
61
|
return;
|
|
43
62
|
}
|
|
63
|
+
this.#stopPulse();
|
|
44
64
|
this.#label = undefined;
|
|
45
65
|
this.#line(tone, label, detail, formatDuration(Date.now() - this.#startedAt));
|
|
46
66
|
}
|
|
67
|
+
#finishPulseLine() {
|
|
68
|
+
if (this.#pulseLineOpen) {
|
|
69
|
+
this.#write("\n");
|
|
70
|
+
this.#pulseLineOpen = false;
|
|
71
|
+
this.#pulseDots = 0;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
#pulse() {
|
|
75
|
+
if (!this.#label) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (!this.#pulseLineOpen) {
|
|
79
|
+
this.#write(` ${statusMark(this.#theme, "muted")} ${this.#detail("working")}`);
|
|
80
|
+
this.#pulseLineOpen = true;
|
|
81
|
+
}
|
|
82
|
+
this.#write(paint(this.#theme, "dim", "."));
|
|
83
|
+
this.#pulseDots += 1;
|
|
84
|
+
if (this.#pulseDots >= 12) {
|
|
85
|
+
this.#finishPulseLine();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
#stopPulse() {
|
|
89
|
+
this.#cancelPulse?.();
|
|
90
|
+
this.#cancelPulse = undefined;
|
|
91
|
+
this.#finishPulseLine();
|
|
92
|
+
}
|
|
47
93
|
#line(tone, label, ...details) {
|
|
48
94
|
const separator = this.#theme.unicode ? " · " : " | ";
|
|
49
95
|
const suffix = details
|
package/dist/ui/progress.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/ui/progress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAElD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/ui/progress.ts"],"names":[],"mappings":"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"}
|
package/dist/ui/theme.d.ts
CHANGED
|
@@ -21,3 +21,5 @@ export declare function createTheme(context: TerminalContext): TerminalTheme;
|
|
|
21
21
|
export declare function streamTheme(stream: NodeJS.WriteStream, env?: NodeJS.ProcessEnv): TerminalTheme;
|
|
22
22
|
export declare function stdoutTheme(): TerminalTheme;
|
|
23
23
|
export declare function stderrTheme(): TerminalTheme;
|
|
24
|
+
/** Live terminal affordances stay out of redirected output and CI logs. */
|
|
25
|
+
export declare function terminalActivityEnabled(stream?: NodeJS.WriteStream, env?: NodeJS.ProcessEnv): boolean;
|
package/dist/ui/theme.js
CHANGED
|
@@ -74,4 +74,8 @@ export function stdoutTheme() {
|
|
|
74
74
|
export function stderrTheme() {
|
|
75
75
|
return streamTheme(process.stderr);
|
|
76
76
|
}
|
|
77
|
+
/** Live terminal affordances stay out of redirected output and CI logs. */
|
|
78
|
+
export function terminalActivityEnabled(stream = process.stderr, env = process.env) {
|
|
79
|
+
return Boolean(stream.isTTY) && !present(env.CI) && env.TERM !== "dumb";
|
|
80
|
+
}
|
|
77
81
|
//# sourceMappingURL=theme.js.map
|
package/dist/ui/theme.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/ui/theme.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/ui/theme.ts"],"names":[],"mappings":"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"}
|