@backlogmd/serve 0.2.2 → 0.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 (118) hide show
  1. package/app/dist/index.html +40 -20
  2. package/dist/assignmentQueue.d.ts +22 -0
  3. package/dist/assignmentQueue.d.ts.map +1 -0
  4. package/dist/assignmentQueue.js +27 -0
  5. package/dist/assignmentQueue.js.map +1 -0
  6. package/dist/chatAgent.d.ts +2 -0
  7. package/dist/chatAgent.d.ts.map +1 -0
  8. package/dist/chatAgent.js +89 -0
  9. package/dist/chatAgent.js.map +1 -0
  10. package/dist/cli.d.ts +4 -2
  11. package/dist/cli.d.ts.map +1 -1
  12. package/dist/cli.js +53 -11
  13. package/dist/cli.js.map +1 -1
  14. package/dist/context.d.ts +45 -0
  15. package/dist/context.d.ts.map +1 -0
  16. package/dist/context.js +2 -0
  17. package/dist/context.js.map +1 -0
  18. package/dist/html.d.ts +2 -2
  19. package/dist/html.d.ts.map +1 -1
  20. package/dist/html.js +20 -5
  21. package/dist/html.js.map +1 -1
  22. package/dist/index.d.ts +5 -1
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +11 -5
  25. package/dist/index.js.map +1 -1
  26. package/dist/lib/errorOutput.d.ts +7 -0
  27. package/dist/lib/errorOutput.d.ts.map +1 -0
  28. package/dist/lib/errorOutput.js +23 -0
  29. package/dist/lib/errorOutput.js.map +1 -0
  30. package/dist/lib/validStatuses.d.ts +2 -0
  31. package/dist/lib/validStatuses.d.ts.map +1 -0
  32. package/dist/lib/validStatuses.js +7 -0
  33. package/dist/lib/validStatuses.js.map +1 -0
  34. package/dist/routes.d.ts +4 -0
  35. package/dist/routes.d.ts.map +1 -0
  36. package/dist/routes.js +36 -0
  37. package/dist/routes.js.map +1 -0
  38. package/dist/server.d.ts +11 -2
  39. package/dist/server.d.ts.map +1 -1
  40. package/dist/server.js +123 -156
  41. package/dist/server.js.map +1 -1
  42. package/dist/shared/os.d.ts +2 -0
  43. package/dist/shared/os.d.ts.map +1 -0
  44. package/dist/shared/os.js +23 -0
  45. package/dist/shared/os.js.map +1 -0
  46. package/dist/useCases/deleteItem.d.ts +14 -0
  47. package/dist/useCases/deleteItem.d.ts.map +1 -0
  48. package/dist/useCases/deleteItem.js +27 -0
  49. package/dist/useCases/deleteItem.js.map +1 -0
  50. package/dist/useCases/deleteTask.d.ts +14 -0
  51. package/dist/useCases/deleteTask.d.ts.map +1 -0
  52. package/dist/useCases/deleteTask.js +28 -0
  53. package/dist/useCases/deleteTask.js.map +1 -0
  54. package/dist/useCases/getBacklog.d.ts +4 -0
  55. package/dist/useCases/getBacklog.d.ts.map +1 -0
  56. package/dist/useCases/getBacklog.js +19 -0
  57. package/dist/useCases/getBacklog.js.map +1 -0
  58. package/dist/useCases/getEvents.d.ts +4 -0
  59. package/dist/useCases/getEvents.d.ts.map +1 -0
  60. package/dist/useCases/getEvents.js +17 -0
  61. package/dist/useCases/getEvents.js.map +1 -0
  62. package/dist/useCases/getIndexPage.d.ts +4 -0
  63. package/dist/useCases/getIndexPage.d.ts.map +1 -0
  64. package/dist/useCases/getIndexPage.js +20 -0
  65. package/dist/useCases/getIndexPage.js.map +1 -0
  66. package/dist/useCases/getItemContent.d.ts +14 -0
  67. package/dist/useCases/getItemContent.d.ts.map +1 -0
  68. package/dist/useCases/getItemContent.js +26 -0
  69. package/dist/useCases/getItemContent.js.map +1 -0
  70. package/dist/useCases/getTaskContent.d.ts +13 -0
  71. package/dist/useCases/getTaskContent.d.ts.map +1 -0
  72. package/dist/useCases/getTaskContent.js +28 -0
  73. package/dist/useCases/getTaskContent.js.map +1 -0
  74. package/dist/useCases/getWork.d.ts +10 -0
  75. package/dist/useCases/getWork.d.ts.map +1 -0
  76. package/dist/useCases/getWork.js +6 -0
  77. package/dist/useCases/getWork.js.map +1 -0
  78. package/dist/useCases/getWorkerAssignments.d.ts +17 -0
  79. package/dist/useCases/getWorkerAssignments.d.ts.map +1 -0
  80. package/dist/useCases/getWorkerAssignments.js +92 -0
  81. package/dist/useCases/getWorkerAssignments.js.map +1 -0
  82. package/dist/useCases/getWorkers.d.ts +4 -0
  83. package/dist/useCases/getWorkers.d.ts.map +1 -0
  84. package/dist/useCases/getWorkers.js +5 -0
  85. package/dist/useCases/getWorkers.js.map +1 -0
  86. package/dist/useCases/patchTaskStatus.d.ts +14 -0
  87. package/dist/useCases/patchTaskStatus.d.ts.map +1 -0
  88. package/dist/useCases/patchTaskStatus.js +34 -0
  89. package/dist/useCases/patchTaskStatus.js.map +1 -0
  90. package/dist/useCases/postAssignWork.d.ts +11 -0
  91. package/dist/useCases/postAssignWork.d.ts.map +1 -0
  92. package/dist/useCases/postAssignWork.js +48 -0
  93. package/dist/useCases/postAssignWork.js.map +1 -0
  94. package/dist/useCases/postChat.d.ts +13 -0
  95. package/dist/useCases/postChat.d.ts.map +1 -0
  96. package/dist/useCases/postChat.js +44 -0
  97. package/dist/useCases/postChat.js.map +1 -0
  98. package/dist/useCases/postWorkerReport.d.ts +6 -0
  99. package/dist/useCases/postWorkerReport.d.ts.map +1 -0
  100. package/dist/useCases/postWorkerReport.js +71 -0
  101. package/dist/useCases/postWorkerReport.js.map +1 -0
  102. package/dist/useCases/putItemContent.d.ts +18 -0
  103. package/dist/useCases/putItemContent.d.ts.map +1 -0
  104. package/dist/useCases/putItemContent.js +30 -0
  105. package/dist/useCases/putItemContent.js.map +1 -0
  106. package/dist/useCases/putTaskContent.d.ts +17 -0
  107. package/dist/useCases/putTaskContent.d.ts.map +1 -0
  108. package/dist/useCases/putTaskContent.js +31 -0
  109. package/dist/useCases/putTaskContent.js.map +1 -0
  110. package/dist/watcher.d.ts +1 -1
  111. package/dist/watcher.d.ts.map +1 -1
  112. package/dist/watcher.js +1 -1
  113. package/dist/watcher.js.map +1 -1
  114. package/dist/workerRegistry.d.ts +35 -0
  115. package/dist/workerRegistry.d.ts.map +1 -0
  116. package/dist/workerRegistry.js +53 -0
  117. package/dist/workerRegistry.js.map +1 -0
  118. package/package.json +31 -13
