link-agents 0.9.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 (184) hide show
  1. package/AGENTS.md +127 -0
  2. package/README.md +93 -0
  3. package/cursor-rules-notes.md +23 -0
  4. package/dist/cli/interactive.d.ts +9 -0
  5. package/dist/cli/interactive.d.ts.map +1 -0
  6. package/dist/cli/interactive.js +1176 -0
  7. package/dist/cli/interactive.js.map +1 -0
  8. package/dist/cli/options.d.ts +3 -0
  9. package/dist/cli/options.d.ts.map +1 -0
  10. package/dist/cli/options.js +107 -0
  11. package/dist/cli/options.js.map +1 -0
  12. package/dist/cli/options.spec.d.ts +2 -0
  13. package/dist/cli/options.spec.d.ts.map +1 -0
  14. package/dist/cli/options.spec.js +74 -0
  15. package/dist/cli/options.spec.js.map +1 -0
  16. package/dist/clients/definitions.d.ts +5 -0
  17. package/dist/clients/definitions.d.ts.map +1 -0
  18. package/dist/clients/definitions.js +82 -0
  19. package/dist/clients/definitions.js.map +1 -0
  20. package/dist/clients/definitions.spec.d.ts +2 -0
  21. package/dist/clients/definitions.spec.d.ts.map +1 -0
  22. package/dist/clients/definitions.spec.js +135 -0
  23. package/dist/clients/definitions.spec.js.map +1 -0
  24. package/dist/commands/doctor.d.ts +3 -0
  25. package/dist/commands/doctor.d.ts.map +1 -0
  26. package/dist/commands/doctor.js +81 -0
  27. package/dist/commands/doctor.js.map +1 -0
  28. package/dist/commands/restore.d.ts +3 -0
  29. package/dist/commands/restore.d.ts.map +1 -0
  30. package/dist/commands/restore.js +36 -0
  31. package/dist/commands/restore.js.map +1 -0
  32. package/dist/commands/sync.d.ts +3 -0
  33. package/dist/commands/sync.d.ts.map +1 -0
  34. package/dist/commands/sync.js +193 -0
  35. package/dist/commands/sync.js.map +1 -0
  36. package/dist/index.d.ts +3 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +30 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/types/index.d.ts +98 -0
  41. package/dist/types/index.d.ts.map +1 -0
  42. package/dist/types/index.js +2 -0
  43. package/dist/types/index.js.map +1 -0
  44. package/dist/utils/apply.d.ts +22 -0
  45. package/dist/utils/apply.d.ts.map +1 -0
  46. package/dist/utils/apply.js +215 -0
  47. package/dist/utils/apply.js.map +1 -0
  48. package/dist/utils/bootstrap.d.ts +18 -0
  49. package/dist/utils/bootstrap.d.ts.map +1 -0
  50. package/dist/utils/bootstrap.js +31 -0
  51. package/dist/utils/bootstrap.js.map +1 -0
  52. package/dist/utils/bootstrap.spec.d.ts +2 -0
  53. package/dist/utils/bootstrap.spec.d.ts.map +1 -0
  54. package/dist/utils/bootstrap.spec.js +92 -0
  55. package/dist/utils/bootstrap.spec.js.map +1 -0
  56. package/dist/utils/canonical.d.ts +17 -0
  57. package/dist/utils/canonical.d.ts.map +1 -0
  58. package/dist/utils/canonical.js +136 -0
  59. package/dist/utils/canonical.js.map +1 -0
  60. package/dist/utils/canonicalState.d.ts +19 -0
  61. package/dist/utils/canonicalState.d.ts.map +1 -0
  62. package/dist/utils/canonicalState.js +21 -0
  63. package/dist/utils/canonicalState.js.map +1 -0
  64. package/dist/utils/cursorHistory.d.ts +7 -0
  65. package/dist/utils/cursorHistory.d.ts.map +1 -0
  66. package/dist/utils/cursorHistory.js +54 -0
  67. package/dist/utils/cursorHistory.js.map +1 -0
  68. package/dist/utils/cursorPaths.d.ts +3 -0
  69. package/dist/utils/cursorPaths.d.ts.map +1 -0
  70. package/dist/utils/cursorPaths.js +17 -0
  71. package/dist/utils/cursorPaths.js.map +1 -0
  72. package/dist/utils/discovery.d.ts +8 -0
  73. package/dist/utils/discovery.d.ts.map +1 -0
  74. package/dist/utils/discovery.js +93 -0
  75. package/dist/utils/discovery.js.map +1 -0
  76. package/dist/utils/frontmatter.d.ts +32 -0
  77. package/dist/utils/frontmatter.d.ts.map +1 -0
  78. package/dist/utils/frontmatter.js +263 -0
  79. package/dist/utils/frontmatter.js.map +1 -0
  80. package/dist/utils/frontmatter.spec.d.ts +2 -0
  81. package/dist/utils/frontmatter.spec.d.ts.map +1 -0
  82. package/dist/utils/frontmatter.spec.js +264 -0
  83. package/dist/utils/frontmatter.spec.js.map +1 -0
  84. package/dist/utils/fs.d.ts +27 -0
  85. package/dist/utils/fs.d.ts.map +1 -0
  86. package/dist/utils/fs.js +137 -0
  87. package/dist/utils/fs.js.map +1 -0
  88. package/dist/utils/fs.spec.d.ts +2 -0
  89. package/dist/utils/fs.spec.d.ts.map +1 -0
  90. package/dist/utils/fs.spec.js +73 -0
  91. package/dist/utils/fs.spec.js.map +1 -0
  92. package/dist/utils/gitignore.d.ts +10 -0
  93. package/dist/utils/gitignore.d.ts.map +1 -0
  94. package/dist/utils/gitignore.js +63 -0
  95. package/dist/utils/gitignore.js.map +1 -0
  96. package/dist/utils/manifest.d.ts +28 -0
  97. package/dist/utils/manifest.d.ts.map +1 -0
  98. package/dist/utils/manifest.js +89 -0
  99. package/dist/utils/manifest.js.map +1 -0
  100. package/dist/utils/mcp.d.ts +73 -0
  101. package/dist/utils/mcp.d.ts.map +1 -0
  102. package/dist/utils/mcp.js +529 -0
  103. package/dist/utils/mcp.js.map +1 -0
  104. package/dist/utils/mcp.spec.d.ts +2 -0
  105. package/dist/utils/mcp.spec.d.ts.map +1 -0
  106. package/dist/utils/mcp.spec.js +488 -0
  107. package/dist/utils/mcp.spec.js.map +1 -0
  108. package/dist/utils/merge.d.ts +17 -0
  109. package/dist/utils/merge.d.ts.map +1 -0
  110. package/dist/utils/merge.js +45 -0
  111. package/dist/utils/merge.js.map +1 -0
  112. package/dist/utils/merge.spec.d.ts +2 -0
  113. package/dist/utils/merge.spec.d.ts.map +1 -0
  114. package/dist/utils/merge.spec.js +134 -0
  115. package/dist/utils/merge.spec.js.map +1 -0
  116. package/dist/utils/paths.d.ts +11 -0
  117. package/dist/utils/paths.d.ts.map +1 -0
  118. package/dist/utils/paths.js +164 -0
  119. package/dist/utils/paths.js.map +1 -0
  120. package/dist/utils/paths.spec.d.ts +2 -0
  121. package/dist/utils/paths.spec.d.ts.map +1 -0
  122. package/dist/utils/paths.spec.js +282 -0
  123. package/dist/utils/paths.spec.js.map +1 -0
  124. package/dist/utils/plan.d.ts +7 -0
  125. package/dist/utils/plan.d.ts.map +1 -0
  126. package/dist/utils/plan.js +118 -0
  127. package/dist/utils/plan.js.map +1 -0
  128. package/dist/utils/plan.spec.d.ts +2 -0
  129. package/dist/utils/plan.spec.d.ts.map +1 -0
  130. package/dist/utils/plan.spec.js +420 -0
  131. package/dist/utils/plan.spec.js.map +1 -0
  132. package/dist/utils/reporting.d.ts +21 -0
  133. package/dist/utils/reporting.d.ts.map +1 -0
  134. package/dist/utils/reporting.js +82 -0
  135. package/dist/utils/reporting.js.map +1 -0
  136. package/dist/utils/reporting.spec.d.ts +2 -0
  137. package/dist/utils/reporting.spec.d.ts.map +1 -0
  138. package/dist/utils/reporting.spec.js +78 -0
  139. package/dist/utils/reporting.spec.js.map +1 -0
  140. package/dist/utils/reset.d.ts +14 -0
  141. package/dist/utils/reset.d.ts.map +1 -0
  142. package/dist/utils/reset.js +81 -0
  143. package/dist/utils/reset.js.map +1 -0
  144. package/dist/utils/revert.d.ts +30 -0
  145. package/dist/utils/revert.d.ts.map +1 -0
  146. package/dist/utils/revert.js +89 -0
  147. package/dist/utils/revert.js.map +1 -0
  148. package/dist/utils/revert.spec.d.ts +2 -0
  149. package/dist/utils/revert.spec.d.ts.map +1 -0
  150. package/dist/utils/revert.spec.js +102 -0
  151. package/dist/utils/revert.spec.js.map +1 -0
  152. package/dist/utils/similarity.d.ts +14 -0
  153. package/dist/utils/similarity.d.ts.map +1 -0
  154. package/dist/utils/similarity.js +70 -0
  155. package/dist/utils/similarity.js.map +1 -0
  156. package/dist/utils/similarity.spec.d.ts +2 -0
  157. package/dist/utils/similarity.spec.d.ts.map +1 -0
  158. package/dist/utils/similarity.spec.js +62 -0
  159. package/dist/utils/similarity.spec.js.map +1 -0
  160. package/dist/utils/snapshots.d.ts +21 -0
  161. package/dist/utils/snapshots.d.ts.map +1 -0
  162. package/dist/utils/snapshots.js +81 -0
  163. package/dist/utils/snapshots.js.map +1 -0
  164. package/dist/utils/snapshots.spec.d.ts +2 -0
  165. package/dist/utils/snapshots.spec.d.ts.map +1 -0
  166. package/dist/utils/snapshots.spec.js +56 -0
  167. package/dist/utils/snapshots.spec.js.map +1 -0
  168. package/dist/utils/syncFilters.d.ts +3 -0
  169. package/dist/utils/syncFilters.d.ts.map +1 -0
  170. package/dist/utils/syncFilters.js +8 -0
  171. package/dist/utils/syncFilters.js.map +1 -0
  172. package/dist/utils/syncRuntime.d.ts +3 -0
  173. package/dist/utils/syncRuntime.d.ts.map +1 -0
  174. package/dist/utils/syncRuntime.js +31 -0
  175. package/dist/utils/syncRuntime.js.map +1 -0
  176. package/dist/utils/validation.d.ts +3 -0
  177. package/dist/utils/validation.d.ts.map +1 -0
  178. package/dist/utils/validation.js +19 -0
  179. package/dist/utils/validation.js.map +1 -0
  180. package/dist/utils/validation.spec.d.ts +2 -0
  181. package/dist/utils/validation.spec.d.ts.map +1 -0
  182. package/dist/utils/validation.spec.js +36 -0
  183. package/dist/utils/validation.spec.js.map +1 -0
  184. package/package.json +63 -0
