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.
Files changed (86) hide show
  1. package/AGENTS.md +49 -0
  2. package/AGENT_PATHS.md +55 -0
  3. package/README.md +32 -0
  4. package/REQUIREMENTS.md +133 -0
  5. package/dist/agents/claude.d.ts +2 -0
  6. package/dist/agents/claude.js +120 -0
  7. package/dist/agents/claude.js.map +1 -0
  8. package/dist/agents/codex.d.ts +2 -0
  9. package/dist/agents/codex.js +68 -0
  10. package/dist/agents/codex.js.map +1 -0
  11. package/dist/agents/copilot.d.ts +2 -0
  12. package/dist/agents/copilot.js +85 -0
  13. package/dist/agents/copilot.js.map +1 -0
  14. package/dist/agents/cursor.d.ts +2 -0
  15. package/dist/agents/cursor.js +84 -0
  16. package/dist/agents/cursor.js.map +1 -0
  17. package/dist/agents/opencode.d.ts +2 -0
  18. package/dist/agents/opencode.js +90 -0
  19. package/dist/agents/opencode.js.map +1 -0
  20. package/dist/agents/registry.d.ts +4 -0
  21. package/dist/agents/registry.js +35 -0
  22. package/dist/agents/registry.js.map +1 -0
  23. package/dist/commands/init.d.ts +1 -0
  24. package/dist/commands/init.js +15 -0
  25. package/dist/commands/init.js.map +1 -0
  26. package/dist/commands/pull.d.ts +2 -0
  27. package/dist/commands/pull.js +5 -0
  28. package/dist/commands/pull.js.map +1 -0
  29. package/dist/commands/push.d.ts +2 -0
  30. package/dist/commands/push.js +5 -0
  31. package/dist/commands/push.js.map +1 -0
  32. package/dist/commands/sync.d.ts +2 -0
  33. package/dist/commands/sync.js +5 -0
  34. package/dist/commands/sync.js.map +1 -0
  35. package/dist/commands/targets.d.ts +1 -0
  36. package/dist/commands/targets.js +17 -0
  37. package/dist/commands/targets.js.map +1 -0
  38. package/dist/core/git.d.ts +6 -0
  39. package/dist/core/git.js +45 -0
  40. package/dist/core/git.js.map +1 -0
  41. package/dist/core/layout.d.ts +3 -0
  42. package/dist/core/layout.js +9 -0
  43. package/dist/core/layout.js.map +1 -0
  44. package/dist/core/planner.d.ts +3 -0
  45. package/dist/core/planner.js +173 -0
  46. package/dist/core/planner.js.map +1 -0
  47. package/dist/core/remote.d.ts +9 -0
  48. package/dist/core/remote.js +28 -0
  49. package/dist/core/remote.js.map +1 -0
  50. package/dist/core/run-sync-command.d.ts +2 -0
  51. package/dist/core/run-sync-command.js +53 -0
  52. package/dist/core/run-sync-command.js.map +1 -0
  53. package/dist/core/scanner.d.ts +4 -0
  54. package/dist/core/scanner.js +58 -0
  55. package/dist/core/scanner.js.map +1 -0
  56. package/dist/core/state.d.ts +10 -0
  57. package/dist/core/state.js +64 -0
  58. package/dist/core/state.js.map +1 -0
  59. package/dist/core/sync-engine.d.ts +21 -0
  60. package/dist/core/sync-engine.js +133 -0
  61. package/dist/core/sync-engine.js.map +1 -0
  62. package/dist/core/targets.d.ts +6 -0
  63. package/dist/core/targets.js +28 -0
  64. package/dist/core/targets.js.map +1 -0
  65. package/dist/index.d.ts +2 -0
  66. package/dist/index.js +86 -0
  67. package/dist/index.js.map +1 -0
  68. package/dist/types.d.ts +79 -0
  69. package/dist/types.js +2 -0
  70. package/dist/types.js.map +1 -0
  71. package/dist/ui/prompts.d.ts +4 -0
  72. package/dist/ui/prompts.js +56 -0
  73. package/dist/ui/prompts.js.map +1 -0
  74. package/dist/utils/fs.d.ts +14 -0
  75. package/dist/utils/fs.js +63 -0
  76. package/dist/utils/fs.js.map +1 -0
  77. package/dist/utils/hash.d.ts +1 -0
  78. package/dist/utils/hash.js +7 -0
  79. package/dist/utils/hash.js.map +1 -0
  80. package/dist/utils/path.d.ts +5 -0
  81. package/dist/utils/path.js +46 -0
  82. package/dist/utils/path.js.map +1 -0
  83. package/dist/utils/shell.d.ts +7 -0
  84. package/dist/utils/shell.js +32 -0
  85. package/dist/utils/shell.js.map +1 -0
  86. 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,2 @@
1
+ import type { ConflictPolicy } from "../types.js";
2
+ export declare function runPull(agent: string, targets: string[], conflictPolicy?: ConflictPolicy): Promise<void>;
@@ -0,0 +1,5 @@
1
+ import { runSyncCommand } from "../core/run-sync-command.js";
2
+ export async function runPull(agent, targets, conflictPolicy) {
3
+ await runSyncCommand("pull", agent, targets, conflictPolicy);
4
+ }
5
+ //# sourceMappingURL=pull.js.map
@@ -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,2 @@
1
+ import type { ConflictPolicy } from "../types.js";
2
+ export declare function runPush(agent: string, targets: string[], conflictPolicy?: ConflictPolicy): Promise<void>;
@@ -0,0 +1,5 @@
1
+ import { runSyncCommand } from "../core/run-sync-command.js";
2
+ export async function runPush(agent, targets, conflictPolicy) {
3
+ await runSyncCommand("push", agent, targets, conflictPolicy);
4
+ }
5
+ //# sourceMappingURL=push.js.map
@@ -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,2 @@
1
+ import type { ConflictPolicy } from "../types.js";
2
+ export declare function runSync(agent: string, targets: string[], conflictPolicy?: ConflictPolicy): Promise<void>;
@@ -0,0 +1,5 @@
1
+ import { runSyncCommand } from "../core/run-sync-command.js";
2
+ export async function runSync(agent, targets, conflictPolicy) {
3
+ await runSyncCommand("sync", agent, targets, conflictPolicy);
4
+ }
5
+ //# sourceMappingURL=sync.js.map
@@ -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;
@@ -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":"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"}
@@ -0,0 +1,3 @@
1
+ import type { AgentAdapter, TargetSpec } from "../types.js";
2
+ export declare function getRemoteTargetBase(mirrorPath: string, agent: AgentAdapter, target: TargetSpec): string;
3
+ export declare function getLocalTargetBase(target: TargetSpec, cwd: string): string;
@@ -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,2 @@
1
+ import type { ConflictPolicy, SyncCommand } from "../types.js";
2
+ export declare function runSyncCommand(command: SyncCommand, agentInput: string, targetIds: string[], conflictPolicy?: ConflictPolicy): Promise<void>;
@@ -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":"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"}
@@ -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[]>;