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.
- package/CHANGELOG.md +25 -0
- package/CONTRIBUTING.md +59 -0
- package/README.md +208 -0
- package/dist/agents/base-agent.d.ts +48 -0
- package/dist/agents/base-agent.d.ts.map +1 -0
- package/dist/agents/base-agent.js +59 -0
- package/dist/agents/base-agent.js.map +1 -0
- package/dist/agents/builder.d.ts +53 -0
- package/dist/agents/builder.d.ts.map +1 -0
- package/dist/agents/builder.js +147 -0
- package/dist/agents/builder.js.map +1 -0
- package/dist/agents/coordinator.d.ts +45 -0
- package/dist/agents/coordinator.d.ts.map +1 -0
- package/dist/agents/coordinator.js +201 -0
- package/dist/agents/coordinator.js.map +1 -0
- package/dist/agents/index.d.ts +8 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +7 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/reviewer.d.ts +39 -0
- package/dist/agents/reviewer.d.ts.map +1 -0
- package/dist/agents/reviewer.js +119 -0
- package/dist/agents/reviewer.js.map +1 -0
- package/dist/agents/scout.d.ts +35 -0
- package/dist/agents/scout.d.ts.map +1 -0
- package/dist/agents/scout.js +76 -0
- package/dist/agents/scout.js.map +1 -0
- package/dist/agents/tester.d.ts +25 -0
- package/dist/agents/tester.d.ts.map +1 -0
- package/dist/agents/tester.js +76 -0
- package/dist/agents/tester.js.map +1 -0
- package/dist/cli/board.d.ts +28 -0
- package/dist/cli/board.d.ts.map +1 -0
- package/dist/cli/board.js +178 -0
- package/dist/cli/board.js.map +1 -0
- package/dist/cli/cost.d.ts +31 -0
- package/dist/cli/cost.d.ts.map +1 -0
- package/dist/cli/cost.js +85 -0
- package/dist/cli/cost.js.map +1 -0
- package/dist/cli/credentials.d.ts +23 -0
- package/dist/cli/credentials.d.ts.map +1 -0
- package/dist/cli/credentials.js +77 -0
- package/dist/cli/credentials.js.map +1 -0
- package/dist/cli/dry-run.d.ts +3 -0
- package/dist/cli/dry-run.d.ts.map +1 -0
- package/dist/cli/dry-run.js +21 -0
- package/dist/cli/dry-run.js.map +1 -0
- package/dist/cli/extras.d.ts +21 -0
- package/dist/cli/extras.d.ts.map +1 -0
- package/dist/cli/extras.js +39 -0
- package/dist/cli/extras.js.map +1 -0
- package/dist/cli/fix.d.ts +11 -0
- package/dist/cli/fix.d.ts.map +1 -0
- package/dist/cli/fix.js +72 -0
- package/dist/cli/fix.js.map +1 -0
- package/dist/cli/git-session.d.ts +21 -0
- package/dist/cli/git-session.d.ts.map +1 -0
- package/dist/cli/git-session.js +62 -0
- package/dist/cli/git-session.js.map +1 -0
- package/dist/cli/index.d.ts +4 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +546 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +16 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +75 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/login.d.ts +9 -0
- package/dist/cli/login.d.ts.map +1 -0
- package/dist/cli/login.js +114 -0
- package/dist/cli/login.js.map +1 -0
- package/dist/cli/logs.d.ts +16 -0
- package/dist/cli/logs.d.ts.map +1 -0
- package/dist/cli/logs.js +37 -0
- package/dist/cli/logs.js.map +1 -0
- package/dist/cli/memory-learner.d.ts +7 -0
- package/dist/cli/memory-learner.d.ts.map +1 -0
- package/dist/cli/memory-learner.js +36 -0
- package/dist/cli/memory-learner.js.map +1 -0
- package/dist/cli/memory.d.ts +13 -0
- package/dist/cli/memory.d.ts.map +1 -0
- package/dist/cli/memory.js +52 -0
- package/dist/cli/memory.js.map +1 -0
- package/dist/cli/plugin.d.ts +5 -0
- package/dist/cli/plugin.d.ts.map +1 -0
- package/dist/cli/plugin.js +42 -0
- package/dist/cli/plugin.js.map +1 -0
- package/dist/cli/resume.d.ts +18 -0
- package/dist/cli/resume.d.ts.map +1 -0
- package/dist/cli/resume.js +84 -0
- package/dist/cli/resume.js.map +1 -0
- package/dist/cli/rollback.d.ts +11 -0
- package/dist/cli/rollback.d.ts.map +1 -0
- package/dist/cli/rollback.js +12 -0
- package/dist/cli/rollback.js.map +1 -0
- package/dist/cli/rules.d.ts +7 -0
- package/dist/cli/rules.d.ts.map +1 -0
- package/dist/cli/rules.js +20 -0
- package/dist/cli/rules.js.map +1 -0
- package/dist/cli/run.d.ts +35 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +294 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/session.d.ts +5 -0
- package/dist/cli/session.d.ts.map +1 -0
- package/dist/cli/session.js +46 -0
- package/dist/cli/session.js.map +1 -0
- package/dist/cli/ui/Board.d.ts +22 -0
- package/dist/cli/ui/Board.d.ts.map +1 -0
- package/dist/cli/ui/Board.js +40 -0
- package/dist/cli/ui/Board.js.map +1 -0
- package/dist/cli/ui/StatusBar.d.ts +10 -0
- package/dist/cli/ui/StatusBar.d.ts.map +1 -0
- package/dist/cli/ui/StatusBar.js +6 -0
- package/dist/cli/ui/StatusBar.js.map +1 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +79 -0
- package/dist/config.js.map +1 -0
- package/dist/core/bus.d.ts +19 -0
- package/dist/core/bus.d.ts.map +1 -0
- package/dist/core/bus.js +25 -0
- package/dist/core/bus.js.map +1 -0
- package/dist/core/context.d.ts +10 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +42 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/dispatcher.d.ts +25 -0
- package/dist/core/dispatcher.d.ts.map +1 -0
- package/dist/core/dispatcher.js +76 -0
- package/dist/core/dispatcher.js.map +1 -0
- package/dist/core/errors.d.ts +8 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +13 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/file-ownership.d.ts +25 -0
- package/dist/core/file-ownership.d.ts.map +1 -0
- package/dist/core/file-ownership.js +81 -0
- package/dist/core/file-ownership.js.map +1 -0
- package/dist/core/index.d.ts +9 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +6 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/mcp-client-pool.d.ts +9 -0
- package/dist/core/mcp-client-pool.d.ts.map +1 -0
- package/dist/core/mcp-client-pool.js +26 -0
- package/dist/core/mcp-client-pool.js.map +1 -0
- package/dist/core/mcp-client.d.ts +27 -0
- package/dist/core/mcp-client.d.ts.map +1 -0
- package/dist/core/mcp-client.js +63 -0
- package/dist/core/mcp-client.js.map +1 -0
- package/dist/core/plugin-loader.d.ts +41 -0
- package/dist/core/plugin-loader.d.ts.map +1 -0
- package/dist/core/plugin-loader.js +62 -0
- package/dist/core/plugin-loader.js.map +1 -0
- package/dist/core/plugin-sdk.d.ts +5 -0
- package/dist/core/plugin-sdk.d.ts.map +1 -0
- package/dist/core/plugin-sdk.js +2 -0
- package/dist/core/plugin-sdk.js.map +1 -0
- package/dist/core/state.d.ts +77 -0
- package/dist/core/state.d.ts.map +1 -0
- package/dist/core/state.js +357 -0
- package/dist/core/state.js.map +1 -0
- package/dist/core/task.d.ts +13 -0
- package/dist/core/task.d.ts.map +1 -0
- package/dist/core/task.js +87 -0
- package/dist/core/task.js.map +1 -0
- package/dist/git/__tests__/helpers.d.ts +3 -0
- package/dist/git/__tests__/helpers.d.ts.map +1 -0
- package/dist/git/__tests__/helpers.js +18 -0
- package/dist/git/__tests__/helpers.js.map +1 -0
- package/dist/git/branch.d.ts +7 -0
- package/dist/git/branch.d.ts.map +1 -0
- package/dist/git/branch.js +62 -0
- package/dist/git/branch.js.map +1 -0
- package/dist/git/commit.d.ts +3 -0
- package/dist/git/commit.d.ts.map +1 -0
- package/dist/git/commit.js +21 -0
- package/dist/git/commit.js.map +1 -0
- package/dist/git/conflict.d.ts +19 -0
- package/dist/git/conflict.d.ts.map +1 -0
- package/dist/git/conflict.js +86 -0
- package/dist/git/conflict.js.map +1 -0
- package/dist/git/index.d.ts +7 -0
- package/dist/git/index.d.ts.map +1 -0
- package/dist/git/index.js +7 -0
- package/dist/git/index.js.map +1 -0
- package/dist/git/merge.d.ts +16 -0
- package/dist/git/merge.d.ts.map +1 -0
- package/dist/git/merge.js +101 -0
- package/dist/git/merge.js.map +1 -0
- package/dist/git/safety.d.ts +16 -0
- package/dist/git/safety.d.ts.map +1 -0
- package/dist/git/safety.js +64 -0
- package/dist/git/safety.js.map +1 -0
- package/dist/git/utils.d.ts +8 -0
- package/dist/git/utils.d.ts.map +1 -0
- package/dist/git/utils.js +39 -0
- package/dist/git/utils.js.map +1 -0
- package/dist/mcp-server/index.d.ts +2 -0
- package/dist/mcp-server/index.d.ts.map +1 -0
- package/dist/mcp-server/index.js +39 -0
- package/dist/mcp-server/index.js.map +1 -0
- package/dist/mcp-server/tools.d.ts +70 -0
- package/dist/mcp-server/tools.d.ts.map +1 -0
- package/dist/mcp-server/tools.js +112 -0
- package/dist/mcp-server/tools.js.map +1 -0
- package/dist/models/item.d.ts +6 -0
- package/dist/models/item.d.ts.map +1 -0
- package/dist/models/item.js +2 -0
- package/dist/models/item.js.map +1 -0
- package/dist/orchestration/glue.d.ts +31 -0
- package/dist/orchestration/glue.d.ts.map +1 -0
- package/dist/orchestration/glue.js +204 -0
- package/dist/orchestration/glue.js.map +1 -0
- package/dist/orchestration/index.d.ts +3 -0
- package/dist/orchestration/index.d.ts.map +1 -0
- package/dist/orchestration/index.js +3 -0
- package/dist/orchestration/index.js.map +1 -0
- package/dist/orchestration/runtime.d.ts +35 -0
- package/dist/orchestration/runtime.d.ts.map +1 -0
- package/dist/orchestration/runtime.js +165 -0
- package/dist/orchestration/runtime.js.map +1 -0
- package/dist/providers/base-provider.d.ts +28 -0
- package/dist/providers/base-provider.d.ts.map +1 -0
- package/dist/providers/base-provider.js +2 -0
- package/dist/providers/base-provider.js.map +1 -0
- package/dist/providers/claude.d.ts +10 -0
- package/dist/providers/claude.d.ts.map +1 -0
- package/dist/providers/claude.js +93 -0
- package/dist/providers/claude.js.map +1 -0
- package/dist/providers/gemini.d.ts +16 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +101 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/index.d.ts +21 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +68 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/mcp-provider.d.ts +11 -0
- package/dist/providers/mcp-provider.d.ts.map +1 -0
- package/dist/providers/mcp-provider.js +42 -0
- package/dist/providers/mcp-provider.js.map +1 -0
- package/dist/providers/mock.d.ts +10 -0
- package/dist/providers/mock.d.ts.map +1 -0
- package/dist/providers/mock.js +66 -0
- package/dist/providers/mock.js.map +1 -0
- package/dist/providers/model-registry.d.ts +9 -0
- package/dist/providers/model-registry.d.ts.map +1 -0
- package/dist/providers/model-registry.js +153 -0
- package/dist/providers/model-registry.js.map +1 -0
- package/dist/providers/ollama.d.ts +11 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +141 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/openai.d.ts +17 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +109 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/zai.d.ts +6 -0
- package/dist/providers/zai.d.ts.map +1 -0
- package/dist/providers/zai.js +17 -0
- package/dist/providers/zai.js.map +1 -0
- package/dist/server/api.d.ts +5 -0
- package/dist/server/api.d.ts.map +1 -0
- package/dist/server/api.js +153 -0
- package/dist/server/api.js.map +1 -0
- package/dist/server/index.d.ts +14 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +98 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/middleware.d.ts +6 -0
- package/dist/server/middleware.d.ts.map +1 -0
- package/dist/server/middleware.js +35 -0
- package/dist/server/middleware.js.map +1 -0
- package/dist/server/tunnel.d.ts +7 -0
- package/dist/server/tunnel.d.ts.map +1 -0
- package/dist/server/tunnel.js +44 -0
- package/dist/server/tunnel.js.map +1 -0
- package/dist/server/websocket.d.ts +11 -0
- package/dist/server/websocket.d.ts.map +1 -0
- package/dist/server/websocket.js +48 -0
- package/dist/server/websocket.js.map +1 -0
- package/dist/types.d.ts +90 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- 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":"AAEA,MAAM,iBAAiB,GAAiB,CAAC,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,mBAAmB,CAAC,CAAA;AAEpG,MAAM,OAAO,SAAS;IACH,KAAK,CAAyB;IAE/C,YAAY,KAAmB;QAC7B,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;QAC1D,IAAI,CAAC,gBAAgB,EAAE,CAAA;IACzB,CAAC;IAED,UAAU;QACR,MAAM,KAAK,GAAiB,EAAE,CAAA;QAE9B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACvC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC9B,SAAQ;YACV,CAAC;YAED,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,YAAY,EAAE,EAAE;gBAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;gBAC/C,OAAO,UAAU,EAAE,MAAM,KAAK,UAAU,CAAA;YAC1C,CAAC,CAAC,CAAA;YAEF,IAAI,YAAY,EAAE,CAAC;gBACjB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAClB,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC;IAED,cAAc;QACZ,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAA;QACjC,MAAM,MAAM,GAAiB,EAAE,CAAA;QAE/B,MAAM,KAAK,GAAG,CAAC,EAAU,EAAQ,EAAE;YACjC,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBACpB,OAAM;YACR,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACf,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YAE/B,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAM;YACR,CAAC;YAED,KAAK,MAAM,YAAY,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC7C,KAAK,CAAC,YAAY,CAAC,CAAA;YACrB,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnB,CAAC,CAAA;QAED,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YACnC,KAAK,CAAC,EAAE,CAAC,CAAA;QACX,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC;IAED,UAAU;QACR,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;IAC1F,CAAC;IAED,UAAU,CAAC,EAAU,EAAE,OAA4B;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAM;QACR,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAA;IAC7C,CAAC;IAED,OAAO,CAAC,EAAU;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAC3B,CAAC;IAED,QAAQ;QACN,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAA;IACjC,CAAC;IAEO,gBAAgB;QACtB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAA;QAClC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAA;QAEjC,MAAM,GAAG,GAAG,CAAC,EAAU,EAAQ,EAAE;YAC/B,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBACpB,OAAM;YACR,CAAC;YAED,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CAAC,gDAAgD,EAAE,GAAG,CAAC,CAAA;YACxE,CAAC;YAED,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YAChB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YAE/B,IAAI,IAAI,EAAE,CAAC;gBACT,KAAK,MAAM,YAAY,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;oBAC7C,GAAG,CAAC,YAAY,CAAC,CAAA;gBACnB,CAAC;YACH,CAAC;YAED,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YACnB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACjB,CAAC,CAAA;QAED,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YACnC,GAAG,CAAC,EAAE,CAAC,CAAA;QACT,CAAC;IACH,CAAC;CACF"}
|
|
@@ -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":"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"}
|
|
@@ -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"}
|