@@ -0,0 +1,134 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { mergeRulesIntoAgents, shouldMergeRulesIntoAgents, getRulesForMerge, } from "./merge.js";
3
+ describe("merge utilities", () => {
4
+ describe("mergeRulesIntoAgents", () => {
5
+ it("should return agent content unchanged when no rules", () => {
6
+ const agentContent = "# Agent Instructions\n\nDo stuff.";
7
+ expect(mergeRulesIntoAgents(agentContent, [])).toBe(agentContent);
8
+ });
9
+ it("should append rules section to agent content", () => {
10
+ const agentContent = "# Agent Instructions\n\nDo stuff.";
11
+ const rules = [
12
+ {
13
+ client: "cursor",
14
+ type: "rules",
15
+ path: "/cursor/rules/test.md",
16
+ relativePath: "rules/test.md",
17
+ canonicalPath: "rules/test.md",
18
+ name: "test",
19
+ content: "Always use TypeScript.",
20
+ hash: "hash1",
21
+ },
22
+ ];
23
+ const result = mergeRulesIntoAgents(agentContent, rules);
24
+ expect(result).toContain("# Agent Instructions");
25
+ expect(result).toContain("# Rules");
26
+ expect(result).toContain("## Rule: test");
27
+ expect(result).toContain("Always use TypeScript.");
28
+ });
29
+ it("should merge multiple rules with separators", () => {
30
+ const agentContent = "# Agent";
31
+ const rules = [
32
+ {
33
+ client: "cursor",
34
+ type: "rules",
35
+ path: "/cursor/rules/a.md",
36
+ relativePath: "rules/a.md",
37
+ canonicalPath: "rules/a.md",
38
+ name: "a",
39
+ content: "Rule A content",
40
+ hash: "hash1",
41
+ },
42
+ {
43
+ client: "cursor",
44
+ type: "rules",
45
+ path: "/cursor/rules/b.md",
46
+ relativePath: "rules/b.md",
47
+ canonicalPath: "rules/b.md",
48
+ name: "b",
49
+ content: "Rule B content",
50
+ hash: "hash2",
51
+ },
52
+ ];
53
+ const result = mergeRulesIntoAgents(agentContent, rules);
54
+ expect(result).toContain("## Rule: a");
55
+ expect(result).toContain("Rule A content");
56
+ expect(result).toContain("## Rule: b");
57
+ expect(result).toContain("Rule B content");
58
+ // Rules should be separated
59
+ expect(result.match(/---/g)?.length).toBeGreaterThanOrEqual(2);
60
+ });
61
+ });
62
+ describe("shouldMergeRulesIntoAgents", () => {
63
+ it("should return true for client without rules support", () => {
64
+ const claudeDef = {
65
+ name: "claude",
66
+ displayName: "Claude Code",
67
+ root: "/home/.claude",
68
+ assets: [
69
+ { type: "agents", patterns: ["CLAUDE.md"] },
70
+ { type: "commands", patterns: ["commands/**/*.md"] },
71
+ { type: "rules", patterns: [] },
72
+ ],
73
+ };
74
+ expect(shouldMergeRulesIntoAgents(claudeDef)).toBe(true);
75
+ });
76
+ it("should return false for client with rules support", () => {
77
+ const cursorDef = {
78
+ name: "cursor",
79
+ displayName: "Cursor",
80
+ root: "/home/.cursor",
81
+ assets: [
82
+ { type: "agents", patterns: ["AGENTS.md"] },
83
+ { type: "rules", patterns: ["rules/**/*.md"] },
84
+ ],
85
+ };
86
+ expect(shouldMergeRulesIntoAgents(cursorDef)).toBe(false);
87
+ });
88
+ });
89
+ describe("getRulesForMerge", () => {
90
+ const assets = [
91
+ {
92
+ client: "cursor",
93
+ type: "rules",
94
+ path: "/cursor/rules/a.md",
95
+ relativePath: "rules/a.md",
96
+ canonicalPath: "rules/a.md",
97
+ name: "a",
98
+ content: "Rule A",
99
+ hash: "hash1",
100
+ },
101
+ {
102
+ client: "cursor",
103
+ type: "agents",
104
+ path: "/cursor/AGENTS.md",
105
+ relativePath: "AGENTS.md",
106
+ canonicalPath: "AGENTS.md",
107
+ name: "AGENTS",
108
+ content: "Agent",
109
+ hash: "hash2",
110
+ },
111
+ {
112
+ client: "opencode",
113
+ type: "rules",
114
+ path: "/opencode/rules/b.md",
115
+ relativePath: "rules/b.md",
116
+ canonicalPath: "rules/b.md",
117
+ name: "b",
118
+ content: "Rule B",
119
+ hash: "hash3",
120
+ },
121
+ ];
122
+ it("should return only rules assets", () => {
123
+ const rules = getRulesForMerge(assets);
124
+ expect(rules).toHaveLength(2);
125
+ expect(rules.every((r) => r.type === "rules")).toBe(true);
126
+ });
127
+ it("should filter by source client when specified", () => {
128
+ const rules = getRulesForMerge(assets, "cursor");
129
+ expect(rules).toHaveLength(1);
130
+ expect(rules[0].client).toBe("cursor");
131
+ });
132
+ });
133
+ });
134
+ //# sourceMappingURL=merge.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.spec.js","sourceRoot":"","sources":["../../src/utils/merge.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { AgentClientName, AssetType, AssetContent, ClientDefinition } from "../types/index.js";
2
+ export declare function normalizeRelativePath(relativePath: string): string;
3
+ export declare function canonicalizeRelativePath(client: AgentClientName, type: AssetType, relativePath: string): string;
4
+ export declare function denormalizeRelativePath(client: AgentClientName, type: AssetType, canonicalPath: string): string;
5
+ export declare function getTargetMcpFilename(targetClient: AgentClientName, defs: ClientDefinition[]): string | null;
6
+ export declare function canonicalizeMcpPath(relativePath: string): string;
7
+ export declare function denormalizeMcpPath(targetClient: AgentClientName, defs: ClientDefinition[]): string | null;
8
+ export declare function buildTargetAbsolutePath(root: string, relativePath: string): string;
9
+ export declare function resolveTargetRelativePath(targetClient: AgentClientName, asset: AssetContent): string;
10
+ export declare function remapRelativePathForTarget(asset: AssetContent, targetClient: AgentClientName, relativePath: string, defs?: ClientDefinition[]): string;
11
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EACf,SAAS,EACT,YAAY,EACZ,gBAAgB,EACjB,MAAM,mBAAmB,CAAC;AAS3B,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAElE;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,SAAS,EACf,YAAY,EAAE,MAAM,GACnB,MAAM,CAoBR;AAmCD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,SAAS,EACf,aAAa,EAAE,MAAM,GACpB,MAAM,CAOR;AAED,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,eAAe,EAC7B,IAAI,EAAE,gBAAgB,EAAE,GACvB,MAAM,GAAG,IAAI,CAQf;AAED,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,eAAe,EAC7B,IAAI,EAAE,gBAAgB,EAAE,GACvB,MAAM,GAAG,IAAI,CAEf;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,GACnB,MAAM,CAKR;AAED,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,eAAe,EAC7B,KAAK,EAAE,YAAY,GAClB,MAAM,CAOR;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,YAAY,EACnB,YAAY,EAAE,eAAe,EAC7B,YAAY,EAAE,MAAM,EACpB,IAAI,CAAC,EAAE,gBAAgB,EAAE,GACxB,MAAM,CAkBR"}
@@ -0,0 +1,164 @@
1
+ import path from "node:path";
2
+ const CLAUDE_FILE = "claude.md";
3
+ const AGENTS_FILE = "AGENTS.md";
4
+ const CODEX_COMMANDS_ROOT = "skills/commands";
5
+ // Canonical MCP filename used for cross-client matching
6
+ const CANONICAL_MCP_FILE = "mcp.json";
7
+ export function normalizeRelativePath(relativePath) {
8
+ return relativePath.replace(/\\/g, "/");
9
+ }
10
+ export function canonicalizeRelativePath(client, type, relativePath) {
11
+ const normalized = normalizeRelativePath(relativePath);
12
+ if (type === "agents") {
13
+ if (normalized.toLowerCase() === CLAUDE_FILE) {
14
+ return AGENTS_FILE;
15
+ }
16
+ }
17
+ if (type === "commands" && client === "codex") {
18
+ return fromCodexCommandPath(normalized);
19
+ }
20
+ if (type === "commands" && client === "opencode") {
21
+ return fromOpenCodeCommandPath(normalized);
22
+ }
23
+ if (type === "skills" && client === "opencode") {
24
+ return fromOpenCodeSkillPath(normalized);
25
+ }
26
+ if (type === "mcp") {
27
+ return canonicalizeMcpPath(normalized);
28
+ }
29
+ return normalized;
30
+ }
31
+ function fromCodexCommandPath(relativePath) {
32
+ const normalized = normalizeRelativePath(relativePath);
33
+ if (normalized.startsWith("prompts/")) {
34
+ return fromPromptPath(normalized);
35
+ }
36
+ if (normalized.startsWith(`${CODEX_COMMANDS_ROOT}/`) &&
37
+ normalized.endsWith("/SKILL.md")) {
38
+ const commandPath = normalized
39
+ .slice(`${CODEX_COMMANDS_ROOT}/`.length, -"/SKILL.md".length)
40
+ .split("/")
41
+ .filter(Boolean)
42
+ .join("/");
43
+ return normalizeRelativePath(path.posix.join("commands", `${commandPath}.md`));
44
+ }
45
+ return fromPromptPath(normalized);
46
+ }
47
+ function fromPromptPath(relativePath) {
48
+ const segments = normalizeRelativePath(relativePath)
49
+ .split("/")
50
+ .filter(Boolean);
51
+ if (segments.length === 0) {
52
+ return "commands/command.md";
53
+ }
54
+ const nameSegments = segments.slice(segments[0] === "prompts" ? 1 : 0);
55
+ const fileName = nameSegments.join("/");
56
+ return normalizeRelativePath(path.posix.join("commands", fileName));
57
+ }
58
+ export function denormalizeRelativePath(client, type, canonicalPath) {
59
+ if (type === "agents" && canonicalPath === AGENTS_FILE) {
60
+ if (client === "claude") {
61
+ return "CLAUDE.md";
62
+ }
63
+ }
64
+ return canonicalPath;
65
+ }
66
+ export function getTargetMcpFilename(targetClient, defs) {
67
+ const def = defs.find((d) => d.name === targetClient);
68
+ if (!def)
69
+ return null;
70
+ const mcpAsset = def.assets.find((a) => a.type === "mcp");
71
+ if (!mcpAsset?.files?.length)
72
+ return null;
73
+ return mcpAsset.files[0];
74
+ }
75
+ export function canonicalizeMcpPath(relativePath) {
76
+ return CANONICAL_MCP_FILE;
77
+ }
78
+ export function denormalizeMcpPath(targetClient, defs) {
79
+ return getTargetMcpFilename(targetClient, defs);
80
+ }
81
+ export function buildTargetAbsolutePath(root, relativePath) {
82
+ const segments = normalizeRelativePath(relativePath)
83
+ .split("/")
84
+ .filter(Boolean);
85
+ return path.join(root, ...segments);
86
+ }
87
+ export function resolveTargetRelativePath(targetClient, asset) {
88
+ const canonical = asset.canonicalPath ?? normalizeRelativePath(asset.relativePath);
89
+ if (asset.client === targetClient) {
90
+ return normalizeRelativePath(asset.relativePath);
91
+ }
92
+ return denormalizeRelativePath(targetClient, asset.type, canonical);
93
+ }
94
+ export function remapRelativePathForTarget(asset, targetClient, relativePath, defs) {
95
+ const normalized = normalizeRelativePath(relativePath);
96
+ if (asset.type === "commands" && targetClient === "codex") {
97
+ return toCodexCommandSkillPath(normalized);
98
+ }
99
+ if (asset.type === "commands" && targetClient === "opencode") {
100
+ return toOpenCodeCommandPath(normalized);
101
+ }
102
+ if (asset.type === "skills" && targetClient === "opencode") {
103
+ return toOpenCodeSkillPath(normalized);
104
+ }
105
+ if (asset.type === "mcp" && defs) {
106
+ const targetFile = denormalizeMcpPath(targetClient, defs);
107
+ if (targetFile) {
108
+ return targetFile;
109
+ }
110
+ }
111
+ return normalized;
112
+ }
113
+ function toCodexCommandSkillPath(relativePath) {
114
+ const segments = normalizeRelativePath(relativePath)
115
+ .split("/")
116
+ .filter(Boolean);
117
+ if (segments.length === 0) {
118
+ return `${CODEX_COMMANDS_ROOT}/command/SKILL.md`;
119
+ }
120
+ const nameSegments = segments.slice(segments[0] === "commands" ? 1 : 0);
121
+ const fileName = nameSegments.join("/").replace(/\.md$/i, "");
122
+ return normalizeRelativePath(path.posix.join(CODEX_COMMANDS_ROOT, fileName, "SKILL.md"));
123
+ }
124
+ function fromOpenCodeCommandPath(relativePath) {
125
+ const segments = normalizeRelativePath(relativePath)
126
+ .split("/")
127
+ .filter(Boolean);
128
+ if (segments.length === 0) {
129
+ return "commands/command.md";
130
+ }
131
+ const nameSegments = segments.slice(segments[0] === "command" ? 1 : 0);
132
+ return normalizeRelativePath(path.posix.join("commands", ...nameSegments));
133
+ }
134
+ function toOpenCodeCommandPath(relativePath) {
135
+ const segments = normalizeRelativePath(relativePath)
136
+ .split("/")
137
+ .filter(Boolean);
138
+ if (segments.length === 0) {
139
+ return "command/command.md";
140
+ }
141
+ const nameSegments = segments.slice(segments[0] === "commands" ? 1 : 0);
142
+ return normalizeRelativePath(path.posix.join("command", ...nameSegments));
143
+ }
144
+ function fromOpenCodeSkillPath(relativePath) {
145
+ const segments = normalizeRelativePath(relativePath)
146
+ .split("/")
147
+ .filter(Boolean);
148
+ if (segments.length === 0) {
149
+ return "skills/skill/SKILL.md";
150
+ }
151
+ const nameSegments = segments.slice(segments[0] === "skill" ? 1 : 0);
152
+ return normalizeRelativePath(path.posix.join("skills", ...nameSegments));
153
+ }
154
+ function toOpenCodeSkillPath(relativePath) {
155
+ const segments = normalizeRelativePath(relativePath)
156
+ .split("/")
157
+ .filter(Boolean);
158
+ if (segments.length === 0) {
159
+ return "skill/skill/SKILL.md";
160
+ }
161
+ const nameSegments = segments.slice(segments[0] === "skills" ? 1 : 0);
162
+ return normalizeRelativePath(path.posix.join("skill", ...nameSegments));
163
+ }
164
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=paths.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.spec.d.ts","sourceRoot":"","sources":["../../src/utils/paths.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,282 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { normalizeRelativePath, canonicalizeRelativePath, denormalizeRelativePath, buildTargetAbsolutePath, remapRelativePathForTarget, getTargetMcpFilename, canonicalizeMcpPath, denormalizeMcpPath, } from "./paths.js";
3
+ const mockDefs = [
4
+ {
5
+ name: "codex",
6
+ displayName: "Codex",
7
+ root: "/home/.codex",
8
+ assets: [
9
+ { type: "agents", patterns: ["AGENTS.md"] },
10
+ { type: "mcp", patterns: [], files: ["config.toml"] },
11
+ ],
12
+ },
13
+ {
14
+ name: "cursor",
15
+ displayName: "Cursor",
16
+ root: "/home/.cursor",
17
+ assets: [
18
+ { type: "agents", patterns: ["AGENTS.md"] },
19
+ { type: "mcp", patterns: [], files: ["mcp.json"] },
20
+ ],
21
+ },
22
+ {
23
+ name: "opencode",
24
+ displayName: "OpenCode",
25
+ root: "/home/.config/opencode",
26
+ assets: [
27
+ { type: "agents", patterns: ["AGENTS.md"] },
28
+ { type: "commands", patterns: ["command/**/*.md"] },
29
+ { type: "skills", patterns: ["skill/**/SKILL.md"] },
30
+ { type: "mcp", patterns: [], files: ["opencode.json"] },
31
+ ],
32
+ },
33
+ ];
34
+ describe("path utilities", () => {
35
+ describe("normalizeRelativePath", () => {
36
+ it("should convert Windows backslashes to forward slashes", () => {
37
+ expect(normalizeRelativePath("rules\\test.md")).toBe("rules/test.md");
38
+ });
39
+ it("should handle mixed separators", () => {
40
+ expect(normalizeRelativePath("commands/sub\\nested.md")).toBe("commands/sub/nested.md");
41
+ });
42
+ it("should preserve forward slashes", () => {
43
+ expect(normalizeRelativePath("skills/test/SKILL.md")).toBe("skills/test/SKILL.md");
44
+ });
45
+ });
46
+ describe("canonicalizeRelativePath", () => {
47
+ it("should normalize claude.md to AGENTS.md for agents type", () => {
48
+ expect(canonicalizeRelativePath("claude", "agents", "CLAUDE.md")).toBe("AGENTS.md");
49
+ });
50
+ it("should normalize claude.md to AGENTS.md (case insensitive)", () => {
51
+ expect(canonicalizeRelativePath("claude", "agents", "claude.md")).toBe("AGENTS.md");
52
+ });
53
+ it("should preserve AGENTS.md for agents type", () => {
54
+ expect(canonicalizeRelativePath("claude", "agents", "AGENTS.md")).toBe("AGENTS.md");
55
+ });
56
+ it("should convert codex prompts/ to canonical commands/", () => {
57
+ expect(canonicalizeRelativePath("codex", "commands", "prompts/test.md")).toBe("commands/test.md");
58
+ });
59
+ it("should preserve nested folder structure when converting codex prompts/ to commands/", () => {
60
+ expect(canonicalizeRelativePath("codex", "commands", "prompts/octocode/research.md")).toBe("commands/octocode/research.md");
61
+ });
62
+ it("should preserve deeply nested folder structure for codex prompts", () => {
63
+ expect(canonicalizeRelativePath("codex", "commands", "prompts/a/b/c/deep.md")).toBe("commands/a/b/c/deep.md");
64
+ });
65
+ it("should convert Codex command skills back to canonical commands", () => {
66
+ expect(canonicalizeRelativePath("codex", "commands", "skills/commands/octocode/research/SKILL.md")).toBe("commands/octocode/research.md");
67
+ });
68
+ it("should not modify paths for other clients", () => {
69
+ expect(canonicalizeRelativePath("claude", "commands", "commands/test.md")).toBe("commands/test.md");
70
+ });
71
+ });
72
+ describe("denormalizeRelativePath", () => {
73
+ it("should convert AGENTS.md to CLAUDE.md for claude client", () => {
74
+ expect(denormalizeRelativePath("claude", "agents", "AGENTS.md")).toBe("CLAUDE.md");
75
+ });
76
+ it("should preserve AGENTS.md for other clients", () => {
77
+ expect(denormalizeRelativePath("cursor", "agents", "AGENTS.md")).toBe("AGENTS.md");
78
+ });
79
+ });
80
+ describe("buildTargetAbsolutePath", () => {
81
+ it("should join root and relative path", () => {
82
+ expect(buildTargetAbsolutePath("/root", "rules/test.md")).toBe("/root/rules/test.md");
83
+ });
84
+ it("should handle empty segments", () => {
85
+ expect(buildTargetAbsolutePath("/root", "test.md")).toBe("/root/test.md");
86
+ });
87
+ });
88
+ describe("remapRelativePathForTarget", () => {
89
+ it("should convert commands to Codex command skills", () => {
90
+ const asset = {
91
+ client: "claude",
92
+ type: "commands",
93
+ path: "/claude/commands/test.md",
94
+ relativePath: "commands/test.md",
95
+ canonicalPath: "commands/test.md",
96
+ name: "test",
97
+ content: "content",
98
+ hash: "hash",
99
+ };
100
+ expect(remapRelativePathForTarget(asset, "codex", "commands/test.md")).toBe("skills/commands/test/SKILL.md");
101
+ });
102
+ it("should preserve nested folder structure when converting commands to Codex command skills", () => {
103
+ const asset = {
104
+ client: "cursor",
105
+ type: "commands",
106
+ path: "/cursor/commands/octocode/research.md",
107
+ relativePath: "commands/octocode/research.md",
108
+ canonicalPath: "commands/octocode/research.md",
109
+ name: "octocode/research",
110
+ content: "content",
111
+ hash: "hash",
112
+ };
113
+ expect(remapRelativePathForTarget(asset, "codex", "commands/octocode/research.md")).toBe("skills/commands/octocode/research/SKILL.md");
114
+ });
115
+ it("should preserve deeply nested folder structure for codex", () => {
116
+ const asset = {
117
+ client: "cursor",
118
+ type: "commands",
119
+ path: "/cursor/commands/a/b/c/deep.md",
120
+ relativePath: "commands/a/b/c/deep.md",
121
+ canonicalPath: "commands/a/b/c/deep.md",
122
+ name: "a/b/c/deep",
123
+ content: "content",
124
+ hash: "hash",
125
+ };
126
+ expect(remapRelativePathForTarget(asset, "codex", "commands/a/b/c/deep.md")).toBe("skills/commands/a/b/c/deep/SKILL.md");
127
+ });
128
+ it("should preserve commands path for non-codex clients", () => {
129
+ const asset = {
130
+ client: "claude",
131
+ type: "commands",
132
+ path: "/claude/commands/test.md",
133
+ relativePath: "commands/test.md",
134
+ canonicalPath: "commands/test.md",
135
+ name: "test",
136
+ content: "content",
137
+ hash: "hash",
138
+ };
139
+ expect(remapRelativePathForTarget(asset, "claude", "commands/test.md")).toBe("commands/test.md");
140
+ });
141
+ it("should remap MCP config.toml to mcp.json for cursor", () => {
142
+ const asset = {
143
+ client: "codex",
144
+ type: "mcp",
145
+ path: "/codex/config.toml",
146
+ relativePath: "config.toml",
147
+ canonicalPath: "mcp.json",
148
+ name: "config",
149
+ content: "[mcpServers]",
150
+ hash: "hash",
151
+ };
152
+ expect(remapRelativePathForTarget(asset, "cursor", "mcp.json", mockDefs)).toBe("mcp.json");
153
+ });
154
+ it("should remap MCP to opencode.json for opencode", () => {
155
+ const asset = {
156
+ client: "cursor",
157
+ type: "mcp",
158
+ path: "/cursor/mcp.json",
159
+ relativePath: "mcp.json",
160
+ canonicalPath: "mcp.json",
161
+ name: "mcp",
162
+ content: "{}",
163
+ hash: "hash",
164
+ };
165
+ expect(remapRelativePathForTarget(asset, "opencode", "mcp.json", mockDefs)).toBe("opencode.json");
166
+ });
167
+ it("should remap MCP to config.toml for codex", () => {
168
+ const asset = {
169
+ client: "cursor",
170
+ type: "mcp",
171
+ path: "/cursor/mcp.json",
172
+ relativePath: "mcp.json",
173
+ canonicalPath: "mcp.json",
174
+ name: "mcp",
175
+ content: "{}",
176
+ hash: "hash",
177
+ };
178
+ expect(remapRelativePathForTarget(asset, "codex", "mcp.json", mockDefs)).toBe("config.toml");
179
+ });
180
+ });
181
+ describe("canonicalizeMcpPath", () => {
182
+ it("should canonicalize config.toml to mcp.json", () => {
183
+ expect(canonicalizeMcpPath("config.toml")).toBe("mcp.json");
184
+ });
185
+ it("should canonicalize opencode.jsonc to mcp.json", () => {
186
+ expect(canonicalizeMcpPath("opencode.jsonc")).toBe("mcp.json");
187
+ });
188
+ });
189
+ describe("getTargetMcpFilename", () => {
190
+ it("should return config.toml for codex", () => {
191
+ expect(getTargetMcpFilename("codex", mockDefs)).toBe("config.toml");
192
+ });
193
+ it("should return mcp.json for cursor", () => {
194
+ expect(getTargetMcpFilename("cursor", mockDefs)).toBe("mcp.json");
195
+ });
196
+ it("should return opencode.json for opencode", () => {
197
+ expect(getTargetMcpFilename("opencode", mockDefs)).toBe("opencode.json");
198
+ });
199
+ it("should return null for unknown client", () => {
200
+ expect(getTargetMcpFilename("unknown", mockDefs)).toBeNull();
201
+ });
202
+ });
203
+ describe("denormalizeMcpPath", () => {
204
+ it("should return client-specific MCP filename", () => {
205
+ expect(denormalizeMcpPath("codex", mockDefs)).toBe("config.toml");
206
+ expect(denormalizeMcpPath("cursor", mockDefs)).toBe("mcp.json");
207
+ expect(denormalizeMcpPath("opencode", mockDefs)).toBe("opencode.json");
208
+ });
209
+ });
210
+ describe("canonicalizeRelativePath for MCP", () => {
211
+ it("should canonicalize any MCP config to mcp.json", () => {
212
+ expect(canonicalizeRelativePath("codex", "mcp", "config.toml")).toBe("mcp.json");
213
+ expect(canonicalizeRelativePath("cursor", "mcp", "mcp.json")).toBe("mcp.json");
214
+ expect(canonicalizeRelativePath("opencode", "mcp", "opencode.json")).toBe("mcp.json");
215
+ });
216
+ });
217
+ describe("OpenCode agent file mapping", () => {
218
+ // OpenCode uses AGENTS.md (same as Cursor/Codex)
219
+ // See: https://opencode.ai/docs/rules/
220
+ it("should preserve AGENTS.md for opencode", () => {
221
+ expect(canonicalizeRelativePath("opencode", "agents", "AGENTS.md")).toBe("AGENTS.md");
222
+ });
223
+ it("should denormalize AGENTS.md to AGENTS.md for opencode", () => {
224
+ expect(denormalizeRelativePath("opencode", "agents", "AGENTS.md")).toBe("AGENTS.md");
225
+ });
226
+ });
227
+ describe("OpenCode singular directory mapping", () => {
228
+ describe("canonicalizeRelativePath", () => {
229
+ it("should convert opencode command/ to canonical commands/", () => {
230
+ expect(canonicalizeRelativePath("opencode", "commands", "command/test.md")).toBe("commands/test.md");
231
+ });
232
+ it("should preserve nested structure when converting command/ to commands/", () => {
233
+ expect(canonicalizeRelativePath("opencode", "commands", "command/sub/nested.md")).toBe("commands/sub/nested.md");
234
+ });
235
+ it("should convert opencode skill/ to canonical skills/", () => {
236
+ expect(canonicalizeRelativePath("opencode", "skills", "skill/myskill/SKILL.md")).toBe("skills/myskill/SKILL.md");
237
+ });
238
+ });
239
+ describe("remapRelativePathForTarget", () => {
240
+ it("should convert commands/ to command/ for opencode", () => {
241
+ const asset = {
242
+ client: "cursor",
243
+ type: "commands",
244
+ path: "/cursor/commands/test.md",
245
+ relativePath: "commands/test.md",
246
+ canonicalPath: "commands/test.md",
247
+ name: "test",
248
+ content: "content",
249
+ hash: "hash",
250
+ };
251
+ expect(remapRelativePathForTarget(asset, "opencode", "commands/test.md")).toBe("command/test.md");
252
+ });
253
+ it("should preserve nested structure when converting to opencode command/", () => {
254
+ const asset = {
255
+ client: "cursor",
256
+ type: "commands",
257
+ path: "/cursor/commands/sub/nested.md",
258
+ relativePath: "commands/sub/nested.md",
259
+ canonicalPath: "commands/sub/nested.md",
260
+ name: "sub/nested",
261
+ content: "content",
262
+ hash: "hash",
263
+ };
264
+ expect(remapRelativePathForTarget(asset, "opencode", "commands/sub/nested.md")).toBe("command/sub/nested.md");
265
+ });
266
+ it("should convert skills/ to skill/ for opencode", () => {
267
+ const asset = {
268
+ client: "cursor",
269
+ type: "skills",
270
+ path: "/cursor/skills/myskill/SKILL.md",
271
+ relativePath: "skills/myskill/SKILL.md",
272
+ canonicalPath: "skills/myskill/SKILL.md",
273
+ name: "myskill",
274
+ content: "content",
275
+ hash: "hash",
276
+ };
277
+ expect(remapRelativePathForTarget(asset, "opencode", "skills/myskill/SKILL.md")).toBe("skill/myskill/SKILL.md");
278
+ });
279
+ });
280
+ });
281
+ });
282
+ //# sourceMappingURL=paths.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.spec.js","sourceRoot":"","sources":["../../src/utils/paths.spec.ts"],"names":[],"mappings":"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"}