agentsx 0.1.1 → 0.1.2

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 (49) hide show
  1. package/AGENT_PATHS.md +23 -15
  2. package/README.md +8 -3
  3. package/REQUIREMENTS.md +11 -1
  4. package/dist/agents/claude.js +34 -46
  5. package/dist/agents/claude.js.map +1 -1
  6. package/dist/agents/codex.js +2 -0
  7. package/dist/agents/codex.js.map +1 -1
  8. package/dist/agents/copilot.js +14 -46
  9. package/dist/agents/copilot.js.map +1 -1
  10. package/dist/agents/cursor.js +24 -27
  11. package/dist/agents/cursor.js.map +1 -1
  12. package/dist/agents/opencode.js +43 -34
  13. package/dist/agents/opencode.js.map +1 -1
  14. package/dist/commands/pull.d.ts +1 -1
  15. package/dist/commands/pull.js +2 -2
  16. package/dist/commands/pull.js.map +1 -1
  17. package/dist/commands/push.d.ts +1 -1
  18. package/dist/commands/push.js +2 -2
  19. package/dist/commands/push.js.map +1 -1
  20. package/dist/commands/sync.d.ts +1 -1
  21. package/dist/commands/sync.js +2 -2
  22. package/dist/commands/sync.js.map +1 -1
  23. package/dist/commands/targets.js +3 -3
  24. package/dist/commands/targets.js.map +1 -1
  25. package/dist/core/planner.js +12 -0
  26. package/dist/core/planner.js.map +1 -1
  27. package/dist/core/run-sync-command.d.ts +1 -1
  28. package/dist/core/run-sync-command.js +19 -2
  29. package/dist/core/run-sync-command.js.map +1 -1
  30. package/dist/core/scanner.js +2 -0
  31. package/dist/core/scanner.js.map +1 -1
  32. package/dist/core/structured-config.d.ts +22 -0
  33. package/dist/core/structured-config.js +308 -0
  34. package/dist/core/structured-config.js.map +1 -0
  35. package/dist/core/sync-engine.d.ts +1 -0
  36. package/dist/core/sync-engine.js +147 -8
  37. package/dist/core/sync-engine.js.map +1 -1
  38. package/dist/core/target-selectors.d.ts +4 -0
  39. package/dist/core/target-selectors.js +96 -0
  40. package/dist/core/target-selectors.js.map +1 -0
  41. package/dist/index.js +7 -4
  42. package/dist/index.js.map +1 -1
  43. package/dist/types.d.ts +7 -0
  44. package/dist/ui/prompts.js +2 -2
  45. package/dist/ui/prompts.js.map +1 -1
  46. package/dist/ui/structured-tree.d.ts +2 -0
  47. package/dist/ui/structured-tree.js +82 -0
  48. package/dist/ui/structured-tree.js.map +1 -0
  49. package/package.json +5 -2
@@ -1 +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"}
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,aAAa;YACjB,KAAK,EAAE,QAAQ;YACf,WAAW,EAAE,mDAAmD;YAChE,QAAQ,EAAE,QAAQ;YAClB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,gCAAgC;YACtC,QAAQ,EAAE,IAAI;YACd,gBAAgB,EAAE,IAAI;YACtB,UAAU,EAAE,IAAI;YAChB,MAAM,EAAE,MAAM;SACf;QACD;YACE,EAAE,EAAE,QAAQ;YACZ,KAAK,EAAE,IAAI;YACX,WAAW,EAAE,4CAA4C;YACzD,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,SAAS;YACb,KAAK,EAAE,MAAM;YACb,WAAW,EAAE,+CAA+C;YAC5D,QAAQ,EAAE,SAAS;YACnB,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,0BAA0B;YAChC,QAAQ,EAAE,IAAI;SACf;QACD;YACE,EAAE,EAAE,cAAc;YAClB,KAAK,EAAE,MAAM;YACb,WAAW,EAAE,iDAAiD;YAC9D,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,QAAQ;YACZ,KAAK,EAAE,UAAU;YACjB,WAAW,EAAE,8CAA8C;YAC3D,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,yBAAyB;YAC/B,QAAQ,EAAE,IAAI;SACf;QACD;YACE,EAAE,EAAE,UAAU;YACd,KAAK,EAAE,SAAS;YAChB,WAAW,EAAE,4CAA4C;YACzD,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,2BAA2B;YACjC,QAAQ,EAAE,IAAI;SACf;QACD;YACE,EAAE,EAAE,OAAO;YACX,KAAK,EAAE,OAAO;YACd,WAAW,EAAE,0CAA0C;YACvD,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,wBAAwB;YAC9B,QAAQ,EAAE,IAAI;SACf;QACD;YACE,EAAE,EAAE,QAAQ;YACZ,KAAK,EAAE,IAAI;YACX,WAAW,EAAE,yCAAyC;YACtD,QAAQ,EAAE,QAAQ;YAClB,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,yBAAyB;YAC/B,QAAQ,EAAE,IAAI;SACf;KACF;CACF,CAAC"}
@@ -1,2 +1,2 @@
1
1
  import type { ConflictPolicy } from "../types.js";
