@dougharness/cli 1.2.0 → 1.4.0
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/dist/bin.js +13 -4
- package/dist/bin.js.map +1 -1
- package/dist/board-page.d.ts +5 -1
- package/dist/board-page.js +19 -5
- package/dist/board-page.js.map +1 -1
- package/dist/board-serve.js +34 -10
- package/dist/board-serve.js.map +1 -1
- package/dist/board.d.ts +1 -1
- package/dist/board.js +160 -13
- package/dist/board.js.map +1 -1
- package/node_modules/@dougharness/flow/.claude-plugin/plugin.json +1 -1
- package/node_modules/@dougharness/flow/agents/implementer.md +1 -1
- package/node_modules/@dougharness/flow/agents/planner.md +1 -1
- package/node_modules/@dougharness/flow/agents/researcher.md +2 -1
- package/node_modules/@dougharness/flow/agents/reviewer.md +3 -1
- package/node_modules/@dougharness/flow/hooks/register.tsx +67 -32
- package/node_modules/@dougharness/flow/lib/autopilot-core.mjs +94 -7
- package/node_modules/@dougharness/flow/lib/autopilot-view.mjs +31 -4
- package/node_modules/@dougharness/flow/lib/board.mjs +366 -21
- package/node_modules/@dougharness/flow/lib/card-loop.mjs +229 -23
- package/node_modules/@dougharness/flow/lib/coordinator.mjs +25 -0
- package/node_modules/@dougharness/flow/lib/cost.mjs +9 -0
- package/node_modules/@dougharness/flow/lib/decisions.mjs +4 -2
- package/node_modules/@dougharness/flow/lib/memory.mjs +382 -65
- package/node_modules/@dougharness/flow/lib/plan.mjs +1 -1
- package/node_modules/@dougharness/flow/package.json +1 -1
- package/node_modules/@dougharness/flow/scripts/autopilot.mjs +228 -14
- package/node_modules/@dougharness/flow/scripts/board.mjs +122 -13
- package/node_modules/@dougharness/flow/scripts/cost.mjs +6 -3
- package/node_modules/@dougharness/flow/scripts/memory.mjs +27 -8
- package/node_modules/@dougharness/flow/scripts/plan.mjs +5 -1
- package/node_modules/@dougharness/flow/scripts/session-recall.mjs +11 -4
- package/node_modules/@dougharness/flow/skills/doug-hand/SKILL.md +1 -1
- package/node_modules/@dougharness/flow/skills/doug-next/SKILL.md +9 -2
- package/node_modules/@dougharness/flow/skills/research/SKILL.md +2 -2
- package/node_modules/@dougharness/flow/skills/run-report/SKILL.md +2 -2
- package/node_modules/@dougharness/flow/workflows/card-queen.js +238 -25
- package/node_modules/@dougharness/flow/workflows/doug-implement.js +77 -34
- package/node_modules/@dougharness/gates/.claude-plugin/plugin.json +1 -1
- package/node_modules/@dougharness/gates/lib/baseline.mjs +23 -0
- package/node_modules/@dougharness/gates/lib/block-ledger.mjs +41 -3
- package/node_modules/@dougharness/gates/lib/docs-gate.mjs +6 -2
- package/node_modules/@dougharness/gates/package.json +1 -1
- package/node_modules/@dougharness/gates/scripts/research-cap.mjs +119 -15
- package/node_modules/@dougharness/gates/scripts/stop-gate.mjs +107 -20
- package/package.json +3 -3
- package/templates/board-app.js +240 -30
package/dist/bin.js
CHANGED
|
@@ -12,12 +12,21 @@ Usage:
|
|
|
12
12
|
doug init [dir] [--yes] [--dry-run] [--no-color] [--show-hooks] [--quiet]
|
|
13
13
|
doug detect [dir] Print what would be detected, as JSON.
|
|
14
14
|
doug board init [dir]
|
|
15
|
-
doug board add <id> --title <t> --goal <g> [--component <c>] [--size S|M|L] [--track flow|hand] [--class <c>] [--deps a,b] [--tag a,b] [--column <col>] [dir]
|
|
16
|
-
doug board list [dir] [--column <id>] [--tag <t>] [--json]
|
|
17
|
-
doug board next [dir] [--track flow|hand] [--batch <n>] [--tag <t>]
|
|
15
|
+
doug board add <id> --title <t> --goal <g> [--component <c>] [--size S|M|L] [--track flow|hand] [--class <c>] [--deps a,b] [--tag a,b] [--epic <id>] [--milestone <id>] [--column <col>] [dir]
|
|
16
|
+
doug board list [dir] [--column <id>] [--tag <t>] [--epic <id>] [--milestone <id>] [--json]
|
|
17
|
+
doug board next [dir] [--track flow|hand] [--batch <n>] [--tag <t>] [--epic <id>] [--milestone <id>]
|
|
18
18
|
doug board reorder <id> [dir] --before <other> | --after <other> | --top | --bottom
|
|
19
19
|
doug board move <id> <column> [dir] [--source <text>]
|
|
20
|
-
doug board edit <id> [dir] [--title <t>] [--goal <g> | --goal-file <path>] [--size S|M|L] [--component <c>] [--track flow|hand] [--class <c>] [--deps a,b] [--tag a,b] [--source <s>] [--force]
|
|
20
|
+
doug board edit <id> [dir] [--title <t>] [--goal <g> | --goal-file <path>] [--size S|M|L] [--component <c>] [--track flow|hand] [--class <c>] [--deps a,b] [--tag a,b] [--source <s>] [--epic <id>] [--milestone <id>] [--force]
|
|
21
|
+
doug board epic add <id> --title <t> --goal <g> [dir] [--version <v>] [--date YYYY-MM-DD]
|
|
22
|
+
doug board epic edit <id> [dir] [--title <t>] [--goal <g>] [--version <v>] [--date YYYY-MM-DD] [--status planned|active|done] [--force]
|
|
23
|
+
doug board epic list [dir] [--json]
|
|
24
|
+
doug board milestone add <id> --title <t> --goal <g> [dir] [--version <v>] [--date YYYY-MM-DD]
|
|
25
|
+
doug board milestone edit <id> [dir] [--title <t>] [--goal <g>] [--version <v>] [--date YYYY-MM-DD] [--status planned|active|done] [--force]
|
|
26
|
+
doug board milestone list [dir] [--json]
|
|
27
|
+
doug board labels init [dir]
|
|
28
|
+
doug board labels --check [dir]
|
|
29
|
+
doug board rollup [dir] [--epic <id> | --milestone <id>] [--from <live-runs>]
|
|
21
30
|
doug board remove <id> [dir] [--force]
|
|
22
31
|
doug board record <id> <report.json> [dir] --summary "<one sentence>" [--cost <usd>] [--codex-cost <usd>] [--shared-cost <usd>] [--wall <text>] [--commit <sha>] [--adversary "<id>=<class>[: <reason>]"]...
|
|
23
32
|
doug board record <id> --hand [dir] --summary "<one sentence>" [--commit <sha>] [--wall <text>] [--gate <text>] [--note <text>]
|
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,MAAM,IAAI,GAAG
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
|
package/dist/board-page.d.ts
CHANGED
|
@@ -1,15 +1,19 @@
|
|
|
1
|
-
import { type Board } from "@dougharness/flow/lib/board.mjs";
|
|
1
|
+
import { type Board, type Rollup } from "@dougharness/flow/lib/board.mjs";
|
|
2
2
|
export type BoardPageMode = "local";
|
|
3
3
|
export interface BoardPageConfig {
|
|
4
4
|
mode: BoardPageMode;
|
|
5
5
|
record: string;
|
|
6
6
|
}
|
|
7
|
+
export declare function liveRunsText(dir: string): string | null;
|
|
8
|
+
export declare function boardRollup(dir: string, board: Board): Rollup;
|
|
7
9
|
export declare function renderBoardPage(board: Board, opts: {
|
|
8
10
|
mode: BoardPageMode;
|
|
9
11
|
record: string;
|
|
12
|
+
rollup?: Rollup;
|
|
10
13
|
}): string;
|
|
11
14
|
export declare function buildBoardPage(dir: string): {
|
|
12
15
|
html: string;
|
|
13
16
|
board: Board;
|
|
14
17
|
record: string;
|
|
18
|
+
rollup: Rollup;
|
|
15
19
|
};
|
package/dist/board-page.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// Renders the board page from the board record. The page's own source is templates/board-app.js;
|
|
2
2
|
// a move is written by `doug board serve`.
|
|
3
|
-
import { readFileSync } from "node:fs";
|
|
4
|
-
import { relative } from "node:path";
|
|
5
|
-
import { boardPath, loadBoard } from "@dougharness/flow/lib/board.mjs";
|
|
3
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
4
|
+
import { join, relative } from "node:path";
|
|
5
|
+
import { LIVE_RUNS_RELPATH, boardPath, loadBoard, rollup } from "@dougharness/flow/lib/board.mjs";
|
|
6
6
|
// The template is a classic script: it is embedded in the page verbatim and evaluated here for its
|
|
7
7
|
// renderDoc. A literal closing script tag in it would cut the page's own <script id="app"> short.
|
|
8
8
|
function templateSource() {
|
|
@@ -12,16 +12,30 @@ function templateSource() {
|
|
|
12
12
|
}
|
|
13
13
|
return source;
|
|
14
14
|
}
|
|
15
|
+
// The text of docs/live-runs.md, or null when it is absent or unreadable. Never throws.
|
|
16
|
+
export function liveRunsText(dir) {
|
|
17
|
+
try {
|
|
18
|
+
const file = join(dir, LIVE_RUNS_RELPATH);
|
|
19
|
+
return existsSync(file) ? readFileSync(file, "utf8") : null;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export function boardRollup(dir, board) {
|
|
26
|
+
return rollup(board, liveRunsText(dir));
|
|
27
|
+
}
|
|
15
28
|
export function renderBoardPage(board, opts) {
|
|
16
29
|
const source = templateSource();
|
|
17
30
|
const renderDoc = new Function(source + "\nreturn renderDoc;")();
|
|
18
31
|
const appSource = source + "\napp();\n";
|
|
19
|
-
return renderDoc(board, appSource, { mode: opts.mode, record: opts.record });
|
|
32
|
+
return renderDoc(board, appSource, { mode: opts.mode, record: opts.record }, opts.rollup ?? rollup(board, null));
|
|
20
33
|
}
|
|
21
34
|
// The complete document: what `doug board serve` and `doug board build` both send.
|
|
22
35
|
export function buildBoardPage(dir) {
|
|
23
36
|
const board = loadBoard(dir);
|
|
24
37
|
const record = relative(dir, boardPath(dir));
|
|
25
|
-
|
|
38
|
+
const roll = boardRollup(dir, board);
|
|
39
|
+
return { html: renderBoardPage(board, { mode: "local", record, rollup: roll }), board, record, rollup: roll };
|
|
26
40
|
}
|
|
27
41
|
//# sourceMappingURL=board-page.js.map
|
package/dist/board-page.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"board-page.js","sourceRoot":"","sources":["../src/board-page.ts"],"names":[],"mappings":"AAAA,iGAAiG;AACjG,2CAA2C;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"board-page.js","sourceRoot":"","sources":["../src/board-page.ts"],"names":[],"mappings":"AAAA,iGAAiG;AACjG,2CAA2C;AAC3C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAA2B,MAAM,iCAAiC,CAAC;AAW3H,mGAAmG;AACnG,kGAAkG;AAClG,SAAS,cAAc;IACrB,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,GAAG,CAAC,2BAA2B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;IAC3F,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,+EAA+E,CAAC,CAAC;IACnG,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;QAC1C,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,KAAY;IACnD,OAAO,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAY,EAAE,IAA8D;IAC1G,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAChC,MAAM,SAAS,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,qBAAqB,CAAC,EAAe,CAAC;IAC9E,MAAM,SAAS,GAAG,MAAM,GAAG,YAAY,CAAC;IACxC,OAAO,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AACnH,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,EAAE,IAAI,EAAE,eAAe,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAChH,CAAC"}
|
package/dist/board-serve.js
CHANGED
|
@@ -5,19 +5,30 @@
|
|
|
5
5
|
import { createServer } from "node:http";
|
|
6
6
|
import { watch as fsWatch, watchFile, unwatchFile } from "node:fs";
|
|
7
7
|
import { basename, dirname, join } from "node:path";
|
|
8
|
-
import { autopilotView, readAutopilot, AUTOPILOT_FILE } from "@dougharness/flow/lib/autopilot-view.mjs";
|
|
8
|
+
import { autopilotView, readAutopilot, readRuns, AUTOPILOT_FILE } from "@dougharness/flow/lib/autopilot-view.mjs";
|
|
9
9
|
import { boardPath, findCard, loadBoard, moveCard, readyCapWarning, reorderCard, saveBoard } from "@dougharness/flow/lib/board.mjs";
|
|
10
|
-
import { buildBoardPage } from "./board-page.js";
|
|
10
|
+
import { boardRollup, buildBoardPage } from "./board-page.js";
|
|
11
11
|
const HOST = "127.0.0.1";
|
|
12
12
|
const CARDS_PREFIX = "/api/cards/";
|
|
13
13
|
const MAX_BODY = 1024 * 1024;
|
|
14
14
|
const DEBOUNCE_MS = 100;
|
|
15
15
|
const POLL_INTERVAL_MS = 500;
|
|
16
|
+
const EMPTY_ROLLUP = '{"epics":[],"milestones":[]}';
|
|
17
|
+
// The roll-up of a loaded board as JSON; a failure yields null so the event is skipped.
|
|
18
|
+
function rollupJson(dir, board) {
|
|
19
|
+
try {
|
|
20
|
+
return JSON.stringify(boardRollup(dir, board));
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
16
26
|
// The autopilot panel's view as the page receives it: the JSON of autopilotView, or "null" with no run, a file that
|
|
17
27
|
// does not parse, or any failure reading it. Never throws.
|
|
18
28
|
function autopilotJson(dir) {
|
|
19
29
|
try {
|
|
20
|
-
|
|
30
|
+
const state = readAutopilot(dir);
|
|
31
|
+
return JSON.stringify(autopilotView(state, new Date(), readRuns(state)));
|
|
21
32
|
}
|
|
22
33
|
catch {
|
|
23
34
|
return "null";
|
|
@@ -213,11 +224,17 @@ function handleEvents(dir, clients, req, res) {
|
|
|
213
224
|
"cache-control": "no-store",
|
|
214
225
|
connection: "keep-alive",
|
|
215
226
|
});
|
|
216
|
-
const client = { res, lastSent: null, lastAutopilot: "null" };
|
|
227
|
+
const client = { res, lastSent: null, lastAutopilot: "null", lastRollup: EMPTY_ROLLUP };
|
|
217
228
|
try {
|
|
218
|
-
const
|
|
229
|
+
const board = loadBoard(dir);
|
|
230
|
+
const serialized = JSON.stringify(board);
|
|
219
231
|
client.lastSent = serialized;
|
|
220
232
|
res.write(`event: board\ndata: ${serialized}\n\n`);
|
|
233
|
+
const roll = rollupJson(dir, board);
|
|
234
|
+
if (roll !== null && roll !== client.lastRollup) {
|
|
235
|
+
client.lastRollup = roll;
|
|
236
|
+
res.write(`event: rollup\ndata: ${roll}\n\n`);
|
|
237
|
+
}
|
|
221
238
|
}
|
|
222
239
|
catch {
|
|
223
240
|
// A record that fails to load sends nothing; the client still gets later changes.
|
|
@@ -288,18 +305,25 @@ export function startBoardServer(dir, opts) {
|
|
|
288
305
|
});
|
|
289
306
|
const onRecordChange = () => {
|
|
290
307
|
let serialized;
|
|
308
|
+
let roll;
|
|
291
309
|
try {
|
|
292
|
-
|
|
310
|
+
const board = loadBoard(dir);
|
|
311
|
+
serialized = JSON.stringify(board);
|
|
312
|
+
roll = rollupJson(dir, board);
|
|
293
313
|
}
|
|
294
314
|
catch {
|
|
295
315
|
// Mid-write or invalid; keep watching and try again on the next change.
|
|
296
316
|
return;
|
|
297
317
|
}
|
|
298
318
|
for (const client of clients) {
|
|
299
|
-
if (client.lastSent
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
319
|
+
if (client.lastSent !== serialized) {
|
|
320
|
+
client.lastSent = serialized;
|
|
321
|
+
client.res.write(`event: board\ndata: ${serialized}\n\n`);
|
|
322
|
+
}
|
|
323
|
+
if (roll !== null && client.lastRollup !== roll) {
|
|
324
|
+
client.lastRollup = roll;
|
|
325
|
+
client.res.write(`event: rollup\ndata: ${roll}\n\n`);
|
|
326
|
+
}
|
|
303
327
|
}
|
|
304
328
|
};
|
|
305
329
|
const onAutopilotChange = () => {
|
package/dist/board-serve.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"board-serve.js","sourceRoot":"","sources":["../src/board-serve.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"board-serve.js","sourceRoot":"","sources":["../src/board-serve.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,6FAA6F;AAC7F,8FAA8F;AAC9F,wCAAwC;AACxC,OAAO,EAAE,YAAY,EAA6C,MAAM,WAAW,CAAC;AACpF,OAAO,EAAE,KAAK,IAAI,OAAO,EAAE,SAAS,EAAE,WAAW,EAAkB,MAAM,SAAS,CAAC;AACnF,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAClH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAc,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAChJ,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAE9D,MAAM,IAAI,GAAG,WAAW,CAAC;AACzB,MAAM,YAAY,GAAG,aAAa,CAAC;AACnC,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC;AAC7B,MAAM,WAAW,GAAG,GAAG,CAAC;AACxB,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAe7B,MAAM,YAAY,GAAG,8BAA8B,CAAC;AAEpD,wFAAwF;AACxF,SAAS,UAAU,CAAC,GAAW,EAAE,KAAY;IAC3C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,oHAAoH;AACpH,2DAA2D;AAC3D,SAAS,aAAa,CAAC,GAAW;IAChC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC;IAChB,CAAC;AACH,CAAC;AAED,gGAAgG;AAChG,iGAAiG;AACjG,kGAAkG;AAClG,+FAA+F;AAC/F,gEAAgE;AAChE,SAAS,WAAW,CAAC,MAAc,EAAE,IAAmB,EAAE,QAAoB;IAC5E,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,QAAQ,GAAyC,IAAI,CAAC;IAC1D,MAAM,OAAO,GAAG,GAAS,EAAE;QACzB,IAAI,QAAQ;YAAE,OAAO;QACrB,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE;YACzB,QAAQ,GAAG,IAAI,CAAC;YAChB,QAAQ,EAAE,CAAC;QACb,CAAC,EAAE,WAAW,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,IAAI,OAAO,GAAqB,IAAI,CAAC;IACrC,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,MAAM,aAAa,GAAG,GAAS,EAAE;QAC/B,IAAI,OAAO;YAAE,OAAO;QACpB,OAAO,GAAG,IAAI,CAAC;QACf,SAAS,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,gBAAgB,EAAE,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IACrE,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,GAAS,EAAE;QAC9B,aAAa,EAAE,CAAC;QAChB,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,CAAC;YAAC,MAAM,CAAC;gBACP,eAAe;YACjB,CAAC;YACD,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,YAAY,EAAE,CAAC;IACjB,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;gBAChD,IAAI,QAAQ,IAAI,QAAQ,KAAK,UAAU;oBAAE,OAAO;gBAChD,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAClC,aAAa,EAAE,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,YAAY,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE,GAAG,EAAE;YACT,IAAI,QAAQ;gBAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;YACrC,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,CAAC;oBACH,OAAO,CAAC,KAAK,EAAE,CAAC;gBAClB,CAAC;gBAAC,MAAM,CAAC;oBACP,eAAe;gBACjB,CAAC;YACH,CAAC;YACD,IAAI,OAAO;gBAAE,WAAW,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,IAAI,CACX,GAAmB,EACnB,MAAc,EACd,IAAY,EACZ,IAAY,EACZ,UAAkC,EAAE;IAEpC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,eAAe,EAAE,UAAU,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACzF,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,QAAQ,CAAC,GAAmB,EAAE,MAAc,EAAE,KAAc,EAAE,UAAkC,EAAE;IACzG,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,iCAAiC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;AACvF,CAAC;AAED,SAAS,SAAS,CAChB,GAAmB,EACnB,MAAc,EACd,OAAe,EACf,UAAkC,EAAE;IAEpC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,iCAAiC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;AACpG,CAAC;AAED,SAAS,SAAS,CAAC,GAAY;IAC7B,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,YAAa,SAAQ,KAAK;CAAG;AAEnC,SAAS,QAAQ,CAAC,GAAoB;IACpC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YAC/B,IAAI,OAAO;gBAAE,OAAO;YACpB,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC;YACrB,IAAI,IAAI,GAAG,QAAQ,EAAE,CAAC;gBACpB,uFAAuF;gBACvF,+EAA+E;gBAC/E,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM,CAAC,IAAI,YAAY,CAAC,+BAA+B,CAAC,CAAC,CAAC;gBAC1D,OAAO;YACT,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YACjB,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACtB,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,kGAAkG;AAClG,wBAAwB;AACxB,SAAS,YAAY,CAAC,GAAoB,EAAE,GAAmB,EAAE,OAAe;IAC9E,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACpB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS;YAAE,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;IACtD,GAAG,CAAC,MAAM,EAAE,CAAC;AACf,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,GAAW,EAAE,EAAU,EAAE,GAAoB,EAAE,GAAmB;IACzF,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,YAAY;YAAE,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;;YAChE,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QACzC,OAAO;IACT,CAAC;IACD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,8BAA8B,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,MAAwE,CAAC;IACxF,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM,CAAC;IAC9B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;QAChD,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,0CAA0C,CAAC,CAAC;QAChE,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM,CAAC;IAC9B,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,CAAC;IAC5B,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,EAAE,CAAC,EAAE,CAAC;QAC1E,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,yDAAyD,CAAC,CAAC;QAC/E,OAAO;IACT,CAAC;IACD,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,CAAC,EAAE,CAAC;QACvE,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,wDAAwD,CAAC,CAAC;QAC9E,OAAO;IACT,CAAC;IACD,IAAI,MAAM,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAChD,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,0DAA0D,CAAC,CAAC;QAChF,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACjC,IAAI,IAAI,GAAG,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;QACxE,IAAI,MAAM,KAAK,SAAS;YAAE,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,MAAgB,EAAE,CAAC,CAAC;aAChF,IAAI,KAAK,KAAK,SAAS;YAAE,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAe,EAAE,CAAC,CAAC;QACvF,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACrB,MAAM,OAAO,GAAG,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAClE,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAChF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IACtC,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,GAAW,EAAE,OAAyB,EAAE,GAAoB,EAAE,GAAmB;IACrG,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;QACjB,cAAc,EAAE,mBAAmB;QACnC,eAAe,EAAE,UAAU;QAC3B,UAAU,EAAE,YAAY;KACzB,CAAC,CAAC;IACH,MAAM,MAAM,GAAgB,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;IACrG,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,CAAC,QAAQ,GAAG,UAAU,CAAC;QAC7B,GAAG,CAAC,KAAK,CAAC,uBAAuB,UAAU,MAAM,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACpC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,MAAM,CAAC,UAAU,EAAE,CAAC;YAChD,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC;YACzB,GAAG,CAAC,KAAK,CAAC,wBAAwB,IAAI,MAAM,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,kFAAkF;IACpF,CAAC;IACD,MAAM,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QACzB,MAAM,CAAC,aAAa,GAAG,SAAS,CAAC;QACjC,GAAG,CAAC,KAAK,CAAC,2BAA2B,SAAS,MAAM,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACnB,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,GAAW,EAAE,OAAyB,EAAE,GAAoB,EAAE,GAAmB;IACrG,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC;IAChE,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;QACnD,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACrC,OAAO;IACT,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;QACzC,IAAI,CAAC;YACH,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,0BAA0B,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;QACvE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,2BAA2B,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;QACrE,CAAC;QACD,OAAO;IACT,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;QAClD,IAAI,CAAC;YACH,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QACtC,CAAC;QACD,OAAO;IACT,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,IAAI,KAAK,gBAAgB,EAAE,CAAC;QACtD,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,iCAAiC,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;QACtE,OAAO;IACT,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC1D,IAAI,EAAU,CAAC;QACf,IAAI,CAAC;YACH,EAAE,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,0BAA0B,CAAC,CAAC;YAChD,OAAO;QACT,CAAC;QACD,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACnC,OAAO;IACT,CAAC;IACD,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,IAA6C;IACzF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAe,CAAC;QACvC,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACvC,GAAG,CAAC,SAAS,CAAC,wBAAwB,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7D,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC3C,IAAI,GAAG,CAAC,WAAW;oBAAE,GAAG,CAAC,GAAG,EAAE,CAAC;;oBAC1B,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,MAAM,cAAc,GAAG,GAAS,EAAE;YAChC,IAAI,UAAkB,CAAC;YACvB,IAAI,IAAmB,CAAC;YACxB,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;gBAC7B,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;gBACnC,IAAI,GAAG,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAChC,CAAC;YAAC,MAAM,CAAC;gBACP,wEAAwE;gBACxE,OAAO;YACT,CAAC;YACD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,IAAI,MAAM,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;oBACnC,MAAM,CAAC,QAAQ,GAAG,UAAU,CAAC;oBAC7B,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,uBAAuB,UAAU,MAAM,CAAC,CAAC;gBAC5D,CAAC;gBACD,IAAI,IAAI,KAAK,IAAI,IAAI,MAAM,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;oBAChD,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC;oBACzB,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,wBAAwB,IAAI,MAAM,CAAC,CAAC;gBACvD,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QACF,MAAM,iBAAiB,GAAG,GAAS,EAAE;YACnC,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;YACtC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,IAAI,MAAM,CAAC,aAAa,KAAK,UAAU;oBAAE,SAAS;gBAClD,MAAM,CAAC,aAAa,GAAG,UAAU,CAAC;gBAClC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,2BAA2B,UAAU,MAAM,CAAC,CAAC;YAChE,CAAC;QACH,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE,cAAc,CAAC,CAAC;QAChF,MAAM,gBAAgB,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE,iBAAiB,CAAC,CAAC;QACvG,oHAAoH;QACpH,MAAM,aAAa,GAAG,WAAW,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;QAC7D,aAAa,CAAC,KAAK,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,CAAC,GAAU,EAAQ,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;YAClC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YACxF,OAAO,CAAC;gBACN,IAAI;gBACJ,GAAG,EAAE,UAAU,IAAI,IAAI,IAAI,GAAG;gBAC9B,KAAK,EAAE,GAAG,EAAE,CACV,IAAI,OAAO,CAAO,CAAC,IAAI,EAAE,EAAE;oBACzB,OAAO,CAAC,IAAI,EAAE,CAAC;oBACf,gBAAgB,CAAC,IAAI,EAAE,CAAC;oBACxB,aAAa,CAAC,aAAa,CAAC,CAAC;oBAC7B,KAAK,MAAM,MAAM,IAAI,OAAO;wBAAE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;oBAC/C,OAAO,CAAC,KAAK,EAAE,CAAC;oBAChB,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;oBAC3B,6DAA6D;oBAC7D,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC;gBACjC,CAAC,CAAC;aACL,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/board.d.ts
CHANGED
|
@@ -2,5 +2,5 @@ export interface BoardIo {
|
|
|
2
2
|
stdout(s: string): void;
|
|
3
3
|
stderr(s: string): void;
|
|
4
4
|
}
|
|
5
|
-
export declare const BOARD_USAGE = "Usage:\n doug board init [dir]\n doug board add <id> --title <t> --goal <g> [--component <c>] [--size S|M|L] [--track flow|hand] [--class <c>] [--deps a,b] [--tag a,b] [--column <col>] [dir]\n doug board list [dir] [--column <id>] [--tag <t>] [--json]\n doug board next [dir] [--track flow|hand] [--batch <n>] [--tag <t>]\n doug board reorder <id> [dir] --before <other> | --after <other> | --top | --bottom\n doug board move <id> <column> [dir] [--source <text>]\n doug board edit <id> [dir] [--title <t>] [--goal <g> | --goal-file <path>] [--size S|M|L] [--component <c>] [--track flow|hand] [--class <c>] [--deps a,b] [--tag a,b] [--source <s>] [--force]\n doug board remove <id> [dir] [--force]\n doug board record <id> <report.json> [dir] --summary \"<one sentence>\" [--cost <usd>] [--codex-cost <usd>] [--shared-cost <usd>] [--wall <text>] [--commit <sha>] [--adversary \"<id>=<class>[: <reason>]\"]...\n doug board record <id> --hand [dir] --summary \"<one sentence>\" [--commit <sha>] [--wall <text>] [--gate <text>] [--note <text>]\n doug board summary <report.json> --summary \"<one sentence>\" [--cost <usd>] [--codex-cost <usd>] [--wall <text>] [--commit <sha>] [--card <id>]\n doug board build [dir] [--out <file>]\n doug board serve [dir] [--port <n>] [--open] [--detach | --stop]\n\nThe record is .doug/board.json (docs/board.json is read, and written back, when only it exists).\nEvery adversary block in a recorded run is classified real (a defect a user would hit), marginal (true to the\nspec, no user impact), or false (wrong); repeat --adversary once per block.\nnext --batch <n> prints the first n runnable Ready cards as a JSON array, the cards /doug-next plans together; when\n.doug/plan.json lists the card among its cards, record shows only that card's tasks, --cost is that card's tasks'\ncost and --shared-cost the shared integration agents', counted once; summary --card <id> filters the same way.\n--codex-cost is the Codex adversary's own cost, shown once per run (once per batch, under its first card) and never\nadded to --cost.\n";
|
|
5
|
+
export declare const BOARD_USAGE = "Usage:\n doug board init [dir]\n doug board add <id> --title <t> --goal <g> [--component <c>] [--size S|M|L] [--track flow|hand] [--class <c>] [--deps a,b] [--tag a,b] [--epic <id>] [--milestone <id>] [--column <col>] [dir]\n doug board list [dir] [--column <id>] [--tag <t>] [--epic <id>] [--milestone <id>] [--json]\n doug board next [dir] [--track flow|hand] [--batch <n>] [--tag <t>] [--epic <id>] [--milestone <id>]\n doug board reorder <id> [dir] --before <other> | --after <other> | --top | --bottom\n doug board move <id> <column> [dir] [--source <text>]\n doug board edit <id> [dir] [--title <t>] [--goal <g> | --goal-file <path>] [--size S|M|L] [--component <c>] [--track flow|hand] [--class <c>] [--deps a,b] [--tag a,b] [--source <s>] [--epic <id>] [--milestone <id>] [--force]\n doug board epic add <id> --title <t> --goal <g> [dir] [--version <v>] [--date YYYY-MM-DD]\n doug board epic edit <id> [dir] [--title <t>] [--goal <g>] [--version <v>] [--date YYYY-MM-DD] [--status planned|active|done] [--force]\n doug board epic list [dir] [--json]\n doug board milestone add <id> --title <t> --goal <g> [dir] [--version <v>] [--date YYYY-MM-DD]\n doug board milestone edit <id> [dir] [--title <t>] [--goal <g>] [--version <v>] [--date YYYY-MM-DD] [--status planned|active|done] [--force]\n doug board milestone list [dir] [--json]\n doug board labels init [dir]\n doug board labels --check [dir]\n doug board rollup [dir] [--epic <id> | --milestone <id>] [--from <live-runs>]\n doug board remove <id> [dir] [--force]\n doug board record <id> <report.json> [dir] --summary \"<one sentence>\" [--cost <usd>] [--codex-cost <usd>] [--shared-cost <usd>] [--wall <text>] [--commit <sha>] [--adversary \"<id>=<class>[: <reason>]\"]...\n doug board record <id> --hand [dir] --summary \"<one sentence>\" [--commit <sha>] [--wall <text>] [--gate <text>] [--note <text>]\n doug board summary <report.json> --summary \"<one sentence>\" [--cost <usd>] [--codex-cost <usd>] [--wall <text>] [--commit <sha>] [--card <id>]\n doug board build [dir] [--out <file>]\n doug board serve [dir] [--port <n>] [--open] [--detach | --stop]\n\nThe record is .doug/board.json (docs/board.json is read, and written back, when only it exists).\nEvery adversary block in a recorded run is classified real (a defect a user would hit), marginal (true to the\nspec, no user impact), or false (wrong); repeat --adversary once per block.\nnext --batch <n> prints the first n runnable Ready cards as a JSON array, the cards /doug-next plans together; when\n.doug/plan.json lists the card among its cards, record shows only that card's tasks, --cost is that card's tasks'\ncost and --shared-cost the shared integration agents', counted once; summary --card <id> filters the same way.\n--codex-cost is the Codex adversary's own cost, shown once per run (once per batch, under its first card) and never\nadded to --cost.\n";
|
|
6
6
|
export declare function runBoard(argv: string[], io?: BoardIo): Promise<number>;
|
package/dist/board.js
CHANGED
|
@@ -5,16 +5,25 @@ import { relative, resolve } from "node:path";
|
|
|
5
5
|
import { buildBoardPage } from "./board-page.js";
|
|
6
6
|
import { startBoardServer } from "./board-serve.js";
|
|
7
7
|
import { findRunningServer, openBrowser, removePidfileIfOwn, spawnDetached, stopRunningServer, waitForDetached, writePidfile, } from "./board-serve-process.js";
|
|
8
|
-
import { addCard, boardPath, boardTags, editCard, findCard, loadBoard, moveCard, reorderCard, readyCapWarning, newBoard, nextReadyCard, nextReadyCards, filterReportForCard, removeCard, runEntry, handEntry, handWallVerdict, runSummary, parseAdversaryClasses, recordLanding, saveBoard, BOARD_RELPATH, } from "@dougharness/flow/lib/board.mjs";
|
|
8
|
+
import { addCard, addEpic, addMilestone, checkFilters, labelContrastFailures, rollup, LIVE_RUNS_RELPATH, editEpic, editMilestone, initLabelGroups, boardPath, boardTags, editCard, findCard, loadBoard, moveCard, reorderCard, readyCapWarning, newBoard, nextReadyCard, nextReadyCards, filterReportForCard, removeCard, runEntry, handEntry, handWallVerdict, runSummary, parseAdversaryClasses, recordLanding, saveBoard, BOARD_RELPATH, } from "@dougharness/flow/lib/board.mjs";
|
|
9
9
|
import { loadPlan, unwrapReport } from "@dougharness/flow/lib/plan.mjs";
|
|
10
10
|
export const BOARD_USAGE = `Usage:
|
|
11
11
|
doug board init [dir]
|
|
12
|
-
doug board add <id> --title <t> --goal <g> [--component <c>] [--size S|M|L] [--track flow|hand] [--class <c>] [--deps a,b] [--tag a,b] [--column <col>] [dir]
|
|
13
|
-
doug board list [dir] [--column <id>] [--tag <t>] [--json]
|
|
14
|
-
doug board next [dir] [--track flow|hand] [--batch <n>] [--tag <t>]
|
|
12
|
+
doug board add <id> --title <t> --goal <g> [--component <c>] [--size S|M|L] [--track flow|hand] [--class <c>] [--deps a,b] [--tag a,b] [--epic <id>] [--milestone <id>] [--column <col>] [dir]
|
|
13
|
+
doug board list [dir] [--column <id>] [--tag <t>] [--epic <id>] [--milestone <id>] [--json]
|
|
14
|
+
doug board next [dir] [--track flow|hand] [--batch <n>] [--tag <t>] [--epic <id>] [--milestone <id>]
|
|
15
15
|
doug board reorder <id> [dir] --before <other> | --after <other> | --top | --bottom
|
|
16
16
|
doug board move <id> <column> [dir] [--source <text>]
|
|
17
|
-
doug board edit <id> [dir] [--title <t>] [--goal <g> | --goal-file <path>] [--size S|M|L] [--component <c>] [--track flow|hand] [--class <c>] [--deps a,b] [--tag a,b] [--source <s>] [--force]
|
|
17
|
+
doug board edit <id> [dir] [--title <t>] [--goal <g> | --goal-file <path>] [--size S|M|L] [--component <c>] [--track flow|hand] [--class <c>] [--deps a,b] [--tag a,b] [--source <s>] [--epic <id>] [--milestone <id>] [--force]
|
|
18
|
+
doug board epic add <id> --title <t> --goal <g> [dir] [--version <v>] [--date YYYY-MM-DD]
|
|
19
|
+
doug board epic edit <id> [dir] [--title <t>] [--goal <g>] [--version <v>] [--date YYYY-MM-DD] [--status planned|active|done] [--force]
|
|
20
|
+
doug board epic list [dir] [--json]
|
|
21
|
+
doug board milestone add <id> --title <t> --goal <g> [dir] [--version <v>] [--date YYYY-MM-DD]
|
|
22
|
+
doug board milestone edit <id> [dir] [--title <t>] [--goal <g>] [--version <v>] [--date YYYY-MM-DD] [--status planned|active|done] [--force]
|
|
23
|
+
doug board milestone list [dir] [--json]
|
|
24
|
+
doug board labels init [dir]
|
|
25
|
+
doug board labels --check [dir]
|
|
26
|
+
doug board rollup [dir] [--epic <id> | --milestone <id>] [--from <live-runs>]
|
|
18
27
|
doug board remove <id> [dir] [--force]
|
|
19
28
|
doug board record <id> <report.json> [dir] --summary "<one sentence>" [--cost <usd>] [--codex-cost <usd>] [--shared-cost <usd>] [--wall <text>] [--commit <sha>] [--adversary "<id>=<class>[: <reason>]"]...
|
|
20
29
|
doug board record <id> --hand [dir] --summary "<one sentence>" [--commit <sha>] [--wall <text>] [--gate <text>] [--note <text>]
|
|
@@ -31,25 +40,33 @@ cost and --shared-cost the shared integration agents', counted once; summary --c
|
|
|
31
40
|
--codex-cost is the Codex adversary's own cost, shown once per run (once per batch, under its first card) and never
|
|
32
41
|
added to --cost.
|
|
33
42
|
`;
|
|
34
|
-
const BOOLEAN_FLAGS = new Set(["json", "help", "hand", "top", "bottom", "force", "open", "detach", "stop"]);
|
|
35
|
-
const EDIT_FIELD_ORDER = ["title", "goal", "size", "component", "track", "class", "tags", "deps", "source"];
|
|
43
|
+
const BOOLEAN_FLAGS = new Set(["json", "help", "hand", "top", "bottom", "force", "open", "detach", "stop", "check"]);
|
|
44
|
+
const EDIT_FIELD_ORDER = ["title", "goal", "size", "component", "track", "class", "tags", "deps", "source", "epic", "milestone"];
|
|
36
45
|
const REPEATABLE_FLAGS = new Set(["adversary"]);
|
|
37
46
|
const DEFAULT_PORT = 8787;
|
|
38
47
|
// Each subcommand's allowed flags, derived from what that case actually reads (card board-cli-unknown-flags).
|
|
39
48
|
// `record` has two forms (--hand or not) with different allowed sets, handled separately below.
|
|
40
49
|
const SUBCOMMAND_FLAGS = {
|
|
41
50
|
init: [],
|
|
42
|
-
add: ["title", "goal", "component", "size", "track", "class", "deps", "tag", "column"],
|
|
43
|
-
list: ["column", "tag", "json"],
|
|
44
|
-
next: ["track", "batch", "tag"],
|
|
51
|
+
add: ["title", "goal", "component", "size", "track", "class", "deps", "tag", "epic", "milestone", "column"],
|
|
52
|
+
list: ["column", "tag", "epic", "milestone", "json"],
|
|
53
|
+
next: ["track", "batch", "tag", "epic", "milestone"],
|
|
45
54
|
reorder: ["before", "after", "top", "bottom"],
|
|
46
55
|
move: ["source"],
|
|
47
|
-
edit: ["title", "goal", "goal-file", "size", "component", "track", "class", "deps", "tag", "source", "force"],
|
|
56
|
+
edit: ["title", "goal", "goal-file", "size", "component", "track", "class", "deps", "tag", "source", "epic", "milestone", "force"],
|
|
48
57
|
remove: ["force"],
|
|
58
|
+
labels: ["check"],
|
|
59
|
+
rollup: ["epic", "milestone", "from"],
|
|
49
60
|
summary: ["summary", "cost", "codex-cost", "wall", "commit", "card"],
|
|
50
61
|
build: ["out"],
|
|
51
62
|
serve: ["port", "open", "detach", "stop"],
|
|
52
63
|
};
|
|
64
|
+
// epic and milestone: `<kind> add|edit|list`, each action with its own allowed flags.
|
|
65
|
+
const PLAN_ACTION_FLAGS = {
|
|
66
|
+
add: ["title", "goal", "version", "date"],
|
|
67
|
+
edit: ["title", "goal", "version", "date", "status", "force"],
|
|
68
|
+
list: ["json"],
|
|
69
|
+
};
|
|
53
70
|
const RECORD_HAND_FLAGS = ["summary", "hand", "commit", "wall", "gate", "note"];
|
|
54
71
|
const RECORD_REPORT_FLAGS = ["summary", "cost", "codex-cost", "shared-cost", "commit", "wall", "adversary"];
|
|
55
72
|
function parse(argv) {
|
|
@@ -129,6 +146,19 @@ export async function runBoard(argv, io) {
|
|
|
129
146
|
out.stderr(BOARD_USAGE);
|
|
130
147
|
return 2;
|
|
131
148
|
};
|
|
149
|
+
if (cmd === "epic" || cmd === "milestone") {
|
|
150
|
+
const action = rest[0];
|
|
151
|
+
if (action === undefined || !Object.prototype.hasOwnProperty.call(PLAN_ACTION_FLAGS, action)) {
|
|
152
|
+
out.stderr(subcommandUsage(cmd));
|
|
153
|
+
return 2;
|
|
154
|
+
}
|
|
155
|
+
const unknown = [...Object.keys(opts), ...Object.keys(repeated)].find((name) => !PLAN_ACTION_FLAGS[action].includes(name));
|
|
156
|
+
if (unknown !== undefined) {
|
|
157
|
+
out.stderr(`unknown option --${unknown} for doug board ${cmd}\n`);
|
|
158
|
+
out.stderr(subcommandUsage(cmd));
|
|
159
|
+
return 2;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
132
162
|
if (cmd === "record" || (cmd !== undefined && Object.prototype.hasOwnProperty.call(SUBCOMMAND_FLAGS, cmd))) {
|
|
133
163
|
const unknown = unknownFlagFor(cmd, opts, repeated);
|
|
134
164
|
if (unknown !== undefined) {
|
|
@@ -187,6 +217,8 @@ export async function runBoard(argv, io) {
|
|
|
187
217
|
class: stringOpt(opts, "class"),
|
|
188
218
|
deps,
|
|
189
219
|
tags,
|
|
220
|
+
epic: stringOpt(opts, "epic") || undefined,
|
|
221
|
+
milestone: stringOpt(opts, "milestone") || undefined,
|
|
190
222
|
column: stringOpt(opts, "column"),
|
|
191
223
|
});
|
|
192
224
|
saveBoard(dir, board);
|
|
@@ -215,7 +247,12 @@ export async function runBoard(argv, io) {
|
|
|
215
247
|
out.stderr(`unknown tag "${tagOpt}"; tags are ${boardTags(board).join(", ")}\n`);
|
|
216
248
|
return 1;
|
|
217
249
|
}
|
|
218
|
-
const
|
|
250
|
+
const epicOpt = stringOpt(opts, "epic");
|
|
251
|
+
const milestoneOpt = stringOpt(opts, "milestone");
|
|
252
|
+
checkFilters(board, { epic: epicOpt, milestone: milestoneOpt });
|
|
253
|
+
const filtered = (cards) => (columnId === undefined ? cards : cards.filter((c) => c.column === columnId)).filter((c) => (tagOpt === undefined || (c.tags || []).includes(tagOpt)) &&
|
|
254
|
+
(epicOpt === undefined || c.epic === epicOpt) &&
|
|
255
|
+
(milestoneOpt === undefined || c.milestone === milestoneOpt));
|
|
219
256
|
if (opts.json === true) {
|
|
220
257
|
out.stdout(JSON.stringify(filtered(board.cards), null, 2) + "\n");
|
|
221
258
|
}
|
|
@@ -243,7 +280,9 @@ export async function runBoard(argv, io) {
|
|
|
243
280
|
return 2;
|
|
244
281
|
}
|
|
245
282
|
const board = loadBoard(dir);
|
|
246
|
-
const picked = batch === null
|
|
283
|
+
const picked = batch === null
|
|
284
|
+
? nextReadyCard(board, { track, tag: tagOpt, epic: stringOpt(opts, "epic"), milestone: stringOpt(opts, "milestone") })
|
|
285
|
+
: nextReadyCards(board, { track, batch, tag: tagOpt, epic: stringOpt(opts, "epic"), milestone: stringOpt(opts, "milestone") });
|
|
247
286
|
const skipped = picked.skipped;
|
|
248
287
|
const card = "card" in picked ? picked.card : picked.cards.length ? picked.cards : null;
|
|
249
288
|
for (const s of skipped) {
|
|
@@ -350,6 +389,12 @@ export async function runBoard(argv, io) {
|
|
|
350
389
|
const source = stringOpt(opts, "source");
|
|
351
390
|
if (source !== undefined)
|
|
352
391
|
fields.source = source;
|
|
392
|
+
const epicOpt = stringOpt(opts, "epic");
|
|
393
|
+
if (epicOpt !== undefined)
|
|
394
|
+
fields.epic = epicOpt === "" ? null : epicOpt;
|
|
395
|
+
const milestoneOpt = stringOpt(opts, "milestone");
|
|
396
|
+
if (milestoneOpt !== undefined)
|
|
397
|
+
fields.milestone = milestoneOpt === "" ? null : milestoneOpt;
|
|
353
398
|
const changed = EDIT_FIELD_ORDER.filter((k) => Object.prototype.hasOwnProperty.call(fields, k));
|
|
354
399
|
if (!changed.length)
|
|
355
400
|
return usage();
|
|
@@ -362,6 +407,108 @@ export async function runBoard(argv, io) {
|
|
|
362
407
|
out.stdout(`Edited ${id} (${changed.join(", ")}) in ${relpathOf(dir, boardPath(dir))}.\n`);
|
|
363
408
|
return 0;
|
|
364
409
|
}
|
|
410
|
+
case "labels": {
|
|
411
|
+
if (opts.check === true) {
|
|
412
|
+
for (const l of labelContrastFailures(loadBoard(dirFrom(rest, 0))))
|
|
413
|
+
out.stdout(`${l}\n`);
|
|
414
|
+
return 0;
|
|
415
|
+
}
|
|
416
|
+
if (rest[0] !== "init")
|
|
417
|
+
return usage();
|
|
418
|
+
const dir = dirFrom(rest, 1);
|
|
419
|
+
saveBoard(dir, initLabelGroups(loadBoard(dir)));
|
|
420
|
+
out.stdout(`Added label groups type and priority to ${relpathOf(dir, boardPath(dir))}.\n`);
|
|
421
|
+
return 0;
|
|
422
|
+
}
|
|
423
|
+
case "rollup": {
|
|
424
|
+
const epicOpt = stringOpt(opts, "epic");
|
|
425
|
+
const milestoneOpt = stringOpt(opts, "milestone");
|
|
426
|
+
if (epicOpt !== undefined && milestoneOpt !== undefined)
|
|
427
|
+
return usage();
|
|
428
|
+
const dir = dirFrom(rest, 0);
|
|
429
|
+
const board = loadBoard(dir);
|
|
430
|
+
checkFilters(board, { epic: epicOpt, milestone: milestoneOpt });
|
|
431
|
+
const from = stringOpt(opts, "from");
|
|
432
|
+
let live = null;
|
|
433
|
+
if (from !== undefined) {
|
|
434
|
+
try {
|
|
435
|
+
live = readFileSync(resolve(from), "utf8");
|
|
436
|
+
}
|
|
437
|
+
catch {
|
|
438
|
+
throw new Error(`cannot read --from file ${from}`);
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
else if (existsSync(resolve(dir, LIVE_RUNS_RELPATH)))
|
|
442
|
+
live = readFileSync(resolve(dir, LIVE_RUNS_RELPATH), "utf8");
|
|
443
|
+
const all = rollup(board, live);
|
|
444
|
+
const result = epicOpt !== undefined ? all.epics.find((e) => e.id === epicOpt) : milestoneOpt !== undefined ? all.milestones.find((m) => m.id === milestoneOpt) : all;
|
|
445
|
+
out.stdout(JSON.stringify(result, null, 2) + "\n");
|
|
446
|
+
return 0;
|
|
447
|
+
}
|
|
448
|
+
case "epic":
|
|
449
|
+
case "milestone": {
|
|
450
|
+
const [action, id] = rest;
|
|
451
|
+
const edit = cmd === "epic" ? editEpic : editMilestone;
|
|
452
|
+
const add = cmd === "epic" ? addEpic : addMilestone;
|
|
453
|
+
if (action === "list") {
|
|
454
|
+
const board = loadBoard(dirFrom(rest, 1));
|
|
455
|
+
const entries = (cmd === "epic" ? board.epics : board.milestones) || [];
|
|
456
|
+
if (opts.json === true)
|
|
457
|
+
out.stdout(JSON.stringify(entries, null, 2) + "\n");
|
|
458
|
+
else {
|
|
459
|
+
for (const e of entries) {
|
|
460
|
+
const t = e.target ? [e.target.version, e.target.date].filter(Boolean).join(" ") : "";
|
|
461
|
+
out.stdout(`${e.id} ${e.status} ${e.title}${t ? ` [${t}]` : ""}\n`);
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
return 0;
|
|
465
|
+
}
|
|
466
|
+
if (!id)
|
|
467
|
+
return usage();
|
|
468
|
+
const title = stringOpt(opts, "title");
|
|
469
|
+
const goal = stringOpt(opts, "goal");
|
|
470
|
+
if (action === "add") {
|
|
471
|
+
if (!title || !goal)
|
|
472
|
+
return usage();
|
|
473
|
+
const dir = dirFrom(rest, 2);
|
|
474
|
+
const version = stringOpt(opts, "version");
|
|
475
|
+
const date = stringOpt(opts, "date");
|
|
476
|
+
const target = {};
|
|
477
|
+
if (version)
|
|
478
|
+
target.version = version;
|
|
479
|
+
if (date)
|
|
480
|
+
target.date = date;
|
|
481
|
+
saveBoard(dir, add(loadBoard(dir), { id, title, goal, ...(Object.keys(target).length ? { target } : {}) }));
|
|
482
|
+
out.stdout(`Added ${cmd} ${id} in ${relpathOf(dir, boardPath(dir))}.\n`);
|
|
483
|
+
return 0;
|
|
484
|
+
}
|
|
485
|
+
const fields = {};
|
|
486
|
+
if (title !== undefined)
|
|
487
|
+
fields.title = title;
|
|
488
|
+
if (goal !== undefined)
|
|
489
|
+
fields.goal = goal;
|
|
490
|
+
const status = stringOpt(opts, "status");
|
|
491
|
+
if (status !== undefined)
|
|
492
|
+
fields.status = status;
|
|
493
|
+
const target = {};
|
|
494
|
+
const version = stringOpt(opts, "version");
|
|
495
|
+
const date = stringOpt(opts, "date");
|
|
496
|
+
if (version !== undefined)
|
|
497
|
+
target.version = version === "" ? null : version;
|
|
498
|
+
if (date !== undefined)
|
|
499
|
+
target.date = date === "" ? null : date;
|
|
500
|
+
if (Object.keys(target).length)
|
|
501
|
+
fields.target = target;
|
|
502
|
+
if (!Object.keys(fields).length)
|
|
503
|
+
return usage();
|
|
504
|
+
const dir = dirFrom(rest, 2);
|
|
505
|
+
const { board, warnings } = edit(loadBoard(dir), id, fields, { force: opts.force === true });
|
|
506
|
+
saveBoard(dir, board);
|
|
507
|
+
for (const w of warnings)
|
|
508
|
+
out.stderr(`warning: ${w}\n`);
|
|
509
|
+
out.stdout(`Edited ${cmd} ${id} (${Object.keys(fields).join(", ")}) in ${relpathOf(dir, boardPath(dir))}.\n`);
|
|
510
|
+
return 0;
|
|
511
|
+
}
|
|
365
512
|
case "remove": {
|
|
366
513
|
const id = rest[0];
|
|
367
514
|
if (!id)
|