@mclawnet/task 0.1.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 (114) hide show
  1. package/README.md +100 -0
  2. package/dist/__tests__/compute-lead-briefing.test.d.ts +2 -0
  3. package/dist/__tests__/compute-lead-briefing.test.d.ts.map +1 -0
  4. package/dist/__tests__/compute-lead-briefing.test.js +81 -0
  5. package/dist/__tests__/compute-lead-briefing.test.js.map +1 -0
  6. package/dist/__tests__/compute-member-briefing.test.d.ts +2 -0
  7. package/dist/__tests__/compute-member-briefing.test.d.ts.map +1 -0
  8. package/dist/__tests__/compute-member-briefing.test.js +36 -0
  9. package/dist/__tests__/compute-member-briefing.test.js.map +1 -0
  10. package/dist/__tests__/compute-task-briefing.test.d.ts +2 -0
  11. package/dist/__tests__/compute-task-briefing.test.d.ts.map +1 -0
  12. package/dist/__tests__/compute-task-briefing.test.js +72 -0
  13. package/dist/__tests__/compute-task-briefing.test.js.map +1 -0
  14. package/dist/__tests__/dag.test.d.ts +2 -0
  15. package/dist/__tests__/dag.test.d.ts.map +1 -0
  16. package/dist/__tests__/dag.test.js +81 -0
  17. package/dist/__tests__/dag.test.js.map +1 -0
  18. package/dist/__tests__/format-lead-briefing.test.d.ts +2 -0
  19. package/dist/__tests__/format-lead-briefing.test.d.ts.map +1 -0
  20. package/dist/__tests__/format-lead-briefing.test.js +70 -0
  21. package/dist/__tests__/format-lead-briefing.test.js.map +1 -0
  22. package/dist/__tests__/format-member-briefing.test.d.ts +2 -0
  23. package/dist/__tests__/format-member-briefing.test.d.ts.map +1 -0
  24. package/dist/__tests__/format-member-briefing.test.js +33 -0
  25. package/dist/__tests__/format-member-briefing.test.js.map +1 -0
  26. package/dist/__tests__/format-task-briefing.test.d.ts +2 -0
  27. package/dist/__tests__/format-task-briefing.test.d.ts.map +1 -0
  28. package/dist/__tests__/format-task-briefing.test.js +74 -0
  29. package/dist/__tests__/format-task-briefing.test.js.map +1 -0
  30. package/dist/__tests__/locking.test.d.ts +2 -0
  31. package/dist/__tests__/locking.test.d.ts.map +1 -0
  32. package/dist/__tests__/locking.test.js +38 -0
  33. package/dist/__tests__/locking.test.js.map +1 -0
  34. package/dist/__tests__/meta.test.d.ts +2 -0
  35. package/dist/__tests__/meta.test.d.ts.map +1 -0
  36. package/dist/__tests__/meta.test.js +48 -0
  37. package/dist/__tests__/meta.test.js.map +1 -0
  38. package/dist/__tests__/path.test.d.ts +2 -0
  39. package/dist/__tests__/path.test.d.ts.map +1 -0
  40. package/dist/__tests__/path.test.js +45 -0
  41. package/dist/__tests__/path.test.js.map +1 -0
  42. package/dist/__tests__/schema.test.d.ts +2 -0
  43. package/dist/__tests__/schema.test.d.ts.map +1 -0
  44. package/dist/__tests__/schema.test.js +49 -0
  45. package/dist/__tests__/schema.test.js.map +1 -0
  46. package/dist/__tests__/store-create-deps.test.d.ts +2 -0
  47. package/dist/__tests__/store-create-deps.test.d.ts.map +1 -0
  48. package/dist/__tests__/store-create-deps.test.js +23 -0
  49. package/dist/__tests__/store-create-deps.test.js.map +1 -0
  50. package/dist/__tests__/store-link.test.d.ts +2 -0
  51. package/dist/__tests__/store-link.test.d.ts.map +1 -0
  52. package/dist/__tests__/store-link.test.js +64 -0
  53. package/dist/__tests__/store-link.test.js.map +1 -0
  54. package/dist/__tests__/store-rebuild.test.d.ts +2 -0
  55. package/dist/__tests__/store-rebuild.test.d.ts.map +1 -0
  56. package/dist/__tests__/store-rebuild.test.js +47 -0
  57. package/dist/__tests__/store-rebuild.test.js.map +1 -0
  58. package/dist/__tests__/store.test.d.ts +2 -0
  59. package/dist/__tests__/store.test.d.ts.map +1 -0
  60. package/dist/__tests__/store.test.js +70 -0
  61. package/dist/__tests__/store.test.js.map +1 -0
  62. package/dist/briefings/compute-lead.d.ts +17 -0
  63. package/dist/briefings/compute-lead.d.ts.map +1 -0
  64. package/dist/briefings/compute-lead.js +52 -0
  65. package/dist/briefings/compute-lead.js.map +1 -0
  66. package/dist/briefings/compute-member.d.ts +12 -0
  67. package/dist/briefings/compute-member.d.ts.map +1 -0
  68. package/dist/briefings/compute-member.js +30 -0
  69. package/dist/briefings/compute-member.js.map +1 -0
  70. package/dist/briefings/compute-task.d.ts +17 -0
  71. package/dist/briefings/compute-task.d.ts.map +1 -0
  72. package/dist/briefings/compute-task.js +60 -0
  73. package/dist/briefings/compute-task.js.map +1 -0
  74. package/dist/briefings/format-lead.d.ts +19 -0
  75. package/dist/briefings/format-lead.d.ts.map +1 -0
  76. package/dist/briefings/format-lead.js +47 -0
  77. package/dist/briefings/format-lead.js.map +1 -0
  78. package/dist/briefings/format-member.d.ts +18 -0
  79. package/dist/briefings/format-member.d.ts.map +1 -0
  80. package/dist/briefings/format-member.js +24 -0
  81. package/dist/briefings/format-member.js.map +1 -0
  82. package/dist/briefings/format-task.d.ts +19 -0
  83. package/dist/briefings/format-task.d.ts.map +1 -0
  84. package/dist/briefings/format-task.js +48 -0
  85. package/dist/briefings/format-task.js.map +1 -0
  86. package/dist/dag.d.ts +10 -0
  87. package/dist/dag.d.ts.map +1 -0
  88. package/dist/dag.js +33 -0
  89. package/dist/dag.js.map +1 -0
  90. package/dist/index.d.ts +17 -0
  91. package/dist/index.d.ts.map +1 -0
  92. package/dist/index.js +13 -0
  93. package/dist/index.js.map +1 -0
  94. package/dist/locking.d.ts +8 -0
  95. package/dist/locking.d.ts.map +1 -0
  96. package/dist/locking.js +19 -0
  97. package/dist/locking.js.map +1 -0
  98. package/dist/meta.d.ts +21 -0
  99. package/dist/meta.d.ts.map +1 -0
  100. package/dist/meta.js +37 -0
  101. package/dist/meta.js.map +1 -0
  102. package/dist/path.d.ts +7 -0
  103. package/dist/path.d.ts.map +1 -0
  104. package/dist/path.js +34 -0
  105. package/dist/path.js.map +1 -0
  106. package/dist/schema.d.ts +42 -0
  107. package/dist/schema.d.ts.map +1 -0
  108. package/dist/schema.js +41 -0
  109. package/dist/schema.js.map +1 -0
  110. package/dist/store.d.ts +47 -0
  111. package/dist/store.d.ts.map +1 -0
  112. package/dist/store.js +248 -0
  113. package/dist/store.js.map +1 -0
  114. package/package.json +33 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta.js","sourceRoot":"","sources":["../src/meta.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,GACnD,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AASlD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,IAAa;IAC9D,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACrC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAyB,CAAC;YAC/E,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;gBACjF,OAAO;YACT,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,6BAA6B;QAC/B,CAAC;IACH,CAAC;IACD,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAgB;QACxB,OAAO,EAAE,CAAC;QACV,OAAO;QACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IACF,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACrD,CAAC"}