@@ -0,0 +1,22 @@
1
+ /**
2
+ * In-memory queue of work assignments for workers.
3
+ * POST /api/workers/assign enqueues; GET /api/workers/assignments returns the list for a worker.
4
+ */
5
+ export interface AssignmentMessage {
6
+ workerId: string;
7
+ taskId?: string;
8
+ itemId?: string;
9
+ }
10
+ export declare class AssignmentQueue {
11
+ private queue;
12
+ enqueue(msg: AssignmentMessage): void;
13
+ /**
14
+ * Remove and return the first assignment for the given worker, or null.
15
+ */
16
+ dequeueForWorker(workerId: string): AssignmentMessage | null;
17
+ /**
18
+ * Return all assignments for the given worker without removing them.
19
+ */
20
+ listForWorker(workerId: string): AssignmentMessage[];
21
+ }
22
+ //# sourceMappingURL=assignmentQueue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assignmentQueue.d.ts","sourceRoot":"","sources":["../src/assignmentQueue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,KAAK,CAA2B;IAExC,OAAO,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI;IAIrC;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAO5D;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,EAAE;CAGrD"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * In-memory queue of work assignments for workers.
3
+ * POST /api/workers/assign enqueues; GET /api/workers/assignments returns the list for a worker.
4
+ */
5
+ export class AssignmentQueue {
6
+ queue = [];
7
+ enqueue(msg) {
8
+ this.queue.push(msg);
9
+ }
10
+ /**
11
+ * Remove and return the first assignment for the given worker, or null.
12
+ */
13
+ dequeueForWorker(workerId) {
14
+ const idx = this.queue.findIndex((m) => m.workerId === workerId);
15
+ if (idx === -1)
16
+ return null;
17
+ const [msg] = this.queue.splice(idx, 1);
18
+ return msg;
19
+ }
20
+ /**
21
+ * Return all assignments for the given worker without removing them.
22
+ */
23
+ listForWorker(workerId) {
24
+ return this.queue.filter((m) => m.workerId === workerId);
25
+ }
26
+ }
27
+ //# sourceMappingURL=assignmentQueue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assignmentQueue.js","sourceRoot":"","sources":["../src/assignmentQueue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,OAAO,eAAe;IAClB,KAAK,GAAwB,EAAE,CAAC;IAExC,OAAO,CAAC,GAAsB;QAC5B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,QAAgB;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;QACjE,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAC5B,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACxC,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,QAAgB;QAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IAC3D,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=chatAgent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chatAgent.d.ts","sourceRoot":"","sources":["../src/chatAgent.ts"],"names":[],"mappings":""}
@@ -0,0 +1,89 @@
1
+ // import { buildBacklogOutput } from "@backlogmd/parser";
2
+ // //import { createChatAgent } from "@backlogmd/autopilot";
3
+ // import { BacklogCore } from "@backlogmd/core";
4
+ // import { DynamicTool } from "@langchain/core/tools";
5
+ // import { ChatOpenAI } from "@langchain/openai";
6
+ // import type { AgentExecutor } from "@langchain/classic/agents";
7
+ // import type { WorkerState } from "./workerRegistry.js";
8
+ export {};
9
+ // export interface CreateChatAgentForServerOptions {
10
+ // onBacklogChange?: () => void;
11
+ // /** Workers that have reported to the server (in-memory list). Used for list_workers tool. */
12
+ // getWorkerStates?: () => WorkerState[];
13
+ // }
14
+ // export async function createChatAgentForServer(
15
+ // backlogDir: string,
16
+ // options: CreateChatAgentForServerOptions = {},
17
+ // ): Promise<AgentExecutor | null> {
18
+ // const { onBacklogChange, getWorkerStates } = options;
19
+ // if (!process.env.OPENAI_API_KEY) {
20
+ // return null;
21
+ // }
22
+ // const getBacklog = new DynamicTool({
23
+ // name: "get_backlog",
24
+ // description:
25
+ // "Get the current backlog (work items and tasks). Use this to answer questions about what is on the backlog.",
26
+ // func: async () => {
27
+ // const output = buildBacklogOutput(backlogDir);
28
+ // return JSON.stringify(
29
+ // {
30
+ // entries: output.entries?.length ?? 0,
31
+ // items: output.items?.length ?? 0,
32
+ // tasks: output.tasks?.length ?? 0,
33
+ // validationErrors: output.validation?.errors?.length ?? 0,
34
+ // summary: output.entries?.slice(0, 20) ?? [],
35
+ // },
36
+ // null,
37
+ // 2,
38
+ // );
39
+ // },
40
+ // });
41
+ // const tools: InstanceType<typeof DynamicTool>[] = [getBacklog];
42
+ // if (getWorkerStates) {
43
+ // tools.push(
44
+ // new DynamicTool({
45
+ // name: "list_workers",
46
+ // description:
47
+ // "List workers that have reported to the server (name, role, status). Call this when the user asks for help, who is available, or what workers exist.",
48
+ // func: async () => {
49
+ // const workers = getWorkerStates();
50
+ // if (workers.length === 0) {
51
+ // return "No workers have reported yet. Workers register when they run with --server-url pointing to this server.";
52
+ // }
53
+ // return workers
54
+ // .map(
55
+ // (w) => `${w.name} (${w.role}): ${w.status}${w.taskTitle ? ` — ${w.taskTitle}` : ""}`,
56
+ // )
57
+ // .join("\n");
58
+ // },
59
+ // }),
60
+ // );
61
+ // }
62
+ // let core: Awaited<ReturnType<typeof BacklogCore.load>> | null = null;
63
+ // try {
64
+ // core = await BacklogCore.load({ rootDir: backlogDir });
65
+ // } catch (err) {
66
+ // console.warn(
67
+ // "[backlogmd-serve] Could not load core:",
68
+ // (err as Error).message,
69
+ // "- chat will have no backlog mutation tools.",
70
+ // );
71
+ // }
72
+ // try {
73
+ // const executor = await createChatAgent({
74
+ // llm: new ChatOpenAI({ temperature: 0 }),
75
+ // core: core ?? undefined,
76
+ // tools,
77
+ // onBacklogChange,
78
+ // });
79
+ // console.log("[backlogmd-serve] Chat agent ready.");
80
+ // return executor;
81
+ // } catch (err) {
82
+ // console.error(
83
+ // "[backlogmd-serve] Failed to create chat agent:",
84
+ // (err as Error).message,
85
+ // );
86
+ // return null;
87
+ // }
88
+ //}
89
+ //# sourceMappingURL=chatAgent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chatAgent.js","sourceRoot":"","sources":["../src/chatAgent.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,4DAA4D;AAC5D,iDAAiD;AACjD,uDAAuD;AACvD,kDAAkD;AAClD,kEAAkE;AAClE,0DAA0D;;AAE1D,qDAAqD;AACrD,kCAAkC;AAClC,kGAAkG;AAClG,2CAA2C;AAC3C,IAAI;AAEJ,kDAAkD;AAClD,wBAAwB;AACxB,mDAAmD;AACnD,qCAAqC;AACrC,0DAA0D;AAC1D,uCAAuC;AACvC,mBAAmB;AACnB,MAAM;AAEN,yCAAyC;AACzC,2BAA2B;AAC3B,mBAAmB;AACnB,sHAAsH;AACtH,0BAA0B;AAC1B,uDAAuD;AACvD,+BAA+B;AAC/B,YAAY;AACZ,kDAAkD;AAClD,8CAA8C;AAC9C,8CAA8C;AAC9C,sEAAsE;AACtE,yDAAyD;AACzD,aAAa;AACb,gBAAgB;AAChB,aAAa;AACb,WAAW;AACX,SAAS;AACT,QAAQ;AAER,oEAAoE;AAEpE,2BAA2B;AAC3B,kBAAkB;AAClB,0BAA0B;AAC1B,gCAAgC;AAChC,uBAAuB;AACvB,mKAAmK;AACnK,8BAA8B;AAC9B,+CAA+C;AAC/C,wCAAwC;AACxC,gIAAgI;AAChI,cAAc;AACd,2BAA2B;AAC3B,oBAAoB;AACpB,sGAAsG;AACtG,gBAAgB;AAChB,2BAA2B;AAC3B,aAAa;AACb,YAAY;AACZ,SAAS;AACT,MAAM;AAEN,0EAA0E;AAC1E,UAAU;AACV,8DAA8D;AAC9D,oBAAoB;AACpB,oBAAoB;AACpB,kDAAkD;AAClD,gCAAgC;AAChC,uDAAuD;AACvD,SAAS;AACT,MAAM;AAEN,QAAQ;AACR,6CAA6C;AAC7C,+CAA+C;AAC/C,+BAA+B;AAC/B,aAAa;AACb,uBAAuB;AACvB,QAAQ;AACR,wDAAwD;AACxD,qBAAqB;AACrB,kBAAkB;AAClB,mBAAmB;AACnB,wDAAwD;AACxD,8BAA8B;AAC9B,OAAO;AACP,iBAAiB;AACjB,IAAI;AACJ,GAAG"}
package/dist/cli.d.ts CHANGED
@@ -1,10 +1,12 @@
1
1
  #!/usr/bin/env node
