orka-cli 1.0.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 (288) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/CONTRIBUTING.md +59 -0
  3. package/README.md +208 -0
  4. package/dist/agents/base-agent.d.ts +48 -0
  5. package/dist/agents/base-agent.d.ts.map +1 -0
  6. package/dist/agents/base-agent.js +59 -0
  7. package/dist/agents/base-agent.js.map +1 -0
  8. package/dist/agents/builder.d.ts +53 -0
  9. package/dist/agents/builder.d.ts.map +1 -0
  10. package/dist/agents/builder.js +147 -0
  11. package/dist/agents/builder.js.map +1 -0
  12. package/dist/agents/coordinator.d.ts +45 -0
  13. package/dist/agents/coordinator.d.ts.map +1 -0
  14. package/dist/agents/coordinator.js +201 -0
  15. package/dist/agents/coordinator.js.map +1 -0
  16. package/dist/agents/index.d.ts +8 -0
  17. package/dist/agents/index.d.ts.map +1 -0
  18. package/dist/agents/index.js +7 -0
  19. package/dist/agents/index.js.map +1 -0
  20. package/dist/agents/reviewer.d.ts +39 -0
  21. package/dist/agents/reviewer.d.ts.map +1 -0
  22. package/dist/agents/reviewer.js +119 -0
  23. package/dist/agents/reviewer.js.map +1 -0
  24. package/dist/agents/scout.d.ts +35 -0
  25. package/dist/agents/scout.d.ts.map +1 -0
  26. package/dist/agents/scout.js +76 -0
  27. package/dist/agents/scout.js.map +1 -0
  28. package/dist/agents/tester.d.ts +25 -0
  29. package/dist/agents/tester.d.ts.map +1 -0
  30. package/dist/agents/tester.js +76 -0
  31. package/dist/agents/tester.js.map +1 -0
  32. package/dist/cli/board.d.ts +28 -0
  33. package/dist/cli/board.d.ts.map +1 -0
  34. package/dist/cli/board.js +178 -0
  35. package/dist/cli/board.js.map +1 -0
  36. package/dist/cli/cost.d.ts +31 -0
  37. package/dist/cli/cost.d.ts.map +1 -0
  38. package/dist/cli/cost.js +85 -0
  39. package/dist/cli/cost.js.map +1 -0
  40. package/dist/cli/credentials.d.ts +23 -0
  41. package/dist/cli/credentials.d.ts.map +1 -0
  42. package/dist/cli/credentials.js +77 -0
  43. package/dist/cli/credentials.js.map +1 -0
  44. package/dist/cli/dry-run.d.ts +3 -0
  45. package/dist/cli/dry-run.d.ts.map +1 -0
  46. package/dist/cli/dry-run.js +21 -0
  47. package/dist/cli/dry-run.js.map +1 -0
  48. package/dist/cli/extras.d.ts +21 -0
  49. package/dist/cli/extras.d.ts.map +1 -0
  50. package/dist/cli/extras.js +39 -0
  51. package/dist/cli/extras.js.map +1 -0
  52. package/dist/cli/fix.d.ts +11 -0
  53. package/dist/cli/fix.d.ts.map +1 -0
  54. package/dist/cli/fix.js +72 -0
  55. package/dist/cli/fix.js.map +1 -0
  56. package/dist/cli/git-session.d.ts +21 -0
  57. package/dist/cli/git-session.d.ts.map +1 -0
  58. package/dist/cli/git-session.js +62 -0
  59. package/dist/cli/git-session.js.map +1 -0
  60. package/dist/cli/index.d.ts +4 -0
  61. package/dist/cli/index.d.ts.map +1 -0
  62. package/dist/cli/index.js +546 -0
  63. package/dist/cli/index.js.map +1 -0
  64. package/dist/cli/init.d.ts +16 -0
  65. package/dist/cli/init.d.ts.map +1 -0
  66. package/dist/cli/init.js +75 -0
  67. package/dist/cli/init.js.map +1 -0
  68. package/dist/cli/login.d.ts +9 -0
  69. package/dist/cli/login.d.ts.map +1 -0
  70. package/dist/cli/login.js +114 -0
  71. package/dist/cli/login.js.map +1 -0
  72. package/dist/cli/logs.d.ts +16 -0
  73. package/dist/cli/logs.d.ts.map +1 -0
  74. package/dist/cli/logs.js +37 -0
  75. package/dist/cli/logs.js.map +1 -0
  76. package/dist/cli/memory-learner.d.ts +7 -0
  77. package/dist/cli/memory-learner.d.ts.map +1 -0
  78. package/dist/cli/memory-learner.js +36 -0
  79. package/dist/cli/memory-learner.js.map +1 -0
  80. package/dist/cli/memory.d.ts +13 -0
  81. package/dist/cli/memory.d.ts.map +1 -0
  82. package/dist/cli/memory.js +52 -0
  83. package/dist/cli/memory.js.map +1 -0
  84. package/dist/cli/plugin.d.ts +5 -0
  85. package/dist/cli/plugin.d.ts.map +1 -0
  86. package/dist/cli/plugin.js +42 -0
  87. package/dist/cli/plugin.js.map +1 -0
  88. package/dist/cli/resume.d.ts +18 -0
  89. package/dist/cli/resume.d.ts.map +1 -0
  90. package/dist/cli/resume.js +84 -0
  91. package/dist/cli/resume.js.map +1 -0
  92. package/dist/cli/rollback.d.ts +11 -0
  93. package/dist/cli/rollback.d.ts.map +1 -0
  94. package/dist/cli/rollback.js +12 -0
  95. package/dist/cli/rollback.js.map +1 -0
  96. package/dist/cli/rules.d.ts +7 -0
  97. package/dist/cli/rules.d.ts.map +1 -0
  98. package/dist/cli/rules.js +20 -0
  99. package/dist/cli/rules.js.map +1 -0
  100. package/dist/cli/run.d.ts +35 -0
  101. package/dist/cli/run.d.ts.map +1 -0
  102. package/dist/cli/run.js +294 -0
  103. package/dist/cli/run.js.map +1 -0
  104. package/dist/cli/session.d.ts +5 -0
  105. package/dist/cli/session.d.ts.map +1 -0
  106. package/dist/cli/session.js +46 -0
  107. package/dist/cli/session.js.map +1 -0
  108. package/dist/cli/ui/Board.d.ts +22 -0
  109. package/dist/cli/ui/Board.d.ts.map +1 -0
  110. package/dist/cli/ui/Board.js +40 -0
  111. package/dist/cli/ui/Board.js.map +1 -0
  112. package/dist/cli/ui/StatusBar.d.ts +10 -0
  113. package/dist/cli/ui/StatusBar.d.ts.map +1 -0
  114. package/dist/cli/ui/StatusBar.js +6 -0
  115. package/dist/cli/ui/StatusBar.js.map +1 -0
  116. package/dist/config.d.ts +4 -0
  117. package/dist/config.d.ts.map +1 -0
  118. package/dist/config.js +79 -0
  119. package/dist/config.js.map +1 -0
  120. package/dist/core/bus.d.ts +19 -0
  121. package/dist/core/bus.d.ts.map +1 -0
  122. package/dist/core/bus.js +25 -0
  123. package/dist/core/bus.js.map +1 -0
  124. package/dist/core/context.d.ts +10 -0
  125. package/dist/core/context.d.ts.map +1 -0
  126. package/dist/core/context.js +42 -0
  127. package/dist/core/context.js.map +1 -0
  128. package/dist/core/dispatcher.d.ts +25 -0
  129. package/dist/core/dispatcher.d.ts.map +1 -0
  130. package/dist/core/dispatcher.js +76 -0
  131. package/dist/core/dispatcher.js.map +1 -0
  132. package/dist/core/errors.d.ts +8 -0
  133. package/dist/core/errors.d.ts.map +1 -0
  134. package/dist/core/errors.js +13 -0
  135. package/dist/core/errors.js.map +1 -0
  136. package/dist/core/file-ownership.d.ts +25 -0
  137. package/dist/core/file-ownership.d.ts.map +1 -0
  138. package/dist/core/file-ownership.js +81 -0
  139. package/dist/core/file-ownership.js.map +1 -0
  140. package/dist/core/index.d.ts +9 -0
  141. package/dist/core/index.d.ts.map +1 -0
  142. package/dist/core/index.js +6 -0
  143. package/dist/core/index.js.map +1 -0
  144. package/dist/core/mcp-client-pool.d.ts +9 -0
  145. package/dist/core/mcp-client-pool.d.ts.map +1 -0
  146. package/dist/core/mcp-client-pool.js +26 -0
  147. package/dist/core/mcp-client-pool.js.map +1 -0
  148. package/dist/core/mcp-client.d.ts +27 -0
  149. package/dist/core/mcp-client.d.ts.map +1 -0
  150. package/dist/core/mcp-client.js +63 -0
  151. package/dist/core/mcp-client.js.map +1 -0
  152. package/dist/core/plugin-loader.d.ts +41 -0
  153. package/dist/core/plugin-loader.d.ts.map +1 -0
  154. package/dist/core/plugin-loader.js +62 -0
  155. package/dist/core/plugin-loader.js.map +1 -0
  156. package/dist/core/plugin-sdk.d.ts +5 -0
  157. package/dist/core/plugin-sdk.d.ts.map +1 -0
  158. package/dist/core/plugin-sdk.js +2 -0
  159. package/dist/core/plugin-sdk.js.map +1 -0
  160. package/dist/core/state.d.ts +77 -0
  161. package/dist/core/state.d.ts.map +1 -0
  162. package/dist/core/state.js +357 -0
  163. package/dist/core/state.js.map +1 -0
  164. package/dist/core/task.d.ts +13 -0
  165. package/dist/core/task.d.ts.map +1 -0
  166. package/dist/core/task.js +87 -0
  167. package/dist/core/task.js.map +1 -0
  168. package/dist/git/__tests__/helpers.d.ts +3 -0
  169. package/dist/git/__tests__/helpers.d.ts.map +1 -0
  170. package/dist/git/__tests__/helpers.js +18 -0
  171. package/dist/git/__tests__/helpers.js.map +1 -0
  172. package/dist/git/branch.d.ts +7 -0
  173. package/dist/git/branch.d.ts.map +1 -0
  174. package/dist/git/branch.js +62 -0
  175. package/dist/git/branch.js.map +1 -0
  176. package/dist/git/commit.d.ts +3 -0
  177. package/dist/git/commit.d.ts.map +1 -0
  178. package/dist/git/commit.js +21 -0
  179. package/dist/git/commit.js.map +1 -0
  180. package/dist/git/conflict.d.ts +19 -0
  181. package/dist/git/conflict.d.ts.map +1 -0
  182. package/dist/git/conflict.js +86 -0
  183. package/dist/git/conflict.js.map +1 -0
  184. package/dist/git/index.d.ts +7 -0
  185. package/dist/git/index.d.ts.map +1 -0
  186. package/dist/git/index.js +7 -0
  187. package/dist/git/index.js.map +1 -0
  188. package/dist/git/merge.d.ts +16 -0
  189. package/dist/git/merge.d.ts.map +1 -0
  190. package/dist/git/merge.js +101 -0
  191. package/dist/git/merge.js.map +1 -0
  192. package/dist/git/safety.d.ts +16 -0
  193. package/dist/git/safety.d.ts.map +1 -0
  194. package/dist/git/safety.js +64 -0
  195. package/dist/git/safety.js.map +1 -0
  196. package/dist/git/utils.d.ts +8 -0
  197. package/dist/git/utils.d.ts.map +1 -0
  198. package/dist/git/utils.js +39 -0
  199. package/dist/git/utils.js.map +1 -0
  200. package/dist/mcp-server/index.d.ts +2 -0
  201. package/dist/mcp-server/index.d.ts.map +1 -0
  202. package/dist/mcp-server/index.js +39 -0
  203. package/dist/mcp-server/index.js.map +1 -0
  204. package/dist/mcp-server/tools.d.ts +70 -0
  205. package/dist/mcp-server/tools.d.ts.map +1 -0
  206. package/dist/mcp-server/tools.js +112 -0
  207. package/dist/mcp-server/tools.js.map +1 -0
  208. package/dist/models/item.d.ts +6 -0
  209. package/dist/models/item.d.ts.map +1 -0
  210. package/dist/models/item.js +2 -0
  211. package/dist/models/item.js.map +1 -0
  212. package/dist/orchestration/glue.d.ts +31 -0
  213. package/dist/orchestration/glue.d.ts.map +1 -0
  214. package/dist/orchestration/glue.js +204 -0
  215. package/dist/orchestration/glue.js.map +1 -0
  216. package/dist/orchestration/index.d.ts +3 -0
  217. package/dist/orchestration/index.d.ts.map +1 -0
  218. package/dist/orchestration/index.js +3 -0
  219. package/dist/orchestration/index.js.map +1 -0
  220. package/dist/orchestration/runtime.d.ts +35 -0
  221. package/dist/orchestration/runtime.d.ts.map +1 -0
  222. package/dist/orchestration/runtime.js +165 -0
  223. package/dist/orchestration/runtime.js.map +1 -0
  224. package/dist/providers/base-provider.d.ts +28 -0
  225. package/dist/providers/base-provider.d.ts.map +1 -0
  226. package/dist/providers/base-provider.js +2 -0
  227. package/dist/providers/base-provider.js.map +1 -0
  228. package/dist/providers/claude.d.ts +10 -0
  229. package/dist/providers/claude.d.ts.map +1 -0
  230. package/dist/providers/claude.js +93 -0
  231. package/dist/providers/claude.js.map +1 -0
  232. package/dist/providers/gemini.d.ts +16 -0
  233. package/dist/providers/gemini.d.ts.map +1 -0
  234. package/dist/providers/gemini.js +101 -0
  235. package/dist/providers/gemini.js.map +1 -0
  236. package/dist/providers/index.d.ts +21 -0
  237. package/dist/providers/index.d.ts.map +1 -0
  238. package/dist/providers/index.js +68 -0
  239. package/dist/providers/index.js.map +1 -0
  240. package/dist/providers/mcp-provider.d.ts +11 -0
  241. package/dist/providers/mcp-provider.d.ts.map +1 -0
  242. package/dist/providers/mcp-provider.js +42 -0
  243. package/dist/providers/mcp-provider.js.map +1 -0
  244. package/dist/providers/mock.d.ts +10 -0
  245. package/dist/providers/mock.d.ts.map +1 -0
  246. package/dist/providers/mock.js +66 -0
  247. package/dist/providers/mock.js.map +1 -0
  248. package/dist/providers/model-registry.d.ts +9 -0
  249. package/dist/providers/model-registry.d.ts.map +1 -0
  250. package/dist/providers/model-registry.js +153 -0
  251. package/dist/providers/model-registry.js.map +1 -0
  252. package/dist/providers/ollama.d.ts +11 -0
  253. package/dist/providers/ollama.d.ts.map +1 -0
  254. package/dist/providers/ollama.js +141 -0
  255. package/dist/providers/ollama.js.map +1 -0
  256. package/dist/providers/openai.d.ts +17 -0
  257. package/dist/providers/openai.d.ts.map +1 -0
  258. package/dist/providers/openai.js +109 -0
  259. package/dist/providers/openai.js.map +1 -0
  260. package/dist/providers/zai.d.ts +6 -0
  261. package/dist/providers/zai.d.ts.map +1 -0
  262. package/dist/providers/zai.js +17 -0
  263. package/dist/providers/zai.js.map +1 -0
  264. package/dist/server/api.d.ts +5 -0
  265. package/dist/server/api.d.ts.map +1 -0
  266. package/dist/server/api.js +153 -0
  267. package/dist/server/api.js.map +1 -0
  268. package/dist/server/index.d.ts +14 -0
  269. package/dist/server/index.d.ts.map +1 -0
  270. package/dist/server/index.js +98 -0
  271. package/dist/server/index.js.map +1 -0
  272. package/dist/server/middleware.d.ts +6 -0
  273. package/dist/server/middleware.d.ts.map +1 -0
  274. package/dist/server/middleware.js +35 -0
  275. package/dist/server/middleware.js.map +1 -0
  276. package/dist/server/tunnel.d.ts +7 -0
  277. package/dist/server/tunnel.d.ts.map +1 -0
  278. package/dist/server/tunnel.js +44 -0
  279. package/dist/server/tunnel.js.map +1 -0
  280. package/dist/server/websocket.d.ts +11 -0
  281. package/dist/server/websocket.d.ts.map +1 -0
  282. package/dist/server/websocket.js +48 -0
  283. package/dist/server/websocket.js.map +1 -0
  284. package/dist/types.d.ts +90 -0
  285. package/dist/types.d.ts.map +1 -0
  286. package/dist/types.js +2 -0
  287. package/dist/types.js.map +1 -0
  288. package/package.json +62 -0
