@googlarz/agents-sync 1.0.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 (189) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +366 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +237 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/config/loader.d.ts +9 -0
  8. package/dist/config/loader.d.ts.map +1 -0
  9. package/dist/config/loader.js +55 -0
  10. package/dist/config/loader.js.map +1 -0
  11. package/dist/config/schema.d.ts +69 -0
  12. package/dist/config/schema.d.ts.map +1 -0
  13. package/dist/config/schema.js +33 -0
  14. package/dist/config/schema.js.map +1 -0
  15. package/dist/derivers/aider.d.ts +19 -0
  16. package/dist/derivers/aider.d.ts.map +1 -0
  17. package/dist/derivers/aider.js +117 -0
  18. package/dist/derivers/aider.js.map +1 -0
  19. package/dist/derivers/claude.d.ts +19 -0
  20. package/dist/derivers/claude.d.ts.map +1 -0
  21. package/dist/derivers/claude.js +41 -0
  22. package/dist/derivers/claude.js.map +1 -0
  23. package/dist/derivers/cline.d.ts +17 -0
  24. package/dist/derivers/cline.d.ts.map +1 -0
  25. package/dist/derivers/cline.js +92 -0
  26. package/dist/derivers/cline.js.map +1 -0
  27. package/dist/derivers/copilot.d.ts +16 -0
  28. package/dist/derivers/copilot.d.ts.map +1 -0
  29. package/dist/derivers/copilot.js +162 -0
  30. package/dist/derivers/copilot.js.map +1 -0
  31. package/dist/derivers/cursor.d.ts +16 -0
  32. package/dist/derivers/cursor.d.ts.map +1 -0
  33. package/dist/derivers/cursor.js +121 -0
  34. package/dist/derivers/cursor.js.map +1 -0
  35. package/dist/derivers/gemini.d.ts +19 -0
  36. package/dist/derivers/gemini.d.ts.map +1 -0
  37. package/dist/derivers/gemini.js +33 -0
  38. package/dist/derivers/gemini.js.map +1 -0
  39. package/dist/derivers/index.d.ts +33 -0
  40. package/dist/derivers/index.d.ts.map +1 -0
  41. package/dist/derivers/index.js +124 -0
  42. package/dist/derivers/index.js.map +1 -0
  43. package/dist/derivers/merger.d.ts +36 -0
  44. package/dist/derivers/merger.d.ts.map +1 -0
  45. package/dist/derivers/merger.js +83 -0
  46. package/dist/derivers/merger.js.map +1 -0
  47. package/dist/derivers/roo.d.ts +18 -0
  48. package/dist/derivers/roo.d.ts.map +1 -0
  49. package/dist/derivers/roo.js +92 -0
  50. package/dist/derivers/roo.js.map +1 -0
  51. package/dist/derivers/windsurf.d.ts +16 -0
  52. package/dist/derivers/windsurf.d.ts.map +1 -0
  53. package/dist/derivers/windsurf.js +91 -0
  54. package/dist/derivers/windsurf.js.map +1 -0
  55. package/dist/extractor/extractor.d.ts +4 -0
  56. package/dist/extractor/extractor.d.ts.map +1 -0
  57. package/dist/extractor/extractor.js +117 -0
  58. package/dist/extractor/extractor.js.map +1 -0
  59. package/dist/extractor/schema.d.ts +187 -0
  60. package/dist/extractor/schema.d.ts.map +1 -0
  61. package/dist/extractor/schema.js +44 -0
  62. package/dist/extractor/schema.js.map +1 -0
  63. package/dist/generator/agents-md.d.ts +3 -0
  64. package/dist/generator/agents-md.d.ts.map +1 -0
  65. package/dist/generator/agents-md.js +127 -0
  66. package/dist/generator/agents-md.js.map +1 -0
  67. package/dist/generator/validator.d.ts +7 -0
  68. package/dist/generator/validator.d.ts.map +1 -0
  69. package/dist/generator/validator.js +67 -0
  70. package/dist/generator/validator.js.map +1 -0
  71. package/dist/lib/claude-client.d.ts +11 -0
  72. package/dist/lib/claude-client.d.ts.map +1 -0
  73. package/dist/lib/claude-client.js +74 -0
  74. package/dist/lib/claude-client.js.map +1 -0
  75. package/dist/lib/errors.d.ts +10 -0
  76. package/dist/lib/errors.d.ts.map +1 -0
  77. package/dist/lib/errors.js +27 -0
  78. package/dist/lib/errors.js.map +1 -0
  79. package/dist/lib/file-utils.d.ts +7 -0
  80. package/dist/lib/file-utils.d.ts.map +1 -0
  81. package/dist/lib/file-utils.js +56 -0
  82. package/dist/lib/file-utils.js.map +1 -0
  83. package/dist/lib/token-estimate.d.ts +7 -0
  84. package/dist/lib/token-estimate.d.ts.map +1 -0
  85. package/dist/lib/token-estimate.js +15 -0
  86. package/dist/lib/token-estimate.js.map +1 -0
  87. package/dist/scanner/codegraph.d.ts +13 -0
  88. package/dist/scanner/codegraph.d.ts.map +1 -0
  89. package/dist/scanner/codegraph.js +65 -0
  90. package/dist/scanner/codegraph.js.map +1 -0
  91. package/dist/scanner/docs.d.ts +13 -0
  92. package/dist/scanner/docs.d.ts.map +1 -0
  93. package/dist/scanner/docs.js +63 -0
  94. package/dist/scanner/docs.js.map +1 -0
  95. package/dist/scanner/gotchas.d.ts +8 -0
  96. package/dist/scanner/gotchas.d.ts.map +1 -0
  97. package/dist/scanner/gotchas.js +107 -0
  98. package/dist/scanner/gotchas.js.map +1 -0
  99. package/dist/scanner/index.d.ts +21 -0
  100. package/dist/scanner/index.d.ts.map +1 -0
  101. package/dist/scanner/index.js +87 -0
  102. package/dist/scanner/index.js.map +1 -0
  103. package/dist/scanner/manifest.d.ts +13 -0
  104. package/dist/scanner/manifest.d.ts.map +1 -0
  105. package/dist/scanner/manifest.js +285 -0
  106. package/dist/scanner/manifest.js.map +1 -0
  107. package/dist/scanner/mcp.d.ts +12 -0
  108. package/dist/scanner/mcp.d.ts.map +1 -0
  109. package/dist/scanner/mcp.js +96 -0
  110. package/dist/scanner/mcp.js.map +1 -0
  111. package/dist/scanner/repomix.d.ts +11 -0
  112. package/dist/scanner/repomix.d.ts.map +1 -0
  113. package/dist/scanner/repomix.js +87 -0
  114. package/dist/scanner/repomix.js.map +1 -0
  115. package/dist/scanner/skills.d.ts +18 -0
  116. package/dist/scanner/skills.d.ts.map +1 -0
  117. package/dist/scanner/skills.js +100 -0
  118. package/dist/scanner/skills.js.map +1 -0
  119. package/dist/scanner/source.d.ts +13 -0
  120. package/dist/scanner/source.d.ts.map +1 -0
  121. package/dist/scanner/source.js +157 -0
  122. package/dist/scanner/source.js.map +1 -0
  123. package/dist/scanner/structure.d.ts +10 -0
  124. package/dist/scanner/structure.d.ts.map +1 -0
  125. package/dist/scanner/structure.js +168 -0
  126. package/dist/scanner/structure.js.map +1 -0
  127. package/dist/server.d.ts +2 -0
  128. package/dist/server.d.ts.map +1 -0
  129. package/dist/server.js +212 -0
  130. package/dist/server.js.map +1 -0
  131. package/dist/snapshot/drift.d.ts +22 -0
  132. package/dist/snapshot/drift.d.ts.map +1 -0
  133. package/dist/snapshot/drift.js +105 -0
  134. package/dist/snapshot/drift.js.map +1 -0
  135. package/dist/snapshot/schema.d.ts +94 -0
  136. package/dist/snapshot/schema.d.ts.map +1 -0
  137. package/dist/snapshot/schema.js +24 -0
  138. package/dist/snapshot/schema.js.map +1 -0
  139. package/dist/snapshot/writer.d.ts +17 -0
  140. package/dist/snapshot/writer.d.ts.map +1 -0
  141. package/dist/snapshot/writer.js +44 -0
  142. package/dist/snapshot/writer.js.map +1 -0
  143. package/dist/tools/drift.d.ts +15 -0
  144. package/dist/tools/drift.d.ts.map +1 -0
  145. package/dist/tools/drift.js +31 -0
  146. package/dist/tools/drift.js.map +1 -0
  147. package/dist/tools/export.d.ts +14 -0
  148. package/dist/tools/export.d.ts.map +1 -0
  149. package/dist/tools/export.js +53 -0
  150. package/dist/tools/export.js.map +1 -0
  151. package/dist/tools/init.d.ts +28 -0
  152. package/dist/tools/init.d.ts.map +1 -0
  153. package/dist/tools/init.js +103 -0
  154. package/dist/tools/init.js.map +1 -0
  155. package/dist/tools/install-hook.d.ts +15 -0
  156. package/dist/tools/install-hook.d.ts.map +1 -0
  157. package/dist/tools/install-hook.js +169 -0
  158. package/dist/tools/install-hook.js.map +1 -0
  159. package/dist/tools/lint.d.ts +24 -0
  160. package/dist/tools/lint.d.ts.map +1 -0
  161. package/dist/tools/lint.js +213 -0
  162. package/dist/tools/lint.js.map +1 -0
  163. package/dist/tools/scan-report.d.ts +14 -0
  164. package/dist/tools/scan-report.d.ts.map +1 -0
  165. package/dist/tools/scan-report.js +136 -0
  166. package/dist/tools/scan-report.js.map +1 -0
  167. package/dist/tools/status.d.ts +18 -0
  168. package/dist/tools/status.d.ts.map +1 -0
  169. package/dist/tools/status.js +38 -0
  170. package/dist/tools/status.js.map +1 -0
  171. package/dist/tools/sync.d.ts +22 -0
  172. package/dist/tools/sync.d.ts.map +1 -0
  173. package/dist/tools/sync.js +123 -0
  174. package/dist/tools/sync.js.map +1 -0
  175. package/dist/tools/validate.d.ts +22 -0
  176. package/dist/tools/validate.d.ts.map +1 -0
  177. package/dist/tools/validate.js +97 -0
  178. package/dist/tools/validate.js.map +1 -0
  179. package/docs/examples/.clinerules +29 -0
  180. package/docs/examples/.cursorrules +19 -0
  181. package/docs/examples/.windsurfrules +14 -0
  182. package/docs/examples/AGENTS.md +97 -0
  183. package/docs/examples/CLAUDE.md +88 -0
  184. package/docs/examples/GEMINI.md +61 -0
  185. package/docs/examples/copilot-instructions.md +24 -0
  186. package/docs/github-action.yml +89 -0
  187. package/package.json +63 -0
  188. package/scripts/demo.sh +138 -0
  189. package/skill/SKILL.md +158 -0
