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,81 @@
1
+ import chalk from "chalk";
2
+ import fs from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { discoverCanonicalAssets, discoverIgnoredCursorRules, discoverLegacyAssets, groupAssetsByCanonicalKey, } from "../utils/canonical.js";
5
+ import { readCanonicalState } from "../utils/canonicalState.js";
6
+ import { transformContentForClient } from "../utils/frontmatter.js";
7
+ import { formatIssueSection } from "../utils/reporting.js";
8
+ export async function runDoctorCommand(options) {
9
+ const projectRoot = process.cwd();
10
+ const canonicalAssets = await discoverCanonicalAssets(projectRoot, options.types);
11
+ const legacyAssets = await discoverLegacyAssets(projectRoot, options.types);
12
+ const ignoredCursorRules = await discoverIgnoredCursorRules(projectRoot);
13
+ const state = await readCanonicalState();
14
+ const canonicalKeys = new Set(groupAssetsByCanonicalKey(canonicalAssets).keys());
15
+ const legacyKeys = groupAssetsByCanonicalKey(legacyAssets.filter((asset) => asset.type !== "rules"));
16
+ let issues = 0;
17
+ console.log(chalk.cyan("Doctor"));
18
+ console.log(` Canonical assets: ${canonicalAssets.length}`);
19
+ console.log(` Tracked generated targets: ${state.generated.length}`);
20
+ console.log();
21
+ const ignoredLines = formatIssueSection("Ignored legacy inputs", ignoredCursorRules.map((asset) => asset.path));
22
+ if (ignoredLines.length > 0) {
23
+ issues += ignoredCursorRules.length;
24
+ console.log(chalk.yellow(ignoredLines[0]));
25
+ for (const line of ignoredLines.slice(1)) {
26
+ console.log(line);
27
+ }
28
+ }
29
+ const bootstrapEligible = [...legacyKeys.entries()].filter(([key]) => !canonicalKeys.has(key));
30
+ const bootstrapLines = formatIssueSection("Missing canonical assets eligible for bootstrap", bootstrapEligible.map(([key, candidates]) => `${key} <- ${candidates.map((asset) => asset.client).join(", ")}`));
31
+ if (bootstrapLines.length > 0) {
32
+ issues += bootstrapEligible.length;
33
+ console.log(chalk.yellow(bootstrapLines[0]));
34
+ for (const line of bootstrapLines.slice(1)) {
35
+ console.log(line);
36
+ }
37
+ }
38
+ const brokenLinks = [];
39
+ const driftedCopies = [];
40
+ for (const entry of state.generated) {
41
+ try {
42
+ const stats = await fs.lstat(entry.path);
43
+ if (stats.isSymbolicLink()) {
44
+ const linkTarget = await fs.readlink(entry.path);
45
+ const resolved = path.resolve(path.dirname(entry.path), linkTarget);
46
+ await fs.access(resolved);
47
+ }
48
+ else {
49
+ const current = await fs.readFile(entry.path, "utf8");
50
+ const expected = entry.expectedContent ??
51
+ transformContentForClient(await fs.readFile(entry.sourcePath, "utf8"), entry.targetClient, entry.type);
52
+ if (current !== expected) {
53
+ driftedCopies.push(entry.path);
54
+ }
55
+ }
56
+ }
57
+ catch {
58
+ brokenLinks.push(entry.path);
59
+ }
60
+ }
61
+ const brokenLines = formatIssueSection("Broken generated links/targets", brokenLinks);
62
+ if (brokenLines.length > 0) {
63
+ issues += brokenLinks.length;
64
+ console.log(chalk.red(brokenLines[0]));
65
+ for (const line of brokenLines.slice(1)) {
66
+ console.log(line);
67
+ }
68
+ }
69
+ const driftLines = formatIssueSection("Generated copies drifted from canonical source", driftedCopies);
70
+ if (driftLines.length > 0) {
71
+ issues += driftedCopies.length;
72
+ console.log(chalk.yellow(driftLines[0]));
73
+ for (const line of driftLines.slice(1)) {
74
+ console.log(line);
75
+ }
76
+ }
77
+ if (issues === 0) {
78
+ console.log(chalk.green("doctor: no issues found"));
79
+ }
80
+ }
81
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { RestoreCommandOptions } from "../types/index.js";
2
+ export declare function runRestoreCommand(options: RestoreCommandOptions): Promise<void>;
3
+ //# sourceMappingURL=restore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore.d.ts","sourceRoot":"","sources":["../../src/commands/restore.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE/D,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,IAAI,CAAC,CA+Bf"}
@@ -0,0 +1,36 @@
1
+ import chalk from "chalk";
2
+ import { listSnapshots, readSnapshot, restoreSnapshot, } from "../utils/snapshots.js";
3
+ import { formatSnapshotList } from "../utils/reporting.js";
4
+ export async function runRestoreCommand(options) {
5
+ if (options.list) {
6
+ const snapshots = await listSnapshots();
7
+ if (snapshots.length === 0) {
8
+ console.log(chalk.yellow("No snapshots available."));
9
+ return;
10
+ }
11
+ console.log(chalk.cyan(`Snapshots (${snapshots.length})`));
12
+ for (const line of formatSnapshotList(snapshots)) {
13
+ console.log(` ${line}`);
14
+ }
15
+ return;
16
+ }
17
+ const snapshotId = options.id ?? (await getLatestSnapshotId());
18
+ const snapshot = await readSnapshot(snapshotId);
19
+ if (options.dryRun) {
20
+ console.log(chalk.yellow(`Would restore snapshot ${snapshot.id} (${snapshot.entries.length} paths)`));
21
+ for (const entry of snapshot.entries) {
22
+ console.log(` ${entry.path} <- ${entry.state}`);
23
+ }
24
+ return;
25
+ }
26
+ await restoreSnapshot(snapshot.id);
27
+ console.log(chalk.green(`Restored snapshot ${snapshot.id}`));
28
+ }
29
+ async function getLatestSnapshotId() {
30
+ const snapshots = await listSnapshots();
31
+ if (snapshots.length === 0) {
32
+ throw new Error("No snapshots available.");
33
+ }
34
+ return snapshots[0].id;
35
+ }
36
+ //# sourceMappingURL=restore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore.js","sourceRoot":"","sources":["../../src/commands/restore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,aAAa,EACb,YAAY,EACZ,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAG3D,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAA8B;IAE9B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,SAAS,GAAG,MAAM,aAAa,EAAE,CAAC;QACxC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC3D,KAAK,MAAM,IAAI,IAAI,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QAC3B,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,EAAE,IAAI,CAAC,MAAM,mBAAmB,EAAE,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC;IAEhD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,0BAA0B,QAAQ,CAAC,EAAE,KAAK,QAAQ,CAAC,OAAO,CAAC,MAAM,SAAS,CAC3E,CACF,CAAC;QACF,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,qBAAqB,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,KAAK,UAAU,mBAAmB;IAChC,MAAM,SAAS,GAAG,MAAM,aAAa,EAAE,CAAC;IACxC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACzB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SyncCommandOptions } from "../types/index.js";
2
+ export declare function runSyncCommand(options: SyncCommandOptions): Promise<void>;
3
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,kBAAkB,EAEnB,MAAM,mBAAmB,CAAC;AA4B3B,wBAAsB,cAAc,CAClC,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAkHf"}
@@ -0,0 +1,193 @@
1
+ import { select } from "@clack/prompts";
2
+ import chalk from "chalk";
3
+ import fs from "node:fs/promises";
4
+ import { buildClientDefinitions } from "../clients/definitions.js";
5
+ import { applyPlan } from "../utils/apply.js";
6
+ import { buildBootstrapEntry, buildFanoutPlan, discoverCanonicalAssets, discoverIgnoredCursorRules, discoverLegacyAssets, getBootstrapChoices, groupAssetsByCanonicalKey, synthesizeCanonicalAsset, } from "../utils/canonical.js";
7
+ import { writeCanonicalState, } from "../utils/canonicalState.js";
8
+ import { fileExists, readFileSafe } from "../utils/fs.js";
9
+ import { getBootstrapResolution } from "../utils/bootstrap.js";
10
+ import { createSnapshot, restoreSnapshot } from "../utils/snapshots.js";
11
+ import { printApplyResultLike } from "../utils/syncRuntime.js";
12
+ import { buildDetailedPlanLines, buildSyncPlanSummaryLines, buildSyncPreflightLines, formatIssueSection, } from "../utils/reporting.js";
13
+ export async function runSyncCommand(options) {
14
+ const projectRoot = process.cwd();
15
+ const allDefs = buildClientDefinitions(projectRoot);
16
+ const targetDefs = await getTargetDefinitions(allDefs);
17
+ const canonicalAssets = await discoverCanonicalAssets(projectRoot, options.types);
18
+ const legacyAssets = await discoverLegacyAssets(projectRoot, options.types);
19
+ const ignoredCursorRules = await discoverIgnoredCursorRules(projectRoot);
20
+ const canonicalByKey = groupAssetsByCanonicalKey(canonicalAssets);
21
+ const legacyByKey = groupAssetsByCanonicalKey(legacyAssets.filter((asset) => asset.type !== "rules"));
22
+ const bootstrapEntries = [];
23
+ const synthesizedCanonical = [...canonicalAssets];
24
+ for (const [, candidates] of legacyByKey.entries()) {
25
+ if (canonicalByKey.has(`${candidates[0].type}::${candidates[0].canonicalPath ?? candidates[0].relativePath}`)) {
26
+ continue;
27
+ }
28
+ const canonicalPath = candidates[0].canonicalPath ?? candidates[0].relativePath;
29
+ const resolution = getBootstrapResolution({
30
+ canonicalPath,
31
+ candidates,
32
+ bootstrapSource: options.bootstrapSource,
33
+ });
34
+ if (resolution.status === "missing") {
35
+ continue;
36
+ }
37
+ if (resolution.status === "ambiguous") {
38
+ const selected = await chooseBootstrapCandidate(canonicalPath, resolution.candidates);
39
+ if (!selected) {
40
+ throw new Error(`Bootstrap cancelled for ${canonicalPath}`);
41
+ }
42
+ bootstrapEntries.push(buildBootstrapEntry(projectRoot, selected));
43
+ synthesizedCanonical.push(synthesizeCanonicalAsset(projectRoot, selected));
44
+ continue;
45
+ }
46
+ bootstrapEntries.push(buildBootstrapEntry(projectRoot, resolution.asset));
47
+ synthesizedCanonical.push(synthesizeCanonicalAsset(projectRoot, resolution.asset));
48
+ }
49
+ const resolvedLinkMode = await resolveWriteMode(options);
50
+ const syncOptions = { ...options, link: resolvedLinkMode };
51
+ const fanoutPlan = buildFanoutPlan(synthesizedCanonical, targetDefs, syncOptions);
52
+ const plan = [...bootstrapEntries, ...fanoutPlan];
53
+ printPreflight({
54
+ canonicalCount: canonicalAssets.length,
55
+ bootstrapCount: bootstrapEntries.length,
56
+ ignoredCount: ignoredCursorRules.length,
57
+ targets: targetDefs.map((def) => def.name),
58
+ writeMode: resolvedLinkMode ? "symlink" : "copy",
59
+ dryRun: options.dryRun,
60
+ types: options.types,
61
+ });
62
+ printWarnings(ignoredCursorRules);
63
+ if (plan.length === 0) {
64
+ console.log(chalk.green("Nothing to sync."));
65
+ return;
66
+ }
67
+ printPlan(plan, options.verbose, options.dryRun);
68
+ if (options.dryRun) {
69
+ return;
70
+ }
71
+ const snapshot = await createSnapshot(plan
72
+ .filter((entry) => entry.action !== "skip")
73
+ .map((entry) => entry.targetPath));
74
+ console.log(chalk.dim(`restore-point-created ${snapshot.id}`));
75
+ const applyResult = await applyPlan(plan, {
76
+ mode: "merge",
77
+ dryRun: false,
78
+ verbose: options.verbose,
79
+ link: resolvedLinkMode,
80
+ separateClaudeMd: options.separateClaudeMd,
81
+ });
82
+ if (applyResult.failed > 0) {
83
+ await restoreSnapshot(snapshot.id);
84
+ throw new Error(`sync failed; restored snapshot ${snapshot.id}`);
85
+ }
86
+ await writeCanonicalState(await collectGeneratedStateEntries(fanoutPlan));
87
+ printApplyResultLike(applyResult, options.verbose);
88
+ }
89
+ async function chooseBootstrapCandidate(canonicalPath, candidates) {
90
+ if (!process.stdout.isTTY || !process.stdin.isTTY) {
91
+ throw new Error(`Ambiguous bootstrap for ${canonicalPath}. Re-run interactively or pass --bootstrap-source <client>.`);
92
+ }
93
+ // Sort by newest first so the suggested default is the most recent
94
+ const sorted = [...candidates].sort((a, b) => {
95
+ const ta = a.modifiedAt?.getTime() ?? 0;
96
+ const tb = b.modifiedAt?.getTime() ?? 0;
97
+ return tb - ta;
98
+ });
99
+ const choice = await select({
100
+ message: `Select bootstrap source for ${canonicalPath}`,
101
+ options: [
102
+ ...getBootstrapChoices(sorted),
103
+ { value: "__cancel__", label: "Cancel", hint: "Abort bootstrap" },
104
+ ],
105
+ });
106
+ if (typeof choice === "symbol" || choice === "__cancel__") {
107
+ return null;
108
+ }
109
+ return candidates.find((asset) => asset.path === choice) ?? null;
110
+ }
111
+ async function resolveWriteMode(options) {
112
+ if (options.link)
113
+ return true;
114
+ if (options.copy)
115
+ return false;
116
+ if (!process.stdout.isTTY || !process.stdin.isTTY)
117
+ return false;
118
+ const mode = await select({
119
+ message: "How should files be written?",
120
+ options: [
121
+ {
122
+ value: "symlink",
123
+ label: "Symlink",
124
+ hint: "Recommended when exact bytes can be reused",
125
+ },
126
+ { value: "copy", label: "Copy", hint: "Always write independent files" },
127
+ ],
128
+ initialValue: "symlink",
129
+ });
130
+ if (typeof mode === "symbol") {
131
+ throw new Error("Sync cancelled at write mode selection.");
132
+ }
133
+ return mode === "symlink";
134
+ }
135
+ function printPreflight(input) {
136
+ console.log(chalk.cyan("Preflight"));
137
+ for (const line of buildSyncPreflightLines(input)) {
138
+ console.log(` ${line}`);
139
+ }
140
+ console.log();
141
+ }
142
+ function printWarnings(ignoredCursorRules) {
143
+ const lines = formatIssueSection("Ignored legacy inputs", ignoredCursorRules.map((asset) => `${asset.path} :: ignored cursor rule; manage via .agents/AGENTS.md instead`));
144
+ if (lines.length === 0) {
145
+ return;
146
+ }
147
+ console.log(chalk.yellow(lines[0]));
148
+ for (const line of lines.slice(1)) {
149
+ console.log(chalk.yellow(line));
150
+ }
151
+ }
152
+ function printPlan(plan, verbose, dryRun) {
153
+ console.log(chalk.cyan("Plan"));
154
+ for (const line of buildSyncPlanSummaryLines(plan)) {
155
+ console.log(` ${line}`);
156
+ }
157
+ console.log();
158
+ if (!verbose && !dryRun) {
159
+ return;
160
+ }
161
+ console.log(chalk.dim("Detailed paths"));
162
+ for (const line of buildDetailedPlanLines(plan)) {
163
+ console.log(chalk.dim(` ${line}`));
164
+ }
165
+ console.log();
166
+ }
167
+ async function collectGeneratedStateEntries(plan) {
168
+ const generated = [];
169
+ for (const entry of plan) {
170
+ const stats = await fs.lstat(entry.targetPath);
171
+ const sourceContent = await readFileSafe(entry.asset.path);
172
+ generated.push({
173
+ path: entry.targetPath,
174
+ sourcePath: entry.asset.path,
175
+ canonicalPath: entry.asset.canonicalPath ?? entry.asset.relativePath,
176
+ targetClient: entry.targetClient,
177
+ type: entry.asset.type,
178
+ mode: stats.isSymbolicLink() ? "symlink" : "copy",
179
+ expectedContent: sourceContent === entry.asset.content ? undefined : entry.asset.content,
180
+ });
181
+ }
182
+ return generated;
183
+ }
184
+ async function getTargetDefinitions(defs) {
185
+ const targets = [];
186
+ for (const def of defs) {
187
+ if (await fileExists(def.root)) {
188
+ targets.push(def);
189
+ }
190
+ }
191
+ return targets;
192
+ }
193
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env node
2
+ import process from "node:process";
3
+ import chalk from "chalk";
4
+ import { CommanderError } from "commander";
5
+ import { parseCliArgs } from "./cli/options.js";
6
+ import { runSyncCommand } from "./commands/sync.js";
7
+ import { runDoctorCommand } from "./commands/doctor.js";
8
+ import { runRestoreCommand } from "./commands/restore.js";
9
+ async function main() {
10
+ const options = parseCliArgs(process.argv);
11
+ if (options.command === "sync") {
12
+ await runSyncCommand(options);
13
+ return;
14
+ }
15
+ if (options.command === "doctor") {
16
+ await runDoctorCommand(options);
17
+ return;
18
+ }
19
+ await runRestoreCommand(options);
20
+ }
21
+ main().catch((error) => {
22
+ if (error instanceof CommanderError &&
23
+ error.code === "commander.helpDisplayed") {
24
+ process.exitCode = 0;
25
+ return;
26
+ }
27
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
28
+ process.exitCode = 1;
29
+ });
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3C,IAAI,OAAO,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;QAC/B,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAChC,OAAO;IACT,CAAC;IAED,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,IACE,KAAK,YAAY,cAAc;QAC/B,KAAK,CAAC,IAAI,KAAK,yBAAyB,EACxC,CAAC;QACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAClE,CAAC;IACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,98 @@
1
+ export type AgentClientName = "project" | "codex" | "claude" | "cursor" | "opencode";
2
+ export type AssetType = "agents" | "commands" | "rules" | "skills" | "mcp" | "prompts";
3
+ export type ManagedAssetType = "agents" | "commands" | "skills" | "mcp";
4
+ export type SyncScope = "project" | "global" | "all";
5
+ export type SyncDirection = "push" | "pull" | "sync";
6
+ export type ConflictResolution = "source" | "target" | "merge" | "rename" | "skip";
7
+ export interface AssetLocation {
8
+ path: string;
9
+ name: string;
10
+ type: AssetType;
11
+ client: AgentClientName;
12
+ relativePath: string;
13
+ canonicalPath?: string;
14
+ }
15
+ export interface AssetContent extends AssetLocation {
16
+ content: string;
17
+ hash: string;
18
+ metadata?: Record<string, unknown>;
19
+ modifiedAt?: Date;
20
+ }
21
+ export interface ClientDefinition {
22
+ name: AgentClientName;
23
+ displayName: string;
24
+ root: string;
25
+ assets: AssetPattern[];
26
+ }
27
+ export interface AssetPattern {
28
+ type: AssetType;
29
+ patterns: string[];
30
+ files?: string[];
31
+ }
32
+ export interface SyncOptions {
33
+ mode: "interactive" | "merge" | "source";
34
+ scope?: SyncScope;
35
+ direction?: SyncDirection;
36
+ source?: AgentClientName;
37
+ clients?: AgentClientName[];
38
+ types?: AssetType[];
39
+ dryRun?: boolean;
40
+ verbose?: boolean;
41
+ priority?: AgentClientName[];
42
+ exportCursorHistory?: boolean;
43
+ cursorHistoryDest?: string;
44
+ reset?: boolean;
45
+ revert?: boolean;
46
+ revertList?: boolean;
47
+ link?: boolean;
48
+ separateClaudeMd?: boolean;
49
+ }
50
+ export interface SyncCommandOptions {
51
+ command: "sync";
52
+ types?: ManagedAssetType[];
53
+ dryRun: boolean;
54
+ verbose: boolean;
55
+ link: boolean;
56
+ copy: boolean;
57
+ separateClaudeMd: boolean;
58
+ bootstrapSource?: AgentClientName;
59
+ }
60
+ export interface DoctorCommandOptions {
61
+ command: "doctor";
62
+ types?: ManagedAssetType[];
63
+ verbose: boolean;
64
+ }
65
+ export interface RestoreCommandOptions {
66
+ command: "restore";
67
+ latest: boolean;
68
+ list: boolean;
69
+ id?: string;
70
+ dryRun: boolean;
71
+ verbose: boolean;
72
+ }
73
+ export type CliCommandOptions = SyncCommandOptions | DoctorCommandOptions | RestoreCommandOptions;
74
+ export interface SyncPlanEntry {
75
+ asset: AssetContent;
76
+ targetClient: AgentClientName;
77
+ targetPath: string;
78
+ targetRelativePath?: string;
79
+ action: "create" | "update" | "skip";
80
+ reason?: string;
81
+ }
82
+ export interface AssetConflict {
83
+ canonicalKey: string;
84
+ type: AssetType;
85
+ versions: AssetContent[];
86
+ resolution?: ConflictResolution;
87
+ resolvedContent?: string;
88
+ renamedPath?: string;
89
+ selectedVersion?: AssetContent;
90
+ }
91
+ export interface ScanResult {
92
+ client: AgentClientName;
93
+ displayName: string;
94
+ found: boolean;
95
+ assets: AssetContent[];
96
+ root: string;
97
+ }
98
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,22 @@
1
+ import type { SyncOptions, SyncPlanEntry } from "../types/index.js";
2
+ export interface ApplyResult {
3
+ applied: number;
4
+ skipped: number;
5
+ failed: number;
6
+ backups: string[];
7
+ errors: string[];
8
+ rolledBack: boolean;
9
+ }
10
+ export declare function applyPlan(plan: SyncPlanEntry[], options: SyncOptions): Promise<ApplyResult>;
11
+ /**
12
+ * Cleanup old backups beyond MAX_BACKUPS limit.
13
+ */
14
+ export declare function cleanupOldBackups(): Promise<number>;
15
+ /**
16
+ * Update manifest with generated files and prune stale files.
17
+ */
18
+ export declare function postApplyCleanup(appliedPaths: string[], verbose?: boolean): Promise<{
19
+ pruned: string[];
20
+ manifestUpdated: boolean;
21
+ }>;
22
+ //# sourceMappingURL=apply.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../src/utils/apply.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAgBpE,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;CACrB;AAcD,wBAAsB,SAAS,CAC7B,IAAI,EAAE,aAAa,EAAE,EACrB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,WAAW,CAAC,CAsItB;AAqED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAgCzD;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,YAAY,EAAE,MAAM,EAAE,EACtB,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,eAAe,EAAE,OAAO,CAAA;CAAE,CAAC,CAoBzD"}