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.
@@ -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
+ }
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV29ya3NwYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1dvcmtzcGFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSx1Q0FBcUM7QUFvQnJDLE1BQWEsU0FBUztJQUtOO0lBQ0E7SUFMSixTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDbEIsS0FBSyxHQUFlLElBQUksQ0FBQztJQUNqQyxZQUNZLEdBQWEsRUFDYixTQUF5QjtRQUR6QixRQUFHLEdBQUgsR0FBRyxDQUFVO1FBQ2IsY0FBUyxHQUFULFNBQVMsQ0FBZ0I7SUFDbEMsQ0FBQztJQUNKLGlCQUFpQjtRQUNiLElBQUksSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPO1FBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQzFCLENBQUM7SUFDRCxLQUFLLENBQUMsS0FBSztRQUNQLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUMxQyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDYixNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDaEQsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLElBQUEsa0JBQVEsRUFBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1QyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFDRCxLQUFLO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNkLE1BQU0sSUFB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
package/lib/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};