2
+ import "dotenv/config";
2
3
  export interface CliArgs {
3
- dir: string;
4
+ /** Project root directory (must contain .backlogmd/) */
5
+ rootDir: string;
4
6
  port: number;
5
7
  host: string;
6
8
  help: boolean;
7
9
  }
8
10
  export declare function parseArgs(argv: string[]): CliArgs;
9
- export declare function run(argv: string[]): number;
11
+ export declare function run(argv: string[]): Promise<number>;
10
12
  //# sourceMappingURL=cli.d.ts.map
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAMA,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;CACf;AAUD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CA0CjD;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAwC1C"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,eAAe,CAAC;AAWvB,MAAM,WAAW,OAAO;IACpB,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;CACjB;AAUD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CA0CjD;AA4BD,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAkDzD"}
package/dist/cli.js CHANGED
@@ -1,17 +1,23 @@
1
1
  #!/usr/bin/env node
2
- import path from "node:path";
2
+ import "dotenv/config";
3
+ import path from "path";
3
4
  import fs from "node:fs";
5
+ import { fileURLToPath } from "url";
6
+ import { Backlogmd } from "@backlogmd/core";
4
7
  import { startServer } from "./index.js";
8
+ import { resolveBacklogRoot } from "./shared/os.js";
9
+ const __filename = fileURLToPath(import.meta.url);
10
+ const isMain = process.argv[1] && path.resolve(process.argv[1]) === __filename;
5
11
  const USAGE = `Usage: backlogmd-serve [options]
6
12
 
7
13
  Options:
8
- --dir <path> Path to .backlogmd/ directory (default: .backlogmd/)
14
+ --dir <path> Project root: must contain .backlogmd/ (with work/ inside) or a work/ directory (default: current directory)
9
15
  --port <port> Port to listen on (default: 3030)
10
16
  --host <host> Host to bind to (default: localhost)
11
17
  --help Show this help message`;