@@ -0,0 +1,168 @@
1
+ import path from "node:path";
2
+ import fg from "fast-glob";
3
+ const IGNORE_PATTERNS = [
4
+ "**/node_modules/**",
5
+ "**/.git/**",
6
+ "**/dist/**",
7
+ "**/build/**",
8
+ "**/__pycache__/**",
9
+ "**/.venv/**",
10
+ "**/target/**",
11
+ "**/.next/**",
12
+ "**/coverage/**",
13
+ "**/.cache/**",
14
+ ];
15
+ const ENTRY_POINT_PATTERNS = [
16
+ /^src\/index\./,
17
+ /^index\./,
18
+ /^main\./,
19
+ /^app\./,
20
+ /^server\./,
21
+ /^cmd\/main\./,
22
+ /^manage\.py$/,
23
+ /^wsgi\.py$/,
24
+ ];
25
+ function detectNamingConvention(names) {
26
+ const counts = { kebab: 0, camel: 0, snake: 0, pascal: 0 };
27
+ for (const name of names) {
28
+ if (/^[A-Z][a-zA-Z0-9]*$/.test(name))
29
+ counts.pascal++;
30
+ else if (/^[a-z][a-zA-Z0-9]*[A-Z]/.test(name))
31
+ counts.camel++;
32
+ else if (name.includes("-"))
33
+ counts.kebab++;
34
+ else if (name.includes("_"))
35
+ counts.snake++;
36
+ }
37
+ const total = names.length;
38
+ if (total === 0)
39
+ return "mixed";
40
+ const threshold = 0.5;
41
+ if (counts.kebab / total >= threshold)
42
+ return "kebab-case";
43
+ if (counts.camel / total >= threshold)
44
+ return "camelCase";
45
+ if (counts.snake / total >= threshold)
46
+ return "snake_case";
47
+ if (counts.pascal / total >= threshold)
48
+ return "PascalCase";
49
+ return "mixed";
50
+ }
51
+ function buildTree(files, maxLines = 60) {
52
+ // Build a nested structure from paths
53
+ const tree = {};
54
+ for (const file of files) {
55
+ const parts = file.split("/");
56
+ let node = tree;
57
+ for (const part of parts) {
58
+ if (!(part in node)) {
59
+ node[part] = {};
60
+ }
61
+ node = node[part];
62
+ }
63
+ }
64
+ const lines = ["."];
65
+ function renderNode(node, prefix, depth) {
66
+ if (depth > 3)
67
+ return;
68
+ if (lines.length >= maxLines)
69
+ return;
70
+ const entries = Object.entries(node);
71
+ entries.sort(([a], [b]) => a.localeCompare(b));
72
+ for (let i = 0; i < entries.length; i++) {
73
+ if (lines.length >= maxLines)
74
+ return;
75
+ const [key, child] = entries[i];
76
+ const isLast = i === entries.length - 1;
77
+ const connector = isLast ? "└── " : "├── ";
78
+ const childPrefix = isLast ? " " : "│ ";
79
+ lines.push(`${prefix}${connector}${key}`);
80
+ const childNode = child;
81
+ if (Object.keys(childNode).length > 0) {
82
+ renderNode(childNode, prefix + childPrefix, depth + 1);
83
+ }
84
+ }
85
+ }
86
+ renderNode(tree, "", 1);
87
+ if (lines.length >= maxLines) {
88
+ lines.push("... (truncated)");
89
+ }
90
+ return lines.join("\n");
91
+ }
92
+ export async function scanStructure(projectPath) {
93
+ try {
94
+ // List files up to depth 3
95
+ const files = await fg("**/*", {
96
+ cwd: projectPath,
97
+ onlyFiles: true,
98
+ deep: 3,
99
+ ignore: IGNORE_PATTERNS,
100
+ dot: false,
101
+ });
102
+ // Total file count (no depth limit, capped at 9999)
103
+ let totalFileCount;
104
+ try {
105
+ const allFiles = await fg("**/*", {
106
+ cwd: projectPath,
107
+ onlyFiles: true,
108
+ ignore: IGNORE_PATTERNS,
109
+ dot: false,
110
+ });
111
+ totalFileCount = Math.min(allFiles.length, 9999);
112
+ }
113
+ catch {
114
+ totalFileCount = Math.min(files.length, 9999);
115
+ }
116
+ // Top-level dirs
117
+ const topLevelDirSet = new Set();
118
+ for (const file of files) {
119
+ const firstSegment = file.split("/")[0];
120
+ if (firstSegment && firstSegment !== file) {
121
+ topLevelDirSet.add(firstSegment);
122
+ }
123
+ }
124
+ const topLevelDirs = Array.from(topLevelDirSet).sort();
125
+ // Entry points
126
+ const entryPoints = files.filter((f) => ENTRY_POINT_PATTERNS.some((pattern) => pattern.test(f)));
127
+ // Test dirs
128
+ const testDirSet = new Set();
129
+ for (const file of files) {
130
+ const parts = file.split("/");
131
+ for (let i = 0; i < parts.length - 1; i++) {
132
+ const dir = parts[i];
133
+ if (dir.toLowerCase().includes("test") ||
134
+ dir.toLowerCase().includes("spec") ||
135
+ dir === "__tests__") {
136
+ testDirSet.add(parts.slice(0, i + 1).join("/"));
137
+ }
138
+ }
139
+ }
140
+ const testDirs = Array.from(testDirSet).sort();
141
+ // Naming convention: sample first 20 filenames without extension
142
+ const sampleNames = files
143
+ .slice(0, 20)
144
+ .map((f) => path.basename(f, path.extname(f)));
145
+ const namingConvention = detectNamingConvention(sampleNames);
146
+ // Tree
147
+ const tree = buildTree(files);
148
+ return {
149
+ topLevelDirs,
150
+ entryPoints,
151
+ testDirs,
152
+ totalFileCount,
153
+ namingConvention,
154
+ tree,
155
+ };
156
+ }
157
+ catch {
158
+ return {
159
+ topLevelDirs: [],
160
+ entryPoints: [],
161
+ testDirs: [],
162
+ totalFileCount: 0,
163
+ namingConvention: "mixed",
164
+ tree: ".",
165
+ };
166
+ }
167
+ }
168
+ //# sourceMappingURL=structure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structure.js","sourceRoot":"","sources":["../../src/scanner/structure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":""}
package/dist/server.js ADDED
@@ -0,0 +1,212 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { z } from "zod";
4
+ import { toMcpError } from "./lib/errors.js";
5
+ import { runInit } from "./tools/init.js";
6
+ import { runSync } from "./tools/sync.js";
7
+ import { runDrift } from "./tools/drift.js";
8
+ import { runExport } from "./tools/export.js";
9
+ import { runValidate } from "./tools/validate.js";
10
+ import { runStatus } from "./tools/status.js";
11
+ const VERSION = "1.0.0";
12
+ const server = new McpServer({
13
+ name: "agents-sync",
14
+ version: VERSION,
15
+ });
16
+ // ─── agents_sync_init ────────────────────────────────────────────────────────
17
+ server.tool("agents_sync_init", "Analyze a codebase and generate AGENTS.md + all tool-specific context files (CLAUDE.md, .cursorrules, copilot-instructions.md, GEMINI.md, .windsurfrules, .clinerules). Run this once per project.", {
18
+ projectPath: z.string().describe("Absolute path to the project root directory"),
19
+ tools: z
20
+ .array(z.enum(["claude", "cursor", "copilot", "gemini", "windsurf", "cline"]))
21
+ .optional()
22
+ .describe("Which tool files to generate. Default: all six."),
23
+ dryRun: z
24
+ .boolean()
25
+ .optional()
26
+ .describe("Preview what would be generated without writing any files."),
27
+ }, async ({ projectPath, tools, dryRun }) => {
28
+ try {
29
+ const result = await runInit({ projectPath, tools, dryRun });
30
+ const lines = [];
31
+ if (result.dryRun) {
32
+ lines.push("DRY RUN — no files written\n");
33
+ lines.push(`→ Would write: ${result.agentsMdPath}`);
34
+ for (const f of result.filesWritten) {
35
+ lines.push(`→ Would write: ${f.path}`);
36
+ }
37
+ }
38
+ else {
39
+ lines.push(`✓ AGENTS.md → ${result.agentsMdPath}`);
40
+ for (const f of result.filesWritten) {
41
+ lines.push(`✓ ${f.tool} → ${f.path}`);
42
+ }
43
+ }
44
+ if (result.customSectionsPreserved > 0) {
45
+ lines.push(`\n ${result.customSectionsPreserved} custom section(s) preserved from existing files`);
46
+ }
47
+ if (result.warnings.length > 0) {
48
+ lines.push("\nWarnings:");
49
+ for (const w of result.warnings)
50
+ lines.push(` ⚠ ${w}`);
51
+ }
52
+ if (!result.dryRun) {
53
+ lines.push("\n✓ Snapshot saved to .agents-sync/");
54
+ lines.push(" → Add AGENTS.md to git. Add .agents-sync/ to .gitignore.");
55
+ }
56
+ return { content: [{ type: "text", text: lines.join("\n") }] };
57
+ }
58
+ catch (e) {
59
+ return { content: [{ type: "text", text: `Error: ${toMcpError(e)}` }], isError: true };
60
+ }
61
+ });
62
+ // ─── agents_sync_sync ────────────────────────────────────────────────────────
63
+ server.tool("agents_sync_sync", "Re-analyze the codebase and update all tool context files from current state. Preserves manual custom sections.", {
64
+ projectPath: z.string().describe("Absolute path to the project root directory"),
65
+ tools: z
66
+ .array(z.enum(["claude", "cursor", "copilot", "gemini", "windsurf", "cline"]))
67
+ .optional()
68
+ .describe("Which tool files to update. Default: all."),
69
+ fast: z
70
+ .boolean()
71
+ .optional()
72
+ .describe("Skip re-extraction if only minor drift detected. No Claude API call."),
73
+ dryRun: z.boolean().optional().describe("Preview changes without writing."),
74
+ }, async ({ projectPath, tools, fast, dryRun }) => {
75
+ try {
76
+ const result = await runSync({ projectPath, tools, fast, dryRun });
77
+ const lines = [];
78
+ if (result.dryRun)
79
+ lines.push("DRY RUN — no files written\n");
80
+ if (result.skippedExtraction)
81
+ lines.push("⚡ Fast mode: skipped re-extraction\n");
82
+ for (const f of result.filesUpdated) {
83
+ lines.push(result.dryRun ? `→ Would write: ${f.path}` : `✓ ${f.tool} → ${f.path}`);
84
+ }
85
+ if (result.customSectionsPreserved > 0) {
86
+ lines.push(`\n ${result.customSectionsPreserved} custom section(s) preserved`);
87
+ }
88
+ if (result.warnings.length > 0) {
89
+ lines.push("\nWarnings:");
90
+ for (const w of result.warnings)
91
+ lines.push(` ⚠ ${w}`);
92
+ }
93
+ return { content: [{ type: "text", text: lines.join("\n") }] };
94
+ }
95
+ catch (e) {
96
+ return { content: [{ type: "text", text: `Error: ${toMcpError(e)}` }], isError: true };
97
+ }
98
+ });
99
+ // ─── agents_sync_drift ───────────────────────────────────────────────────────
100
+ server.tool("agents_sync_drift", "Check what has changed in the codebase since the last sync. Read-only — makes no changes.", {
101
+ projectPath: z.string().describe("Absolute path to the project root directory"),
102
+ }, async ({ projectPath }) => {
103
+ try {
104
+ const result = await runDrift({ projectPath });
105
+ if (!result.hasSnapshot) {
106
+ return {
107
+ content: [{
108
+ type: "text",
109
+ text: "No snapshot found. Run /agents-sync init first to start tracking drift.",
110
+ }],
111
+ };
112
+ }
113
+ return { content: [{ type: "text", text: result.report ?? "No report available." }] };
114
+ }
115
+ catch (e) {
116
+ return { content: [{ type: "text", text: `Error: ${toMcpError(e)}` }], isError: true };
117
+ }
118
+ });
119
+ // ─── agents_sync_export ──────────────────────────────────────────────────────
120
+ server.tool("agents_sync_export", "Regenerate a single tool file from the existing AGENTS.md without re-running analysis.", {
121
+ projectPath: z.string().describe("Absolute path to the project root directory"),
122
+ tool: z
123
+ .enum(["claude", "cursor", "copilot", "gemini", "windsurf", "cline"])
124
+ .describe("Which tool file to regenerate"),
125
+ }, async ({ projectPath, tool }) => {
126
+ try {
127
+ const result = await runExport({ projectPath, tool });
128
+ if (result.error) {
129
+ return { content: [{ type: "text", text: `Error: ${result.error}` }], isError: true };
130
+ }
131
+ return {
132
+ content: [{
133
+ type: "text",
134
+ text: `✓ ${result.tool} → ${result.path}`,
135
+ }],
136
+ };
137
+ }
138
+ catch (e) {
139
+ return { content: [{ type: "text", text: `Error: ${toMcpError(e)}` }], isError: true };
140
+ }
141
+ });
142
+ // ─── agents_sync_validate ────────────────────────────────────────────────────
143
+ server.tool("agents_sync_validate", "Check whether all tool files are in sync with the canonical AGENTS.md.", {
144
+ projectPath: z.string().describe("Absolute path to the project root directory"),
145
+ }, async ({ projectPath }) => {
146
+ try {
147
+ const result = await runValidate({ projectPath });
148
+ const lines = [];
149
+ const canonicalStatus = result.canonical.exists ? "✓" : "✗ MISSING";
150
+ lines.push(`AGENTS.md (canonical) ${canonicalStatus}`);
151
+ lines.push("");
152
+ for (const f of result.toolFiles) {
153
+ const icon = f.status === "in-sync" ? "✓" : f.status === "missing" ? "✗" : "⚠";
154
+ const label = f.status === "in-sync" ? "in sync" : f.status === "missing" ? "MISSING" : "DRIFTED";
155
+ lines.push(`${icon} ${f.tool.padEnd(10)} ${label} ${f.path}`);
156
+ if (f.details)
157
+ lines.push(` ${f.details}`);
158
+ }
159
+ lines.push("");
160
+ if (result.allInSync) {
161
+ lines.push("✓ All files are in sync.");
162
+ }
163
+ else {
164
+ lines.push("Some files are out of sync. Run /agents-sync sync to fix.");
165
+ }
166
+ if (!result.hasSnapshot) {
167
+ lines.push("\nNote: No snapshot found — run /agents-sync init for full tracking.");
168
+ }
169
+ return { content: [{ type: "text", text: lines.join("\n") }] };
170
+ }
171
+ catch (e) {
172
+ return { content: [{ type: "text", text: `Error: ${toMcpError(e)}` }], isError: true };
173
+ }
174
+ });
175
+ // ─── agents_sync_status ──────────────────────────────────────────────────────
176
+ server.tool("agents_sync_status", "Show sync status: last sync time, managed files, drift score.", {
177
+ projectPath: z.string().describe("Absolute path to the project root directory"),
178
+ }, async ({ projectPath }) => {
179
+ try {
180
+ const result = await runStatus({ projectPath });
181
+ const lines = ["agents-sync status\n"];
182
+ if (!result.hasSnapshot) {
183
+ lines.push("Not initialized.");
184
+ lines.push(`\n→ ${result.recommendation}`);
185
+ }
186
+ else {
187
+ lines.push(`Last synced: ${result.lastSyncedAt ?? "unknown"} (${result.daysSinceSync} day${result.daysSinceSync === 1 ? "" : "s"} ago)`);
188
+ lines.push(`Language: ${result.language ?? "unknown"}${result.framework ? ` / ${result.framework}` : ""}`);
189
+ lines.push(`Drift score: ${result.driftScore}`);
190
+ lines.push(`\nManaged files (${result.filesManaged.length}):`);
191
+ for (const f of result.filesManaged) {
192
+ lines.push(` ${f.tool.padEnd(12)} ${f.path}`);
193
+ }
194
+ lines.push(`\n→ ${result.recommendation}`);
195
+ }
196
+ return { content: [{ type: "text", text: lines.join("\n") }] };
197
+ }
198
+ catch (e) {
199
+ return { content: [{ type: "text", text: `Error: ${toMcpError(e)}` }], isError: true };
200
+ }
201
+ });
202
+ // ─── Start ───────────────────────────────────────────────────────────────────
203
+ async function main() {
204
+ const transport = new StdioServerTransport();
205
+ await server.connect(transport);
206
+ process.stderr.write(`agents-sync MCP server v${VERSION} ready\n`);
207
+ }
208
+ main().catch((e) => {
209
+ process.stderr.write(`Fatal: ${e}\n`);
210
+ process.exit(1);
211
+ });
212
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { Snapshot } from "./schema.js";
2
+ import type { RawCorpus } from "../scanner/index.js";
3
+ export type DriftSeverity = "HIGH" | "MEDIUM" | "LOW";
4
+ export interface DriftSignal {
5
+ severity: DriftSeverity;
6
+ message: string;
7
+ detail?: string;
8
+ }
9
+ export interface DriftReport {
10
+ hasSnapshot: true;
11
+ signals: DriftSignal[];
12
+ daysSinceSync: number;
13
+ recommendation: string;
14
+ maxSeverity: DriftSeverity | "NONE";
15
+ }
16
+ export interface NoDrift {
17
+ hasSnapshot: false;
18
+ }
19
+ export type DriftResult = DriftReport | NoDrift;
20
+ export declare function detectDrift(snapshot: Snapshot, corpus: RawCorpus): DriftReport;
21
+ export declare function formatDriftReport(report: DriftReport): string;
22
+ //# sourceMappingURL=drift.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drift.d.ts","sourceRoot":"","sources":["../../src/snapshot/drift.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGrD,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEtD,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,aAAa,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,IAAI,CAAC;IAClB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,aAAa,GAAG,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,OAAO;IACtB,WAAW,EAAE,KAAK,CAAC;CACpB;AAED,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,OAAO,CAAC;AAEhD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,GAAG,WAAW,CAiF9E;AASD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CA6B7D"}
@@ -0,0 +1,105 @@
1
+ import { sha256 } from "./writer.js";
2
+ export function detectDrift(snapshot, corpus) {
3
+ const signals = [];
4
+ // Manifest hash change
5
+ const manifestContent = corpus.manifest.dependencies.join("\n") +
6
+ corpus.manifest.devDependencies.join("\n");
7
+ const currentManifestHash = sha256(manifestContent);
8
+ if (currentManifestHash !== snapshot.manifestHash) {
9
+ const prevCount = snapshot.meta.dependencyCount;
10
+ const currCount = corpus.manifest.dependencies.length;
11
+ const diff = currCount - prevCount;
12
+ if (Math.abs(diff) >= 3) {
13
+ signals.push({
14
+ severity: "HIGH",
15
+ message: `Dependency count changed significantly (${prevCount} → ${currCount})`,
16
+ detail: diff > 0
17
+ ? `${diff} new dependencies added`
18
+ : `${Math.abs(diff)} dependencies removed`,
19
+ });
20
+ }
21
+ else if (currentManifestHash !== snapshot.manifestHash) {
22
+ signals.push({
23
+ severity: "MEDIUM",
24
+ message: "Manifest changed (dependencies or scripts updated)",
25
+ });
26
+ }
27
+ }
28
+ // New top-level dirs
29
+ const prevDirs = new Set(snapshot.meta.topLevelDirs);
30
+ const newDirs = corpus.structure.topLevelDirs.filter((d) => !prevDirs.has(d));
31
+ for (const dir of newDirs) {
32
+ signals.push({
33
+ severity: "HIGH",
34
+ message: `New top-level directory: ${dir}`,
35
+ });
36
+ }
37
+ // Significant file count change
38
+ const fileDiff = corpus.structure.totalFileCount - snapshot.meta.totalFiles;
39
+ if (fileDiff > 50) {
40
+ signals.push({
41
+ severity: "MEDIUM",
42
+ message: `${fileDiff} new files added since last sync`,
43
+ });
44
+ }
45
+ // New gotchas found
46
+ if (corpus.gotchas.length > 3) {
47
+ signals.push({
48
+ severity: "LOW",
49
+ message: `${corpus.gotchas.length} FIXME/HACK/WARNING comments found in codebase`,
50
+ detail: "Some may be new gotchas worth capturing",
51
+ });
52
+ }
53
+ const daysSinceSync = Math.floor((Date.now() - new Date(snapshot.syncedAt).getTime()) / (1000 * 60 * 60 * 24));
54
+ if (daysSinceSync > 14) {
55
+ signals.push({
56
+ severity: "LOW",
57
+ message: `Last synced ${daysSinceSync} days ago`,
58
+ detail: "Regular re-sync keeps AI tools accurate",
59
+ });
60
+ }
61
+ const maxSeverity = computeMaxSeverity(signals);
62
+ const recommendation = maxSeverity === "HIGH"
63
+ ? "Re-sync strongly recommended. Run: /agents-sync sync"
64
+ : maxSeverity === "MEDIUM"
65
+ ? "Re-sync recommended. Run: /agents-sync sync"
66
+ : maxSeverity === "LOW"
67
+ ? "Minor drift detected. Re-sync when convenient."
68
+ : `Up to date. Last synced ${daysSinceSync} day${daysSinceSync === 1 ? "" : "s"} ago.`;
69
+ return { hasSnapshot: true, signals, daysSinceSync, recommendation, maxSeverity };
70
+ }
71
+ function computeMaxSeverity(signals) {
72
+ if (signals.some((s) => s.severity === "HIGH"))
73
+ return "HIGH";
74
+ if (signals.some((s) => s.severity === "MEDIUM"))
75
+ return "MEDIUM";
76
+ if (signals.some((s) => s.severity === "LOW"))
77
+ return "LOW";
78
+ return "NONE";
79
+ }
80
+ export function formatDriftReport(report) {
81
+ const NO_COLOR = process.env.NO_COLOR === "1";
82
+ const color = (code, text) => NO_COLOR ? text : `\x1b[${code}m${text}\x1b[0m`;
83
+ const lines = [];
84
+ lines.push(color("1", `agents-sync drift report (${new Date().toISOString().slice(0, 10)})`));
85
+ lines.push(color("2", `Last sync: ${report.daysSinceSync} day${report.daysSinceSync === 1 ? "" : "s"} ago\n`));
86
+ if (report.signals.length === 0) {
87
+ lines.push(color("32", "✓ No drift detected — everything is in sync."));
88
+ }
89
+ else {
90
+ for (const s of report.signals) {
91
+ const badge = s.severity === "HIGH"
92
+ ? color("31;1", "HIGH ")
93
+ : s.severity === "MEDIUM"
94
+ ? color("33;1", "MED ")
95
+ : color("34;1", "LOW ");
96
+ lines.push(`${badge} ${s.message}`);
97
+ if (s.detail)
98
+ lines.push(` ${color("2", s.detail)}`);
99
+ }
100
+ }
101
+ lines.push("");
102
+ lines.push(color("1", report.recommendation));
103
+ return lines.join("\n");
104
+ }
105
+ //# sourceMappingURL=drift.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drift.js","sourceRoot":"","sources":["../../src/snapshot/drift.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ import { z } from "zod";
2
+ export declare const ManagedFileSchema: z.ZodObject<{
3
+ path: z.ZodString;
4
+ sha256: z.ZodString;
5
+ tool: z.ZodEnum<["agents-md", "claude", "cursor", "copilot", "gemini", "windsurf", "cline"]>;
6
+ }, "strip", z.ZodTypeAny, {
7
+ path: string;
8
+ sha256: string;
9
+ tool: "claude" | "cursor" | "copilot" | "gemini" | "windsurf" | "cline" | "agents-md";
10
+ }, {
11
+ path: string;
12
+ sha256: string;
13
+ tool: "claude" | "cursor" | "copilot" | "gemini" | "windsurf" | "cline" | "agents-md";
14
+ }>;
15
+ export declare const SnapshotSchema: z.ZodObject<{
16
+ version: z.ZodLiteral<"1.0">;
17
+ syncedAt: z.ZodString;
18
+ projectPath: z.ZodString;
19
+ codebaseHash: z.ZodString;
20
+ manifestHash: z.ZodString;
21
+ filesManaged: z.ZodArray<z.ZodObject<{
22
+ path: z.ZodString;
23
+ sha256: z.ZodString;
24
+ tool: z.ZodEnum<["agents-md", "claude", "cursor", "copilot", "gemini", "windsurf", "cline"]>;
25
+ }, "strip", z.ZodTypeAny, {
26
+ path: string;
27
+ sha256: string;
28
+ tool: "claude" | "cursor" | "copilot" | "gemini" | "windsurf" | "cline" | "agents-md";
29
+ }, {
30
+ path: string;
31
+ sha256: string;
32
+ tool: "claude" | "cursor" | "copilot" | "gemini" | "windsurf" | "cline" | "agents-md";
33
+ }>, "many">;
34
+ meta: z.ZodObject<{
35
+ dependencyCount: z.ZodNumber;
36
+ topLevelDirs: z.ZodArray<z.ZodString, "many">;
37
+ language: z.ZodString;
38
+ framework: z.ZodNullable<z.ZodString>;
39
+ totalFiles: z.ZodNumber;
40
+ }, "strip", z.ZodTypeAny, {
41
+ language: string;
42
+ framework: string | null;
43
+ topLevelDirs: string[];
44
+ dependencyCount: number;
45
+ totalFiles: number;
46
+ }, {
47
+ language: string;
48
+ framework: string | null;
49
+ topLevelDirs: string[];
50
+ dependencyCount: number;
51
+ totalFiles: number;
52
+ }>;
53
+ }, "strip", z.ZodTypeAny, {
54
+ version: "1.0";
55
+ projectPath: string;
56
+ syncedAt: string;
57
+ codebaseHash: string;
58
+ manifestHash: string;
59
+ filesManaged: {
60
+ path: string;
61
+ sha256: string;
62
+ tool: "claude" | "cursor" | "copilot" | "gemini" | "windsurf" | "cline" | "agents-md";
63
+ }[];
64
+ meta: {
65
+ language: string;
66
+ framework: string | null;
67
+ topLevelDirs: string[];
68
+ dependencyCount: number;
69
+ totalFiles: number;
70
+ };
71
+ }, {
72
+ version: "1.0";
73
+ projectPath: string;
74
+ syncedAt: string;
75
+ codebaseHash: string;
76
+ manifestHash: string;
77
+ filesManaged: {
78
+ path: string;
79
+ sha256: string;
80
+ tool: "claude" | "cursor" | "copilot" | "gemini" | "windsurf" | "cline" | "agents-md";
81
+ }[];
82
+ meta: {
83
+ language: string;
84
+ framework: string | null;
85
+ topLevelDirs: string[];
86
+ dependencyCount: number;
87
+ totalFiles: number;
88
+ };
89
+ }>;
90
+ export type Snapshot = z.infer<typeof SnapshotSchema>;
91
+ export type ManagedFile = z.infer<typeof ManagedFileSchema>;
92
+ export declare const SNAPSHOT_DIR = ".agents-sync";
93
+ export declare const SNAPSHOT_FILE = "snapshot.json";
94
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/snapshot/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,iBAAiB;;;;;;;;;;;;EAI5B,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAczB,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AACtD,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,eAAO,MAAM,YAAY,iBAAiB,CAAC;AAC3C,eAAO,MAAM,aAAa,kBAAkB,CAAC"}