@@ -0,0 +1,87 @@
1
+ const TERMINAL_STATUSES = ['approved', 'rejected', 'interrupted', 'awaiting_approval'];
2
+ export class TaskGraph {
3
+ tasks;
4
+ constructor(tasks) {
5
+ this.tasks = new Map(tasks.map((task) => [task.id, task]));
6
+ this.validateNoCycles();
7
+ }
8
+ readyTasks() {
9
+ const ready = [];
10
+ for (const task of this.tasks.values()) {
11
+ if (task.status !== 'pending') {
12
+ continue;
13
+ }
14
+ const depsResolved = task.dependencies.every((dependencyId) => {
15
+ const dependency = this.tasks.get(dependencyId);
16
+ return dependency?.status === 'approved';
17
+ });
18
+ if (depsResolved) {
19
+ ready.push(task);
20
+ }
21
+ }
22
+ return ready;
23
+ }
24
+ executionOrder() {
25
+ const visited = new Set();
26
+ const result = [];
27
+ const visit = (id) => {
28
+ if (visited.has(id)) {
29
+ return;
30
+ }
31
+ visited.add(id);
32
+ const task = this.tasks.get(id);
33
+ if (!task) {
34
+ return;
35
+ }
36
+ for (const dependencyId of task.dependencies) {
37
+ visit(dependencyId);
38
+ }
39
+ result.push(task);
40
+ };
41
+ for (const id of this.tasks.keys()) {
42
+ visit(id);
43
+ }
44
+ return result;
45
+ }
46
+ isComplete() {
47
+ return [...this.tasks.values()].every((task) => TERMINAL_STATUSES.includes(task.status));
48
+ }
49
+ updateTask(id, updates) {
50
+ const task = this.tasks.get(id);
51
+ if (!task) {
52
+ return;
53
+ }
54
+ this.tasks.set(id, { ...task, ...updates });
55
+ }
56
+ getTask(id) {
57
+ return this.tasks.get(id);
58
+ }
59
+ allTasks() {
60
+ return [...this.tasks.values()];
61
+ }
62
+ validateNoCycles() {
63
+ const visiting = new Set();
64
+ const visited = new Set();
65
+ const dfs = (id) => {
66
+ if (visited.has(id)) {
67
+ return;
68
+ }
69
+ if (visiting.has(id)) {
70
+ throw new Error(`Circular dependency detected involving task "${id}"`);
71
+ }
72
+ visiting.add(id);
73
+ const task = this.tasks.get(id);
74
+ if (task) {
75
+ for (const dependencyId of task.dependencies) {
76
+ dfs(dependencyId);
77
+ }
78
+ }
79
+ visiting.delete(id);
80
+ visited.add(id);
81
+ };
82
+ for (const id of this.tasks.keys()) {
83
+ dfs(id);
84
+ }
85
+ }
86
+ }
87
+ //# sourceMappingURL=task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/core/task.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function initRepoWithCommit(prefix?: string): string;
2
+ export declare function cleanupRepo(dir: string): void;
3
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/git/__tests__/helpers.ts"],"names":[],"mappings":"AAKA,wBAAgB,kBAAkB,CAAC,MAAM,SAAe,GAAG,MAAM,CAShE;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE7C"}
@@ -0,0 +1,18 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ export function initRepoWithCommit(prefix = 'orka-test-') {
6
+ const dir = mkdtempSync(join(tmpdir(), prefix));
7
+ execFileSync('git', ['init', dir]);
8
+ execFileSync('git', ['-C', dir, 'config', 'user.email', 'test@orka.dev']);
9
+ execFileSync('git', ['-C', dir, 'config', 'user.name', 'Orka Test']);
10
+ writeFileSync(join(dir, 'README.md'), '# Test\n');
11
+ execFileSync('git', ['-C', dir, 'add', '.']);
12
+ execFileSync('git', ['-C', dir, 'commit', '-m', 'initial']);
13
+ return dir;
14
+ }
15
+ export function cleanupRepo(dir) {
16
+ rmSync(dir, { recursive: true, force: true });
17
+ }
18
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/git/__tests__/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,MAAM,UAAU,kBAAkB,CAAC,MAAM,GAAG,YAAY;IACtD,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC,CAAA;IAC/C,YAAY,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAA;IAClC,YAAY,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC,CAAA;IACzE,YAAY,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAA;IACpE,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC,CAAA;IACjD,YAAY,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAA;IAC5C,YAAY,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAA;IAC3D,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;AAC/C,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare function createSessionBranch(cwd: string): Promise<string>;
2
+ export declare function createTaskBranch(cwd: string, sessionBranch: string, taskNumber: number, description: string): Promise<string>;
3
+ export declare function switchBranch(cwd: string, branchName: string): Promise<void>;
4
+ export declare function deleteBranch(cwd: string, branchName: string, force?: boolean): Promise<void>;
5
+ export declare function listOrkaBranches(cwd: string): Promise<string[]>;
6
+ export declare function getTaskBranchesForSession(cwd: string): Promise<string[]>;
7
+ //# sourceMappingURL=branch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch.d.ts","sourceRoot":"","sources":["../../src/git/branch.ts"],"names":[],"mappings":"AASA,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAetE;AAED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CASjB;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjF;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAWhG;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAOrE;AAED,wBAAsB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAY9E"}
@@ -0,0 +1,62 @@
1
+ import { branchExists, getCurrentBranch, gitExec, isCleanWorkingTree } from './utils.js';
2
+ function slugify(text) {
3
+ return text
4
+ .toLowerCase()
5
+ .replace(/[^a-z0-9]+/g, '-')
6
+ .replace(/^-+|-+$/g, '');
7
+ }
8
+ export async function createSessionBranch(cwd) {
9
+ const clean = await isCleanWorkingTree(cwd);
10
+ if (!clean) {
11
+ throw new Error('Working tree tidak bersih. Commit atau stash perubahan sebelum membuat session branch.');
12
+ }
13
+ const timestamp = Date.now();
14
+ let branchName = `orka/session-${timestamp}`;
15
+ if (await branchExists(cwd, branchName)) {
16
+ branchName = `orka/session-${timestamp}-${Math.floor(Math.random() * 1000)}`;
17
+ }
18
+ await gitExec(cwd, ['checkout', '-b', branchName]);
19
+ return branchName;
20
+ }
21
+ export async function createTaskBranch(cwd, sessionBranch, taskNumber, description) {
22
+ const branchName = `orka/task-${taskNumber}-${slugify(description)}`;
23
+ if (await branchExists(cwd, branchName)) {
24
+ throw new Error(`Branch "${branchName}" sudah ada. Gunakan nomor task yang berbeda.`);
25
+ }
26
+ await gitExec(cwd, ['checkout', '-b', branchName, sessionBranch]);
27
+ return branchName;
28
+ }
29
+ export async function switchBranch(cwd, branchName) {
30
+ await gitExec(cwd, ['checkout', branchName]);
31
+ }
32
+ export async function deleteBranch(cwd, branchName, force = false) {
33
+ if (force) {
34
+ await gitExec(cwd, ['branch', '-D', branchName]);
35
+ return;
36
+ }
37
+ try {
38
+ await gitExec(cwd, ['branch', '-d', branchName]);
39
+ }
40
+ catch {
41
+ throw new Error(`Branch "${branchName}" belum di-merge. Gunakan force=true untuk tetap menghapus.`);
42
+ }
43
+ }
44
+ export async function listOrkaBranches(cwd) {
45
+ const output = await gitExec(cwd, ['branch', '--list', 'orka/*']);
46
+ if (!output) {
47
+ return [];
48
+ }
49
+ return output.split('\n').map((branch) => branch.trim().replace(/^\*\s+/, ''));
50
+ }
51
+ export async function getTaskBranchesForSession(cwd) {
52
+ const currentBranch = await getCurrentBranch(cwd);
53
+ const output = await gitExec(cwd, ['branch', '--list', 'orka/task-*']);
54
+ const branches = output
55
+ ? output.split('\n').map((branch) => branch.trim().replace(/^\*\s+/, ''))
56
+ : [];
57
+ if (currentBranch.startsWith('orka/session-')) {
58
+ return branches;
59
+ }
60
+ return branches;
61
+ }
62
+ //# sourceMappingURL=branch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch.js","sourceRoot":"","sources":["../../src/git/branch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function formatCommitMessage(agentId: string, description: string, prefix?: string): string;
2
+ export declare function autoCommit(cwd: string, agentId: string, description: string, commitPrefix?: string, files?: string[]): Promise<string>;
3
+ //# sourceMappingURL=commit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit.d.ts","sourceRoot":"","sources":["../../src/git/commit.ts"],"names":[],"mappings":"AAEA,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAGjG;AAED,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,YAAY,CAAC,EAAE,MAAM,EACrB,KAAK,CAAC,EAAE,MAAM,EAAE,GACf,OAAO,CAAC,MAAM,CAAC,CAejB"}
@@ -0,0 +1,21 @@
1
+ import { gitExec } from './utils.js';
2
+ export function formatCommitMessage(agentId, description, prefix) {
3
+ const normalized = (prefix ?? '[orka]').replace(/^\[?/, '').replace(/\]?$/, '');
4
+ return `[${normalized}:${agentId}] ${description}`;
5
+ }
6
+ export async function autoCommit(cwd, agentId, description, commitPrefix, files) {
7
+ if (files && files.length > 0) {
8
+ await gitExec(cwd, ['add', ...files]);
9
+ }
10
+ else {
11
+ await gitExec(cwd, ['add', '-A']);
12
+ }
13
+ const staged = await gitExec(cwd, ['diff', '--cached', '--name-only']);
14
+ if (!staged) {
15
+ throw new Error('Tidak ada perubahan untuk di-commit.');
16
+ }
17
+ const message = formatCommitMessage(agentId, description, commitPrefix);
18
+ await gitExec(cwd, ['commit', '-m', message]);
19
+ return gitExec(cwd, ['rev-parse', 'HEAD']);
20
+ }
21
+ //# sourceMappingURL=commit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit.js","sourceRoot":"","sources":["../../src/git/commit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEpC,MAAM,UAAU,mBAAmB,CAAC,OAAe,EAAE,WAAmB,EAAE,MAAe;IACvF,MAAM,UAAU,GAAG,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IAC/E,OAAO,IAAI,UAAU,IAAI,OAAO,KAAK,WAAW,EAAE,CAAA;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAW,EACX,OAAe,EACf,WAAmB,EACnB,YAAqB,EACrB,KAAgB;IAEhB,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC,CAAA;IACvC,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAA;IACnC,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CAAA;IACtE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;IACzD,CAAC;IAED,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,EAAE,WAAW,EAAE,YAAY,CAAC,CAAA;IACvE,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAA;IAC7C,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAA;AAC5C,CAAC"}
@@ -0,0 +1,19 @@
1
+ export interface ConflictBlock {
2
+ ours: string;
3
+ theirs: string;
4
+ theirsBranch: string;
5
+ }
6
+ export interface ConflictResolution {
7
+ ours: string;
8
+ theirs: string;
9
+ resolved: string;
10
+ }
11
+ export interface TaskContext {
12
+ ours: string;
13
+ theirs: string;
14
+ }
15
+ export type LLMResolver = (prompt: string) => Promise<string>;
16
+ export declare function parseConflictMarkers(content: string): ConflictBlock[];
17
+ export declare function resolveConflictsWithLLM(filePath: string, blocks: ConflictBlock[], taskGoals: TaskContext, resolver: LLMResolver): Promise<ConflictResolution[]>;
18
+ export declare function applyResolution(content: string, resolutions: ConflictResolution[]): string;
19
+ //# sourceMappingURL=conflict.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflict.d.ts","sourceRoot":"","sources":["../../src/git/conflict.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;AAE7D,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,EAAE,CAoCrE;AAED,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,aAAa,EAAE,EACvB,SAAS,EAAE,WAAW,EACtB,QAAQ,EAAE,WAAW,GACpB,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAyB/B;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAoC1F"}
@@ -0,0 +1,86 @@
1
+ export function parseConflictMarkers(content) {
2
+ const lines = content.split('\n');
3
+ const blocks = [];
4
+ let index = 0;
5
+ while (index < lines.length) {
6
+ if (!lines[index]?.startsWith('<<<<<<< ')) {
7
+ index += 1;
8
+ continue;
9
+ }
10
+ index += 1;
11
+ const ours = [];
12
+ while (index < lines.length && lines[index] !== '=======') {
13
+ ours.push(lines[index] ?? '');
14
+ index += 1;
15
+ }
16
+ index += 1;
17
+ const theirs = [];
18
+ while (index < lines.length && !lines[index]?.startsWith('>>>>>>> ')) {
19
+ theirs.push(lines[index] ?? '');
20
+ index += 1;
21
+ }
22
+ const theirsBranch = (lines[index] ?? '').replace('>>>>>>> ', '');
23
+ blocks.push({
24
+ ours: ours.join('\n'),
25
+ theirs: theirs.join('\n'),
26
+ theirsBranch,
27
+ });
28
+ index += 1;
29
+ }
30
+ return blocks;
31
+ }
32
+ export async function resolveConflictsWithLLM(filePath, blocks, taskGoals, resolver) {
33
+ const resolutions = [];
34
+ for (const [index, block] of blocks.entries()) {
35
+ const prompt = [
36
+ `Anda sedang menyelesaikan merge conflict pada file ${filePath}.`,
37
+ `Conflict block #${index + 1}.`,
38
+ `Tujuan perubahan session: ${taskGoals.ours}`,
39
+ `Tujuan perubahan task: ${taskGoals.theirs}`,
40
+ `Versi session (ours):`,
41
+ block.ours,
42
+ `Versi task (theirs) dari ${block.theirsBranch}:`,
43
+ block.theirs,
44
+ 'Buat hasil gabungan final tanpa marker conflict. Berikan hanya isi final block.',
45
+ ].join('\n\n');
46
+ const resolved = await resolver(prompt);
47
+ resolutions.push({
48
+ ours: block.ours,
49
+ theirs: block.theirs,
50
+ resolved,
51
+ });
52
+ }
53
+ return resolutions;
54
+ }
55
+ export function applyResolution(content, resolutions) {
56
+ const lines = content.split('\n');
57
+ const output = [];
58
+ let index = 0;
59
+ let resolutionIndex = 0;
60
+ while (index < lines.length) {
61
+ if (!lines[index]?.startsWith('<<<<<<< ')) {
62
+ output.push(lines[index] ?? '');
63
+ index += 1;
64
+ continue;
65
+ }
66
+ index += 1;
67
+ while (index < lines.length && lines[index] !== '=======') {
68
+ index += 1;
69
+ }
70
+ index += 1;
71
+ while (index < lines.length && !lines[index]?.startsWith('>>>>>>> ')) {
72
+ index += 1;
73
+ }
74
+ index += 1;
75
+ const resolution = resolutions[resolutionIndex];
76
+ if (resolution) {
77
+ output.push(...resolution.resolved.split('\n'));
78
+ }
79
+ resolutionIndex += 1;
80
+ }
81
+ if (output[output.length - 1] === '') {
82
+ output.pop();
83
+ }
84
+ return output.join('\n');
85
+ }
86
+ //# sourceMappingURL=conflict.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflict.js","sourceRoot":"","sources":["../../src/git/conflict.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { autoCommit, formatCommitMessage } from './commit.js';
2
+ export { createSessionBranch, createTaskBranch, deleteBranch, getTaskBranchesForSession, listOrkaBranches, switchBranch, } from './branch.js';
3
+ export { applyResolution, parseConflictMarkers, resolveConflictsWithLLM } from './conflict.js';
4
+ export { detectConflicts, mergeTaskToSession, rebaseInFlightBranches, rebaseOntoSession } from './merge.js';
5
+ export { assertSafeOperation, getGitConfigFromOrka, rollback, rollbackSession } from './safety.js';
6
+ export { branchExists, getCurrentBranch, getHeadCommit, getHeadSha, gitExec, isCleanWorkingTree, isGitRepo } from './utils.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/git/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAC7D,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,YAAY,EACZ,yBAAyB,EACzB,gBAAgB,EAChB,YAAY,GACb,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAA;AAC9F,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAC3G,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAClG,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA"}
@@ -0,0 +1,7 @@
1
+ export { autoCommit, formatCommitMessage } from './commit.js';
2
+ export { createSessionBranch, createTaskBranch, deleteBranch, getTaskBranchesForSession, listOrkaBranches, switchBranch, } from './branch.js';
3
+ export { applyResolution, parseConflictMarkers, resolveConflictsWithLLM } from './conflict.js';
4
+ export { detectConflicts, mergeTaskToSession, rebaseInFlightBranches, rebaseOntoSession } from './merge.js';
5
+ export { assertSafeOperation, getGitConfigFromOrka, rollback, rollbackSession } from './safety.js';
6
+ export { branchExists, getCurrentBranch, getHeadCommit, getHeadSha, gitExec, isCleanWorkingTree, isGitRepo } from './utils.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/git/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAC7D,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,YAAY,EACZ,yBAAyB,EACzB,gBAAgB,EAChB,YAAY,GACb,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAA;AAC9F,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAC3G,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAClG,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA"}
@@ -0,0 +1,16 @@
1
+ export type MergeFailureReason = 'conflict' | 'dirty-tree' | 'unknown';
2
+ export interface MergeResult {
3
+ success: boolean;
4
+ conflicts?: string[];
5
+ failureReason?: MergeFailureReason;
6
+ }
7
+ export interface RebaseResult {
8
+ success: boolean;
9
+ conflicts?: string[];
10
+ failureReason?: MergeFailureReason;
11
+ }
12
+ export declare function mergeTaskToSession(cwd: string, taskBranch: string, sessionBranch: string): Promise<MergeResult>;
13
+ export declare function rebaseOntoSession(cwd: string, taskBranch: string, sessionBranch: string): Promise<RebaseResult>;
14
+ export declare function rebaseInFlightBranches(cwd: string, sessionBranch: string, inFlightBranches: string[]): Promise<Map<string, RebaseResult>>;
15
+ export declare function detectConflicts(cwd: string, taskBranch: string, sessionBranch: string): Promise<string[]>;
16
+ //# sourceMappingURL=merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/git/merge.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,YAAY,GAAG,SAAS,CAAA;AAEtE,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,aAAa,CAAC,EAAE,kBAAkB,CAAA;CACnC;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,aAAa,CAAC,EAAE,kBAAkB,CAAA;CACnC;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAkBrH;AAED,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAkBrH;AAED,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,EACrB,gBAAgB,EAAE,MAAM,EAAE,GACzB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAUpC;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAY/G"}
@@ -0,0 +1,101 @@
1
+ import { switchBranch } from './branch.js';
2
+ import { gitExec } from './utils.js';
3
+ export async function mergeTaskToSession(cwd, taskBranch, sessionBranch) {
4
+ await switchBranch(cwd, sessionBranch);
5
+ try {
6
+ await gitExec(cwd, ['merge', taskBranch, '--no-ff', '-m', `merge ${taskBranch} into ${sessionBranch}`]);
7
+ return { success: true };
8
+ }
9
+ catch (error) {
10
+ const conflicts = await getConflictedFiles(cwd);
11
+ if (conflicts.length > 0) {
12
+ await abortMerge(cwd);
13
+ return { success: false, conflicts, failureReason: 'conflict' };
14
+ }
15
+ return {
16
+ success: false,
17
+ failureReason: classifyFailure(error),
18
+ };
19
+ }
20
+ }
21
+ export async function rebaseOntoSession(cwd, taskBranch, sessionBranch) {
22
+ await switchBranch(cwd, taskBranch);
23
+ try {
24
+ await gitExec(cwd, ['rebase', sessionBranch]);
25
+ return { success: true };
26
+ }
27
+ catch (error) {
28
+ const conflicts = await getConflictedFiles(cwd);
29
+ if (conflicts.length > 0) {
30
+ await abortRebase(cwd);
31
+ return { success: false, conflicts, failureReason: 'conflict' };
32
+ }
33
+ return {
34
+ success: false,
35
+ failureReason: classifyFailure(error),
36
+ };
37
+ }
38
+ }
39
+ export async function rebaseInFlightBranches(cwd, sessionBranch, inFlightBranches) {
40
+ const results = new Map();
41
+ for (const branch of inFlightBranches) {
42
+ const result = await rebaseOntoSession(cwd, branch, sessionBranch);
43
+ results.set(branch, result);
44
+ }
45
+ await switchBranch(cwd, sessionBranch);
46
+ return results;
47
+ }
48
+ export async function detectConflicts(cwd, taskBranch, sessionBranch) {
49
+ await switchBranch(cwd, sessionBranch);
50
+ try {
51
+ await gitExec(cwd, ['merge', '--no-commit', '--no-ff', taskBranch]);
52
+ await resetMerge(cwd);
53
+ return [];
54
+ }
55
+ catch {
56
+ const conflicts = await getConflictedFiles(cwd);
57
+ await abortMerge(cwd);
58
+ return conflicts;
59
+ }
60
+ }
61
+ async function getConflictedFiles(cwd) {
62
+ try {
63
+ const output = await gitExec(cwd, ['diff', '--name-only', '--diff-filter=U']);
64
+ return output ? output.split('\n').filter(Boolean) : [];
65
+ }
66
+ catch {
67
+ return [];
68
+ }
69
+ }
70
+ async function abortMerge(cwd) {
71
+ try {
72
+ await gitExec(cwd, ['merge', '--abort']);
73
+ }
74
+ catch {
75
+ await resetMerge(cwd);
76
+ }
77
+ }
78
+ async function resetMerge(cwd) {
79
+ try {
80
+ await gitExec(cwd, ['reset', '--merge']);
81
+ }
82
+ catch {
83
+ // noop
84
+ }
85
+ }
86
+ async function abortRebase(cwd) {
87
+ try {
88
+ await gitExec(cwd, ['rebase', '--abort']);
89
+ }
90
+ catch {
91
+ // noop
92
+ }
93
+ }
94
+ function classifyFailure(error) {
95
+ const message = error instanceof Error ? error.message.toLowerCase() : String(error).toLowerCase();
96
+ if (message.includes('not possible') || message.includes('local changes')) {
97
+ return 'dirty-tree';
98
+ }
99
+ return 'unknown';
100
+ }
101
+ //# sourceMappingURL=merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/git/merge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAgBpC,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAW,EAAE,UAAkB,EAAE,aAAqB;IAC7F,MAAM,YAAY,CAAC,GAAG,EAAE,aAAa,CAAC,CAAA;IAEtC,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,UAAU,SAAS,aAAa,EAAE,CAAC,CAAC,CAAA;QACvG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,GAAG,CAAC,CAAA;QAC/C,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,UAAU,CAAC,GAAG,CAAC,CAAA;YACrB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,CAAA;QACjE,CAAC;QAED,OAAO;YACL,OAAO,EAAE,KAAK;YACd,aAAa,EAAE,eAAe,CAAC,KAAK,CAAC;SACtC,CAAA;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAW,EAAE,UAAkB,EAAE,aAAqB;IAC5F,MAAM,YAAY,CAAC,GAAG,EAAE,UAAU,CAAC,CAAA;IAEnC,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAA;QAC7C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,GAAG,CAAC,CAAA;QAC/C,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,WAAW,CAAC,GAAG,CAAC,CAAA;YACtB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,CAAA;QACjE,CAAC;QAED,OAAO;YACL,OAAO,EAAE,KAAK;YACd,aAAa,EAAE,eAAe,CAAC,KAAK,CAAC;SACtC,CAAA;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,GAAW,EACX,aAAqB,EACrB,gBAA0B;IAE1B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAwB,CAAA;IAE/C,KAAK,MAAM,MAAM,IAAI,gBAAgB,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,CAAC,CAAA;QAClE,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7B,CAAC;IAED,MAAM,YAAY,CAAC,GAAG,EAAE,aAAa,CAAC,CAAA;IACtC,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAW,EAAE,UAAkB,EAAE,aAAqB;IAC1F,MAAM,YAAY,CAAC,GAAG,EAAE,aAAa,CAAC,CAAA;IAEtC,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAA;QACnE,MAAM,UAAU,CAAC,GAAG,CAAC,CAAA;QACrB,OAAO,EAAE,CAAA;IACX,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,GAAG,CAAC,CAAA;QAC/C,MAAM,UAAU,CAAC,GAAG,CAAC,CAAA;QACrB,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,GAAW;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,iBAAiB,CAAC,CAAC,CAAA;QAC7E,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,GAAW;IACnC,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAA;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,UAAU,CAAC,GAAG,CAAC,CAAA;IACvB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,GAAW;IACnC,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAA;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,GAAW;IACpC,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAA;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAA;IAClG,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QAC1E,OAAO,YAAY,CAAA;IACrB,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { OrkaConfig } from '../types.js';
2
+ export interface GitSafetyConfig {
3
+ push: boolean;
4
+ }
5
+ type SafeOperation = 'merge' | 'rebase' | 'push' | 'force-push';
6
+ export declare function getGitConfigFromOrka(config: OrkaConfig): {
7
+ autoBranch: boolean;
8
+ autoMerge: boolean;
9
+ commitPrefix: string;
10
+ conflictResolution: 'prompt' | 'auto' | 'manual';
11
+ };
12
+ export declare function assertSafeOperation(operation: SafeOperation, config?: GitSafetyConfig, targetBranch?: string): void;
13
+ export declare function rollback(cwd: string, sessionBranch: string, mode?: 'revert' | 'reset'): Promise<void>;
14
+ export declare function rollbackSession(cwd: string, sessionBranch: string, returnBranch: string): Promise<void>;
15
+ export {};
16
+ //# sourceMappingURL=safety.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safety.d.ts","sourceRoot":"","sources":["../../src/git/safety.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAI7C,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,CAAA;CACd;AAED,KAAK,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,YAAY,CAAA;AAI/D,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,GAAG;IACxD,UAAU,EAAE,OAAO,CAAA;IACnB,SAAS,EAAE,OAAO,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,kBAAkB,EAAE,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAA;CACjD,CAOA;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,eAAe,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAgBnH;AAED,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,GAAE,QAAQ,GAAG,OAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBrH;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAa7G"}
@@ -0,0 +1,64 @@
1
+ import { deleteBranch, getTaskBranchesForSession, switchBranch } from './branch.js';
2
+ import { gitExec } from './utils.js';
3
+ const PROTECTED_BRANCHES = new Set(['main', 'master']);
4
+ export function getGitConfigFromOrka(config) {
5
+ return {
6
+ autoBranch: config.git.autoBranch,
7
+ autoMerge: config.git.autoMerge,
8
+ commitPrefix: config.git.commitPrefix,
9
+ conflictResolution: config.git.conflictResolution,
10
+ };
11
+ }
12
+ export function assertSafeOperation(operation, config, targetBranch) {
13
+ if (operation === 'force-push') {
14
+ throw new Error('Orka tidak pernah melakukan force push.');
15
+ }
16
+ if (operation !== 'push') {
17
+ return;
18
+ }
19
+ if (!config?.push) {
20
+ throw new Error('Push ke remote tidak diizinkan. Set git.push: true di config.');
21
+ }
22
+ if (targetBranch && PROTECTED_BRANCHES.has(targetBranch)) {
23
+ throw new Error(`Tidak boleh push langsung ke ${targetBranch}.`);
24
+ }
25
+ }
26
+ export async function rollback(cwd, sessionBranch, mode = 'revert') {
27
+ await switchBranch(cwd, sessionBranch);
28
+ const firstCommit = await gitExec(cwd, ['rev-list', '--max-parents=0', 'HEAD']);
29
+ const mergeBase = await gitExec(cwd, ['merge-base', firstCommit, sessionBranch]);
30
+ if (mode === 'reset') {
31
+ await gitExec(cwd, ['reset', '--hard', mergeBase]);
32
+ return;
33
+ }
34
+ const commits = await gitExec(cwd, ['rev-list', `${mergeBase}..HEAD`]);
35
+ const commitList = commits ? commits.split('\n').filter(Boolean) : [];
36
+ for (const commit of commitList) {
37
+ try {
38
+ await gitExec(cwd, ['revert', '--no-edit', commit]);
39
+ }
40
+ catch {
41
+ try {
42
+ await gitExec(cwd, ['revert', '--abort']);
43
+ }
44
+ catch {
45
+ // noop
46
+ }
47
+ break;
48
+ }
49
+ }
50
+ }
51
+ export async function rollbackSession(cwd, sessionBranch, returnBranch) {
52
+ const taskBranches = await getTaskBranchesForSession(cwd);
53
+ await switchBranch(cwd, returnBranch);
54
+ for (const branch of taskBranches) {
55
+ try {
56
+ await deleteBranch(cwd, branch, true);
57
+ }
58
+ catch {
59
+ // noop
60
+ }
61
+ }
62
+ await deleteBranch(cwd, sessionBranch, true);
63
+ }
64
+ //# sourceMappingURL=safety.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safety.js","sourceRoot":"","sources":["../../src/git/safety.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export declare function gitExec(cwd: string, args: string[]): Promise<string>;
2
+ export declare function isGitRepo(cwd: string): Promise<boolean>;
3
+ export declare function getCurrentBranch(cwd: string): Promise<string>;
4
+ export declare function isCleanWorkingTree(cwd: string): Promise<boolean>;
5
+ export declare function getHeadCommit(cwd: string): Promise<string>;
6
+ export declare function getHeadSha(cwd: string): Promise<string>;
7
+ export declare function branchExists(cwd: string, branchName: string): Promise<boolean>;
8
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/git/utils.ts"],"names":[],"mappings":"AAKA,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAG1E;AAED,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO7D;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEnE;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGtE;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEhE;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE7D;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOpF"}