@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.
Files changed (47) hide show
  1. package/dist/bin.js +13 -4
  2. package/dist/bin.js.map +1 -1
  3. package/dist/board-page.d.ts +5 -1
  4. package/dist/board-page.js +19 -5
  5. package/dist/board-page.js.map +1 -1
  6. package/dist/board-serve.js +34 -10
  7. package/dist/board-serve.js.map +1 -1
  8. package/dist/board.d.ts +1 -1
  9. package/dist/board.js +160 -13
  10. package/dist/board.js.map +1 -1
  11. package/node_modules/@dougharness/flow/.claude-plugin/plugin.json +1 -1
  12. package/node_modules/@dougharness/flow/agents/implementer.md +1 -1
  13. package/node_modules/@dougharness/flow/agents/planner.md +1 -1
  14. package/node_modules/@dougharness/flow/agents/researcher.md +2 -1
  15. package/node_modules/@dougharness/flow/agents/reviewer.md +3 -1
  16. package/node_modules/@dougharness/flow/hooks/register.tsx +67 -32
  17. package/node_modules/@dougharness/flow/lib/autopilot-core.mjs +94 -7
  18. package/node_modules/@dougharness/flow/lib/autopilot-view.mjs +31 -4
  19. package/node_modules/@dougharness/flow/lib/board.mjs +366 -21
  20. package/node_modules/@dougharness/flow/lib/card-loop.mjs +229 -23
  21. package/node_modules/@dougharness/flow/lib/coordinator.mjs +25 -0
  22. package/node_modules/@dougharness/flow/lib/cost.mjs +9 -0
  23. package/node_modules/@dougharness/flow/lib/decisions.mjs +4 -2
  24. package/node_modules/@dougharness/flow/lib/memory.mjs +382 -65
  25. package/node_modules/@dougharness/flow/lib/plan.mjs +1 -1
  26. package/node_modules/@dougharness/flow/package.json +1 -1
  27. package/node_modules/@dougharness/flow/scripts/autopilot.mjs +228 -14
  28. package/node_modules/@dougharness/flow/scripts/board.mjs +122 -13
  29. package/node_modules/@dougharness/flow/scripts/cost.mjs +6 -3
  30. package/node_modules/@dougharness/flow/scripts/memory.mjs +27 -8
  31. package/node_modules/@dougharness/flow/scripts/plan.mjs +5 -1
  32. package/node_modules/@dougharness/flow/scripts/session-recall.mjs +11 -4
  33. package/node_modules/@dougharness/flow/skills/doug-hand/SKILL.md +1 -1
  34. package/node_modules/@dougharness/flow/skills/doug-next/SKILL.md +9 -2
  35. package/node_modules/@dougharness/flow/skills/research/SKILL.md +2 -2
  36. package/node_modules/@dougharness/flow/skills/run-report/SKILL.md +2 -2
  37. package/node_modules/@dougharness/flow/workflows/card-queen.js +238 -25
  38. package/node_modules/@dougharness/flow/workflows/doug-implement.js +77 -34
  39. package/node_modules/@dougharness/gates/.claude-plugin/plugin.json +1 -1
  40. package/node_modules/@dougharness/gates/lib/baseline.mjs +23 -0
  41. package/node_modules/@dougharness/gates/lib/block-ledger.mjs +41 -3
  42. package/node_modules/@dougharness/gates/lib/docs-gate.mjs +6 -2
  43. package/node_modules/@dougharness/gates/package.json +1 -1
  44. package/node_modules/@dougharness/gates/scripts/research-cap.mjs +119 -15
  45. package/node_modules/@dougharness/gates/scripts/stop-gate.mjs +107 -20
  46. package/package.json +3 -3
  47. 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":"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"}
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
@@ -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
  };
@@ -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
- return { html: renderBoardPage(board, { mode: "local", record }), board, record };
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
@@ -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;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAc,MAAM,iCAAiC,CAAC;AAWnF,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,MAAM,UAAU,eAAe,CAAC,KAAY,EAAE,IAA6C;IACzF,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,CAAC,CAAC;AAC/E,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,OAAO,EAAE,IAAI,EAAE,eAAe,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AACpF,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"}
@@ -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
- return JSON.stringify(autopilotView(readAutopilot(dir), new Date()));
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 serialized = JSON.stringify(loadBoard(dir));
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
- serialized = JSON.stringify(loadBoard(dir));
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 === serialized)
300
- continue;
301
- client.lastSent = serialized;
302
- client.res.write(`event: board\ndata: ${serialized}\n\n`);
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 = () => {
@@ -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":"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"}
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 filtered = (cards) => (columnId === undefined ? cards : cards.filter((c) => c.column === columnId)).filter((c) => tagOpt === undefined || (c.tags || []).includes(tagOpt));
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 ? nextReadyCard(board, { track, tag: tagOpt }) : nextReadyCards(board, { track, batch, tag: tagOpt });
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)