2
- export declare function runPull(agent: string, targets: string[], conflictPolicy?: ConflictPolicy): Promise<void>;
2
+ export declare function runPull(agent: string, targets: string[], conflictPolicy?: ConflictPolicy, jsonPathRules?: string[]): Promise<void>;
@@ -1,5 +1,5 @@
1
1
  import { runSyncCommand } from "../core/run-sync-command.js";
2
- export async function runPull(agent, targets, conflictPolicy) {
3
- await runSyncCommand("pull", agent, targets, conflictPolicy);
2
+ export async function runPull(agent, targets, conflictPolicy, jsonPathRules = []) {
3
+ await runSyncCommand("pull", agent, targets, conflictPolicy, jsonPathRules);
4
4
  }
5
5
  //# sourceMappingURL=pull.js.map
@@ -1 +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"}
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,EAC/B,gBAA0B,EAAE;IAE5B,MAAM,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC;AAC9E,CAAC"}
@@ -1,2 +1,2 @@
1
1
  import type { ConflictPolicy } from "../types.js";
2
- export declare function runPush(agent: string, targets: string[], conflictPolicy?: ConflictPolicy): Promise<void>;
2
+ export declare function runPush(agent: string, targets: string[], conflictPolicy?: ConflictPolicy, jsonPathRules?: string[]): Promise<void>;
@@ -1,5 +1,5 @@
1
1
  import { runSyncCommand } from "../core/run-sync-command.js";
2
- export async function runPush(agent, targets, conflictPolicy) {
3
- await runSyncCommand("push", agent, targets, conflictPolicy);
2
+ export async function runPush(agent, targets, conflictPolicy, jsonPathRules = []) {
3
+ await runSyncCommand("push", agent, targets, conflictPolicy, jsonPathRules);
4
4
  }
5
5
  //# sourceMappingURL=push.js.map
@@ -1 +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"}
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,EAC/B,gBAA0B,EAAE;IAE5B,MAAM,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC;AAC9E,CAAC"}
@@ -1,2 +1,2 @@
1
1
  import type { ConflictPolicy } from "../types.js";
2
- export declare function runSync(agent: string, targets: string[], conflictPolicy?: ConflictPolicy): Promise<void>;
2
+ export declare function runSync(agent: string, targets: string[], conflictPolicy?: ConflictPolicy, jsonPathRules?: string[]): Promise<void>;
@@ -1,5 +1,5 @@
1
1
  import { runSyncCommand } from "../core/run-sync-command.js";
2
- export async function runSync(agent, targets, conflictPolicy) {
3
- await runSyncCommand("sync", agent, targets, conflictPolicy);
2
+ export async function runSync(agent, targets, conflictPolicy, jsonPathRules = []) {
3
+ await runSyncCommand("sync", agent, targets, conflictPolicy, jsonPathRules);
4
4
  }
5
5
  //# sourceMappingURL=sync.js.map
@@ -1 +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"}
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,EAC/B,gBAA0B,EAAE;IAE5B,MAAM,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC;AAC9E,CAAC"}
@@ -3,10 +3,10 @@ export function runTargets(agentInput) {
3
3
  const adapter = resolveAgentAdapter(agentInput);
4
4
  const lines = [];
5
5
  lines.push(`${adapter.displayName} (${adapter.key})`);
6
- lines.push("targets:");
6
+ lines.push("settings:");
7
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}`);
8
+ lines.push(`- ${target.id} | ${target.label} | ${target.category} | default=${target.includeByDefault ? "yes" : "no"} | optional=${target.optional ? "yes" : "no"}`);
9
+ lines.push(` ${target.description} (scope=${target.scope}, kind=${target.kind}, structured=${target.structured ? "yes" : "no"}${target.format ? `:${target.format}` : ""})`);
10
10
  }
11
11
  lines.push("references:");
12
12
  for (const ref of adapter.references) {
@@ -1 +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"}
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,WAAW,CAAC,CAAC;IAExB,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CACR,KAAK,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC,KAAK,MAAM,MAAM,CAAC,QAAQ,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,CACzJ,CAAC;QACF,KAAK,CAAC,IAAI,CACR,KAAK,MAAM,CAAC,WAAW,WAAW,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAI,gBAAgB,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAClK,CAAC;IACJ,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"}
@@ -9,6 +9,7 @@ export function mergeEntries(local, remote) {
9
9
  key,
10
10
  targetId: entry.targetId,
11
11
  relPath: entry.relPath,
12
+ selector: entry.selector,
12
13
  local: entry.snapshot,
13
14
  remote: map.get(key)?.remote,
14
15
  });
@@ -20,6 +21,7 @@ export function mergeEntries(local, remote) {
20
21
  key,
21
22
  targetId: entry.targetId,
22
23
  relPath: entry.relPath,
24
+ selector: entry.selector ?? prev?.selector,
23
25
  local: prev?.local,
24
26
  remote: entry.snapshot,
25
27
  });
@@ -42,6 +44,7 @@ function addConflict(conflicts, entry) {
42
44
  key: entry.key,
43
45
  targetId: entry.targetId,
44
46
  relPath: entry.relPath,
47
+ selector: entry.selector,
45
48
  local: entry.local,
46
49
  remote: entry.remote,
47
50
  });
@@ -60,6 +63,7 @@ function pushLikePlan(entries, command, policy) {
60
63
  key: entry.key,
61
64
  targetId: entry.targetId,
62
65
  relPath: entry.relPath,
66
+ selector: entry.selector,
63
67
  action: command === "push" ? "copy-local-to-remote" : "copy-remote-to-local",
64
68
  reason: "new",
65
69
  });
@@ -70,6 +74,7 @@ function pushLikePlan(entries, command, policy) {
70
74
  key: entry.key,
71
75
  targetId: entry.targetId,
72
76
  relPath: entry.relPath,
77
+ selector: entry.selector,
73
78
  action: "skip",
74
79
  reason: "same",
75
80
  });
@@ -81,6 +86,7 @@ function pushLikePlan(entries, command, policy) {
81
86
  key: entry.key,
82
87
  targetId: entry.targetId,
83
88
  relPath: entry.relPath,
89
+ selector: entry.selector,
84
90
  action: command === "push" ? "copy-local-to-remote" : "copy-remote-to-local",
85
91
  reason: "overwrite",
86
92
  });
@@ -90,6 +96,7 @@ function pushLikePlan(entries, command, policy) {
90
96
  key: entry.key,
91
97
  targetId: entry.targetId,
92
98
  relPath: entry.relPath,
99
+ selector: entry.selector,
93
100
  action: "skip",
94
101
  reason: "conflict-skip",
95
102
  });
@@ -110,6 +117,7 @@ function syncPlan(entries, policy) {
110
117
  key: entry.key,
111
118
  targetId: entry.targetId,
112
119
  relPath: entry.relPath,
120
+ selector: entry.selector,
113
121
  action: "copy-local-to-remote",
114
122
  reason: "new",
115
123
  });
@@ -120,6 +128,7 @@ function syncPlan(entries, policy) {
120
128
  key: entry.key,
121
129
  targetId: entry.targetId,
122
130
  relPath: entry.relPath,
131
+ selector: entry.selector,
123
132
  action: "copy-remote-to-local",
124
133
  reason: "new",
125
134
  });
@@ -133,6 +142,7 @@ function syncPlan(entries, policy) {
133
142
  key: entry.key,
134
143
  targetId: entry.targetId,
135
144
  relPath: entry.relPath,
145
+ selector: entry.selector,
136
146
  action: "skip",
137
147
  reason: "same",
138
148
  });
@@ -144,6 +154,7 @@ function syncPlan(entries, policy) {
144
154
  key: entry.key,
145
155
  targetId: entry.targetId,
146
156
  relPath: entry.relPath,
157
+ selector: entry.selector,
147
158
  action: chooseSyncDirection(entry),
148
159
  reason: "overwrite",
149
160
  });
@@ -153,6 +164,7 @@ function syncPlan(entries, policy) {
153
164
  key: entry.key,
154
165
  targetId: entry.targetId,
155
166
  relPath: entry.relPath,
167
+ selector: entry.selector,
156
168
  action: "skip",
157
169
  reason: "conflict-skip",
158
170
  });
@@ -1 +1 @@
1
- {"version":3,"file":"planner.js","sourceRoot":"","sources":["../../src/core/planner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"planner.js","sourceRoot":"","sources":["../../src/core/planner.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
1
  import type { ConflictPolicy, SyncCommand } from "../types.js";
2
- export declare function runSyncCommand(command: SyncCommand, agentInput: string, targetIds: string[], conflictPolicy?: ConflictPolicy): Promise<void>;
2
+ export declare function runSyncCommand(command: SyncCommand, agentInput: string, targetIds: string[], conflictPolicy?: ConflictPolicy, jsonPathRules?: string[]): Promise<void>;
@@ -4,13 +4,14 @@ import { conflictDefaultKey, saveState } from "./state.js";
4
4
  import { selectTargets } from "./targets.js";
5
5
  import { executeSyncEngine } from "./sync-engine.js";
6
6
  import { requireRemote } from "./remote.js";
7
+ import { combineJsonPathSelections, parseCliJsonPathSelections, promptInteractiveJsonPathSelections, } from "./target-selectors.js";
7
8
  function timestampIso() {
8
9
  return new Date().toISOString();
9
10
  }
10
11
  function commitMessage(command, agent) {
11
12
  return `agentsx(${command}): ${agent} @ ${timestampIso()}`;
12
13
  }
13
- export async function runSyncCommand(command, agentInput, targetIds, conflictPolicy) {
14
+ export async function runSyncCommand(command, agentInput, targetIds, conflictPolicy, jsonPathRules = []) {
14
15
  const adapter = resolveAgentAdapter(agentInput);
15
16
  const { state, remote } = await requireRemote();
16
17
  const remoteStatus = prepareRemoteBranch(remote.mirrorPath, remote.defaultBranch);
@@ -21,7 +22,19 @@ export async function runSyncCommand(command, agentInput, targetIds, conflictPol
21
22
  if (selection.targets.length === 0) {
22
23
  throw new Error("동기화할 대상을 최소 1개 이상 선택해야 합니다.");
23
24
  }
24
- const conflictKey = conflictDefaultKey(command, adapter.key, selection.targets.map((target) => target.id));
25
+ const cliJsonPathSelections = parseCliJsonPathSelections(selection.targets, jsonPathRules);
26
+ const interactiveJsonPathSelections = selection.interactive
27
+ ? await promptInteractiveJsonPathSelections(command, adapter, selection.targets, process.cwd(), remote.mirrorPath)
28
+ : {};
29
+ const jsonPathSelectionsByTarget = combineJsonPathSelections(cliJsonPathSelections, interactiveJsonPathSelections);
30
+ const selectionFingerprint = selection.targets.map((target) => {
31
+ const selectors = jsonPathSelectionsByTarget[target.id];
32
+ if (!selectors || selectors.length === 0) {
33
+ return `${target.id}:*`;
34
+ }
35
+ return `${target.id}:${selectors.slice().sort().join("&")}`;
36
+ });
37
+ const conflictKey = conflictDefaultKey(command, adapter.key, selectionFingerprint);
25
38
  const summary = await executeSyncEngine({
26
39
  command,
27
40
  adapter,
@@ -32,6 +45,7 @@ export async function runSyncCommand(command, agentInput, targetIds, conflictPol
32
45
  conflictStateKey: conflictKey,
33
46
  interactiveTargets: selection.interactive,
34
47
  explicitPolicy: conflictPolicy,
48
+ jsonPathSelectionsByTarget,
35
49
  });
36
50
  state.lastSyncAtByAgent[adapter.key] = new Date().toISOString();
37
51
  await saveState(state);
@@ -50,6 +64,9 @@ export async function runSyncCommand(command, agentInput, targetIds, conflictPol
50
64
  `복사(remote->local): ${summary.copiedRemoteToLocal}`,
51
65
  `건너뜀: ${summary.skipped}`,
52
66
  summary.policy ? `충돌정책: ${summary.policy}` : undefined,
67
+ Object.keys(jsonPathSelectionsByTarget).length > 0
68
+ ? `세부선택(jsonpath): ${JSON.stringify(jsonPathSelectionsByTarget)}`
69
+ : undefined,
53
70
  adapter.references.length > 0 ? `참고 문서: ${adapter.references.join(", ")}` : undefined,
54
71
  ].filter(Boolean).join("\n"));
55
72
  }
@@ -1 +1 @@
1
- {"version":3,"file":"run-sync-command.js","sourceRoot":"","sources":["../../src/core/run-sync-command.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-sync-command.js","sourceRoot":"","sources":["../../src/core/run-sync-command.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,7 @@ export async function scanTargetSide(basePath, target, targetId) {
22
22
  {
23
23
  targetId,
24
24
  relPath: path.basename(basePath),
25
+ selector: undefined,
25
26
  snapshot: await toSnapshot(basePath, fileStat.mtimeMs),
26
27
  },
27
28
  ];
@@ -32,6 +33,7 @@ export async function scanTargetSide(basePath, target, targetId) {
32
33
  entries.push({
33
34
  targetId,
34
35
  relPath: file.relPath,
36
+ selector: undefined,
35
37
  snapshot: await toSnapshot(file.absPath, file.mtimeMs),
36
38
  });
37
39
  }
@@ -1 +1 @@
1
- {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/core/scanner.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEtE,KAAK,UAAU,UAAU,CAAC,OAAe,EAAE,OAAe;IACxD,OAAO;QACL,OAAO;QACP,IAAI,EAAE,MAAM,QAAQ,CAAC,OAAO,CAAC;QAC7B,OAAO;KACR,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAgB,EAChB,MAAkB,EAClB,QAAgB;IAEhB,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO;YACL;gBACE,QAAQ;gBACR,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAChC,QAAQ,EAAE,MAAM,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC;aACvD;SACF,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,OAAO,GAAgB,EAAE,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC;YACX,QAAQ;YACR,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC;SACvD,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,GAAW,EACX,OAAqB;IAErB,MAAM,GAAG,GAAgB,EAAE,CAAC;IAC5B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAClE,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,UAAkB,EAClB,KAAmB,EACnB,OAAqB;IAErB,MAAM,GAAG,GAAgB,EAAE,CAAC;IAC5B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,mBAAmB,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAChE,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAClE,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/core/scanner.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEtE,KAAK,UAAU,UAAU,CAAC,OAAe,EAAE,OAAe;IACxD,OAAO;QACL,OAAO;QACP,IAAI,EAAE,MAAM,QAAQ,CAAC,OAAO,CAAC;QAC7B,OAAO;KACR,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAgB,EAChB,MAAkB,EAClB,QAAgB;IAEhB,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO;YACL;gBACE,QAAQ;gBACR,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAChC,QAAQ,EAAE,SAAS;gBACnB,QAAQ,EAAE,MAAM,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC;aACvD;SACF,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,OAAO,GAAgB,EAAE,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC;YACX,QAAQ;YACR,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,SAAS;YACnB,QAAQ,EAAE,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC;SACvD,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,GAAW,EACX,OAAqB;IAErB,MAAM,GAAG,GAAgB,EAAE,CAAC;IAC5B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAClE,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,UAAkB,EAClB,KAAmB,EACnB,OAAqB;IAErB,MAAM,GAAG,GAAgB,EAAE,CAAC;IAC5B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,mBAAmB,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAChE,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAClE,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { ConfigFormat, TargetSpec } from "../types.js";
2
+ export interface ParsedJsonPathRule {
3
+ targetId: string;
4
+ expression: string;
5
+ }
6
+ export declare function inferConfigFormatFromPath(filePath: string): ConfigFormat | undefined;
7
+ export declare function isStructuredConfigTarget(target: TargetSpec): boolean;
8
+ export declare function resolveTargetFormat(target: TargetSpec, filePath: string): ConfigFormat;
9
+ export declare function readStructuredFile(filePath: string, format: ConfigFormat): Promise<unknown>;
10
+ export interface SelectorSnapshot {
11
+ exists: boolean;
12
+ hash: string | undefined;
13
+ matchedCount: number;
14
+ }
15
+ export declare function getSelectorSnapshot(doc: unknown, expression: string): SelectorSnapshot;
16
+ export declare function applyStructuredSelectionFile(sourceFilePath: string, destinationFilePath: string, target: TargetSpec, selectors: string[]): Promise<{
17
+ applied: number;
18
+ missingSelectors: string[];
19
+ }>;
20
+ export declare function parseJsonPathRule(input: string): ParsedJsonPathRule;
21
+ export declare function segmentsToJsonPath(segments: Array<string | number>): string;
22
+ export declare function getNodeBySegments(root: unknown, segments: Array<string | number>): unknown;
@@ -0,0 +1,308 @@
1
+ import path from "node:path";
2
+ import { readFile, writeFile } from "node:fs/promises";
3
+ import { createHash } from "node:crypto";
4
+ import { JSONPath } from "jsonpath-plus";
5
+ import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
6
+ import { parse as parseToml, stringify as stringifyToml } from "@iarna/toml";
7
+ import { ensureDir, exists } from "../utils/fs.js";
8
+ export function inferConfigFormatFromPath(filePath) {
9
+ const ext = path.extname(filePath).toLowerCase();
10
+ if (ext === ".json") {
11
+ return "json";
12
+ }
13
+ if (ext === ".yaml" || ext === ".yml") {
14
+ return "yaml";
15
+ }
16
+ if (ext === ".toml") {
17
+ return "toml";
18
+ }
19
+ return undefined;
20
+ }
21
+ export function isStructuredConfigTarget(target) {
22
+ if (target.kind !== "file") {
23
+ return false;
24
+ }
25
+ if (target.structured) {
26
+ return true;
27
+ }
28
+ if (typeof target.path !== "string") {
29
+ return false;
30
+ }
31
+ return inferConfigFormatFromPath(target.path) !== undefined;
32
+ }
33
+ export function resolveTargetFormat(target, filePath) {
34
+ if (target.format) {
35
+ return target.format;
36
+ }
37
+ const inferred = inferConfigFormatFromPath(filePath);
38
+ if (!inferred) {
39
+ throw new Error(`구조화 설정 포맷을 추론할 수 없습니다: ${filePath}`);
40
+ }
41
+ return inferred;
42
+ }
43
+ function parseStructuredText(text, format) {
44
+ if (format === "json") {
45
+ return JSON.parse(text);
46
+ }
47
+ if (format === "yaml") {
48
+ return parseYaml(text);
49
+ }
50
+ return parseToml(text);
51
+ }
52
+ function stringifyStructuredValue(value, format) {
53
+ if (format === "json") {
54
+ return `${JSON.stringify(value, null, 2)}\n`;
55
+ }
56
+ if (format === "yaml") {
57
+ return stringifyYaml(value);
58
+ }
59
+ if (value && typeof value === "object" && !Array.isArray(value)) {
60
+ return stringifyToml(value);
61
+ }
62
+ return stringifyToml({});
63
+ }
64
+ export async function readStructuredFile(filePath, format) {
65
+ const raw = await readFile(filePath, "utf8");
66
+ try {
67
+ return parseStructuredText(raw, format);
68
+ }
69
+ catch (error) {
70
+ const message = error instanceof Error ? error.message : "파싱 오류";
71
+ throw new Error(`구조화 설정 파싱 실패 (${format}): ${filePath}\n${message}`);
72
+ }
73
+ }
74
+ function parseJsonPathFromResultPath(resultPath) {
75
+ if (resultPath === "$") {
76
+ return [];
77
+ }
78
+ const segments = [];
79
+ const bracketRegex = /\[['"]((?:\\.|[^'\\"])*)['"]\]|\[(\d+)\]/g;
80
+ let match;
81
+ while ((match = bracketRegex.exec(resultPath)) !== null) {
82
+ const key = match[1];
83
+ const index = match[2];
84
+ if (typeof key === "string") {
85
+ segments.push(key.replace(/\\'/g, "'").replace(/\\"/g, '"'));
86
+ }
87
+ else if (typeof index === "string") {
88
+ segments.push(Number(index));
89
+ }
90
+ }
91
+ return segments;
92
+ }
93
+ function createContainer(next) {
94
+ return typeof next === "number" ? [] : {};
95
+ }
96
+ function getChild(container, key) {
97
+ if (Array.isArray(container) && typeof key === "number") {
98
+ return container[key];
99
+ }
100
+ if (!Array.isArray(container) && typeof key === "string") {
101
+ return container[key];
102
+ }
103
+ return undefined;
104
+ }
105
+ function setChild(container, key, value) {
106
+ if (Array.isArray(container) && typeof key === "number") {
107
+ container[key] = value;
108
+ return;
109
+ }
110
+ if (!Array.isArray(container) && typeof key === "string") {
111
+ container[key] = value;
112
+ return;
113
+ }
114
+ throw new Error(`경로 타입 불일치: ${String(key)}`);
115
+ }
116
+ function setBySegments(root, segments, value) {
117
+ if (segments.length === 0) {
118
+ return structuredClone(value);
119
+ }
120
+ const firstSegment = segments[0];
121
+ if (firstSegment === undefined) {
122
+ return structuredClone(value);
123
+ }
124
+ let base;
125
+ if (Array.isArray(root)) {
126
+ base = [...root];
127
+ }
128
+ else if (root && typeof root === "object") {
129
+ base = { ...root };
130
+ }
131
+ else {
132
+ base = createContainer(firstSegment);
133
+ }
134
+ let cursor = base;
135
+ for (let i = 0; i < segments.length - 1; i += 1) {
136
+ const current = segments[i];
137
+ const next = segments[i + 1];
138
+ if (current === undefined || next === undefined) {
139
+ continue;
140
+ }
141
+ const existing = getChild(cursor, current);
142
+ if (existing && typeof existing === "object") {
143
+ setChild(cursor, current, Array.isArray(existing) ? [...existing] : { ...existing });
144
+ }
145
+ else {
146
+ setChild(cursor, current, createContainer(next));
147
+ }
148
+ const nextCursor = getChild(cursor, current);
149
+ if (!nextCursor || typeof nextCursor !== "object") {
150
+ throw new Error(`경로 구성 실패: ${segmentsToJsonPath(segments.slice(0, i + 1))}`);
151
+ }
152
+ cursor = nextCursor;
153
+ }
154
+ const leaf = segments[segments.length - 1];
155
+ if (leaf === undefined) {
156
+ return base;
157
+ }
158
+ setChild(cursor, leaf, structuredClone(value));
159
+ return base;
160
+ }
161
+ function selectMatches(json, expression) {
162
+ const jsonInput = json === null ||
163
+ typeof json === "string" ||
164
+ typeof json === "number" ||
165
+ typeof json === "boolean" ||
166
+ Array.isArray(json) ||
167
+ (typeof json === "object" && json !== null)
168
+ ? json
169
+ : null;
170
+ const results = JSONPath({
171
+ path: expression,
172
+ json: jsonInput,
173
+ resultType: "all",
174
+ wrap: true,
175
+ });
176
+ if (!Array.isArray(results)) {
177
+ return [];
178
+ }
179
+ return results;
180
+ }
181
+ function stableStringify(value) {
182
+ if (value === null || typeof value !== "object") {
183
+ return JSON.stringify(value);
184
+ }
185
+ if (Array.isArray(value)) {
186
+ return `[${value.map((item) => stableStringify(item)).join(",")}]`;
187
+ }
188
+ const entries = Object.entries(value).sort(([a], [b]) => a.localeCompare(b));
189
+ return `{${entries.map(([key, val]) => `${JSON.stringify(key)}:${stableStringify(val)}`).join(",")}}`;
190
+ }
191
+ function hashText(text) {
192
+ return createHash("sha256").update(text).digest("hex");
193
+ }
194
+ export function getSelectorSnapshot(doc, expression) {
195
+ const matches = selectMatches(doc, expression);
196
+ if (matches.length === 0) {
197
+ return {
198
+ exists: false,
199
+ hash: undefined,
200
+ matchedCount: 0,
201
+ };
202
+ }
203
+ const canonical = matches
204
+ .map((match) => ({ path: match.path ?? "", value: stableStringify(match.value) }))
205
+ .sort((a, b) => a.path.localeCompare(b.path))
206
+ .map((item) => `${item.path}=${item.value}`)
207
+ .join("|");
208
+ return {
209
+ exists: true,
210
+ hash: hashText(canonical),
211
+ matchedCount: matches.length,
212
+ };
213
+ }
214
+ export async function applyStructuredSelectionFile(sourceFilePath, destinationFilePath, target, selectors) {
215
+ const format = resolveTargetFormat(target, sourceFilePath);
216
+ const source = await readStructuredFile(sourceFilePath, format);
217
+ let destination = {};
218
+ if (await exists(destinationFilePath)) {
219
+ destination = await readStructuredFile(destinationFilePath, format);
220
+ }
221
+ let current = destination;
222
+ let applied = 0;
223
+ const missingSelectors = [];
224
+ for (const selector of selectors) {
225
+ const trimmed = selector.trim();
226
+ if (!trimmed) {
227
+ continue;
228
+ }
229
+ if (trimmed === "$") {
230
+ current = structuredClone(source);
231
+ applied += 1;
232
+ continue;
233
+ }
234
+ const matches = selectMatches(source, trimmed);
235
+ if (matches.length === 0) {
236
+ missingSelectors.push(trimmed);
237
+ continue;
238
+ }
239
+ for (const match of matches) {
240
+ if (!match.path) {
241
+ continue;
242
+ }
243
+ const segments = parseJsonPathFromResultPath(match.path);
244
+ current = setBySegments(current, segments, match.value);
245
+ applied += 1;
246
+ }
247
+ }
248
+ if (applied === 0) {
249
+ return {
250
+ applied,
251
+ missingSelectors,
252
+ };
253
+ }
254
+ await ensureDir(path.dirname(destinationFilePath));
255
+ await writeFile(destinationFilePath, stringifyStructuredValue(current, format), "utf8");
256
+ return {
257
+ applied,
258
+ missingSelectors,
259
+ };
260
+ }
261
+ export function parseJsonPathRule(input) {
262
+ const trimmed = input.trim();
263
+ const firstEquals = trimmed.indexOf("=");
264
+ if (firstEquals <= 0 || firstEquals === trimmed.length - 1) {
265
+ throw new Error(`--jsonpath 형식이 잘못되었습니다: '${input}'. 형식: targetId=$.path`);
266
+ }
267
+ const targetId = trimmed.slice(0, firstEquals).trim();
268
+ const expression = trimmed.slice(firstEquals + 1).trim();
269
+ if (!targetId || !expression) {
270
+ throw new Error(`--jsonpath 형식이 잘못되었습니다: '${input}'. 형식: targetId=$.path`);
271
+ }
272
+ return { targetId, expression };
273
+ }
274
+ export function segmentsToJsonPath(segments) {
275
+ let pathText = "$";
276
+ for (const segment of segments) {
277
+ if (typeof segment === "number") {
278
+ pathText += `[${segment}]`;
279
+ continue;
280
+ }
281
+ if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(segment)) {
282
+ pathText += `.${segment}`;
283
+ continue;
284
+ }
285
+ const escaped = segment.replace(/\\/g, "\\\\").replace(/'/g, "\\'");
286
+ pathText += `['${escaped}']`;
287
+ }
288
+ return pathText;
289
+ }
290
+ export function getNodeBySegments(root, segments) {
291
+ let cursor = root;
292
+ for (const segment of segments) {
293
+ if (cursor == null) {
294
+ return undefined;
295
+ }
296
+ if (Array.isArray(cursor) && typeof segment === "number") {
297
+ cursor = cursor[segment];
298
+ continue;
299
+ }
300
+ if (!Array.isArray(cursor) && typeof cursor === "object" && typeof segment === "string") {
301
+ cursor = cursor[segment];
302
+ continue;
303
+ }
304
+ return undefined;
305
+ }
306
+ return cursor;
307
+ }
308
+ //# sourceMappingURL=structured-config.js.map