package/dist/path.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ export declare function encodeCwd(absPath: string): string;
2
+ export declare function projectRoot(workDir: string, home?: string): string;
3
+ export declare function tasksDir(workDir: string, home?: string): string;
4
+ export declare function taskFile(workDir: string, taskId: string, home?: string): string;
5
+ export declare function indexFile(workDir: string, home?: string): string;
6
+ export declare function metaFile(workDir: string, home?: string): string;
7
+ //# sourceMappingURL=path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../src/path.ts"],"names":[],"mappings":"AAGA,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAejD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAkB,GAAG,MAAM,CAE7E;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAE/E;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAE/D"}
package/dist/path.js ADDED
@@ -0,0 +1,34 @@
1
+ import { join } from "node:path";
2
+ import { homedir } from "node:os";
3
+ export function encodeCwd(absPath) {
4
+ // POSIX: /Users/lcf/code/foo → -Users-lcf-code-foo
5
+ // Win32: C:\Users\lcf\code\foo → C--Users-lcf-code-foo (colon and \ both → -)
6
+ // \\server\share\path → --server-share-path
7
+ const isPosix = absPath.startsWith("/");
8
+ const isWin = /^[a-zA-Z]:[\\/]/.test(absPath) || absPath.startsWith("\\\\");
9
+ if (!isPosix && !isWin) {
10
+ throw new Error(`encodeCwd requires an absolute path, got: ${absPath}`);
11
+ }
12
+ // Trim a single trailing slash/backslash (but never reduce a root to empty).
13
+ const trimmed = absPath.length > 1 && (absPath.endsWith("/") || absPath.endsWith("\\"))
14
+ ? absPath.slice(0, -1)
15
+ : absPath;
16
+ // Replace path separators and the Windows drive colon with a dash.
17
+ return trimmed.replace(/[\\/:]/g, "-");
18
+ }
19
+ export function projectRoot(workDir, home = homedir()) {
20
+ return join(home, ".clawnet", "projects", encodeCwd(workDir));
21
+ }
22
+ export function tasksDir(workDir, home) {
23
+ return join(projectRoot(workDir, home), "tasks");
24
+ }
25
+ export function taskFile(workDir, taskId, home) {
26
+ return join(tasksDir(workDir, home), `${taskId}.json`);
27
+ }
28
+ export function indexFile(workDir, home) {
29
+ return join(tasksDir(workDir, home), "index.json");
30
+ }
31
+ export function metaFile(workDir, home) {
32
+ return join(projectRoot(workDir, home), "meta.json");
33
+ }
34
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../src/path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,oDAAoD;IACpD,+EAA+E;IAC/E,oDAAoD;IACpD,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,KAAK,GAAK,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC9E,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,6CAA6C,OAAO,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,6EAA6E;IAC7E,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACrF,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtB,CAAC,CAAC,OAAO,CAAC;IACZ,mEAAmE;IACnE,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,OAAe,OAAO,EAAE;IACnE,OAAO,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAe,EAAE,IAAa;IACrD,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAe,EAAE,MAAc,EAAE,IAAa;IACrE,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,GAAG,MAAM,OAAO,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAe,EAAE,IAAa;IACtD,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,YAAY,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAe,EAAE,IAAa;IACrD,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,WAAW,CAAC,CAAC;AACvD,CAAC"}
@@ -0,0 +1,42 @@
1
+ export type TaskStatus = "pending" | "in_progress" | "completed" | "cancelled";
2
+ export declare const TaskStatusSchema: Set<TaskStatus>;
3
+ export interface TaskHistoryEvent {
4
+ type: string;
5
+ at: string;
6
+ payload?: unknown;
7
+ }
8
+ export interface TaskComment {
9
+ id: string;
10
+ author: string;
11
+ type: string;
12
+ body: string;
13
+ createdAt: string;
14
+ }
15
+ export interface Task {
16
+ id: string;
17
+ displayId: string;
18
+ createdAt: string;
19
+ updatedAt: string;
20
+ status: TaskStatus;
21
+ teamName: string;
22
+ swarmId: string | null;
23
+ owner: string | null;
24
+ subject: string;
25
+ description: string;
26
+ blockedBy: string[];
27
+ blocks: string[];
28
+ historyEvents: TaskHistoryEvent[];
29
+ comments: TaskComment[];
30
+ }
31
+ export interface CreateEmptyTaskInput {
32
+ id: string;
33
+ teamName: string;
34
+ subject: string;
35
+ description?: string;
36
+ swarmId?: string | null;
37
+ owner?: string | null;
38
+ blockedBy?: string[];
39
+ }
40
+ export declare function createEmptyTask(input: CreateEmptyTaskInput): Task;
41
+ export declare function validateTask(t: Task): void;
42
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,WAAW,CAAC;AAE/E,eAAO,MAAM,gBAAgB,EAAE,GAAG,CAAC,UAAU,CAE3C,CAAC;AAEH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,EAAE,gBAAgB,EAAE,CAAC;IAClC,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,IAAI,CAkBjE;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAS1C"}
package/dist/schema.js ADDED
@@ -0,0 +1,41 @@
1
+ export const TaskStatusSchema = new Set([
2
+ "pending", "in_progress", "completed", "cancelled",
3
+ ]);
4
+ export function createEmptyTask(input) {
5
+ const now = new Date().toISOString();
6
+ return {
7
+ id: input.id,
8
+ displayId: input.id.slice(0, 8),
9
+ createdAt: now,
10
+ updatedAt: now,
11
+ status: "pending",
12
+ teamName: input.teamName,
13
+ swarmId: input.swarmId ?? null,
14
+ owner: input.owner ?? null,
15
+ subject: input.subject,
16
+ description: input.description ?? "",
17
+ blockedBy: input.blockedBy ?? [],
18
+ blocks: [],
19
+ historyEvents: [],
20
+ comments: [],
21
+ };
22
+ }
23
+ export function validateTask(t) {
24
+ if (!t.id)
25
+ throw new Error("Task.id required");
26
+ if (!t.displayId)
27
+ throw new Error("Task.displayId required");
28
+ if (!TaskStatusSchema.has(t.status))
29
+ throw new Error(`Task.status invalid: ${t.status}`);
30
+ if (!t.teamName)
31
+ throw new Error("Task.teamName required");
32
+ if (!Array.isArray(t.blockedBy))
33
+ throw new Error("Task.blockedBy must be array");
34
+ if (!Array.isArray(t.blocks))
35
+ throw new Error("Task.blocks must be array");
36
+ if (!Array.isArray(t.historyEvents))
37
+ throw new Error("Task.historyEvents must be array");
38
+ if (!Array.isArray(t.comments))
39
+ throw new Error("Task.comments must be array");
40
+ }
41
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,gBAAgB,GAAoB,IAAI,GAAG,CAAC;IACvD,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW;CACnD,CAAC,CAAC;AA2CH,MAAM,UAAU,eAAe,CAAC,KAA2B;IACzD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,OAAO;QACL,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/B,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;QACd,MAAM,EAAE,SAAS;QACjB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI;QAC9B,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,IAAI;QAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE;QACpC,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,EAAE;QAChC,MAAM,EAAE,EAAE;QACV,aAAa,EAAE,EAAE;QACjB,QAAQ,EAAE,EAAE;KACb,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,CAAO;IAClC,IAAI,CAAC,CAAC,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAC/C,IAAI,CAAC,CAAC,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7D,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IACzF,IAAI,CAAC,CAAC,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC3D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACjF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC3E,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACzF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;AACjF,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { Task, TaskComment } from "./schema.js";
2
+ export interface TaskStoreOptions {
3
+ workDir: string;
4
+ home?: string;
5
+ }
6
+ export interface IndexEntry {
7
+ id: string;
8
+ displayId: string;
9
+ status: string;
10
+ subject: string;
11
+ owner: string | null;
12
+ swarmId: string | null;
13
+ }
14
+ export interface CreateInput {
15
+ teamName: string;
16
+ subject: string;
17
+ description?: string;
18
+ swarmId?: string | null;
19
+ owner?: string | null;
20
+ blockedBy?: string[];
21
+ }
22
+ export declare class TaskStore {
23
+ private readonly opts;
24
+ constructor(opts: TaskStoreOptions);
25
+ private taskPath;
26
+ private indexPath;
27
+ private readIndex;
28
+ private writeIndex;
29
+ private upsertIndexEntry;
30
+ private writeTask;
31
+ private persist;
32
+ private ensureIndexFileExists;
33
+ create(input: CreateInput): Promise<Task>;
34
+ tryGet(id: string): Task | null;
35
+ get(id: string): Task;
36
+ update(id: string, patch: Partial<Task>): Promise<Task>;
37
+ addComment(id: string, comment: Omit<TaskComment, "createdAt"> & {
38
+ createdAt?: string;
39
+ }): Promise<void>;
40
+ list(): IndexEntry[];
41
+ /** List index entries for a given swarmId. Empty when no matches. */
42
+ listBySwarm(swarmId: string): IndexEntry[];
43
+ rebuildIndex(): Promise<void>;
44
+ link(fromId: string, toId: string): Promise<void>;
45
+ unlink(fromId: string, toId: string): Promise<void>;
46
+ }
47
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,IAAI,EAAE,WAAW,EAClB,MAAM,aAAa,CAAC;AAQrB,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAOD,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,qBAAa,SAAS;IACR,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,gBAAgB;IAYnD,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,qBAAqB;IAMvB,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAiC/C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAU/B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAMf,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBvD,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,GAAG;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAc7G,IAAI,IAAI,UAAU,EAAE;IAIpB,qEAAqE;IACrE,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE;IAIpC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAgC7B,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BjD,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAuB1D"}
package/dist/store.js ADDED
@@ -0,0 +1,248 @@
1
+ import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync, } from "node:fs";
2
+ import { randomUUID } from "node:crypto";
3
+ import { dirname } from "node:path";
4
+ import { createEmptyTask, validateTask, } from "./schema.js";
5
+ import { projectRoot, tasksDir, taskFile, indexFile, } from "./path.js";
6
+ import { ensureProjectMeta } from "./meta.js";
7
+ import { withLock } from "./locking.js";
8
+ import { wouldCreateCycle } from "./dag.js";
9
+ export class TaskStore {
10
+ opts;
11
+ constructor(opts) {
12
+ this.opts = opts;
13
+ mkdirSync(tasksDir(this.opts.workDir, this.opts.home), { recursive: true });
14
+ mkdirSync(projectRoot(this.opts.workDir, this.opts.home), { recursive: true });
15
+ // Bootstrap project meta.json so hub /api/projects can discover this project.
16
+ // Idempotent and best-effort: errors here must not break TaskStore use.
17
+ try {
18
+ ensureProjectMeta(this.opts.workDir, this.opts.home);
19
+ }
20
+ catch {
21
+ // swallow — meta is a discovery hint, not load-bearing for task ops
22
+ }
23
+ }
24
+ taskPath(id) {
25
+ return taskFile(this.opts.workDir, id, this.opts.home);
26
+ }
27
+ indexPath() {
28
+ return indexFile(this.opts.workDir, this.opts.home);
29
+ }
30
+ readIndex() {
31
+ const p = this.indexPath();
32
+ if (!existsSync(p))
33
+ return { version: 1, tasks: {} };
34
+ try {
35
+ return JSON.parse(readFileSync(p, "utf-8"));
36
+ }
37
+ catch {
38
+ return { version: 1, tasks: {} };
39
+ }
40
+ }
41
+ writeIndex(idx) {
42
+ mkdirSync(dirname(this.indexPath()), { recursive: true });
43
+ writeFileSync(this.indexPath(), JSON.stringify(idx, null, 2));
44
+ }
45
+ upsertIndexEntry(task) {
46
+ const idx = this.readIndex();
47
+ idx.tasks[task.id] = {
48
+ id: task.id,
49
+ displayId: task.displayId,
50
+ status: task.status,
51
+ subject: task.subject,
52
+ owner: task.owner,
53
+ swarmId: task.swarmId,
54
+ };
55
+ this.writeIndex(idx);
56
+ }
57
+ writeTask(task) {
58
+ validateTask(task);
59
+ mkdirSync(dirname(this.taskPath(task.id)), { recursive: true });
60
+ writeFileSync(this.taskPath(task.id), JSON.stringify(task, null, 2));
61
+ }
62
+ persist(task) {
63
+ this.writeTask(task);
64
+ this.upsertIndexEntry(task);
65
+ }
66
+ ensureIndexFileExists() {
67
+ if (!existsSync(this.indexPath())) {
68
+ this.writeIndex({ version: 1, tasks: {} });
69
+ }
70
+ }
71
+ async create(input) {
72
+ this.ensureIndexFileExists();
73
+ return withLock(this.indexPath(), async () => {
74
+ for (const depId of input.blockedBy ?? []) {
75
+ if (!this.tryGet(depId)) {
76
+ throw new Error(`dependency not found: ${depId}`);
77
+ }
78
+ }
79
+ const task = createEmptyTask({
80
+ id: randomUUID(),
81
+ teamName: input.teamName,
82
+ subject: input.subject,
83
+ description: input.description,
84
+ swarmId: input.swarmId ?? null,
85
+ owner: input.owner ?? null,
86
+ blockedBy: input.blockedBy ?? [],
87
+ });
88
+ this.persist(task);
89
+ for (const depId of task.blockedBy) {
90
+ const dep = this.get(depId);
91
+ if (!dep.blocks.includes(task.id)) {
92
+ const updated = {
93
+ ...dep,
94
+ blocks: [...dep.blocks, task.id],
95
+ updatedAt: new Date().toISOString(),
96
+ };
97
+ this.persist(updated);
98
+ }
99
+ }
100
+ return task;
101
+ });
102
+ }
103
+ tryGet(id) {
104
+ const p = this.taskPath(id);
105
+ if (!existsSync(p))
106
+ return null;
107
+ try {
108
+ return JSON.parse(readFileSync(p, "utf-8"));
109
+ }
110
+ catch {
111
+ return null;
112
+ }
113
+ }
114
+ get(id) {
115
+ const t = this.tryGet(id);
116
+ if (!t)
117
+ throw new Error(`Task not found: ${id}`);
118
+ return t;
119
+ }
120
+ async update(id, patch) {
121
+ if ("blockedBy" in patch || "blocks" in patch) {
122
+ throw new Error("update() cannot modify blockedBy/blocks; use link/unlink");
123
+ }
124
+ this.ensureIndexFileExists();
125
+ return withLock(this.indexPath(), async () => {
126
+ const cur = this.get(id);
127
+ const merged = {
128
+ ...cur,
129
+ ...patch,
130
+ id: cur.id,
131
+ displayId: cur.displayId,
132
+ createdAt: cur.createdAt,
133
+ updatedAt: new Date().toISOString(),
134
+ };
135
+ this.persist(merged);
136
+ return merged;
137
+ });
138
+ }
139
+ async addComment(id, comment) {
140
+ this.ensureIndexFileExists();
141
+ await withLock(this.indexPath(), async () => {
142
+ const cur = this.get(id);
143
+ if (cur.comments.some(c => c.id === comment.id))
144
+ return;
145
+ const next = {
146
+ ...cur,
147
+ comments: [...cur.comments, { ...comment, createdAt: comment.createdAt ?? new Date().toISOString() }],
148
+ updatedAt: new Date().toISOString(),
149
+ };
150
+ this.persist(next);
151
+ });
152
+ }
153
+ list() {
154
+ return Object.values(this.readIndex().tasks);
155
+ }
156
+ /** List index entries for a given swarmId. Empty when no matches. */
157
+ listBySwarm(swarmId) {
158
+ return this.list().filter(e => e.swarmId === swarmId);
159
+ }
160
+ async rebuildIndex() {
161
+ await withLock(this.indexPath(), async () => {
162
+ const dir = tasksDir(this.opts.workDir, this.opts.home);
163
+ const idx = { version: 1, tasks: {} };
164
+ let entries = [];
165
+ try {
166
+ entries = readdirSync(dir);
167
+ }
168
+ catch {
169
+ entries = [];
170
+ }
171
+ for (const name of entries) {
172
+ if (!name.endsWith(".json") || name === "index.json")
173
+ continue;
174
+ const full = `${dir}/${name}`;
175
+ try {
176
+ const task = JSON.parse(readFileSync(full, "utf-8"));
177
+ validateTask(task);
178
+ idx.tasks[task.id] = {
179
+ id: task.id,
180
+ displayId: task.displayId,
181
+ status: task.status,
182
+ subject: task.subject,
183
+ owner: task.owner,
184
+ swarmId: task.swarmId,
185
+ };
186
+ }
187
+ catch {
188
+ // skip unreadable / invalid task file
189
+ }
190
+ }
191
+ this.writeIndex(idx);
192
+ });
193
+ }
194
+ async link(fromId, toId) {
195
+ this.ensureIndexFileExists();
196
+ await withLock(this.indexPath(), async () => {
197
+ const from = this.get(fromId);
198
+ const to = this.get(toId);
199
+ // fast path: fully linked already
200
+ if (from.blockedBy.includes(toId) && to.blocks.includes(fromId))
201
+ return;
202
+ if (wouldCreateCycle(this, toId, fromId)) {
203
+ throw new Error(`link would create cycle: ${fromId} -> ${toId}`);
204
+ }
205
+ // repair half-edge if previous write crashed mid-link
206
+ if (!from.blockedBy.includes(toId)) {
207
+ const updated = {
208
+ ...from,
209
+ blockedBy: [...from.blockedBy, toId],
210
+ updatedAt: new Date().toISOString(),
211
+ };
212
+ this.persist(updated);
213
+ }
214
+ if (!to.blocks.includes(fromId)) {
215
+ const updated = {
216
+ ...to,
217
+ blocks: [...to.blocks, fromId],
218
+ updatedAt: new Date().toISOString(),
219
+ };
220
+ this.persist(updated);
221
+ }
222
+ });
223
+ }
224
+ async unlink(fromId, toId) {
225
+ this.ensureIndexFileExists();
226
+ await withLock(this.indexPath(), async () => {
227
+ const from = this.tryGet(fromId);
228
+ const to = this.tryGet(toId);
229
+ if (from && from.blockedBy.includes(toId)) {
230
+ const updated = {
231
+ ...from,
232
+ blockedBy: from.blockedBy.filter(id => id !== toId),
233
+ updatedAt: new Date().toISOString(),
234
+ };
235
+ this.persist(updated);
236
+ }
237
+ if (to && to.blocks.includes(fromId)) {
238
+ const updated = {
239
+ ...to,
240
+ blocks: to.blocks.filter(id => id !== fromId),
241
+ updatedAt: new Date().toISOString(),
242
+ };
243
+ this.persist(updated);
244
+ }
245
+ });
246
+ }
247
+ }
248
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "@mclawnet/task",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "exports": {
6
+ ".": {
7
+ "types": "./dist/index.d.ts",
8
+ "default": "./dist/index.js"
9
+ },
10
+ "./package.json": "./package.json"
11
+ },
12
+ "files": [
13
+ "dist"
14
+ ],
15
+ "publishConfig": {
16
+ "access": "public"
17
+ },
18
+ "dependencies": {
19
+ "proper-lockfile": "^4.1.2",
20
+ "@mclawnet/logger": "0.1.5"
21
+ },
22
+ "devDependencies": {
23
+ "@types/node": "^22",
24
+ "@types/proper-lockfile": "^4.1.4",
25
+ "typescript": "^5.8.3",
26
+ "vitest": "^4.0.18"
27
+ },
28
+ "scripts": {
29
+ "build": "tsc",
30
+ "clean": "rm -rf dist",
31
+ "test": "vitest run"
32
+ }
33
+ }