pi-loop 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 (166) hide show
  1. package/agents/code-reviewer.md +82 -0
  2. package/agents/coder.md +82 -0
  3. package/agents/decomposer.md +55 -0
  4. package/agents/judge.md +90 -0
  5. package/agents/review-optimizer.md +44 -0
  6. package/dist/agents/adapter.d.ts +9 -0
  7. package/dist/agents/adapter.d.ts.map +1 -0
  8. package/dist/agents/adapter.js +41 -0
  9. package/dist/agents/adapter.js.map +1 -0
  10. package/dist/agents/factory.d.ts +7 -0
  11. package/dist/agents/factory.d.ts.map +1 -0
  12. package/dist/agents/factory.js +49 -0
  13. package/dist/agents/factory.js.map +1 -0
  14. package/dist/agents/registry.d.ts +4 -0
  15. package/dist/agents/registry.d.ts.map +1 -0
  16. package/dist/agents/registry.js +98 -0
  17. package/dist/agents/registry.js.map +1 -0
  18. package/dist/agents/types.d.ts +21 -0
  19. package/dist/agents/types.d.ts.map +1 -0
  20. package/dist/agents/types.js +39 -0
  21. package/dist/agents/types.js.map +1 -0
  22. package/dist/cli/args.d.ts +38 -0
  23. package/dist/cli/args.d.ts.map +1 -0
  24. package/dist/cli/args.js +160 -0
  25. package/dist/cli/args.js.map +1 -0
  26. package/dist/cli/commands.d.ts +29 -0
  27. package/dist/cli/commands.d.ts.map +1 -0
  28. package/dist/cli/commands.js +362 -0
  29. package/dist/cli/commands.js.map +1 -0
  30. package/dist/cli/output.d.ts +33 -0
  31. package/dist/cli/output.d.ts.map +1 -0
  32. package/dist/cli/output.js +99 -0
  33. package/dist/cli/output.js.map +1 -0
  34. package/dist/config/defaults.d.ts +3 -0
  35. package/dist/config/defaults.d.ts.map +1 -0
  36. package/dist/config/defaults.js +31 -0
  37. package/dist/config/defaults.js.map +1 -0
  38. package/dist/config/loader.d.ts +11 -0
  39. package/dist/config/loader.d.ts.map +1 -0
  40. package/dist/config/loader.js +70 -0
  41. package/dist/config/loader.js.map +1 -0
  42. package/dist/config/types.d.ts +41 -0
  43. package/dist/config/types.d.ts.map +1 -0
  44. package/dist/config/types.js +5 -0
  45. package/dist/config/types.js.map +1 -0
  46. package/dist/core/checkpoint.d.ts +18 -0
  47. package/dist/core/checkpoint.d.ts.map +1 -0
  48. package/dist/core/checkpoint.js +32 -0
  49. package/dist/core/checkpoint.js.map +1 -0
  50. package/dist/core/judge.d.ts +11 -0
  51. package/dist/core/judge.d.ts.map +1 -0
  52. package/dist/core/judge.js +91 -0
  53. package/dist/core/judge.js.map +1 -0
  54. package/dist/core/learnings.d.ts +4 -0
  55. package/dist/core/learnings.d.ts.map +1 -0
  56. package/dist/core/learnings.js +33 -0
  57. package/dist/core/learnings.js.map +1 -0
  58. package/dist/core/orchestrator.d.ts +64 -0
  59. package/dist/core/orchestrator.d.ts.map +1 -0
  60. package/dist/core/orchestrator.js +499 -0
  61. package/dist/core/orchestrator.js.map +1 -0
  62. package/dist/core/plan.d.ts +7 -0
  63. package/dist/core/plan.d.ts.map +1 -0
  64. package/dist/core/plan.js +15 -0
  65. package/dist/core/plan.js.map +1 -0
  66. package/dist/core/readiness-policy.d.ts +11 -0
  67. package/dist/core/readiness-policy.d.ts.map +1 -0
  68. package/dist/core/readiness-policy.js +24 -0
  69. package/dist/core/readiness-policy.js.map +1 -0
  70. package/dist/core/scheduling-policy.d.ts +9 -0
  71. package/dist/core/scheduling-policy.d.ts.map +1 -0
  72. package/dist/core/scheduling-policy.js +56 -0
  73. package/dist/core/scheduling-policy.js.map +1 -0
  74. package/dist/core/task-backend.d.ts +55 -0
  75. package/dist/core/task-backend.d.ts.map +1 -0
  76. package/dist/core/task-backend.js +76 -0
  77. package/dist/core/task-backend.js.map +1 -0
  78. package/dist/core/task-state.d.ts +26 -0
  79. package/dist/core/task-state.d.ts.map +1 -0
  80. package/dist/core/task-state.js +182 -0
  81. package/dist/core/task-state.js.map +1 -0
  82. package/dist/core/wiring.d.ts +12 -0
  83. package/dist/core/wiring.d.ts.map +1 -0
  84. package/dist/core/wiring.js +131 -0
  85. package/dist/core/wiring.js.map +1 -0
  86. package/dist/git/conflict.d.ts +6 -0
  87. package/dist/git/conflict.d.ts.map +1 -0
  88. package/dist/git/conflict.js +25 -0
  89. package/dist/git/conflict.js.map +1 -0
  90. package/dist/git/repo.d.ts +13 -0
  91. package/dist/git/repo.d.ts.map +1 -0
  92. package/dist/git/repo.js +74 -0
  93. package/dist/git/repo.js.map +1 -0
  94. package/dist/git/same-branch.d.ts +9 -0
  95. package/dist/git/same-branch.d.ts.map +1 -0
  96. package/dist/git/same-branch.js +55 -0
  97. package/dist/git/same-branch.js.map +1 -0
  98. package/dist/git/worktree.d.ts +14 -0
  99. package/dist/git/worktree.d.ts.map +1 -0
  100. package/dist/git/worktree.js +78 -0
  101. package/dist/git/worktree.js.map +1 -0
  102. package/dist/index.d.ts +6 -0
  103. package/dist/index.d.ts.map +1 -0
  104. package/dist/index.js +47 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/integrations/linear/backend.d.ts +38 -0
  107. package/dist/integrations/linear/backend.d.ts.map +1 -0
  108. package/dist/integrations/linear/backend.js +374 -0
  109. package/dist/integrations/linear/backend.js.map +1 -0
  110. package/dist/integrations/linear/client.d.ts +19 -0
  111. package/dist/integrations/linear/client.d.ts.map +1 -0
  112. package/dist/integrations/linear/client.js +86 -0
  113. package/dist/integrations/linear/client.js.map +1 -0
  114. package/dist/integrations/linear/comment-templates.d.ts +14 -0
  115. package/dist/integrations/linear/comment-templates.d.ts.map +1 -0
  116. package/dist/integrations/linear/comment-templates.js +50 -0
  117. package/dist/integrations/linear/comment-templates.js.map +1 -0
  118. package/dist/integrations/linear/contract.d.ts +15 -0
  119. package/dist/integrations/linear/contract.d.ts.map +1 -0
  120. package/dist/integrations/linear/contract.js +86 -0
  121. package/dist/integrations/linear/contract.js.map +1 -0
  122. package/dist/integrations/linear/types.d.ts +39 -0
  123. package/dist/integrations/linear/types.d.ts.map +1 -0
  124. package/dist/integrations/linear/types.js +2 -0
  125. package/dist/integrations/linear/types.js.map +1 -0
  126. package/dist/swarm/pool.d.ts +33 -0
  127. package/dist/swarm/pool.d.ts.map +1 -0
  128. package/dist/swarm/pool.js +182 -0
  129. package/dist/swarm/pool.js.map +1 -0
  130. package/dist/swarm/scheduler.d.ts +38 -0
  131. package/dist/swarm/scheduler.d.ts.map +1 -0
  132. package/dist/swarm/scheduler.js +191 -0
  133. package/dist/swarm/scheduler.js.map +1 -0
  134. package/dist/swarm/worker.d.ts +49 -0
  135. package/dist/swarm/worker.d.ts.map +1 -0
  136. package/dist/swarm/worker.js +180 -0
  137. package/dist/swarm/worker.js.map +1 -0
  138. package/dist/tools/bash-tool.d.ts +24 -0
  139. package/dist/tools/bash-tool.d.ts.map +1 -0
  140. package/dist/tools/bash-tool.js +177 -0
  141. package/dist/tools/bash-tool.js.map +1 -0
  142. package/dist/tools/file-tools.d.ts +3 -0
  143. package/dist/tools/file-tools.d.ts.map +1 -0
  144. package/dist/tools/file-tools.js +68 -0
  145. package/dist/tools/file-tools.js.map +1 -0
  146. package/dist/tools/git-tools.d.ts +3 -0
  147. package/dist/tools/git-tools.d.ts.map +1 -0
  148. package/dist/tools/git-tools.js +44 -0
  149. package/dist/tools/git-tools.js.map +1 -0
  150. package/dist/tools/learnings-tool.d.ts +3 -0
  151. package/dist/tools/learnings-tool.d.ts.map +1 -0
  152. package/dist/tools/learnings-tool.js +48 -0
  153. package/dist/tools/learnings-tool.js.map +1 -0
  154. package/dist/tools/plan-tool.d.ts +3 -0
  155. package/dist/tools/plan-tool.d.ts.map +1 -0
  156. package/dist/tools/plan-tool.js +24 -0
  157. package/dist/tools/plan-tool.js.map +1 -0
  158. package/dist/tools/task-tools.d.ts +3 -0
  159. package/dist/tools/task-tools.d.ts.map +1 -0
  160. package/dist/tools/task-tools.js +108 -0
  161. package/dist/tools/task-tools.js.map +1 -0
  162. package/dist/tools/test-tool.d.ts +3 -0
  163. package/dist/tools/test-tool.d.ts.map +1 -0
  164. package/dist/tools/test-tool.js +43 -0
  165. package/dist/tools/test-tool.js.map +1 -0
  166. package/package.json +47 -0
