flanders 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/Claude.d.ts +129 -0
- package/lib/Claude.js +390 -0
- package/lib/ClaudeSession.d.ts +34 -0
- package/lib/ClaudeSession.js +293 -0
- package/lib/Flanders.d.ts +21 -0
- package/lib/Flanders.js +64 -0
- package/lib/Git.d.ts +12 -0
- package/lib/Git.js +128 -0
- package/lib/PlanFile.d.ts +38 -0
- package/lib/PlanFile.js +167 -0
- package/lib/ScriptRunner.d.ts +26 -0
- package/lib/ScriptRunner.js +109 -0
- package/lib/Workspace.d.ts +32 -0
- package/lib/Workspace.js +78 -0
- package/lib/cli.d.ts +2 -0
- package/lib/cli.js +328 -0
- package/lib/commands/Implement.d.ts +64 -0
- package/lib/commands/Implement.js +696 -0
- package/lib/commands/Install.d.ts +20 -0
- package/lib/commands/Install.js +126 -0
- package/lib/contexts.d.ts +77 -0
- package/lib/contexts.js +3 -0
- package/lib/fsUtils.d.ts +5 -0
- package/lib/fsUtils.js +51 -0
- package/lib/index.d.ts +5 -0
- package/lib/index.js +6 -0
- package/lib/prompts.d.ts +18 -0
- package/lib/prompts.js +222 -0
- package/lib/skills.d.ts +3 -0
- package/lib/skills.js +207 -0
- package/lib/ui/BottomBlock.d.ts +70 -0
- package/lib/ui/BottomBlock.js +193 -0
- package/lib/ui/formatters.d.ts +29 -0
- package/lib/ui/formatters.js +222 -0
- package/lib/wait.d.ts +2 -0
- package/lib/wait.js +36 -0
- package/package.json +41 -0
package/lib/PlanFile.js
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PlanFile = void 0;
|
|
4
|
+
exports.parsePlan = parsePlan;
|
|
5
|
+
const TASK_LINE = /^(\s*[-*+]\s+)\[([ xX])\](\{[^}]*\})(\s.*)?$/;
|
|
6
|
+
const MALFORMED_TASK_LINE = /^\s*[-*+]\s+\[([^\]]*)\]/;
|
|
7
|
+
const HEADING_NUMBER = /^#{1,6}\s+(\d+(?:\.\d+)*)\b/;
|
|
8
|
+
function validateMetrics(jsonStr) {
|
|
9
|
+
let parsed;
|
|
10
|
+
try {
|
|
11
|
+
parsed = JSON.parse(jsonStr);
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
const keys = Object.keys(parsed);
|
|
20
|
+
if (keys.length !== 3 || !keys.includes("it") || !keys.includes("ot") || !keys.includes("t")) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
const obj = parsed;
|
|
24
|
+
for (const key of ["it", "ot", "t"]) {
|
|
25
|
+
const v = obj[key];
|
|
26
|
+
if (!Number.isInteger(v) || v < 0) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return { it: obj["it"], ot: obj["ot"], t: obj["t"] };
|
|
31
|
+
}
|
|
32
|
+
function validateMetricsInput(metrics) {
|
|
33
|
+
for (const key of ["it", "ot", "t"]) {
|
|
34
|
+
const v = metrics[key];
|
|
35
|
+
if (!Number.isInteger(v) || v < 0) {
|
|
36
|
+
throw new Error(`Invalid metric "${key}": ${v} (must be a non-negative integer)`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function parsePlan(content) {
|
|
41
|
+
const tasks = [];
|
|
42
|
+
const malformed = [];
|
|
43
|
+
const lines = content.split(/\r?\n/);
|
|
44
|
+
let currentNumber = "";
|
|
45
|
+
for (let i = 0; i < lines.length; i++) {
|
|
46
|
+
const raw = lines[i];
|
|
47
|
+
const headingMatch = HEADING_NUMBER.exec(raw);
|
|
48
|
+
if (headingMatch) {
|
|
49
|
+
currentNumber = headingMatch[1];
|
|
50
|
+
}
|
|
51
|
+
const match = TASK_LINE.exec(raw);
|
|
52
|
+
if (match) {
|
|
53
|
+
const checkbox = match[2];
|
|
54
|
+
if (checkbox !== " " && checkbox !== "x") {
|
|
55
|
+
malformed.push({ line: i + 1, raw });
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
const metricsStr = match[3];
|
|
59
|
+
const metrics = validateMetrics(metricsStr);
|
|
60
|
+
if (!metrics) {
|
|
61
|
+
malformed.push({ line: i + 1, raw });
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
const trailing = match[4] ?? "";
|
|
65
|
+
tasks.push({
|
|
66
|
+
line: i + 1,
|
|
67
|
+
raw,
|
|
68
|
+
title: trailing.trimStart(),
|
|
69
|
+
taskNumber: currentNumber,
|
|
70
|
+
done: checkbox === "x",
|
|
71
|
+
metrics
|
|
72
|
+
});
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
const malformedMatch = MALFORMED_TASK_LINE.exec(raw);
|
|
76
|
+
if (malformedMatch) {
|
|
77
|
+
malformed.push({ line: i + 1, raw });
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const trailingNewline = content.endsWith("\n");
|
|
81
|
+
const lineCount = trailingNewline ? lines.length - 1 : lines.length;
|
|
82
|
+
return {
|
|
83
|
+
tasks,
|
|
84
|
+
malformed,
|
|
85
|
+
lineCount,
|
|
86
|
+
size: content.length
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
class PlanFile {
|
|
90
|
+
path;
|
|
91
|
+
_content;
|
|
92
|
+
_fs;
|
|
93
|
+
constructor(path, _content, _fs) {
|
|
94
|
+
this.path = path;
|
|
95
|
+
this._content = _content;
|
|
96
|
+
this._fs = _fs;
|
|
97
|
+
}
|
|
98
|
+
static async load(path, fs) {
|
|
99
|
+
const content = await fs.readFile(path);
|
|
100
|
+
return new PlanFile(path, content, fs);
|
|
101
|
+
}
|
|
102
|
+
parse() {
|
|
103
|
+
return parsePlan(this._content);
|
|
104
|
+
}
|
|
105
|
+
nextOpenTask() {
|
|
106
|
+
for (const task of this.parse().tasks) {
|
|
107
|
+
if (!task.done) {
|
|
108
|
+
return task;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
async updateMetrics(lineNumber, metrics) {
|
|
114
|
+
return this._rewriteTaskLine(lineNumber, metrics, "none");
|
|
115
|
+
}
|
|
116
|
+
async markDone(lineNumber, metrics) {
|
|
117
|
+
return this._rewriteTaskLine(lineNumber, metrics, "done");
|
|
118
|
+
}
|
|
119
|
+
async markOpen(lineNumber, metrics) {
|
|
120
|
+
return this._rewriteTaskLine(lineNumber, metrics, "open");
|
|
121
|
+
}
|
|
122
|
+
planTotals() {
|
|
123
|
+
const { tasks } = parsePlan(this._content);
|
|
124
|
+
let it = 0, ot = 0, t = 0;
|
|
125
|
+
for (const task of tasks) {
|
|
126
|
+
it += task.metrics.it;
|
|
127
|
+
ot += task.metrics.ot;
|
|
128
|
+
t += task.metrics.t;
|
|
129
|
+
}
|
|
130
|
+
return { it, ot, t };
|
|
131
|
+
}
|
|
132
|
+
async _rewriteTaskLine(lineNumber, metrics, flip) {
|
|
133
|
+
validateMetricsInput(metrics);
|
|
134
|
+
const newlineMatch = /\r\n|\n/.exec(this._content);
|
|
135
|
+
const newline = newlineMatch ? newlineMatch[0] : "\n";
|
|
136
|
+
const lines = this._content.split(/\r?\n/);
|
|
137
|
+
const idx = lineNumber - 1;
|
|
138
|
+
const raw = lines[idx];
|
|
139
|
+
if (raw === undefined) {
|
|
140
|
+
throw new Error(`Plan line ${lineNumber} not found in ${this.path}`);
|
|
141
|
+
}
|
|
142
|
+
const match = TASK_LINE.exec(raw);
|
|
143
|
+
if (!match) {
|
|
144
|
+
throw new Error(`Plan line ${lineNumber} is not a task line: ${raw}`);
|
|
145
|
+
}
|
|
146
|
+
if (flip === "done" && match[2] !== " ") {
|
|
147
|
+
throw new Error(`Plan line ${lineNumber} is not an open task: ${raw}`);
|
|
148
|
+
}
|
|
149
|
+
if (flip === "open" && match[2] !== "x") {
|
|
150
|
+
throw new Error(`Plan line ${lineNumber} is not a done task: ${raw}`);
|
|
151
|
+
}
|
|
152
|
+
const metricsStr = `{"it":${metrics.it},"ot":${metrics.ot},"t":${metrics.t}}`;
|
|
153
|
+
if (flip === "done") {
|
|
154
|
+
lines[idx] = raw.replace(/\[ \]\{[^}]*\}/, `[x]${metricsStr}`);
|
|
155
|
+
}
|
|
156
|
+
else if (flip === "open") {
|
|
157
|
+
lines[idx] = raw.replace(/\[x\]\{[^}]*\}/, `[ ]${metricsStr}`);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
lines[idx] = raw.replace(/\{[^}]*\}/, metricsStr);
|
|
161
|
+
}
|
|
162
|
+
this._content = lines.join(newline);
|
|
163
|
+
await this._fs.writeFile(this.path, this._content);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
exports.PlanFile = PlanFile;
|
|
167
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGxhbkZpbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvUGxhbkZpbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBMERBLDhCQWdEQztBQXRGRCxNQUFNLFNBQVMsR0FBRyw4Q0FBOEMsQ0FBQztBQUNqRSxNQUFNLG1CQUFtQixHQUFHLDBCQUEwQixDQUFDO0FBQ3ZELE1BQU0sY0FBYyxHQUFHLDZCQUE2QixDQUFDO0FBRXJELFNBQVMsZUFBZSxDQUFDLE9BQWM7SUFDbkMsSUFBSSxNQUFjLENBQUM7SUFDbkIsSUFBSSxDQUFDO1FBQ0QsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNMLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUN6RSxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDM0YsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUNELE1BQU0sR0FBRyxHQUFHLE1BQWlDLENBQUM7SUFDOUMsS0FBSyxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFVLEVBQUUsQ0FBQztRQUMzQyxNQUFNLENBQUMsR0FBRyxHQUFH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
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ScriptContext, TimeContext } from "./contexts";
|
|
2
|
+
export type ScriptResult = Readonly<{
|
|
3
|
+
code: number | null;
|
|
4
|
+
stdout: string;
|
|
5
|
+
stderr: string;
|
|
6
|
+
}>;
|
|
7
|
+
export type ScriptRunOptions = Readonly<{
|
|
8
|
+
command: string;
|
|
9
|
+
args?: readonly string[];
|
|
10
|
+
cwd?: string;
|
|
11
|
+
onStdout?(chunk: string): void;
|
|
12
|
+
onStderr?(chunk: string): void;
|
|
13
|
+
}>;
|
|
14
|
+
export declare class ScriptRunner {
|
|
15
|
+
readonly options: ScriptRunOptions;
|
|
16
|
+
private _context;
|
|
17
|
+
private _time;
|
|
18
|
+
private _disposed;
|
|
19
|
+
private _process;
|
|
20
|
+
private _runPromise;
|
|
21
|
+
private _killTimer;
|
|
22
|
+
constructor(options: ScriptRunOptions, _context: ScriptContext, _time: TimeContext);
|
|
23
|
+
result(): Promise<ScriptResult>;
|
|
24
|
+
private _run;
|
|
25
|
+
dispose(): Promise<void>;
|
|
26
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ScriptRunner = void 0;
|
|
4
|
+
class ScriptRunner {
|
|
5
|
+
options;
|
|
6
|
+
_context;
|
|
7
|
+
_time;
|
|
8
|
+
_disposed = false;
|
|
9
|
+
_process = null;
|
|
10
|
+
_runPromise;
|
|
11
|
+
_killTimer = null;
|
|
12
|
+
constructor(options, _context, _time) {
|
|
13
|
+
this.options = options;
|
|
14
|
+
this._context = _context;
|
|
15
|
+
this._time = _time;
|
|
16
|
+
this._runPromise = this._run();
|
|
17
|
+
this._runPromise.catch(() => { });
|
|
18
|
+
}
|
|
19
|
+
result() {
|
|
20
|
+
return this._runPromise;
|
|
21
|
+
}
|
|
22
|
+
_run() {
|
|
23
|
+
return new Promise((resolve, reject) => {
|
|
24
|
+
if (this._disposed) {
|
|
25
|
+
return reject(new Error("ScriptRunner disposed"));
|
|
26
|
+
}
|
|
27
|
+
const proc = this._context.spawn(this.options.command, this.options.args ?? [], {
|
|
28
|
+
stdio: "pipe",
|
|
29
|
+
...(this.options.cwd ? { cwd: this.options.cwd } : null)
|
|
30
|
+
});
|
|
31
|
+
this._process = proc;
|
|
32
|
+
const stdoutChunks = [];
|
|
33
|
+
const stderrChunks = [];
|
|
34
|
+
proc.stdout?.on("data", chunk => {
|
|
35
|
+
const text = String(chunk);
|
|
36
|
+
stdoutChunks.push(text);
|
|
37
|
+
this.options.onStdout?.(text);
|
|
38
|
+
});
|
|
39
|
+
proc.stderr?.on("data", chunk => {
|
|
40
|
+
const text = String(chunk);
|
|
41
|
+
stderrChunks.push(text);
|
|
42
|
+
this.options.onStderr?.(text);
|
|
43
|
+
});
|
|
44
|
+
let settled = false;
|
|
45
|
+
const settle = (outcome) => {
|
|
46
|
+
if (settled) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
settled = true;
|
|
50
|
+
this._process = null;
|
|
51
|
+
if (outcome.ok) {
|
|
52
|
+
resolve(outcome.value);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
reject(outcome.error);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
proc.on("error", e => {
|
|
59
|
+
settle({ ok: false, error: e instanceof Error ? e : new Error(String(e)) });
|
|
60
|
+
});
|
|
61
|
+
proc.on("exit", code => {
|
|
62
|
+
if (this._disposed) {
|
|
63
|
+
settle({ ok: false, error: new Error("ScriptRunner disposed") });
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
settle({
|
|
67
|
+
ok: true,
|
|
68
|
+
value: {
|
|
69
|
+
code,
|
|
70
|
+
stdout: stdoutChunks.join(""),
|
|
71
|
+
stderr: stderrChunks.join("")
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
async dispose() {
|
|
78
|
+
if (this._disposed) {
|
|
79
|
+
try {
|
|
80
|
+
await this._runPromise;
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
}
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
this._disposed = true;
|
|
87
|
+
const proc = this._process;
|
|
88
|
+
if (proc) {
|
|
89
|
+
const exitWaiter = new Promise(resolve => {
|
|
90
|
+
proc.on("exit", () => resolve());
|
|
91
|
+
});
|
|
92
|
+
proc.kill("SIGINT");
|
|
93
|
+
this._killTimer = this._time.setTimeout(() => {
|
|
94
|
+
this._killTimer = null;
|
|
95
|
+
proc.kill("SIGTERM");
|
|
96
|
+
}, 5000);
|
|
97
|
+
await exitWaiter;
|
|
98
|
+
this._killTimer?.cancel();
|
|
99
|
+
this._killTimer = null;
|
|
100
|
+
}
|
|
101
|
+
try {
|
|
102
|
+
await this._runPromise;
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
exports.ScriptRunner = ScriptRunner;
|
|
109
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NyaXB0UnVubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1NjcmlwdFJ1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFnQkEsTUFBYSxZQUFZO0lBTVI7SUFDRDtJQUNBO0lBUEosU0FBUyxHQUFHLEtBQUssQ0FBQztJQUNsQixRQUFRLEdBQXVCLElBQUksQ0FBQztJQUNwQyxXQUFXLENBQXVCO0lBQ2xDLFVBQVUsR0FBc0IsSUFBSSxDQUFDO0lBQzdDLFlBQ2EsT0FBd0IsRUFDekIsUUFBc0IsRUFDdEIsS0FBaUI7UUFGaEIsWUFBTyxHQUFQLE9BQU8sQ0FBaUI7UUFDekIsYUFBUSxHQUFSLFFBQVEsQ0FBYztRQUN0QixVQUFLLEdBQUwsS0FBSyxDQUFZO1FBRXpCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRS9CLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFDRCxNQUFNO1FBQ0YsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzVCLENBQUM7SUFDTyxJQUFJO1FBQ1IsT0FBTyxJQUFJLE9BQU8sQ0FBZSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUVqRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDakIsT0FBTyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO1lBQ3RELENBQUM7WUFDRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxFQUFFLEVBQUU7Z0JBQzVFLEtBQUssRUFBRSxNQUFNO2dCQUNiLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FB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
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { FsContext } from "./contexts";
|
|
2
|
+
export type WorkspacePaths = Readonly<{
|
|
3
|
+
root: string;
|
|
4
|
+
buildScript: string;
|
|
5
|
+
testScript: string;
|
|
6
|
+
errorLog: string;
|
|
7
|
+
prepLog(taskIndex: number): string;
|
|
8
|
+
workerLog(iter: number): string;
|
|
9
|
+
buildLog(iter: number): string;
|
|
10
|
+
testLog(iter: number): string;
|
|
11
|
+
reviewerLog(iter: number): string;
|
|
12
|
+
}>;
|
|
13
|
+
export interface PlatformContext {
|
|
14
|
+
isWindows(): boolean;
|
|
15
|
+
tmpdir(): string;
|
|
16
|
+
homedir(): string;
|
|
17
|
+
}
|
|
18
|
+
export declare class Workspace {
|
|
19
|
+
private _fs;
|
|
20
|
+
private _platform;
|
|
21
|
+
private _disposed;
|
|
22
|
+
private _preserve;
|
|
23
|
+
private _root;
|
|
24
|
+
constructor(_fs: FsContext, _platform: PlatformContext);
|
|
25
|
+
preserveOnDispose(): void;
|
|
26
|
+
setup(): Promise<WorkspacePaths>;
|
|
27
|
+
paths(): WorkspacePaths;
|
|
28
|
+
private _paths;
|
|
29
|
+
writeErrorLog(content: string): Promise<void>;
|
|
30
|
+
clearErrorLog(): Promise<void>;
|
|
31
|
+
dispose(): Promise<void>;
|
|
32
|
+
}
|
package/lib/Workspace.js
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Workspace = void 0;
|
|
4
|
+
const fsUtils_1 = require("./fsUtils");
|
|
5
|
+
class Workspace {
|
|
6
|
+
_fs;
|
|
7
|
+
_platform;
|
|
8
|
+
_disposed = false;
|
|
9
|
+
_preserve = false;
|
|
10
|
+
_root = null;
|
|
11
|
+
constructor(_fs, _platform) {
|
|
12
|
+
this._fs = _fs;
|
|
13
|
+
this._platform = _platform;
|
|
14
|
+
}
|
|
15
|
+
preserveOnDispose() {
|
|
16
|
+
if (this._disposed)
|
|
17
|
+
return;
|
|
18
|
+
this._preserve = true;
|
|
19
|
+
}
|
|
20
|
+
async setup() {
|
|
21
|
+
if (this._disposed) {
|
|
22
|
+
throw new Error("Workspace disposed");
|
|
23
|
+
}
|
|
24
|
+
if (this._root) {
|
|
25
|
+
throw new Error("Workspace already set up");
|
|
26
|
+
}
|
|
27
|
+
const prefix = (0, fsUtils_1.joinPath)(this._platform.tmpdir(), "flanders-");
|
|
28
|
+
this._root = await this._fs.mkdtemp(prefix);
|
|
29
|
+
return this._paths(this._root);
|
|
30
|
+
}
|
|
31
|
+
paths() {
|
|
32
|
+
if (!this._root) {
|
|
33
|
+
throw new Error("Workspace not set up");
|
|
34
|
+
}
|
|
35
|
+
return this._paths(this._root);
|
|
36
|
+
}
|
|
37
|
+
_paths(root) {
|
|
38
|
+
const isWindows = this._platform.isWindows();
|
|
39
|
+
return {
|
|
40
|
+
root,
|
|
41
|
+
buildScript: (0, fsUtils_1.joinPath)(root, isWindows ? "build.bat" : "build.sh"),
|
|
42
|
+
testScript: (0, fsUtils_1.joinPath)(root, isWindows ? "test.bat" : "test.sh"),
|
|
43
|
+
errorLog: (0, fsUtils_1.joinPath)(root, "error.log"),
|
|
44
|
+
prepLog(taskIndex) { return (0, fsUtils_1.joinPath)(root, `prep.${taskIndex}.log`); },
|
|
45
|
+
workerLog(iter) { return (0, fsUtils_1.joinPath)(root, `worker.${iter}.log`); },
|
|
46
|
+
buildLog(iter) { return (0, fsUtils_1.joinPath)(root, `build.${iter}.log`); },
|
|
47
|
+
testLog(iter) { return (0, fsUtils_1.joinPath)(root, `test.${iter}.log`); },
|
|
48
|
+
reviewerLog(iter) { return (0, fsUtils_1.joinPath)(root, `reviewer.${iter}.log`); }
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
async writeErrorLog(content) {
|
|
52
|
+
const paths = this.paths();
|
|
53
|
+
await this._fs.writeFile(paths.errorLog, content);
|
|
54
|
+
}
|
|
55
|
+
async clearErrorLog() {
|
|
56
|
+
const paths = this.paths();
|
|
57
|
+
if (await this._fs.exists(paths.errorLog)) {
|
|
58
|
+
await this._fs.rm(paths.errorLog, { force: true });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async dispose() {
|
|
62
|
+
if (this._disposed) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
this._disposed = true;
|
|
66
|
+
const root = this._root;
|
|
67
|
+
this._root = null;
|
|
68
|
+
if (root && !this._preserve) {
|
|
69
|
+
try {
|
|
70
|
+
await this._fs.rm(root, { recursive: true, force: true });
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
exports.Workspace = Workspace;
|
|
78
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV29ya3NwYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1dvcmtzcGFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSx1Q0FBcUM7QUFvQnJDLE1BQWEsU0FBUztJQUtOO0lBQ0E7SUFMSixTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDbEIsS0FBSyxHQUFlLElBQUksQ0FBQztJQUNqQyxZQUNZLEdBQWEsRUFDYixTQUF5QjtRQUR6QixRQUFHLEdBQUgsR0FBRyxDQUFVO1FBQ2IsY0FBUyxHQUFULFNBQVMsQ0FBZ0I7SUFDbEMsQ0FBQztJQUNKLGlCQUFpQjtRQUNiLElBQUksSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPO1FBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQzFCLENBQUM7SUFDRCxLQUFLLENBQUMsS0FBSztRQUNQLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUMxQyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDYixNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDaEQsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLElBQUEsa0JBQVEsRUFBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1QyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFDRCxLQUFLO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBQ08sTUFBTSxDQUFDLElBQVc7UUFDdEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM3QyxPQUFPO1lBQ0gsSUFBSTtZQUNKLFdBQVcsRUFBRSxJQUFBLGtCQUFRLEVBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7WUFDakUsVUFBVSxFQUFFLElBQUEsa0JBQVEsRUFBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUM5RCxRQUFRLEVBQUUsSUFBQSxrQkFBUSxFQUFDLElBQUksRUFBRSxXQUFXLENBQUM7WUFDckMsT0FBTyxDQUFDLFNBQWdCLElBQUksT0FBTyxJQUFBLGtCQUFRLEVBQUMsSUFBSSxFQUFFLFFBQVEsU0FBUyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0UsU0FBUyxDQUFDLElBQVcsSUFBSSxPQUFPLElBQUEsa0JBQVEsRUFBQyxJQUFJLEVBQUUsVUFBVSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2RSxRQUFRLENBQUMsSUFBVyxJQUFJLE9BQU8sSUFBQSxrQkFBUSxFQUFDLElBQUksRUFBRSxTQUFTLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JFLE9BQU8sQ0FBQyxJQUFXLElBQUksT0FBTyxJQUFBLGtCQUFRLEVBQUMsSUFBSSxFQUFFLFFBQVEsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkUsV0FBVyxDQUFDLElBQVcsSUFBSSxPQUFPLElBQUEsa0JBQVEsRUFBQyxJQUFJLEVBQUUsWUFBWSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM5RSxDQUFDO0lBQ04sQ0FBQztJQUNELEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBYztRQUM5QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDM0IsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFDRCxLQUFLLENBQUMsYUFBYTtRQUNmLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMzQixJQUFJLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDeEMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdkQsQ0FBQztJQUNMLENBQUM7SUFDRCxLQUFLLENBQUMsT0FBTztRQUNULElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2pCLE9BQU87UUFDWCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNsQixJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUM7Z0JBQ0QsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzlELENBQUM7WUFBQyxNQUFNLENBQUM7WUFFVCxDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7Q0FDSjtBQXBFRCw4QkFvRUMifQ==
|
package/lib/cli.d.ts
ADDED