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/cli.js
ADDED
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
const child_process_1 = require("child_process");
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const fs_1 = require("fs");
|
|
40
|
+
const os = __importStar(require("os"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const readline = __importStar(require("readline"));
|
|
43
|
+
const Flanders_1 = require("./Flanders");
|
|
44
|
+
const spawnContext = {
|
|
45
|
+
spawn(command, args, options) {
|
|
46
|
+
const child = (0, child_process_1.spawn)(command, [...args], options);
|
|
47
|
+
const proc = {
|
|
48
|
+
on(event, listener) {
|
|
49
|
+
child.on(event, listener);
|
|
50
|
+
},
|
|
51
|
+
kill(signal) {
|
|
52
|
+
child.kill(signal);
|
|
53
|
+
},
|
|
54
|
+
stdout: child.stdout ? {
|
|
55
|
+
on(event, listener) {
|
|
56
|
+
child.stdout.on(event, listener);
|
|
57
|
+
}
|
|
58
|
+
} : undefined,
|
|
59
|
+
stderr: child.stderr ? {
|
|
60
|
+
on(event, listener) {
|
|
61
|
+
child.stderr.on(event, listener);
|
|
62
|
+
}
|
|
63
|
+
} : undefined,
|
|
64
|
+
stdin: child.stdin ? {
|
|
65
|
+
write(chunk) {
|
|
66
|
+
child.stdin.write(chunk);
|
|
67
|
+
},
|
|
68
|
+
end() {
|
|
69
|
+
child.stdin.end();
|
|
70
|
+
}
|
|
71
|
+
} : undefined
|
|
72
|
+
};
|
|
73
|
+
return proc;
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
const fsContext = {
|
|
77
|
+
async readFile(p) {
|
|
78
|
+
return await fs_1.promises.readFile(p, "utf8");
|
|
79
|
+
},
|
|
80
|
+
async writeFile(p, content) {
|
|
81
|
+
await fs_1.promises.mkdir(path.dirname(p), { recursive: true });
|
|
82
|
+
await fs_1.promises.writeFile(p, content, "utf8");
|
|
83
|
+
},
|
|
84
|
+
async readdir(p) {
|
|
85
|
+
const entries = await fs_1.promises.readdir(p, { withFileTypes: true });
|
|
86
|
+
return entries.map(e => ({
|
|
87
|
+
name: e.name,
|
|
88
|
+
isFile: e.isFile(),
|
|
89
|
+
isDirectory: e.isDirectory()
|
|
90
|
+
}));
|
|
91
|
+
},
|
|
92
|
+
async stat(p) {
|
|
93
|
+
const s = await fs_1.promises.stat(p);
|
|
94
|
+
return {
|
|
95
|
+
size: s.size,
|
|
96
|
+
isFile: s.isFile(),
|
|
97
|
+
isDirectory: s.isDirectory()
|
|
98
|
+
};
|
|
99
|
+
},
|
|
100
|
+
async exists(p) {
|
|
101
|
+
try {
|
|
102
|
+
await fs_1.promises.access(p, fs.constants.F_OK);
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
async mkdir(p, options) {
|
|
110
|
+
await fs_1.promises.mkdir(p, { recursive: !!options?.recursive });
|
|
111
|
+
},
|
|
112
|
+
async mkdtemp(prefix) {
|
|
113
|
+
return await fs_1.promises.mkdtemp(prefix);
|
|
114
|
+
},
|
|
115
|
+
async rm(p, options) {
|
|
116
|
+
await fs_1.promises.rm(p, {
|
|
117
|
+
recursive: !!options?.recursive,
|
|
118
|
+
force: !!options?.force
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
const timeContext = {
|
|
123
|
+
now() {
|
|
124
|
+
return Date.now();
|
|
125
|
+
},
|
|
126
|
+
setTimeout(handler, ms) {
|
|
127
|
+
const id = setTimeout(handler, ms);
|
|
128
|
+
return {
|
|
129
|
+
cancel() {
|
|
130
|
+
clearTimeout(id);
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
const outputContext = {
|
|
136
|
+
write(text) {
|
|
137
|
+
process.stdout.write(text);
|
|
138
|
+
},
|
|
139
|
+
writeError(text) {
|
|
140
|
+
process.stderr.write(text);
|
|
141
|
+
},
|
|
142
|
+
columns() {
|
|
143
|
+
return process.stdout.columns || 80;
|
|
144
|
+
},
|
|
145
|
+
rows() {
|
|
146
|
+
return process.stdout.rows || 24;
|
|
147
|
+
},
|
|
148
|
+
onResize(listener) {
|
|
149
|
+
process.stdout.on("resize", listener);
|
|
150
|
+
return () => { process.stdout.off("resize", listener); };
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
const platformContext = {
|
|
154
|
+
isWindows() {
|
|
155
|
+
return os.platform() === "win32";
|
|
156
|
+
},
|
|
157
|
+
tmpdir() {
|
|
158
|
+
return os.tmpdir();
|
|
159
|
+
},
|
|
160
|
+
homedir() {
|
|
161
|
+
return os.homedir();
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
const ask = (() => {
|
|
165
|
+
let rl = null;
|
|
166
|
+
const ensure = () => {
|
|
167
|
+
if (!rl) {
|
|
168
|
+
rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
169
|
+
}
|
|
170
|
+
return rl;
|
|
171
|
+
};
|
|
172
|
+
const readLine = (prompt) => new Promise(resolve => {
|
|
173
|
+
ensure().question(prompt, answer => resolve(answer));
|
|
174
|
+
});
|
|
175
|
+
const parseAnswer = (raw, max, multi) => {
|
|
176
|
+
const trimmed = raw.trim();
|
|
177
|
+
if (!trimmed) {
|
|
178
|
+
return null;
|
|
179
|
+
}
|
|
180
|
+
if (/^\d/.test(trimmed)) {
|
|
181
|
+
const re = multi
|
|
182
|
+
? /^(\d+(?:\s*,\s*\d+)*)\s*(.*)$/s
|
|
183
|
+
: /^(\d+)\s*(.*)$/s;
|
|
184
|
+
const match = re.exec(trimmed);
|
|
185
|
+
if (match) {
|
|
186
|
+
const numberPart = match[1];
|
|
187
|
+
const extraPart = (match[2] ?? "").trim();
|
|
188
|
+
const picks = [];
|
|
189
|
+
let ok = true;
|
|
190
|
+
for (const token of numberPart.split(/\s*,\s*/)) {
|
|
191
|
+
const n = Number.parseInt(token, 10);
|
|
192
|
+
if (!Number.isFinite(n) || n < 1 || n > max) {
|
|
193
|
+
ok = false;
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
if (!picks.includes(n)) {
|
|
197
|
+
picks.push(n);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
if (ok && picks.length > 0) {
|
|
201
|
+
return extraPart ? { picks, extra: extraPart } : { picks };
|
|
202
|
+
}
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
return { picks: [], extra: trimmed };
|
|
208
|
+
};
|
|
209
|
+
const renderQuestion = (q, idx, total, existing, out) => {
|
|
210
|
+
const counter = total > 1 ? `(${idx + 1}/${total}) ` : "";
|
|
211
|
+
out.write(`\n[?] ${counter}${q.header}${q.header ? ": " : ""}${q.question}\n`);
|
|
212
|
+
const pickedLabels = new Set((existing?.picked ?? []).map(p => p.label));
|
|
213
|
+
for (let i = 0; i < q.options.length; i++) {
|
|
214
|
+
const o = q.options[i];
|
|
215
|
+
const marker = pickedLabels.has(o.label) ? "*" : " ";
|
|
216
|
+
out.write(` ${marker} ${i + 1}) ${o.label}${o.description ? ` — ${o.description}` : ""}\n`);
|
|
217
|
+
}
|
|
218
|
+
if (existing) {
|
|
219
|
+
const labels = existing.picked.map(p => p.label).join(", ");
|
|
220
|
+
const summary = labels && existing.extra
|
|
221
|
+
? `${labels}: ${existing.extra}`
|
|
222
|
+
: labels || existing.extra || "(empty)";
|
|
223
|
+
out.write(` current: ${summary}\n`);
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
const context = {
|
|
227
|
+
async askChoices(questions, output) {
|
|
228
|
+
const out = output ?? outputContext;
|
|
229
|
+
const total = questions.length;
|
|
230
|
+
const answers = new Array(total).fill(undefined);
|
|
231
|
+
let idx = 0;
|
|
232
|
+
while (idx < total) {
|
|
233
|
+
const q = questions[idx];
|
|
234
|
+
const existing = answers[idx];
|
|
235
|
+
renderQuestion(q, idx, total, existing, out);
|
|
236
|
+
const hints = [];
|
|
237
|
+
hints.push(q.multiSelect
|
|
238
|
+
? `[1-${q.options.length}, comma-separated; free-text OK]`
|
|
239
|
+
: `[1-${q.options.length}; free-text OK]`);
|
|
240
|
+
if (idx > 0) {
|
|
241
|
+
hints.push("'-' back");
|
|
242
|
+
}
|
|
243
|
+
if (existing !== undefined && idx + 1 < total) {
|
|
244
|
+
hints.push("'+' next");
|
|
245
|
+
}
|
|
246
|
+
const promptText = `Pick ${hints.join(", ")}: `;
|
|
247
|
+
const raw = await readLine(promptText);
|
|
248
|
+
const trimmed = raw.trim();
|
|
249
|
+
if (trimmed === "-") {
|
|
250
|
+
if (idx > 0) {
|
|
251
|
+
idx--;
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
out.writeError("Already at the first question.\n");
|
|
255
|
+
}
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
if (trimmed === "+") {
|
|
259
|
+
if (existing === undefined) {
|
|
260
|
+
out.writeError("Answer this question first, then use '+' to move on.\n");
|
|
261
|
+
}
|
|
262
|
+
else if (idx + 1 < total) {
|
|
263
|
+
idx++;
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
out.writeError("Already at the last question — submit it to finish.\n");
|
|
267
|
+
}
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
const parsed = parseAnswer(raw, q.options.length, q.multiSelect);
|
|
271
|
+
if (!parsed) {
|
|
272
|
+
out.writeError("Invalid input. Pick a valid option number, type free-form text, or use '-' / '+' to navigate.\n");
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
const picked = parsed.picks.map(i => q.options[i - 1]);
|
|
276
|
+
answers[idx] = parsed.extra ? { picked, extra: parsed.extra } : { picked };
|
|
277
|
+
idx++;
|
|
278
|
+
}
|
|
279
|
+
return answers;
|
|
280
|
+
},
|
|
281
|
+
async askText(prompt) {
|
|
282
|
+
return await readLine(prompt);
|
|
283
|
+
}
|
|
284
|
+
};
|
|
285
|
+
const close = () => {
|
|
286
|
+
if (rl) {
|
|
287
|
+
rl.close();
|
|
288
|
+
rl = null;
|
|
289
|
+
}
|
|
290
|
+
};
|
|
291
|
+
return { context, close };
|
|
292
|
+
})();
|
|
293
|
+
const flanders = new Flanders_1.Flanders(process.argv.slice(2), { projectRoot: process.cwd() }, {
|
|
294
|
+
claude: spawnContext,
|
|
295
|
+
script: spawnContext,
|
|
296
|
+
fs: fsContext,
|
|
297
|
+
time: timeContext,
|
|
298
|
+
platform: platformContext,
|
|
299
|
+
ask: ask.context,
|
|
300
|
+
output: outputContext
|
|
301
|
+
});
|
|
302
|
+
let ended = false;
|
|
303
|
+
const end = async () => {
|
|
304
|
+
if (ended) {
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
ended = true;
|
|
308
|
+
outputContext.write("Shutting down...\n");
|
|
309
|
+
try {
|
|
310
|
+
await flanders.dispose();
|
|
311
|
+
}
|
|
312
|
+
catch (e) {
|
|
313
|
+
outputContext.writeError(`${e instanceof Error ? e.stack ?? e.message : String(e)}\n`);
|
|
314
|
+
}
|
|
315
|
+
ask.close();
|
|
316
|
+
};
|
|
317
|
+
process.on("SIGINT", () => { process.exitCode = 130; end().catch(() => { }); });
|
|
318
|
+
process.on("SIGTERM", () => { process.exitCode = 143; end().catch(() => { }); });
|
|
319
|
+
process.on("SIGHUP", () => { process.exitCode = 129; end().catch(() => { }); });
|
|
320
|
+
flanders.result().then(code => {
|
|
321
|
+
process.exitCode = code;
|
|
322
|
+
end().catch(() => { });
|
|
323
|
+
}, err => {
|
|
324
|
+
outputContext.writeError(`${err instanceof Error ? err.stack ?? err.message : String(err)}\n`);
|
|
325
|
+
process.exitCode = 1;
|
|
326
|
+
end().catch(() => { });
|
|
327
|
+
});
|
|
328
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxpREFBc0M7QUFDdEMsdUNBQXlCO0FBQ3pCLDJCQUFxQztBQUNyQyx1Q0FBeUI7QUFDekIsMkNBQTZCO0FBQzdCLG1EQUFxQztBQWdCckMseUNBQXNDO0FBR3RDLE1BQU0sWUFBWSxHQUFHO0lBQ2pCLEtBQUssQ0FBQyxPQUFjLEVBQUUsSUFBc0IsRUFBRSxPQUFPO1FBQ2pELE1BQU0sS0FBSyxHQUFHLElBQUEscUJBQUssRUFBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2pELE1BQU0sSUFBSSxHQUFrQjtZQUN4QixFQUFFLENBQUMsS0FBSyxFQUFFLFFBQVE7Z0JBQ2QsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsUUFBb0MsQ0FBQyxDQUFDO1lBQzFELENBQUM7WUFDRCxJQUFJLENBQUMsTUFBTTtnQkFDUCxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZCLENBQUM7WUFDRCxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ25CLEVBQUUsQ0FBQyxLQUFLLEVBQUUsUUFBUTtvQkFDZCxLQUFLLENBQUMsTUFBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ3RDLENBQUM7YUFDSixDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQ2IsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNuQixFQUFFLENBQUMsS0FBSyxFQUFFLFFBQVE7b0JBQ2QsS0FBSyxDQUFDLE1BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUN0QyxDQUFDO2FBQ0osQ0FBQyxDQUFD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
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { AskContext, ClaudeContext, FsContext, OutputContext, ScriptContext, TimeContext } from "../contexts";
|
|
2
|
+
import type { Activity } from "../ui/BottomBlock";
|
|
3
|
+
import { PlatformContext } from "../Workspace";
|
|
4
|
+
export type { Activity };
|
|
5
|
+
export type ImplementContexts = Readonly<{
|
|
6
|
+
claude: ClaudeContext;
|
|
7
|
+
script: ScriptContext;
|
|
8
|
+
fs: FsContext;
|
|
9
|
+
time: TimeContext;
|
|
10
|
+
platform: PlatformContext;
|
|
11
|
+
ask: AskContext;
|
|
12
|
+
output: OutputContext;
|
|
13
|
+
}>;
|
|
14
|
+
export type ImplementOptions = Readonly<{
|
|
15
|
+
projectRoot: string;
|
|
16
|
+
}>;
|
|
17
|
+
export declare class Implement {
|
|
18
|
+
private _options;
|
|
19
|
+
private _contexts;
|
|
20
|
+
private _disposed;
|
|
21
|
+
private _contractList;
|
|
22
|
+
private _ruleList;
|
|
23
|
+
private _workspace;
|
|
24
|
+
private _block;
|
|
25
|
+
private _buffered;
|
|
26
|
+
private _currentWorkerSessionId;
|
|
27
|
+
private _currentPrepSessionId;
|
|
28
|
+
private _activeSession;
|
|
29
|
+
private _activeScript;
|
|
30
|
+
private _currentIndexLabel;
|
|
31
|
+
private _currentIteration;
|
|
32
|
+
private _currentTask;
|
|
33
|
+
private _taskStartedAt;
|
|
34
|
+
private _taskRateLimitMs;
|
|
35
|
+
private _taskRateLimitStartedAt;
|
|
36
|
+
private _taskTokens;
|
|
37
|
+
private _runPromise;
|
|
38
|
+
constructor(rawArgs: readonly string[], _options: ImplementOptions, _contexts: ImplementContexts);
|
|
39
|
+
result(): Promise<number>;
|
|
40
|
+
private _run;
|
|
41
|
+
private _selectPlan;
|
|
42
|
+
private _askOutput;
|
|
43
|
+
private _promptPlanChoice;
|
|
44
|
+
private _detectBuildAndTest;
|
|
45
|
+
private _setActivity;
|
|
46
|
+
private _activeSeconds;
|
|
47
|
+
private _persistMetrics;
|
|
48
|
+
private _updateMetrics;
|
|
49
|
+
private _runTask;
|
|
50
|
+
private _prepStage;
|
|
51
|
+
private _workerStage;
|
|
52
|
+
private _buildStage;
|
|
53
|
+
private _testStage;
|
|
54
|
+
private _reviewerStage;
|
|
55
|
+
private _parseReviewVerdict;
|
|
56
|
+
private _formatPathList;
|
|
57
|
+
private _runClaude;
|
|
58
|
+
private _runScript;
|
|
59
|
+
private _writeLog;
|
|
60
|
+
private _writeErrorLog;
|
|
61
|
+
private _stringifyError;
|
|
62
|
+
private _finalizeBlock;
|
|
63
|
+
dispose(): Promise<void>;
|
|
64
|
+
}
|