@@ -0,0 +1,56 @@
1
+ export function selectExecutionOrder(tasks, options) {
2
+ const sorted = [...tasks].sort((a, b) => compareTasks(a, b, options));
3
+ if (options.limit && options.limit > 0) {
4
+ return sorted.slice(0, options.limit);
5
+ }
6
+ return sorted;
7
+ }
8
+ function compareTasks(a, b, options) {
9
+ const priorityA = a.priority ?? 0;
10
+ const priorityB = b.priority ?? 0;
11
+ if (priorityA !== priorityB) {
12
+ return priorityB - priorityA;
13
+ }
14
+ const createdA = toTimestamp(a.createdAt);
15
+ const createdB = toTimestamp(b.createdAt);
16
+ if (createdA !== createdB) {
17
+ return createdA - createdB;
18
+ }
19
+ const roleWeightA = roleLabelWeight(a, options);
20
+ const roleWeightB = roleLabelWeight(b, options);
21
+ if (roleWeightA !== roleWeightB) {
22
+ return roleWeightB - roleWeightA;
23
+ }
24
+ return a.id.localeCompare(b.id);
25
+ }
26
+ function roleLabelWeight(task, options) {
27
+ const labels = new Set((task.labels ?? []).map((label) => label.toLowerCase()));
28
+ const expectedLabels = buildRoleLabels(options.role, options.roleLabelPrefix ?? "agent:");
29
+ for (const label of expectedLabels) {
30
+ if (labels.has(label.toLowerCase())) {
31
+ return 1;
32
+ }
33
+ }
34
+ return 0;
35
+ }
36
+ function buildRoleLabels(role, prefix) {
37
+ switch (role) {
38
+ case "decomposer":
39
+ return [`${prefix}planner`, `${prefix}decomposer`];
40
+ case "coder":
41
+ return [`${prefix}builder`, `${prefix}coder`];
42
+ case "code-reviewer":
43
+ return [`${prefix}verifier`, `${prefix}reviewer`];
44
+ case "review-optimizer":
45
+ return [`${prefix}planner`, `${prefix}review-optimizer`];
46
+ case "judge":
47
+ return [`${prefix}judge`];
48
+ }
49
+ }
50
+ function toTimestamp(value) {
51
+ if (!value)
52
+ return Number.MAX_SAFE_INTEGER;
53
+ const timestamp = Date.parse(value);
54
+ return Number.isNaN(timestamp) ? Number.MAX_SAFE_INTEGER : timestamp;
55
+ }
56
+ //# sourceMappingURL=scheduling-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduling-policy.js","sourceRoot":"","sources":["../../src/core/scheduling-policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import type { AgentRole } from "../agents/types.js";
2
+ import { type Task } from "./task-state.js";
3
+ export type TaskBackendMode = "markdown" | "linear";
4
+ export interface BackendTask extends Task {
5
+ priority?: number;
6
+ createdAt?: string;
7
+ labels?: string[];
8
+ description?: string;
9
+ externalId?: string;
10
+ externalIdentifier?: string;
11
+ }
12
+ export interface ReadinessValidation {
13
+ ok: boolean;
14
+ reasons: string[];
15
+ }
16
+ export interface BackendCheckpointContext {
17
+ currentTaskId?: string;
18
+ lastSyncedAt?: string;
19
+ reconciliationSummary?: string;
20
+ }
21
+ export interface TaskBackend {
22
+ readonly mode: TaskBackendMode;
23
+ initializeCycle(cycle: number): Promise<void>;
24
+ reconcileState(): Promise<string>;
25
+ getReadyTasks(role: AgentRole): Promise<BackendTask[]>;
26
+ validateDefinitionOfReady(task: BackendTask): Promise<ReadinessValidation>;
27
+ markInProgress(taskId: string): Promise<void>;
28
+ markInReview(taskId: string, worklog: string): Promise<void>;
29
+ markDone(taskId: string, verificationLog: string): Promise<void>;
30
+ markFailed(taskId: string, reason: string): Promise<void>;
31
+ markNeedsDecision(taskId: string, optionsComment: string): Promise<void>;
32
+ snapshotForJudge(): Promise<string>;
33
+ getCheckpointContext(): Promise<BackendCheckpointContext>;
34
+ applyCheckpointContext(context?: BackendCheckpointContext): Promise<void>;
35
+ }
36
+ export declare class MarkdownTaskBackend implements TaskBackend {
37
+ private readonly tasksPath;
38
+ readonly mode: "markdown";
39
+ constructor(tasksPath: string);
40
+ initializeCycle(_cycle: number): Promise<void>;
41
+ getReadyTasks(_role: AgentRole): Promise<BackendTask[]>;
42
+ reconcileState(): Promise<string>;
43
+ validateDefinitionOfReady(_task: BackendTask): Promise<ReadinessValidation>;
44
+ markInProgress(taskId: string): Promise<void>;
45
+ markInReview(taskId: string, _worklog: string): Promise<void>;
46
+ markDone(taskId: string, _verificationLog: string): Promise<void>;
47
+ markFailed(taskId: string, reason: string): Promise<void>;
48
+ markNeedsDecision(taskId: string, optionsComment: string): Promise<void>;
49
+ snapshotForJudge(): Promise<string>;
50
+ getCheckpointContext(): Promise<BackendCheckpointContext>;
51
+ applyCheckpointContext(_context?: BackendCheckpointContext): Promise<void>;
52
+ private mutateTaskDocument;
53
+ }
54
+ export declare function createMarkdownTaskBackend(tasksPath: string): TaskBackend;
55
+ //# sourceMappingURL=task-backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-backend.d.ts","sourceRoot":"","sources":["../../src/core/task-backend.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EACN,KAAK,IAAI,EAMT,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,QAAQ,CAAC;AAEpD,MAAM,WAAW,WAAY,SAAQ,IAAI;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,mBAAmB;IACnC,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,wBAAwB;IACxC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACvD,yBAAyB,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC3E,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzE,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,oBAAoB,IAAI,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAC1D,sBAAsB,CAAC,OAAO,CAAC,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1E;AAED,qBAAa,mBAAoB,YAAW,WAAW;IAG1C,OAAO,CAAC,QAAQ,CAAC,SAAS;IAFtC,QAAQ,CAAC,IAAI,EAAG,UAAU,CAAU;gBAEP,SAAS,EAAE,MAAM;IAExC,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAMvD,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAUjC,yBAAyB,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAK3E,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM7C,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM7D,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMjE,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOzD,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOxE,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAInC,oBAAoB,IAAI,OAAO,CAAC,wBAAwB,CAAC;IAIzD,sBAAsB,CAAC,QAAQ,CAAC,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;YAIlE,kBAAkB;CAMhC;AAED,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAExE"}
@@ -0,0 +1,76 @@
1
+ import { readFile, writeFile } from "node:fs/promises";
2
+ import { getReadyTasks as getMarkdownReadyTasks, incrementAttempt, parseTasks, serializeTasks, updateTaskStatus, } from "./task-state.js";
3
+ export class MarkdownTaskBackend {
4
+ tasksPath;
5
+ mode = "markdown";
6
+ constructor(tasksPath) {
7
+ this.tasksPath = tasksPath;
8
+ }
9
+ async initializeCycle(_cycle) {
10
+ // Markdown backend does not need explicit cycle initialization.
11
+ }
12
+ async getReadyTasks(_role) {
13
+ const markdown = await readFile(this.tasksPath, "utf8");
14
+ const doc = parseTasks(markdown);
15
+ return getMarkdownReadyTasks(doc);
16
+ }
17
+ async reconcileState() {
18
+ const markdown = await readFile(this.tasksPath, "utf8");
19
+ const doc = parseTasks(markdown);
20
+ const statusCounts = doc.tasks.reduce((acc, task) => {
21
+ acc[task.status] = (acc[task.status] ?? 0) + 1;
22
+ return acc;
23
+ }, {});
24
+ return JSON.stringify(statusCounts);
25
+ }
26
+ async validateDefinitionOfReady(_task) {
27
+ // Existing markdown workflow does not enforce Linear-style DoR sections.
28
+ return { ok: true, reasons: [] };
29
+ }
30
+ async markInProgress(taskId) {
31
+ await this.mutateTaskDocument((doc) => {
32
+ updateTaskStatus(doc, taskId, "in-progress");
33
+ });
34
+ }
35
+ async markInReview(taskId, _worklog) {
36
+ await this.mutateTaskDocument((doc) => {
37
+ updateTaskStatus(doc, taskId, "in-review");
38
+ });
39
+ }
40
+ async markDone(taskId, _verificationLog) {
41
+ await this.mutateTaskDocument((doc) => {
42
+ updateTaskStatus(doc, taskId, "done");
43
+ });
44
+ }
45
+ async markFailed(taskId, reason) {
46
+ await this.mutateTaskDocument((doc) => {
47
+ incrementAttempt(doc, taskId, reason);
48
+ updateTaskStatus(doc, taskId, "rejected");
49
+ });
50
+ }
51
+ async markNeedsDecision(taskId, optionsComment) {
52
+ await this.mutateTaskDocument((doc) => {
53
+ incrementAttempt(doc, taskId, `Needs decision: ${optionsComment}`);
54
+ updateTaskStatus(doc, taskId, "rejected");
55
+ });
56
+ }
57
+ async snapshotForJudge() {
58
+ return readFile(this.tasksPath, "utf8");
59
+ }
60
+ async getCheckpointContext() {
61
+ return {};
62
+ }
63
+ async applyCheckpointContext(_context) {
64
+ // Markdown backend keeps no extra state.
65
+ }
66
+ async mutateTaskDocument(mutator) {
67
+ const markdown = await readFile(this.tasksPath, "utf8");
68
+ const doc = parseTasks(markdown);
69
+ mutator(doc);
70
+ await writeFile(this.tasksPath, serializeTasks(doc), "utf8");
71
+ }
72
+ }
73
+ export function createMarkdownTaskBackend(tasksPath) {
74
+ return new MarkdownTaskBackend(tasksPath);
75
+ }
76
+ //# sourceMappingURL=task-backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-backend.js","sourceRoot":"","sources":["../../src/core/task-backend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export type TaskStatus = "pending" | "in-progress" | "in-review" | "done" | "rejected" | "needs-decomposition";
2
+ export interface Task {
3
+ id: string;
4
+ title: string;
5
+ status: TaskStatus;
6
+ estimate?: string;
7
+ dependencies: string[];
8
+ attempts: number;
9
+ cycle: number;
10
+ rejectionHistory: string[];
11
+ parent?: string;
12
+ subtasks: string[];
13
+ }
14
+ export interface TaskDocument {
15
+ planHash: string;
16
+ updated: string;
17
+ cycle: number;
18
+ tasks: Task[];
19
+ }
20
+ export declare function parseTasks(markdown: string): TaskDocument;
21
+ export declare function serializeTasks(doc: TaskDocument): string;
22
+ export declare function getReadyTasks(doc: TaskDocument): Task[];
23
+ export declare function updateTaskStatus(doc: TaskDocument, id: string, status: TaskStatus): void;
24
+ export declare function incrementAttempt(doc: TaskDocument, id: string, rejection?: string): void;
25
+ export declare function createSubtasks(doc: TaskDocument, parentId: string, subtasks: Omit<Task, "parent" | "subtasks" | "attempts" | "rejectionHistory">[]): void;
26
+ //# sourceMappingURL=task-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-state.d.ts","sourceRoot":"","sources":["../../src/core/task-state.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,qBAAqB,CAAC;AAE/G,MAAM,WAAW,IAAI;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,IAAI,EAAE,CAAC;CACd;AAMD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAuGzD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CAiCxD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,EAAE,CASvD;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAOxF;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAUxF;AAED,wBAAgB,cAAc,CAC7B,GAAG,EAAE,YAAY,EACjB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,UAAU,GAAG,kBAAkB,CAAC,EAAE,GAC7E,IAAI,CAqBN"}
@@ -0,0 +1,182 @@
1
+ const METADATA_RE = /<!--\s*(plan-hash|updated|cycle):\s*(.+?)\s*-->/g;
2
+ const TASK_HEADING_RE = /^##\s+(T-\d+(?:-[a-z]+)?):\s+(.+?)\s+\[(.+?)\]\s*$/;
3
+ const FIELD_RE = /^-\s+\*\*(.+?)\*\*:\s*(.*)$/;
4
+ export function parseTasks(markdown) {
5
+ const doc = {
6
+ planHash: "",
7
+ updated: "",
8
+ cycle: 0,
9
+ tasks: [],
10
+ };
11
+ // Extract metadata from HTML comments
12
+ let match;
13
+ METADATA_RE.lastIndex = 0;
14
+ while ((match = METADATA_RE.exec(markdown)) !== null) {
15
+ const [, key, value] = match;
16
+ if (key === "plan-hash")
17
+ doc.planHash = value;
18
+ else if (key === "updated")
19
+ doc.updated = value;
20
+ else if (key === "cycle")
21
+ doc.cycle = Number.parseInt(value, 10);
22
+ }
23
+ // Split into sections by ## headings
24
+ const lines = markdown.split("\n");
25
+ let currentTask = null;
26
+ let inRejectionHistory = false;
27
+ for (const line of lines) {
28
+ const headingMatch = line.match(TASK_HEADING_RE);
29
+ if (headingMatch) {
30
+ if (currentTask) {
31
+ doc.tasks.push(currentTask);
32
+ }
33
+ currentTask = {
34
+ id: headingMatch[1],
35
+ title: headingMatch[2],
36
+ status: headingMatch[3],
37
+ dependencies: [],
38
+ attempts: 0,
39
+ cycle: 0,
40
+ rejectionHistory: [],
41
+ subtasks: [],
42
+ };
43
+ inRejectionHistory = false;
44
+ continue;
45
+ }
46
+ if (!currentTask)
47
+ continue;
48
+ const fieldMatch = line.match(FIELD_RE);
49
+ if (fieldMatch) {
50
+ const [, key, value] = fieldMatch;
51
+ switch (key) {
52
+ case "Estimate":
53
+ currentTask.estimate = value.trim();
54
+ break;
55
+ case "Dependencies":
56
+ currentTask.dependencies = value.trim() === "none"
57
+ ? []
58
+ : value.split(",").map((d) => d.trim()).filter(Boolean);
59
+ break;
60
+ case "Attempts":
61
+ currentTask.attempts = Number.parseInt(value.trim(), 10);
62
+ break;
63
+ case "Cycle":
64
+ currentTask.cycle = Number.parseInt(value.trim(), 10);
65
+ break;
66
+ case "Parent":
67
+ currentTask.parent = value.trim();
68
+ break;
69
+ case "Subtasks":
70
+ currentTask.subtasks = value.split(",").map((s) => s.trim()).filter(Boolean);
71
+ break;
72
+ case "Rejection History":
73
+ inRejectionHistory = true;
74
+ break;
75
+ case "Rejection Reason":
76
+ // Informational field from decomposer — store in rejection history
77
+ if (value.trim()) {
78
+ currentTask.rejectionHistory.push(value.trim());
79
+ }
80
+ break;
81
+ default:
82
+ break;
83
+ }
84
+ // "Rejection History" field starts the list but has no inline value
85
+ if (key !== "Rejection History") {
86
+ inRejectionHistory = false;
87
+ }
88
+ continue;
89
+ }
90
+ // Collect rejection history entries (indented list items)
91
+ if (inRejectionHistory) {
92
+ const rejectionMatch = line.match(/^\s+-\s+Attempt\s+\d+:\s+(.+)$/);
93
+ if (rejectionMatch) {
94
+ currentTask.rejectionHistory.push(rejectionMatch[1].trim());
95
+ }
96
+ }
97
+ }
98
+ // Push final task
99
+ if (currentTask) {
100
+ doc.tasks.push(currentTask);
101
+ }
102
+ return doc;
103
+ }
104
+ export function serializeTasks(doc) {
105
+ const lines = [];
106
+ lines.push("# Tasks");
107
+ lines.push("");
108
+ lines.push(`<!-- plan-hash: ${doc.planHash} -->`);
109
+ lines.push(`<!-- updated: ${doc.updated} -->`);
110
+ lines.push(`<!-- cycle: ${doc.cycle} -->`);
111
+ for (const task of doc.tasks) {
112
+ lines.push("");
113
+ lines.push(`## ${task.id}: ${task.title} [${task.status}]`);
114
+ if (task.estimate) {
115
+ lines.push(`- **Estimate**: ${task.estimate}`);
116
+ }
117
+ lines.push(`- **Dependencies**: ${task.dependencies.length > 0 ? task.dependencies.join(", ") : "none"}`);
118
+ lines.push(`- **Attempts**: ${task.attempts}`);
119
+ lines.push(`- **Cycle**: ${task.cycle}`);
120
+ if (task.parent) {
121
+ lines.push(`- **Parent**: ${task.parent}`);
122
+ }
123
+ if (task.subtasks.length > 0) {
124
+ lines.push(`- **Subtasks**: ${task.subtasks.join(", ")}`);
125
+ }
126
+ if (task.rejectionHistory.length > 0) {
127
+ lines.push("- **Rejection History**:");
128
+ task.rejectionHistory.forEach((entry, i) => {
129
+ lines.push(` - Attempt ${i + 1}: ${entry}`);
130
+ });
131
+ }
132
+ }
133
+ lines.push("");
134
+ return lines.join("\n");
135
+ }
136
+ export function getReadyTasks(doc) {
137
+ const doneIds = new Set(doc.tasks.filter((t) => t.status === "done").map((t) => t.id));
138
+ return doc.tasks.filter((task) => {
139
+ if (task.status !== "pending")
140
+ return false;
141
+ return task.dependencies.every((dep) => doneIds.has(dep));
142
+ });
143
+ }
144
+ export function updateTaskStatus(doc, id, status) {
145
+ const task = doc.tasks.find((t) => t.id === id);
146
+ if (!task) {
147
+ throw new Error(`Task ${id} not found`);
148
+ }
149
+ task.status = status;
150
+ doc.updated = new Date().toISOString();
151
+ }
152
+ export function incrementAttempt(doc, id, rejection) {
153
+ const task = doc.tasks.find((t) => t.id === id);
154
+ if (!task) {
155
+ throw new Error(`Task ${id} not found`);
156
+ }
157
+ task.attempts += 1;
158
+ if (rejection) {
159
+ task.rejectionHistory.push(rejection);
160
+ }
161
+ doc.updated = new Date().toISOString();
162
+ }
163
+ export function createSubtasks(doc, parentId, subtasks) {
164
+ const parent = doc.tasks.find((t) => t.id === parentId);
165
+ if (!parent) {
166
+ throw new Error(`Parent task ${parentId} not found`);
167
+ }
168
+ const newTasks = subtasks.map((sub) => ({
169
+ ...sub,
170
+ parent: parentId,
171
+ subtasks: [],
172
+ attempts: 0,
173
+ rejectionHistory: [],
174
+ }));
175
+ parent.subtasks = newTasks.map((t) => t.id);
176
+ parent.status = "needs-decomposition";
177
+ // Insert subtasks right after the parent
178
+ const parentIndex = doc.tasks.indexOf(parent);
179
+ doc.tasks.splice(parentIndex + 1, 0, ...newTasks);
180
+ doc.updated = new Date().toISOString();
181
+ }
182
+ //# sourceMappingURL=task-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-state.js","sourceRoot":"","sources":["../../src/core/task-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Wiring module — builds OrchestratorDeps from config.
3
+ * This is the composition root that connects all modules.
4
+ */
5
+ import type { PiLoopConfig } from "../config/types.js";
6
+ import type { OrchestratorDeps } from "./orchestrator.js";
7
+ /**
8
+ * Builds OrchestratorDeps from config and file paths.
9
+ * Returns closures that bind config, agent definitions, and tool registry.
10
+ */
11
+ export declare function buildOrchestratorDeps(config: PiLoopConfig, planPath: string, tasksPath: string, learningsPath: string, workDir: string): Promise<OrchestratorDeps>;
12
+ //# sourceMappingURL=wiring.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiring.d.ts","sourceRoot":"","sources":["../../src/core/wiring.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AA2D1D;;;GAGG;AACH,wBAAsB,qBAAqB,CAC1C,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,GACb,OAAO,CAAC,gBAAgB,CAAC,CA6E3B"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Wiring module — builds OrchestratorDeps from config.
3
+ * This is the composition root that connects all modules.
4
+ */
5
+ import { resolve } from "node:path";
6
+ import { wrapAgent } from "../agents/adapter.js";
7
+ import { createAgent } from "../agents/factory.js";
8
+ import { loadAgentDefinitions } from "../agents/registry.js";
9
+ import { bashTools, restrictedBashTools } from "../tools/bash-tool.js";
10
+ // Tool factories
11
+ import { fileTools } from "../tools/file-tools.js";
12
+ import { gitTools } from "../tools/git-tools.js";
13
+ import { learningsTools } from "../tools/learnings-tool.js";
14
+ import { planTools } from "../tools/plan-tool.js";
15
+ import { taskTools } from "../tools/task-tools.js";
16
+ import { testTools } from "../tools/test-tool.js";
17
+ // Git operations
18
+ import { commit, diff, resetHard, stageAll } from "../git/repo.js";
19
+ import { createLinearTaskBackend } from "../integrations/linear/backend.js";
20
+ import { executeBatch } from "../swarm/pool.js";
21
+ import { selectParallelismMode } from "../swarm/scheduler.js";
22
+ import { readLearnings } from "./learnings.js";
23
+ import { createMarkdownTaskBackend } from "./task-backend.js";
24
+ /**
25
+ * Assembles the full tool registry from all tool modules,
26
+ * bound to the given file paths and working directory.
27
+ *
28
+ * File and bash tools resolve paths relative to workDir.
29
+ * In worktree mode, each worker gets tools bound to its worktree path.
30
+ */
31
+ function buildToolRegistry(planPath, tasksPath, learningsPath, workDir) {
32
+ return [
33
+ ...fileTools(workDir),
34
+ ...bashTools(workDir),
35
+ ...taskTools(tasksPath),
36
+ ...learningsTools(learningsPath),
37
+ ...planTools(planPath),
38
+ ...gitTools(workDir),
39
+ ...testTools(workDir),
40
+ ];
41
+ }
42
+ /**
43
+ * Restricted tool set for worker agents (coder/reviewer).
44
+ *
45
+ * Workers operate on a single task provided by the worker harness.
46
+ * They should NOT read/update Tasks.md or make git commits — the worker
47
+ * harness controls the commit/task lifecycle. This prevents agents from
48
+ * going rogue and claiming multiple tasks or committing prematurely.
49
+ */
50
+ function buildWorkerToolRegistry(planPath, learningsPath, workDir) {
51
+ return [
52
+ ...fileTools(workDir),
53
+ ...restrictedBashTools(workDir),
54
+ ...learningsTools(learningsPath),
55
+ ...planTools(planPath),
56
+ ...testTools(workDir),
57
+ ];
58
+ }
59
+ /**
60
+ * Builds OrchestratorDeps from config and file paths.
61
+ * Returns closures that bind config, agent definitions, and tool registry.
62
+ */
63
+ export async function buildOrchestratorDeps(config, planPath, tasksPath, learningsPath, workDir) {
64
+ const agentsDir = resolve(workDir, config.agentsDir);
65
+ const definitions = await loadAgentDefinitions(agentsDir);
66
+ const allTools = buildToolRegistry(planPath, tasksPath, learningsPath, workDir);
67
+ const taskBackend = config.taskBackend === "linear" ? createLinearTaskBackend(config.linear) : createMarkdownTaskBackend(tasksPath);
68
+ const createAgentFn = async (role, learnings) => {
69
+ const definition = definitions.get(role);
70
+ if (!definition) {
71
+ throw new Error(`No agent definition found for role: ${role}`);
72
+ }
73
+ const piAgent = createAgent(definition, config, learnings, allTools);
74
+ return wrapAgent(piAgent, role, definition);
75
+ };
76
+ const dispatchBatchFn = async (tasks, piConfig) => {
77
+ const mode = selectParallelismMode(piConfig.maxConcurrency);
78
+ const poolConfig = {
79
+ maxConcurrency: piConfig.maxConcurrency,
80
+ mode,
81
+ repoRoot: workDir,
82
+ worktreeBaseDir: resolve(workDir, piConfig.git.worktreeBaseDir),
83
+ piLoopConfig: piConfig,
84
+ };
85
+ const workerFactory = (_taskId, taskWorkDir) => {
86
+ // Build restricted tools bound to this worker's directory.
87
+ // Workers get file/bash/test/plan/learnings tools but NO task management or git commit.
88
+ // The worker harness controls commits and task status updates.
89
+ const workerTools = buildWorkerToolRegistry(planPath, learningsPath, taskWorkDir);
90
+ const createWorkerAgent = async (role, learnings) => {
91
+ const definition = definitions.get(role);
92
+ if (!definition) {
93
+ throw new Error(`No agent definition found for role: ${role}`);
94
+ }
95
+ const piAgent = createAgent(definition, config, learnings, workerTools);
96
+ return wrapAgent(piAgent, role, definition);
97
+ };
98
+ return {
99
+ createCoderAgent: async () => {
100
+ const learnings = await readLearnings(learningsPath);
101
+ const agent = await createWorkerAgent("coder", learnings);
102
+ return { run: agent.run.bind(agent) };
103
+ },
104
+ createReviewerAgent: async () => {
105
+ const learnings = await readLearnings(learningsPath);
106
+ const agent = await createWorkerAgent("code-reviewer", learnings);
107
+ return { run: agent.run.bind(agent) };
108
+ },
109
+ gitStage: () => stageAll(taskWorkDir),
110
+ gitDiff: () => diff(taskWorkDir, "--cached"),
111
+ gitCommit: async (message) => {
112
+ // Files are already staged by the worker before diffing
113
+ return commit(taskWorkDir, message);
114
+ },
115
+ gitReset: () => resetHard(taskWorkDir),
116
+ };
117
+ };
118
+ const batchResults = await executeBatch(tasks, poolConfig, workerFactory);
119
+ return batchResults.map((br) => ({
120
+ taskId: br.taskId,
121
+ success: br.success,
122
+ output: br.success
123
+ ? `Committed ${br.commitHash?.slice(0, 8) ?? "unknown"}`
124
+ : (br.error ?? "Worker failed without explicit error"),
125
+ commitHash: br.commitHash,
126
+ changedFiles: br.changedFiles,
127
+ }));
128
+ };
129
+ return { createAgentFn, dispatchBatchFn, taskBackend };
130
+ }
131
+ //# sourceMappingURL=wiring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiring.js","sourceRoot":"","sources":["../../src/core/wiring.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAO7D,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACvE,iBAAiB;AACjB,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,iBAAiB;AACjB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,EAAmB,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAI9D;;;;;;GAMG;AACH,SAAS,iBAAiB,CAAC,QAAgB,EAAE,SAAiB,EAAE,aAAqB,EAAE,OAAe;IACrG,OAAO;QACN,GAAG,SAAS,CAAC,OAAO,CAAC;QACrB,GAAG,SAAS,CAAC,OAAO,CAAC;QACrB,GAAG,SAAS,CAAC,SAAS,CAAC;QACvB,GAAG,cAAc,CAAC,aAAa,CAAC;QAChC,GAAG,SAAS,CAAC,QAAQ,CAAC;QACtB,GAAG,QAAQ,CAAC,OAAO,CAAC;QACpB,GAAG,SAAS,CAAC,OAAO,CAAC;KACrB,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,uBAAuB,CAAC,QAAgB,EAAE,aAAqB,EAAE,OAAe;IACxF,OAAO;QACN,GAAG,SAAS,CAAC,OAAO,CAAC;QACrB,GAAG,mBAAmB,CAAC,OAAO,CAAC;QAC/B,GAAG,cAAc,CAAC,aAAa,CAAC;QAChC,GAAG,SAAS,CAAC,QAAQ,CAAC;QACtB,GAAG,SAAS,CAAC,OAAO,CAAC;KACrB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAC1C,MAAoB,EACpB,QAAgB,EAChB,SAAiB,EACjB,aAAqB,EACrB,OAAe;IAEf,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,MAAM,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;IAChF,MAAM,WAAW,GAChB,MAAM,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,uBAAuB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAC;IAEjH,MAAM,aAAa,GAAsC,KAAK,EAAE,IAAe,EAAE,SAAiB,EAAE,EAAE;QACrG,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,UAAU,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,uCAAuC,IAAI,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QACrE,OAAO,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IAC7C,CAAC,CAAC;IAEF,MAAM,eAAe,GAAwC,KAAK,EAAE,KAAa,EAAE,QAAsB,EAAE,EAAE;QAC5G,MAAM,IAAI,GAAG,qBAAqB,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAE5D,MAAM,UAAU,GAAe;YAC9B,cAAc,EAAE,QAAQ,CAAC,cAAc;YACvC,IAAI;YACJ,QAAQ,EAAE,OAAO;YACjB,eAAe,EAAE,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC;YAC/D,YAAY,EAAE,QAAQ;SACtB,CAAC;QAEF,MAAM,aAAa,GAAG,CAAC,OAAe,EAAE,WAAmB,EAAc,EAAE;YAC1E,2DAA2D;YAC3D,wFAAwF;YACxF,+DAA+D;YAC/D,MAAM,WAAW,GAAG,uBAAuB,CAAC,QAAQ,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;YAElF,MAAM,iBAAiB,GAAG,KAAK,EAAE,IAAe,EAAE,SAAiB,EAAE,EAAE;gBACtE,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACzC,IAAI,CAAC,UAAU,EAAE,CAAC;oBACjB,MAAM,IAAI,KAAK,CAAC,uCAAuC,IAAI,EAAE,CAAC,CAAC;gBAChE,CAAC;gBACD,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;gBACxE,OAAO,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;YAC7C,CAAC,CAAC;YAEF,OAAO;gBACN,gBAAgB,EAAE,KAAK,IAAI,EAAE;oBAC5B,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,aAAa,CAAC,CAAC;oBACrD,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;oBAC1D,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvC,CAAC;gBACD,mBAAmB,EAAE,KAAK,IAAI,EAAE;oBAC/B,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,aAAa,CAAC,CAAC;oBACrD,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;oBAClE,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvC,CAAC;gBACD,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;gBACrC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC;gBAC5C,SAAS,EAAE,KAAK,EAAE,OAAe,EAAE,EAAE;oBACpC,wDAAwD;oBACxD,OAAO,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;gBACrC,CAAC;gBACD,QAAQ,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC;aACtC,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;QAE1E,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAChC,MAAM,EAAE,EAAE,CAAC,MAAM;YACjB,OAAO,EAAE,EAAE,CAAC,OAAO;YACnB,MAAM,EAAE,EAAE,CAAC,OAAO;gBACjB,CAAC,CAAC,aAAa,EAAE,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,SAAS,EAAE;gBACxD,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,sCAAsC,CAAC;YACvD,UAAU,EAAE,EAAE,CAAC,UAAU;YACzB,YAAY,EAAE,EAAE,CAAC,YAAY;SAC7B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,WAAW,EAAE,CAAC;AACxD,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function detectConflicts(cwd: string): Promise<string[]>;
2
+ export declare function getConflictContent(cwd: string, file: string): Promise<string>;
3
+ export declare function markResolved(cwd: string, file: string): Promise<void>;
4
+ export declare function abortMerge(cwd: string): Promise<void>;
5
+ export declare function abortRebase(cwd: string): Promise<void>;
6
+ //# sourceMappingURL=conflict.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflict.d.ts","sourceRoot":"","sources":["../../src/git/conflict.ts"],"names":[],"mappings":"AAIA,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAMpE;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAInF;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3E;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3D;AAED,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5D"}
@@ -0,0 +1,25 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { gitExec } from "./repo.js";
4
+ export async function detectConflicts(cwd) {
5
+ const output = await gitExec(["diff", "--name-only", "--diff-filter=U"], cwd);
6
+ if (!output) {
7
+ return [];
8
+ }
9
+ return output.split("\n").filter(Boolean);
10
+ }
11
+ export async function getConflictContent(cwd, file) {
12
+ const filePath = join(cwd, file);
13
+ const content = await readFile(filePath, "utf-8");
14
+ return content;
15
+ }
16
+ export async function markResolved(cwd, file) {
17
+ await gitExec(["add", file], cwd);
18
+ }
19
+ export async function abortMerge(cwd) {
20
+ await gitExec(["merge", "--abort"], cwd);
21
+ }
22
+ export async function abortRebase(cwd) {
23
+ await gitExec(["rebase", "--abort"], cwd);
24
+ }
25
+ //# sourceMappingURL=conflict.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflict.js","sourceRoot":"","sources":["../../src/git/conflict.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAW;IAChD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,CAAC,MAAM,EAAE,aAAa,EAAE,iBAAiB,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9E,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,OAAO,EAAE,CAAC;IACX,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAW,EAAE,IAAY;IACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAClD,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW,EAAE,IAAY;IAC3D,MAAM,OAAO,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW;IAC3C,MAAM,OAAO,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW;IAC5C,MAAM,OAAO,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;AAC3C,CAAC"}