12
18
  export function parseArgs(argv) {
13
19
  const args = {
14
- dir: path.join(process.cwd(), ".backlogmd"),
20
+ rootDir: process.cwd(),
15
21
  port: 3030,
16
22
  host: "localhost",
17
23
  help: false,
@@ -22,7 +28,7 @@ export function parseArgs(argv) {
22
28
  if (i + 1 >= argv.length) {
23
29
  throw new Error("--dir requires a path argument");
24
30
  }
25
- args.dir = path.resolve(argv[++i]);
31
+ args.rootDir = path.resolve(argv[++i]);
26
32
  break;
27
33
  case "--port":
28
34
  if (i + 1 >= argv.length) {
@@ -50,7 +56,31 @@ export function parseArgs(argv) {
50
56
  }
51
57
  return args;
52
58
  }
53
- export function run(argv) {
59
+ // const STAFF_ROLE = { id: "executor", name: "Executor" } as const;
60
+ // function startAgentsInProcess(
61
+ // backlogRoot: string,
62
+ // host: string,
63
+ // port: number,
64
+ // ctx: AppContext,
65
+ // ): void {
66
+ // const url = `http://${host}:${port}`;
67
+ // void runWorkerLoop({
68
+ // backlogDir: backlogRoot,
69
+ // serverUrl: url,
70
+ // name: "Planner",
71
+ // role: PLANNER_ROLE,
72
+ // getWorkTrigger: ctx.getWorkTrigger,
73
+ // });
74
+ // void runWorkerLoop({
75
+ // backlogDir: backlogRoot,
76
+ // serverUrl: url,
77
+ // name: "Staff",
78
+ // role: STAFF_ROLE,
79
+ // getWorkTrigger: ctx.getWorkTrigger,
80
+ // });
81
+ // console.error("[serve] Started 2 agents in-process (event-driven, no poll loop)");
82
+ // }
83
+ export async function run(argv) {
54
84
  let args;
55
85
  try {
56
86
  args = parseArgs(argv);
@@ -64,14 +94,24 @@ export function run(argv) {
64
94
  console.log(USAGE);
65
95
  return 0;
66
96
  }
67
- if (!fs.existsSync(args.dir)) {
68
- console.error(`Error: directory not found: ${args.dir}`);
97
+ if (!fs.existsSync(args.rootDir)) {
98
+ console.error(`Error: project root not found: ${args.rootDir}`);
99
+ return 1;
100
+ }
101
+ const backlogRoot = resolveBacklogRoot(args.rootDir);
102
+ let backlogmd;
103
+ try {
104
+ backlogmd = await Backlogmd.load({ rootDir: backlogRoot });
105
+ }
106
+ catch (err) {
107
+ console.error("Failed to load backlog:", err.message);
69
108
  return 1;
70
109
  }
71
110
  const server = startServer({
72
- dir: args.dir,
111
+ dir: backlogRoot,
73
112
  port: args.port,
74
113
  host: args.host,
114
+ backlogmd,
75
115
  });
76
116
  const url = `http://${args.host}:${args.port}`;
77
117
  console.error(`BacklogMD board running at ${url}`);
@@ -85,8 +125,10 @@ export function run(argv) {
85
125
  process.on("SIGTERM", handleShutdown);
86
126
  return 0;
87
127
  }
88
- const exitCode = run(process.argv.slice(2));
89
- if (exitCode !== 0) {
90
- process.exit(exitCode);
128
+ if (isMain) {
129
+ run(process.argv.slice(2)).then((exitCode) => {
130
+ if (exitCode !== 0)
131
+ process.exit(exitCode);
132
+ });
91
133
  }
92
134
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { ServerResponse } from "node:http";
2
+ import type { Backlogmd } from "@backlogmd/core";
3
+ export type { WorkerReportBody, WorkerState } from "./workerRegistry.js";
4
+ import type { WorkerReportBody, WorkerState } from "./workerRegistry.js";
5
+ import type { AssignmentMessage } from "./assignmentQueue.js";
6
+ export type ChatAgent = {
7
+ invoke: (args: {
8
+ input: string;
9
+ }) => Promise<{
10
+ output: unknown;
11
+ }>;
12
+ };
13
+ export interface AppContext {
14
+ backlogDir: string;
15
+ /** Single source of truth for backlog state; all reads/writes go through this. */
16
+ backlogmd: Backlogmd;
17
+ /** Returns a chat agent instance, or null if unavailable (e.g. no API key). */
18
+ getChatAgent: () => Promise<ChatAgent | null>;
19
+ notifyClients: () => void;
20
+ /** Broadcast a worker update to all SSE clients. */
21
+ broadcastWorkerUpdate: (payload: WorkerReportBody) => void;
22
+ /** Broadcast status (e.g. worker count) to all SSE clients. */
23
+ broadcastStatus: () => void;
24
+ /** Update worker state and return current state (for report endpoint). */
25
+ reportWorker: (body: WorkerReportBody) => WorkerState;
26
+ /** Get current state of all known workers. */
27
+ getWorkerStates: () => WorkerState[];
28
+ /** Enqueue an assignment for a worker to consume via poll. */
29
+ enqueueAssignment: (msg: AssignmentMessage) => void;
30
+ /** Dequeue and return the next assignment (available work) for this worker, or null. */
31
+ dequeueAssignment: (workerId: string) => AssignmentMessage | null;
32
+ /** List all assignments for this worker without removing them. */
33
+ listAssignments: (workerId: string) => AssignmentMessage[];
34
+ addEventClient: (res: ServerResponse) => void;
35
+ removeEventClient: (res: ServerResponse) => void;
36
+ /** Claim an item (e.g. when in-progress but item has no tasks to set). Cleared when worker reports idle. */
37
+ setClaimedItem: (workerKey: string, itemId: string | null) => void;
38
+ /** Whether this item is currently claimed by any worker (exclude from assignments). */
39
+ isItemClaimed: (itemId: string) => boolean;
40
+ /** Returns a promise that resolves when work may be available (assign or backlog change). In-process workers wait on this instead of polling. */
41
+ getWorkTrigger: () => Promise<void>;
42
+ /** Signal in-process workers to check for work. Called after assign and on backlog change. */
43
+ triggerWorkAvailable: () => void;
44
+ }
45
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,MAAM,MAAM,SAAS,GAAG;IAAE,MAAM,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC;AAE9F,MAAM,WAAW,UAAU;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,SAAS,EAAE,SAAS,CAAC;IACrB,+EAA+E;IAC/E,YAAY,EAAE,MAAM,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAC9C,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,oDAAoD;IACpD,qBAAqB,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC3D,+DAA+D;IAC/D,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,0EAA0E;IAC1E,YAAY,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,WAAW,CAAC;IACtD,8CAA8C;IAC9C,eAAe,EAAE,MAAM,WAAW,EAAE,CAAC;IACrC,8DAA8D;IAC9D,iBAAiB,EAAE,CAAC,GAAG,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACpD,wFAAwF;IACxF,iBAAiB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,iBAAiB,GAAG,IAAI,CAAC;IAClE,kEAAkE;IAClE,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,iBAAiB,EAAE,CAAC;IAC3D,cAAc,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,IAAI,CAAC;IAC9C,iBAAiB,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,IAAI,CAAC;IACjD,4GAA4G;IAC5G,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACnE,uFAAuF;IACvF,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3C,iJAAiJ;IACjJ,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,8FAA8F;IAC9F,oBAAoB,EAAE,MAAM,IAAI,CAAC;CACpC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":""}
package/dist/html.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- import type { BacklogOutput } from "@backlogmd/types";
2
- export declare function renderHtml(output: BacklogOutput): string;
1
+ import type { BacklogStateDto } from "@backlogmd/types";
2
+ export declare function renderHtml(doc: BacklogStateDto): string;
3
3
  //# sourceMappingURL=html.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../src/html.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAQtD,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAGxD"}
1
+ {"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../src/html.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAsBxD,wBAAgB,UAAU,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAKvD"}
package/dist/html.js CHANGED
@@ -1,12 +1,27 @@
1
1
  import fs from "node:fs";
2
- import path from "node:path";
3
- import { fileURLToPath } from "node:url";
2
+ import path from "path";
3
+ import { fileURLToPath } from "url";
4
4
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
5
5
  const templatePath = path.resolve(__dirname, "..", "app", "dist", "index.html");
6
- const template = fs.readFileSync(templatePath, "utf-8");
7
6
  const PLACEHOLDER = "<!--__BACKLOG_DATA__-->";
8
- export function renderHtml(output) {
9
- const script = `<script>window.__BACKLOG__=${JSON.stringify(output)}</script>`;
7
+ /** In development, read template on each request so app rebuilds (e.g. vite --watch) are picked up without restarting the server. */
8
+ function getTemplate() {
9
+ if (process.env.NODE_ENV === "development" && fs.existsSync(templatePath)) {
10
+ return fs.readFileSync(templatePath, "utf-8");
11
+ }
12
+ return cachedTemplate;
13
+ }
14
+ let cachedTemplate;
15
+ try {
16
+ cachedTemplate = fs.readFileSync(templatePath, "utf-8");
17
+ }
18
+ catch {
19
+ cachedTemplate = "";
20
+ }
21
+ export function renderHtml(doc) {
22
+ const template = getTemplate();
23
+ const chatEnabled = Boolean(process.env.OPENAI_API_KEY?.trim());
24
+ const script = `<script>window.__BACKLOG__=${JSON.stringify(doc)};window.__CHAT_ENABLED__=${JSON.stringify(chatEnabled)}</script>`;
10
25
  return template.replace(PLACEHOLDER, script);
11
26
  }
12
27
  //# sourceMappingURL=html.js.map
package/dist/html.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"html.js","sourceRoot":"","sources":["../src/html.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;AAChF,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;AAExD,MAAM,WAAW,GAAG,yBAAyB,CAAC;AAE9C,MAAM,UAAU,UAAU,CAAC,MAAqB;IAC9C,MAAM,MAAM,GAAG,8BAA8B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC;IAC/E,OAAO,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AAC/C,CAAC"}
1
+ {"version":3,"file":"html.js","sourceRoot":"","sources":["../src/html.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAGpC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;AAEhF,MAAM,WAAW,GAAG,yBAAyB,CAAC;AAE9C,qIAAqI;AACrI,SAAS,WAAW;IAClB,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC1E,OAAO,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,IAAI,cAAsB,CAAC;AAC3B,IAAI,CAAC;IACH,cAAc,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;AAC1D,CAAC;AAAC,MAAM,CAAC;IACP,cAAc,GAAG,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAoB;IAC7C,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,8BAA8B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,4BAA4B,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,CAAC;IACnI,OAAO,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AAC/C,CAAC"}
package/dist/index.d.ts CHANGED
@@ -4,9 +4,13 @@ export interface ServerOptions {
4
4
  dir?: string;
5
5
  port?: number;
6
6
  host?: string;
7
+ /** Backlogmd instance (source of truth). Must be loaded before startServer. */
8
+ backlogmd: import("@backlogmd/core").Backlogmd;
9
+ /** Called when the server is listening; receives ctx (e.g. to start in-process workers with getWorkTrigger). */
10
+ onListening?: (ctx: import("./context.js").AppContext) => void;
7
11
  }
8
12
  export interface ServerHandle {
9
13
  close: () => void;
10
14
  }
11
- export declare function startServer(options?: ServerOptions): ServerHandle;
15
+ export declare function startServer(options: ServerOptions): ServerHandle;
12
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,wBAAgB,WAAW,CAAC,OAAO,GAAE,aAAkB,GAAG,YAAY,CAkBrE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,aAAa;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,SAAS,EAAE,OAAO,iBAAiB,EAAE,SAAS,CAAC;IAC/C,gHAAgH;IAChH,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,cAAc,EAAE,UAAU,KAAK,IAAI,CAAC;CAClE;AAED,MAAM,WAAW,YAAY;IACzB,KAAK,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,YAAY,CA2BhE"}
package/dist/index.js CHANGED
@@ -1,15 +1,21 @@
1
- import path from "node:path";
1
+ import path from "path";
2
2
  import { watchBacklogDir } from "./watcher.js";
3
3
  import { createServer } from "./server.js";
4
4
  export { createServer } from "./server.js";
5
- export function startServer(options = {}) {
5
+ export function startServer(options) {
6
6
  const cwd = process.cwd();
7
7
  const dir = path.resolve(options.dir || path.join(cwd, ".backlogmd"));
8
8
  const port = options.port || 3000;
9
- const host = options.host || "localhost";
10
- const { server, notifyClients, close: closeServer } = createServer(port, dir);
9
+ const { backlogmd } = options;
10
+ const { notifyClients, close: closeServer, triggerWorkAvailable, } = createServer(port, dir, {
11
+ backlogmd,
12
+ onListening: options.onListening,
13
+ });
11
14
  const watcher = watchBacklogDir(dir, () => {
12
- notifyClients();
15
+ void backlogmd.reconcile().then(() => {
16
+ notifyClients();
17
+ triggerWorkAvailable();
18
+ });
13
19
  });
14
20
  const close = () => {
15
21
  watcher.close();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAa3C,MAAM,UAAU,WAAW,CAAC,UAAyB,EAAE;IACrD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC;IACtE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC;IAClC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC;IAEzC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAE9E,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE;QACxC,aAAa,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,WAAW,EAAE,CAAC;IAChB,CAAC,CAAC;IAEF,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAiB3C,MAAM,UAAU,WAAW,CAAC,OAAsB;IAC9C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC;IACtE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC;IAClC,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAC9B,MAAM,EACF,aAAa,EACb,KAAK,EAAE,WAAW,EAClB,oBAAoB,GACvB,GAAG,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE;QACxB,SAAS;QACT,WAAW,EAAE,OAAO,CAAC,WAAW;KACnC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE;QACtC,KAAK,SAAS,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;YACjC,aAAa,EAAE,CAAC;YAChB,oBAAoB,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,GAAG,EAAE;QACf,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,WAAW,EAAE,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,EAAE,KAAK,EAAE,CAAC;AACrB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { BacklogStateDto } from "@backlogmd/types";
2
+ /**
3
+ * Build a minimal BacklogStateDto with a single error entry.
4
+ * Used as a fallback when the parser fails catastrophically.
5
+ */
6
+ export declare function errorBacklogStateDto(backlogDir: string, err: Error): BacklogStateDto;
7
+ //# sourceMappingURL=errorOutput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorOutput.d.ts","sourceRoot":"","sources":["../../src/lib/errorOutput.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,GAAG,eAAe,CAiBpF"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Build a minimal BacklogStateDto with a single error entry.
3
+ * Used as a fallback when the parser fails catastrophically.
4
+ */
5
+ export function errorBacklogStateDto(backlogDir, err) {
6
+ return {
7
+ protocol: "backlogmd/v2",
8
+ generatedAt: new Date().toISOString(),
9
+ rootDir: backlogDir,
10
+ validation: {
11
+ errors: [
12
+ {
13
+ code: "FATAL_PARSE_ERROR",
14
+ message: `Failed to read backlog: ${err.message}`,
15
+ source: "",
16
+ },
17
+ ],
18
+ warnings: [],
19
+ },
20
+ work: [],
21
+ };
22
+ }
23
+ //# sourceMappingURL=errorOutput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorOutput.js","sourceRoot":"","sources":["../../src/lib/errorOutput.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,UAAkB,EAAE,GAAU;IACjE,OAAO;QACL,QAAQ,EAAE,cAAc;QACxB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,OAAO,EAAE,UAAU;QACnB,UAAU,EAAE;YACV,MAAM,EAAE;gBACN;oBACE,IAAI,EAAE,mBAAmB;oBACzB,OAAO,EAAE,2BAA2B,GAAG,CAAC,OAAO,EAAE;oBACjD,MAAM,EAAE,EAAE;iBACX;aACF;YACD,QAAQ,EAAE,EAAE;SACb;QACD,IAAI,EAAE,EAAE;KACT,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const VALID_STATUSES: Set<string>;
2
+ //# sourceMappingURL=validStatuses.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validStatuses.d.ts","sourceRoot":"","sources":["../../src/lib/validStatuses.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,EAAE,GAAG,CAAC,MAAM,CAKrC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export const VALID_STATUSES = new Set([
2
+ "open",
3
+ "block",
4
+ "in-progress",
5
+ "done",
6
+ ]);
7
+ //# sourceMappingURL=validStatuses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validStatuses.js","sourceRoot":"","sources":["../../src/lib/validStatuses.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAgB,IAAI,GAAG,CAAC;IACjD,MAAM;IACN,OAAO;IACP,aAAa;IACb,MAAM;CACP,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { FastifyInstance } from "fastify";
2
+ import type { AppContext } from "./context.js";
3
+ export declare function registerRoutes(app: FastifyInstance, ctx: AppContext): void;
4
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAoB,MAAM,cAAc,CAAC;AAiBjE,wBAAgB,cAAc,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,UAAU,GAAG,IAAI,CAiE1E"}
package/dist/routes.js ADDED
@@ -0,0 +1,36 @@
1
+ import { getIndexPage } from "./useCases/getIndexPage.js";
2
+ import { getBacklog } from "./useCases/getBacklog.js";
3
+ import { patchTaskStatus } from "./useCases/patchTaskStatus.js";
4
+ import { getTaskContent } from "./useCases/getTaskContent.js";
5
+ import { putTaskContent } from "./useCases/putTaskContent.js";
6
+ import { deleteTask } from "./useCases/deleteTask.js";
7
+ import { deleteItem } from "./useCases/deleteItem.js";
8
+ import { getItemContent } from "./useCases/getItemContent.js";
9
+ import { putItemContent } from "./useCases/putItemContent.js";
10
+ import { postChat } from "./useCases/postChat.js";
11
+ import { getEvents } from "./useCases/getEvents.js";
12
+ import { postWorkerReport } from "./useCases/postWorkerReport.js";
13
+ import { getWorkers } from "./useCases/getWorkers.js";
14
+ import { postAssignWork } from "./useCases/postAssignWork.js";
15
+ import { getWorkerAssignments } from "./useCases/getWorkerAssignments.js";
16
+ export function registerRoutes(app, ctx) {
17
+ app.get("/", (req, reply) => getIndexPage(ctx, req, reply));
18
+ app.get("/index.html", (req, reply) => getIndexPage(ctx, req, reply));
19
+ app.get("/api/backlog", (req, reply) => getBacklog(ctx, req, reply));
20
+ app.get("/api/backlog.json", (req, reply) => getBacklog(ctx, req, reply));
21
+ app.patch("/api/tasks/:taskId", (req, reply) => patchTaskStatus(ctx, req, reply));
22
+ app.get("/api/tasks/:taskId/content", (req, reply) => getTaskContent(ctx, req, reply));
23
+ app.put("/api/tasks/:taskId/content", (req, reply) => putTaskContent(ctx, req, reply));
24
+ app.delete("/api/tasks/:taskId", (req, reply) => deleteTask(ctx, req, reply));
25
+ app.get("/api/items/:encodedSlug/content", (req, reply) => getItemContent(ctx, req, reply));
26
+ app.put("/api/items/:encodedSlug/content", (req, reply) => putItemContent(ctx, req, reply));
27
+ app.delete("/api/items/:encodedSlug", (req, reply) => deleteItem(ctx, req, reply));
28
+ app.post("/api/chat", (req, reply) => postChat(ctx, req, reply));
29
+ app.get("/events", (req, reply) => getEvents(ctx, req, reply));
30
+ app.get("/api/workers", (req, reply) => getWorkers(ctx, req, reply));
31
+ app.post("/api/workers/report", (req, reply) => postWorkerReport(ctx, req, reply));
32
+ app.post("/api/workers/assign", (req, reply) => postAssignWork(ctx, req, reply));
33
+ app.get("/api/work", (req, reply) => getWorkerAssignments(ctx, req, reply));
34
+ app.get("/api/workers/assignments", (req, reply) => getWorkerAssignments(ctx, req, reply));
35
+ }
36
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,cAAc,EAAuB,MAAM,8BAA8B,CAAC;AACnF,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAE1E,MAAM,UAAU,cAAc,CAAC,GAAoB,EAAE,GAAe;IAClE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IAC5D,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IAEtE,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IACrE,GAAG,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IAE1E,GAAG,CAAC,KAAK,CAGN,oBAAoB,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CACtC,eAAe,CAAC,GAAG,EAAE,GAAY,EAAE,KAAK,CAAC,CAC1C,CAAC;IACF,GAAG,CAAC,GAAG,CACL,4BAA4B,EAC5B,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,GAAY,EAAE,KAAK,CAAC,CACzD,CAAC;IACF,GAAG,CAAC,GAAG,CACL,4BAA4B,EAC5B,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,GAAY,EAAE,KAAK,CAAC,CACzD,CAAC;IACF,GAAG,CAAC,MAAM,CACR,oBAAoB,EACpB,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,GAAY,EAAE,KAAK,CAAC,CACrD,CAAC;IAEF,GAAG,CAAC,GAAG,CACL,iCAAiC,EACjC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,GAAY,EAAE,KAAK,CAAC,CACzD,CAAC;IACF,GAAG,CAAC,GAAG,CACL,iCAAiC,EACjC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,GAAY,EAAE,KAAK,CAAC,CACzD,CAAC;IACF,GAAG,CAAC,MAAM,CACR,yBAAyB,EACzB,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,GAAY,EAAE,KAAK,CAAC,CACrD,CAAC;IAEF,GAAG,CAAC,IAAI,CACN,WAAW,EACX,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAY,EAAE,KAAK,CAAC,CACnD,CAAC;IAEF,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IAE/D,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IACrE,GAAG,CAAC,IAAI,CACN,qBAAqB,EACrB,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,EAAE,GAAY,EAAE,KAAK,CAAC,CAC3D,CAAC;IACF,GAAG,CAAC,IAAI,CACN,qBAAqB,EACrB,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,GAAY,EAAE,KAAK,CAAC,CACzD,CAAC;IAEF,GAAG,CAAC,GAAG,CACL,WAAW,EACX,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,oBAAoB,CAAC,GAAG,EAAE,GAAY,EAAE,KAAK,CAAC,CAC/D,CAAC;IAEF,GAAG,CAAC,GAAG,CACL,0BAA0B,EAC1B,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,oBAAoB,CAAC,GAAG,EAAE,GAAY,EAAE,KAAK,CAAC,CAC/D,CAAC;AACJ,CAAC"}
package/dist/server.d.ts CHANGED
@@ -1,8 +1,17 @@
1
- import { type Server } from "node:http";
1
+ import type { Server } from "http";
2
+ import type { AppContext } from "./context.js";
2
3
  export interface ServerResult {
3
4
  server: Server;
4
5
  notifyClients: () => void;
5
6
  close: () => void;
7
+ /** Signal in-process workers to check for work (e.g. for watcher). */
8
+ triggerWorkAvailable: () => void;
6
9
  }
7
- export declare function createServer(port: number, backlogDir: string): ServerResult;
10
+ export interface CreateServerOptions {
11
+ /** Backlogmd instance (source of truth); must be loaded before calling createServer. */
12
+ backlogmd: import("@backlogmd/core").Backlogmd;
13
+ /** Called when the server is listening; receives ctx so workers can register for work triggers. */
14
+ onListening?: (ctx: AppContext) => void;
15
+ }
16
+ export declare function createServer(port: number, backlogDir: string, options: CreateServerOptions): ServerResult;
8
17
  //# sourceMappingURL=server.d.ts.map