agentsx 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +49 -0
- package/AGENT_PATHS.md +55 -0
- package/README.md +32 -0
- package/REQUIREMENTS.md +133 -0
- package/dist/agents/claude.d.ts +2 -0
- package/dist/agents/claude.js +120 -0
- package/dist/agents/claude.js.map +1 -0
- package/dist/agents/codex.d.ts +2 -0
- package/dist/agents/codex.js +68 -0
- package/dist/agents/codex.js.map +1 -0
- package/dist/agents/copilot.d.ts +2 -0
- package/dist/agents/copilot.js +85 -0
- package/dist/agents/copilot.js.map +1 -0
- package/dist/agents/cursor.d.ts +2 -0
- package/dist/agents/cursor.js +84 -0
- package/dist/agents/cursor.js.map +1 -0
- package/dist/agents/opencode.d.ts +2 -0
- package/dist/agents/opencode.js +90 -0
- package/dist/agents/opencode.js.map +1 -0
- package/dist/agents/registry.d.ts +4 -0
- package/dist/agents/registry.js +35 -0
- package/dist/agents/registry.js.map +1 -0
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.js +15 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/pull.d.ts +2 -0
- package/dist/commands/pull.js +5 -0
- package/dist/commands/pull.js.map +1 -0
- package/dist/commands/push.d.ts +2 -0
- package/dist/commands/push.js +5 -0
- package/dist/commands/push.js.map +1 -0
- package/dist/commands/sync.d.ts +2 -0
- package/dist/commands/sync.js +5 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/targets.d.ts +1 -0
- package/dist/commands/targets.js +17 -0
- package/dist/commands/targets.js.map +1 -0
- package/dist/core/git.d.ts +6 -0
- package/dist/core/git.js +45 -0
- package/dist/core/git.js.map +1 -0
- package/dist/core/layout.d.ts +3 -0
- package/dist/core/layout.js +9 -0
- package/dist/core/layout.js.map +1 -0
- package/dist/core/planner.d.ts +3 -0
- package/dist/core/planner.js +173 -0
- package/dist/core/planner.js.map +1 -0
- package/dist/core/remote.d.ts +9 -0
- package/dist/core/remote.js +28 -0
- package/dist/core/remote.js.map +1 -0
- package/dist/core/run-sync-command.d.ts +2 -0
- package/dist/core/run-sync-command.js +53 -0
- package/dist/core/run-sync-command.js.map +1 -0
- package/dist/core/scanner.d.ts +4 -0
- package/dist/core/scanner.js +58 -0
- package/dist/core/scanner.js.map +1 -0
- package/dist/core/state.d.ts +10 -0
- package/dist/core/state.js +64 -0
- package/dist/core/state.js.map +1 -0
- package/dist/core/sync-engine.d.ts +21 -0
- package/dist/core/sync-engine.js +133 -0
- package/dist/core/sync-engine.js.map +1 -0
- package/dist/core/targets.d.ts +6 -0
- package/dist/core/targets.js +28 -0
- package/dist/core/targets.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +86 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +79 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/prompts.d.ts +4 -0
- package/dist/ui/prompts.js +56 -0
- package/dist/ui/prompts.js.map +1 -0
- package/dist/utils/fs.d.ts +14 -0
- package/dist/utils/fs.js +63 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/hash.d.ts +1 -0
- package/dist/utils/hash.js +7 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/path.d.ts +5 -0
- package/dist/utils/path.js +46 -0
- package/dist/utils/path.js.map +1 -0
- package/dist/utils/shell.d.ts +7 -0
- package/dist/utils/shell.js +32 -0
- package/dist/utils/shell.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
export const opencodeAdapter = {
|
|
2
|
+
key: "opencode",
|
|
3
|
+
displayName: "OpenCode",
|
|
4
|
+
aliases: ["opencode", "open-code", "open_code", "open code"],
|
|
5
|
+
references: [
|
|
6
|
+
"https://opencode.ai/docs/config/",
|
|
7
|
+
"https://opencode.ai/docs/skills",
|
|
8
|
+
"https://opencode.ai/docs/rules/",
|
|
9
|
+
"https://opencode.ai/docs/plugins/"
|
|
10
|
+
],
|
|
11
|
+
targets: [
|
|
12
|
+
{
|
|
13
|
+
id: "global-config",
|
|
14
|
+
label: "Global config",
|
|
15
|
+
description: "~/.config/opencode/opencode.json",
|
|
16
|
+
category: "config",
|
|
17
|
+
kind: "file",
|
|
18
|
+
scope: "home",
|
|
19
|
+
path: ".config/opencode/opencode.json",
|
|
20
|
+
optional: true,
|
|
21
|
+
includeByDefault: true,
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
id: "global-skills",
|
|
25
|
+
label: "Global skills",
|
|
26
|
+
description: "~/.config/opencode/skills",
|
|
27
|
+
category: "skills",
|
|
28
|
+
kind: "dir",
|
|
29
|
+
scope: "home",
|
|
30
|
+
path: ".config/opencode/skills",
|
|
31
|
+
optional: true,
|
|
32
|
+
includeByDefault: true,
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
id: "global-plugins",
|
|
36
|
+
label: "Global plugins",
|
|
37
|
+
description: "~/.config/opencode/plugins",
|
|
38
|
+
category: "plugins",
|
|
39
|
+
kind: "dir",
|
|
40
|
+
scope: "home",
|
|
41
|
+
path: ".config/opencode/plugins",
|
|
42
|
+
optional: true,
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
id: "global-agents-md",
|
|
46
|
+
label: "Global AGENTS.md",
|
|
47
|
+
description: "~/.config/opencode/AGENTS.md",
|
|
48
|
+
category: "instructions",
|
|
49
|
+
kind: "file",
|
|
50
|
+
scope: "home",
|
|
51
|
+
path: ".config/opencode/AGENTS.md",
|
|
52
|
+
optional: true,
|
|
53
|
+
includeByDefault: true,
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
id: "project-config",
|
|
57
|
+
label: "Project opencode.json",
|
|
58
|
+
description: "./opencode.json",
|
|
59
|
+
category: "config",
|
|
60
|
+
kind: "file",
|
|
61
|
+
scope: "cwd",
|
|
62
|
+
path: "opencode.json",
|
|
63
|
+
optional: true,
|
|
64
|
+
includeByDefault: true,
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
id: "project-opencode-dir",
|
|
68
|
+
label: "Project .opencode",
|
|
69
|
+
description: "./.opencode",
|
|
70
|
+
category: "other",
|
|
71
|
+
kind: "dir",
|
|
72
|
+
scope: "cwd",
|
|
73
|
+
path: ".opencode",
|
|
74
|
+
optional: true,
|
|
75
|
+
includeByDefault: true,
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
id: "project-agents-md",
|
|
79
|
+
label: "Project AGENTS.md",
|
|
80
|
+
description: "./AGENTS.md",
|
|
81
|
+
category: "instructions",
|
|
82
|
+
kind: "file",
|
|
83
|
+
scope: "cwd",
|
|
84
|
+
path: "AGENTS.md",
|
|
85
|
+
optional: true,
|
|
86
|
+
includeByDefault: true,
|
|
87
|
+
}
|
|
88
|
+
]
|
|
89
|
+
};
|
|
90
|
+
//# sourceMappingURL=opencode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/agents/opencode.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAiB;IAC3C,GAAG,EAAE,UAAU;IACf,WAAW,EAAE,UAAU;IACvB,OAAO,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC;IAC5D,UAAU,EAAE;QACV,kCAAkC;QAClC,iCAAiC;QACjC,iCAAiC;QACjC,mCAAmC;KACpC;IACD,OAAO,EAAE;QACP;YACE,EAAE,EAAE,eAAe;YACnB,KAAK,EAAE,eAAe;YACtB,WAAW,EAAE,kCAAkC;YAC/C,QAAQ,EAAE,QAAQ;YAClB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,gCAAgC;YACtC,QAAQ,EAAE,IAAI;YACd,gBAAgB,EAAE,IAAI;SACvB;QACD;YACE,EAAE,EAAE,eAAe;YACnB,KAAK,EAAE,eAAe;YACtB,WAAW,EAAE,2BAA2B;YACxC,QAAQ,EAAE,QAAQ;YAClB,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,yBAAyB;YAC/B,QAAQ,EAAE,IAAI;YACd,gBAAgB,EAAE,IAAI;SACvB;QACD;YACE,EAAE,EAAE,gBAAgB;YACpB,KAAK,EAAE,gBAAgB;YACvB,WAAW,EAAE,4BAA4B;YACzC,QAAQ,EAAE,SAAS;YACnB,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,0BAA0B;YAChC,QAAQ,EAAE,IAAI;SACf;QACD;YACE,EAAE,EAAE,kBAAkB;YACtB,KAAK,EAAE,kBAAkB;YACzB,WAAW,EAAE,8BAA8B;YAC3C,QAAQ,EAAE,cAAc;YACxB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,4BAA4B;YAClC,QAAQ,EAAE,IAAI;YACd,gBAAgB,EAAE,IAAI;SACvB;QACD;YACE,EAAE,EAAE,gBAAgB;YACpB,KAAK,EAAE,uBAAuB;YAC9B,WAAW,EAAE,iBAAiB;YAC9B,QAAQ,EAAE,QAAQ;YAClB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,KAAK;YACZ,IAAI,EAAE,eAAe;YACrB,QAAQ,EAAE,IAAI;YACd,gBAAgB,EAAE,IAAI;SACvB;QACD;YACE,EAAE,EAAE,sBAAsB;YAC1B,KAAK,EAAE,mBAAmB;YAC1B,WAAW,EAAE,aAAa;YAC1B,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,KAAK;YACZ,IAAI,EAAE,WAAW;YACjB,QAAQ,EAAE,IAAI;YACd,gBAAgB,EAAE,IAAI;SACvB;QACD;YACE,EAAE,EAAE,mBAAmB;YACvB,KAAK,EAAE,mBAAmB;YAC1B,WAAW,EAAE,aAAa;YAC1B,QAAQ,EAAE,cAAc;YACxB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,KAAK;YACZ,IAAI,EAAE,WAAW;YACjB,QAAQ,EAAE,IAAI;YACd,gBAAgB,EAAE,IAAI;SACvB;KACF;CACF,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { AgentAdapter, AgentKey } from "../types.js";
|
|
2
|
+
export declare function listSupportedAgents(): AgentAdapter[];
|
|
3
|
+
export declare function resolveAgentAdapter(input: string): AgentAdapter;
|
|
4
|
+
export declare function isSupportedAgentKey(input: string): input is AgentKey;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { claudeAdapter } from "./claude.js";
|
|
2
|
+
import { codexAdapter } from "./codex.js";
|
|
3
|
+
import { copilotAdapter } from "./copilot.js";
|
|
4
|
+
import { cursorAdapter } from "./cursor.js";
|
|
5
|
+
import { opencodeAdapter } from "./opencode.js";
|
|
6
|
+
const adapters = [
|
|
7
|
+
codexAdapter,
|
|
8
|
+
claudeAdapter,
|
|
9
|
+
cursorAdapter,
|
|
10
|
+
opencodeAdapter,
|
|
11
|
+
copilotAdapter,
|
|
12
|
+
];
|
|
13
|
+
const byAlias = new Map();
|
|
14
|
+
for (const adapter of adapters) {
|
|
15
|
+
byAlias.set(adapter.key, adapter);
|
|
16
|
+
for (const alias of adapter.aliases) {
|
|
17
|
+
byAlias.set(alias, adapter);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function listSupportedAgents() {
|
|
21
|
+
return adapters;
|
|
22
|
+
}
|
|
23
|
+
export function resolveAgentAdapter(input) {
|
|
24
|
+
const normalized = input.trim().toLowerCase();
|
|
25
|
+
const adapter = byAlias.get(normalized);
|
|
26
|
+
if (!adapter) {
|
|
27
|
+
const supported = adapters.map((item) => item.key).join(", ");
|
|
28
|
+
throw new Error(`지원하지 않는 에이전트입니다: ${input}. 지원 목록: ${supported}`);
|
|
29
|
+
}
|
|
30
|
+
return adapter;
|
|
31
|
+
}
|
|
32
|
+
export function isSupportedAgentKey(input) {
|
|
33
|
+
return adapters.some((adapter) => adapter.key === input);
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/agents/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,QAAQ,GAAmB;IAC/B,YAAY;IACZ,aAAa;IACb,aAAa;IACb,eAAe;IACf,cAAc;CACf,CAAC;AAEF,MAAM,OAAO,GAAG,IAAI,GAAG,EAAwB,CAAC;AAEhD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAClC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,oBAAoB,KAAK,YAAY,SAAS,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runInit(repoUrl: string): Promise<void>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { initRemote } from "../core/remote.js";
|
|
2
|
+
export async function runInit(repoUrl) {
|
|
3
|
+
const normalized = repoUrl.trim();
|
|
4
|
+
if (!normalized) {
|
|
5
|
+
throw new Error("repo-url이 비어 있습니다.");
|
|
6
|
+
}
|
|
7
|
+
const { mirrorPath, branch } = await initRemote(normalized);
|
|
8
|
+
console.log([
|
|
9
|
+
"초기화 완료",
|
|
10
|
+
`원격 저장소: ${normalized}`,
|
|
11
|
+
`로컬 미러: ${mirrorPath}`,
|
|
12
|
+
`기본 브랜치: ${branch}`,
|
|
13
|
+
].join("\n"));
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAe;IAC3C,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAClC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;IAE5D,OAAO,CAAC,GAAG,CAAC;QACV,QAAQ;QACR,WAAW,UAAU,EAAE;QACvB,UAAU,UAAU,EAAE;QACtB,WAAW,MAAM,EAAE;KACpB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pull.js","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,KAAa,EACb,OAAiB,EACjB,cAA+B;IAE/B,MAAM,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,KAAa,EACb,OAAiB,EACjB,cAA+B;IAE/B,MAAM,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,KAAa,EACb,OAAiB,EACjB,cAA+B;IAE/B,MAAM,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runTargets(agentInput: string): void;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { resolveAgentAdapter } from "../agents/registry.js";
|
|
2
|
+
export function runTargets(agentInput) {
|
|
3
|
+
const adapter = resolveAgentAdapter(agentInput);
|
|
4
|
+
const lines = [];
|
|
5
|
+
lines.push(`${adapter.displayName} (${adapter.key})`);
|
|
6
|
+
lines.push("targets:");
|
|
7
|
+
for (const target of adapter.targets) {
|
|
8
|
+
lines.push(`- ${target.id} | ${target.kind} | ${target.scope} | default=${target.includeByDefault ? "yes" : "no"} | optional=${target.optional ? "yes" : "no"}`);
|
|
9
|
+
lines.push(` ${target.description}`);
|
|
10
|
+
}
|
|
11
|
+
lines.push("references:");
|
|
12
|
+
for (const ref of adapter.references) {
|
|
13
|
+
lines.push(`- ${ref}`);
|
|
14
|
+
}
|
|
15
|
+
console.log(lines.join("\n"));
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=targets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"targets.js","sourceRoot":"","sources":["../../src/commands/targets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,UAAU,UAAU,CAAC,UAAkB;IAC3C,MAAM,OAAO,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAEhD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,WAAW,KAAK,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;IACtD,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAEvB,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CACR,KAAK,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,KAAK,cAAc,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,eAAe,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CACrJ,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC1B,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IACzB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function ensureRepoMirror(repoUrl: string, mirrorPath: string): Promise<void>;
|
|
2
|
+
export declare function getDefaultBranch(mirrorPath: string): string;
|
|
3
|
+
export declare function pullLatest(mirrorPath: string, branch: string): void;
|
|
4
|
+
export declare function stageAll(mirrorPath: string): void;
|
|
5
|
+
export declare function hasStagedChanges(mirrorPath: string): boolean;
|
|
6
|
+
export declare function commitAndPush(mirrorPath: string, branch: string, message: string): void;
|
package/dist/core/git.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { mkdir } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { exists } from "../utils/fs.js";
|
|
4
|
+
import { run, runOrThrow } from "../utils/shell.js";
|
|
5
|
+
function git(cwd, args) {
|
|
6
|
+
const result = runOrThrow("git", ["-C", cwd, ...args]);
|
|
7
|
+
return result.stdout.trim();
|
|
8
|
+
}
|
|
9
|
+
export async function ensureRepoMirror(repoUrl, mirrorPath) {
|
|
10
|
+
const repoGitDir = path.join(mirrorPath, ".git");
|
|
11
|
+
if (await exists(repoGitDir)) {
|
|
12
|
+
runOrThrow("git", ["-C", mirrorPath, "remote", "set-url", "origin", repoUrl]);
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
await mkdir(path.dirname(mirrorPath), { recursive: true });
|
|
16
|
+
runOrThrow("git", ["clone", repoUrl, mirrorPath]);
|
|
17
|
+
}
|
|
18
|
+
export function getDefaultBranch(mirrorPath) {
|
|
19
|
+
const result = run("git", ["-C", mirrorPath, "symbolic-ref", "--short", "refs/remotes/origin/HEAD"]);
|
|
20
|
+
if (result.status !== 0) {
|
|
21
|
+
return "main";
|
|
22
|
+
}
|
|
23
|
+
const ref = result.stdout.trim();
|
|
24
|
+
if (!ref.includes("/")) {
|
|
25
|
+
return "main";
|
|
26
|
+
}
|
|
27
|
+
return ref.split("/").at(-1) ?? "main";
|
|
28
|
+
}
|
|
29
|
+
export function pullLatest(mirrorPath, branch) {
|
|
30
|
+
git(mirrorPath, ["fetch", "origin", branch]);
|
|
31
|
+
git(mirrorPath, ["checkout", branch]);
|
|
32
|
+
git(mirrorPath, ["pull", "--rebase", "origin", branch]);
|
|
33
|
+
}
|
|
34
|
+
export function stageAll(mirrorPath) {
|
|
35
|
+
git(mirrorPath, ["add", "-A"]);
|
|
36
|
+
}
|
|
37
|
+
export function hasStagedChanges(mirrorPath) {
|
|
38
|
+
const result = run("git", ["-C", mirrorPath, "diff", "--cached", "--quiet"]);
|
|
39
|
+
return result.status !== 0;
|
|
40
|
+
}
|
|
41
|
+
export function commitAndPush(mirrorPath, branch, message) {
|
|
42
|
+
git(mirrorPath, ["commit", "-m", message]);
|
|
43
|
+
git(mirrorPath, ["push", "origin", branch]);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/core/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,SAAS,GAAG,CAAC,GAAW,EAAE,IAAc;IACtC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IACvD,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAe,EAAE,UAAkB;IACxE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACjD,IAAI,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7B,UAAU,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QAC9E,OAAO;IACT,CAAC;IAED,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,UAAU,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,UAAkB;IACjD,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,0BAA0B,CAAC,CAAC,CAAC;IACrG,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,UAAkB,EAAE,MAAc;IAC3D,GAAG,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7C,GAAG,CAAC,UAAU,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IACtC,GAAG,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,UAAkB;IACzC,GAAG,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,UAAkB;IACjD,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;IAC7E,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,UAAkB,EAAE,MAAc,EAAE,OAAe;IAC/E,GAAG,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3C,GAAG,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { resolveTargetAbsolutePath } from "../utils/path.js";
|
|
3
|
+
export function getRemoteTargetBase(mirrorPath, agent, target) {
|
|
4
|
+
return path.join(mirrorPath, "agents", agent.key, target.id);
|
|
5
|
+
}
|
|
6
|
+
export function getLocalTargetBase(target, cwd) {
|
|
7
|
+
return resolveTargetAbsolutePath(target, cwd);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../src/core/layout.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAE7D,MAAM,UAAU,mBAAmB,CACjC,UAAkB,EAClB,KAAmB,EACnB,MAAkB;IAElB,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAkB,EAAE,GAAW;IAChE,OAAO,yBAAyB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { ConflictPolicy, PlanResult, SideEntry, SyncCommand, SyncEntry } from "../types.js";
|
|
2
|
+
export declare function mergeEntries(local: SideEntry[], remote: SideEntry[]): SyncEntry[];
|
|
3
|
+
export declare function buildPlan(entries: SyncEntry[], command: SyncCommand, policy: ConflictPolicy): PlanResult;
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
function makeKey(targetId, relPath) {
|
|
2
|
+
return `${targetId}:${relPath}`;
|
|
3
|
+
}
|
|
4
|
+
export function mergeEntries(local, remote) {
|
|
5
|
+
const map = new Map();
|
|
6
|
+
for (const entry of local) {
|
|
7
|
+
const key = makeKey(entry.targetId, entry.relPath);
|
|
8
|
+
map.set(key, {
|
|
9
|
+
key,
|
|
10
|
+
targetId: entry.targetId,
|
|
11
|
+
relPath: entry.relPath,
|
|
12
|
+
local: entry.snapshot,
|
|
13
|
+
remote: map.get(key)?.remote,
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
for (const entry of remote) {
|
|
17
|
+
const key = makeKey(entry.targetId, entry.relPath);
|
|
18
|
+
const prev = map.get(key);
|
|
19
|
+
map.set(key, {
|
|
20
|
+
key,
|
|
21
|
+
targetId: entry.targetId,
|
|
22
|
+
relPath: entry.relPath,
|
|
23
|
+
local: prev?.local,
|
|
24
|
+
remote: entry.snapshot,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return [...map.values()].sort((a, b) => a.key.localeCompare(b.key));
|
|
28
|
+
}
|
|
29
|
+
function isDifferent(entry) {
|
|
30
|
+
return Boolean(entry.local && entry.remote && entry.local.hash !== entry.remote.hash);
|
|
31
|
+
}
|
|
32
|
+
function chooseSyncDirection(entry) {
|
|
33
|
+
if (!entry.local || !entry.remote) {
|
|
34
|
+
return "copy-local-to-remote";
|
|
35
|
+
}
|
|
36
|
+
return entry.local.mtimeMs >= entry.remote.mtimeMs
|
|
37
|
+
? "copy-local-to-remote"
|
|
38
|
+
: "copy-remote-to-local";
|
|
39
|
+
}
|
|
40
|
+
function addConflict(conflicts, entry) {
|
|
41
|
+
conflicts.push({
|
|
42
|
+
key: entry.key,
|
|
43
|
+
targetId: entry.targetId,
|
|
44
|
+
relPath: entry.relPath,
|
|
45
|
+
local: entry.local,
|
|
46
|
+
remote: entry.remote,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
function pushLikePlan(entries, command, policy) {
|
|
50
|
+
const ops = [];
|
|
51
|
+
const conflicts = [];
|
|
52
|
+
for (const entry of entries) {
|
|
53
|
+
const source = command === "push" ? entry.local : entry.remote;
|
|
54
|
+
const dest = command === "push" ? entry.remote : entry.local;
|
|
55
|
+
if (!source) {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (!dest) {
|
|
59
|
+
ops.push({
|
|
60
|
+
key: entry.key,
|
|
61
|
+
targetId: entry.targetId,
|
|
62
|
+
relPath: entry.relPath,
|
|
63
|
+
action: command === "push" ? "copy-local-to-remote" : "copy-remote-to-local",
|
|
64
|
+
reason: "new",
|
|
65
|
+
});
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (source.hash === dest.hash) {
|
|
69
|
+
ops.push({
|
|
70
|
+
key: entry.key,
|
|
71
|
+
targetId: entry.targetId,
|
|
72
|
+
relPath: entry.relPath,
|
|
73
|
+
action: "skip",
|
|
74
|
+
reason: "same",
|
|
75
|
+
});
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
addConflict(conflicts, entry);
|
|
79
|
+
if (policy === "overwrite") {
|
|
80
|
+
ops.push({
|
|
81
|
+
key: entry.key,
|
|
82
|
+
targetId: entry.targetId,
|
|
83
|
+
relPath: entry.relPath,
|
|
84
|
+
action: command === "push" ? "copy-local-to-remote" : "copy-remote-to-local",
|
|
85
|
+
reason: "overwrite",
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
else if (policy === "partial") {
|
|
89
|
+
ops.push({
|
|
90
|
+
key: entry.key,
|
|
91
|
+
targetId: entry.targetId,
|
|
92
|
+
relPath: entry.relPath,
|
|
93
|
+
action: "skip",
|
|
94
|
+
reason: "conflict-skip",
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
ops,
|
|
100
|
+
conflicts,
|
|
101
|
+
blocked: policy === "fail-all" && conflicts.length > 0,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function syncPlan(entries, policy) {
|
|
105
|
+
const ops = [];
|
|
106
|
+
const conflicts = [];
|
|
107
|
+
for (const entry of entries) {
|
|
108
|
+
if (entry.local && !entry.remote) {
|
|
109
|
+
ops.push({
|
|
110
|
+
key: entry.key,
|
|
111
|
+
targetId: entry.targetId,
|
|
112
|
+
relPath: entry.relPath,
|
|
113
|
+
action: "copy-local-to-remote",
|
|
114
|
+
reason: "new",
|
|
115
|
+
});
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
if (!entry.local && entry.remote) {
|
|
119
|
+
ops.push({
|
|
120
|
+
key: entry.key,
|
|
121
|
+
targetId: entry.targetId,
|
|
122
|
+
relPath: entry.relPath,
|
|
123
|
+
action: "copy-remote-to-local",
|
|
124
|
+
reason: "new",
|
|
125
|
+
});
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
if (!entry.local || !entry.remote) {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
if (!isDifferent(entry)) {
|
|
132
|
+
ops.push({
|
|
133
|
+
key: entry.key,
|
|
134
|
+
targetId: entry.targetId,
|
|
135
|
+
relPath: entry.relPath,
|
|
136
|
+
action: "skip",
|
|
137
|
+
reason: "same",
|
|
138
|
+
});
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
addConflict(conflicts, entry);
|
|
142
|
+
if (policy === "overwrite") {
|
|
143
|
+
ops.push({
|
|
144
|
+
key: entry.key,
|
|
145
|
+
targetId: entry.targetId,
|
|
146
|
+
relPath: entry.relPath,
|
|
147
|
+
action: chooseSyncDirection(entry),
|
|
148
|
+
reason: "overwrite",
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
else if (policy === "partial") {
|
|
152
|
+
ops.push({
|
|
153
|
+
key: entry.key,
|
|
154
|
+
targetId: entry.targetId,
|
|
155
|
+
relPath: entry.relPath,
|
|
156
|
+
action: "skip",
|
|
157
|
+
reason: "conflict-skip",
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return {
|
|
162
|
+
ops,
|
|
163
|
+
conflicts,
|
|
164
|
+
blocked: policy === "fail-all" && conflicts.length > 0,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
export function buildPlan(entries, command, policy) {
|
|
168
|
+
if (command === "push" || command === "pull") {
|
|
169
|
+
return pushLikePlan(entries, command, policy);
|
|
170
|
+
}
|
|
171
|
+
return syncPlan(entries, policy);
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=planner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planner.js","sourceRoot":"","sources":["../../src/core/planner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { loadState } from "./state.js";
|
|
2
|
+
export declare function initRemote(repoUrl: string): Promise<{
|
|
3
|
+
mirrorPath: string;
|
|
4
|
+
branch: string;
|
|
5
|
+
}>;
|
|
6
|
+
export declare function requireRemote(): Promise<{
|
|
7
|
+
state: Awaited<ReturnType<typeof loadState>>;
|
|
8
|
+
remote: NonNullable<Awaited<ReturnType<typeof loadState>>["remote"]>;
|
|
9
|
+
}>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { getStateDir, loadState, saveState } from "./state.js";
|
|
2
|
+
import { ensureRepoMirror, getDefaultBranch } from "./git.js";
|
|
3
|
+
import { repoSlugFromUrl } from "../utils/path.js";
|
|
4
|
+
export async function initRemote(repoUrl) {
|
|
5
|
+
const state = await loadState();
|
|
6
|
+
const stateDir = getStateDir();
|
|
7
|
+
const mirrorPath = `${stateDir}/repos/${repoSlugFromUrl(repoUrl)}`;
|
|
8
|
+
await ensureRepoMirror(repoUrl, mirrorPath);
|
|
9
|
+
const branch = getDefaultBranch(mirrorPath);
|
|
10
|
+
state.remote = {
|
|
11
|
+
repoUrl,
|
|
12
|
+
mirrorPath,
|
|
13
|
+
defaultBranch: branch,
|
|
14
|
+
};
|
|
15
|
+
await saveState(state);
|
|
16
|
+
return { mirrorPath, branch };
|
|
17
|
+
}
|
|
18
|
+
export async function requireRemote() {
|
|
19
|
+
const state = await loadState();
|
|
20
|
+
if (!state.remote) {
|
|
21
|
+
throw new Error("원격 저장소가 초기화되지 않았습니다. 먼저 `npx agentsx init <repo-url>`를 실행하세요.");
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
state,
|
|
25
|
+
remote: state.remote,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=remote.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote.js","sourceRoot":"","sources":["../../src/core/remote.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAe;IAC9C,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAChC,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,UAAU,GAAG,GAAG,QAAQ,UAAU,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;IAEnE,MAAM,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAE5C,KAAK,CAAC,MAAM,GAAG;QACb,OAAO;QACP,UAAU;QACV,aAAa,EAAE,MAAM;KACtB,CAAC;IAEF,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;IACvB,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa;IAIjC,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAChC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IACnF,CAAC;IAED,OAAO;QACL,KAAK;QACL,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { resolveAgentAdapter } from "../agents/registry.js";
|
|
2
|
+
import { pullLatest, stageAll, hasStagedChanges, commitAndPush } from "./git.js";
|
|
3
|
+
import { conflictDefaultKey, saveState } from "./state.js";
|
|
4
|
+
import { selectTargets } from "./targets.js";
|
|
5
|
+
import { executeSyncEngine } from "./sync-engine.js";
|
|
6
|
+
import { requireRemote } from "./remote.js";
|
|
7
|
+
function timestampIso() {
|
|
8
|
+
return new Date().toISOString();
|
|
9
|
+
}
|
|
10
|
+
function commitMessage(command, agent) {
|
|
11
|
+
return `agentsx(${command}): ${agent} @ ${timestampIso()}`;
|
|
12
|
+
}
|
|
13
|
+
export async function runSyncCommand(command, agentInput, targetIds, conflictPolicy) {
|
|
14
|
+
const adapter = resolveAgentAdapter(agentInput);
|
|
15
|
+
const { state, remote } = await requireRemote();
|
|
16
|
+
pullLatest(remote.mirrorPath, remote.defaultBranch);
|
|
17
|
+
const selection = await selectTargets(adapter, targetIds);
|
|
18
|
+
if (selection.targets.length === 0) {
|
|
19
|
+
throw new Error("동기화할 대상을 최소 1개 이상 선택해야 합니다.");
|
|
20
|
+
}
|
|
21
|
+
const conflictKey = conflictDefaultKey(command, adapter.key, selection.targets.map((target) => target.id));
|
|
22
|
+
const summary = await executeSyncEngine({
|
|
23
|
+
command,
|
|
24
|
+
adapter,
|
|
25
|
+
targets: selection.targets,
|
|
26
|
+
cwd: process.cwd(),
|
|
27
|
+
mirrorPath: remote.mirrorPath,
|
|
28
|
+
state,
|
|
29
|
+
conflictStateKey: conflictKey,
|
|
30
|
+
interactiveTargets: selection.interactive,
|
|
31
|
+
explicitPolicy: conflictPolicy,
|
|
32
|
+
});
|
|
33
|
+
state.lastSyncAtByAgent[adapter.key] = new Date().toISOString();
|
|
34
|
+
await saveState(state);
|
|
35
|
+
const remoteChanged = summary.copiedLocalToRemote > 0;
|
|
36
|
+
if (remoteChanged && (command === "push" || command === "sync")) {
|
|
37
|
+
stageAll(remote.mirrorPath);
|
|
38
|
+
if (hasStagedChanges(remote.mirrorPath)) {
|
|
39
|
+
commitAndPush(remote.mirrorPath, remote.defaultBranch, commitMessage(command, adapter.key));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
console.log([
|
|
43
|
+
`명령: ${command}`,
|
|
44
|
+
`에이전트: ${adapter.displayName} (${adapter.key})`,
|
|
45
|
+
`충돌: ${summary.conflicts}`,
|
|
46
|
+
`복사(local->remote): ${summary.copiedLocalToRemote}`,
|
|
47
|
+
`복사(remote->local): ${summary.copiedRemoteToLocal}`,
|
|
48
|
+
`건너뜀: ${summary.skipped}`,
|
|
49
|
+
summary.policy ? `충돌정책: ${summary.policy}` : undefined,
|
|
50
|
+
adapter.references.length > 0 ? `참고 문서: ${adapter.references.join(", ")}` : undefined,
|
|
51
|
+
].filter(Boolean).join("\n"));
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=run-sync-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-sync-command.js","sourceRoot":"","sources":["../../src/core/run-sync-command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,SAAS,YAAY;IACnB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,aAAa,CAAC,OAAoB,EAAE,KAAa;IACxD,OAAO,WAAW,OAAO,MAAM,KAAK,MAAM,YAAY,EAAE,EAAE,CAAC;AAC7D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAoB,EACpB,UAAkB,EAClB,SAAmB,EACnB,cAA+B;IAE/B,MAAM,OAAO,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAChD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,EAAE,CAAC;IAEhD,UAAU,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;IAEpD,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC1D,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAE3G,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC;QACtC,OAAO;QACP,OAAO;QACP,OAAO,EAAE,SAAS,CAAC,OAAO;QAC1B,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;QAClB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,KAAK;QACL,gBAAgB,EAAE,WAAW;QAC7B,kBAAkB,EAAE,SAAS,CAAC,WAAW;QACzC,cAAc,EAAE,cAAc;KAC/B,CAAC,CAAC;IAEH,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAChE,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;IAEvB,MAAM,aAAa,GAAG,OAAO,CAAC,mBAAmB,GAAG,CAAC,CAAC;IACtD,IAAI,aAAa,IAAI,CAAC,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,MAAM,CAAC,EAAE,CAAC;QAChE,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC5B,IAAI,gBAAgB,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;YACxC,aAAa,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,aAAa,EAAE,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC;QACV,OAAO,OAAO,EAAE;QAChB,SAAS,OAAO,CAAC,WAAW,KAAK,OAAO,CAAC,GAAG,GAAG;QAC/C,OAAO,OAAO,CAAC,SAAS,EAAE;QAC1B,sBAAsB,OAAO,CAAC,mBAAmB,EAAE;QACnD,sBAAsB,OAAO,CAAC,mBAAmB,EAAE;QACnD,QAAQ,OAAO,CAAC,OAAO,EAAE;QACzB,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS;QACtD,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;KACtF,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { AgentAdapter, SideEntry, TargetSpec } from "../types.js";
|
|
2
|
+
export declare function scanTargetSide(basePath: string, target: TargetSpec, targetId: string): Promise<SideEntry[]>;
|
|
3
|
+
export declare function scanLocalEntries(cwd: string, targets: TargetSpec[]): Promise<SideEntry[]>;
|
|
4
|
+
export declare function scanRemoteEntries(mirrorPath: string, agent: AgentAdapter, targets: TargetSpec[]): Promise<SideEntry[]>;
|