@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.
- package/LICENSE +21 -0
- package/README.md +366 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +237 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/loader.d.ts +9 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +55 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +69 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +33 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/derivers/aider.d.ts +19 -0
- package/dist/derivers/aider.d.ts.map +1 -0
- package/dist/derivers/aider.js +117 -0
- package/dist/derivers/aider.js.map +1 -0
- package/dist/derivers/claude.d.ts +19 -0
- package/dist/derivers/claude.d.ts.map +1 -0
- package/dist/derivers/claude.js +41 -0
- package/dist/derivers/claude.js.map +1 -0
- package/dist/derivers/cline.d.ts +17 -0
- package/dist/derivers/cline.d.ts.map +1 -0
- package/dist/derivers/cline.js +92 -0
- package/dist/derivers/cline.js.map +1 -0
- package/dist/derivers/copilot.d.ts +16 -0
- package/dist/derivers/copilot.d.ts.map +1 -0
- package/dist/derivers/copilot.js +162 -0
- package/dist/derivers/copilot.js.map +1 -0
- package/dist/derivers/cursor.d.ts +16 -0
- package/dist/derivers/cursor.d.ts.map +1 -0
- package/dist/derivers/cursor.js +121 -0
- package/dist/derivers/cursor.js.map +1 -0
- package/dist/derivers/gemini.d.ts +19 -0
- package/dist/derivers/gemini.d.ts.map +1 -0
- package/dist/derivers/gemini.js +33 -0
- package/dist/derivers/gemini.js.map +1 -0
- package/dist/derivers/index.d.ts +33 -0
- package/dist/derivers/index.d.ts.map +1 -0
- package/dist/derivers/index.js +124 -0
- package/dist/derivers/index.js.map +1 -0
- package/dist/derivers/merger.d.ts +36 -0
- package/dist/derivers/merger.d.ts.map +1 -0
- package/dist/derivers/merger.js +83 -0
- package/dist/derivers/merger.js.map +1 -0
- package/dist/derivers/roo.d.ts +18 -0
- package/dist/derivers/roo.d.ts.map +1 -0
- package/dist/derivers/roo.js +92 -0
- package/dist/derivers/roo.js.map +1 -0
- package/dist/derivers/windsurf.d.ts +16 -0
- package/dist/derivers/windsurf.d.ts.map +1 -0
- package/dist/derivers/windsurf.js +91 -0
- package/dist/derivers/windsurf.js.map +1 -0
- package/dist/extractor/extractor.d.ts +4 -0
- package/dist/extractor/extractor.d.ts.map +1 -0
- package/dist/extractor/extractor.js +117 -0
- package/dist/extractor/extractor.js.map +1 -0
- package/dist/extractor/schema.d.ts +187 -0
- package/dist/extractor/schema.d.ts.map +1 -0
- package/dist/extractor/schema.js +44 -0
- package/dist/extractor/schema.js.map +1 -0
- package/dist/generator/agents-md.d.ts +3 -0
- package/dist/generator/agents-md.d.ts.map +1 -0
- package/dist/generator/agents-md.js +127 -0
- package/dist/generator/agents-md.js.map +1 -0
- package/dist/generator/validator.d.ts +7 -0
- package/dist/generator/validator.d.ts.map +1 -0
- package/dist/generator/validator.js +67 -0
- package/dist/generator/validator.js.map +1 -0
- package/dist/lib/claude-client.d.ts +11 -0
- package/dist/lib/claude-client.d.ts.map +1 -0
- package/dist/lib/claude-client.js +74 -0
- package/dist/lib/claude-client.js.map +1 -0
- package/dist/lib/errors.d.ts +10 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +27 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/file-utils.d.ts +7 -0
- package/dist/lib/file-utils.d.ts.map +1 -0
- package/dist/lib/file-utils.js +56 -0
- package/dist/lib/file-utils.js.map +1 -0
- package/dist/lib/token-estimate.d.ts +7 -0
- package/dist/lib/token-estimate.d.ts.map +1 -0
- package/dist/lib/token-estimate.js +15 -0
- package/dist/lib/token-estimate.js.map +1 -0
- package/dist/scanner/codegraph.d.ts +13 -0
- package/dist/scanner/codegraph.d.ts.map +1 -0
- package/dist/scanner/codegraph.js +65 -0
- package/dist/scanner/codegraph.js.map +1 -0
- package/dist/scanner/docs.d.ts +13 -0
- package/dist/scanner/docs.d.ts.map +1 -0
- package/dist/scanner/docs.js +63 -0
- package/dist/scanner/docs.js.map +1 -0
- package/dist/scanner/gotchas.d.ts +8 -0
- package/dist/scanner/gotchas.d.ts.map +1 -0
- package/dist/scanner/gotchas.js +107 -0
- package/dist/scanner/gotchas.js.map +1 -0
- package/dist/scanner/index.d.ts +21 -0
- package/dist/scanner/index.d.ts.map +1 -0
- package/dist/scanner/index.js +87 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/scanner/manifest.d.ts +13 -0
- package/dist/scanner/manifest.d.ts.map +1 -0
- package/dist/scanner/manifest.js +285 -0
- package/dist/scanner/manifest.js.map +1 -0
- package/dist/scanner/mcp.d.ts +12 -0
- package/dist/scanner/mcp.d.ts.map +1 -0
- package/dist/scanner/mcp.js +96 -0
- package/dist/scanner/mcp.js.map +1 -0
- package/dist/scanner/repomix.d.ts +11 -0
- package/dist/scanner/repomix.d.ts.map +1 -0
- package/dist/scanner/repomix.js +87 -0
- package/dist/scanner/repomix.js.map +1 -0
- package/dist/scanner/skills.d.ts +18 -0
- package/dist/scanner/skills.d.ts.map +1 -0
- package/dist/scanner/skills.js +100 -0
- package/dist/scanner/skills.js.map +1 -0
- package/dist/scanner/source.d.ts +13 -0
- package/dist/scanner/source.d.ts.map +1 -0
- package/dist/scanner/source.js +157 -0
- package/dist/scanner/source.js.map +1 -0
- package/dist/scanner/structure.d.ts +10 -0
- package/dist/scanner/structure.d.ts.map +1 -0
- package/dist/scanner/structure.js +168 -0
- package/dist/scanner/structure.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +212 -0
- package/dist/server.js.map +1 -0
- package/dist/snapshot/drift.d.ts +22 -0
- package/dist/snapshot/drift.d.ts.map +1 -0
- package/dist/snapshot/drift.js +105 -0
- package/dist/snapshot/drift.js.map +1 -0
- package/dist/snapshot/schema.d.ts +94 -0
- package/dist/snapshot/schema.d.ts.map +1 -0
- package/dist/snapshot/schema.js +24 -0
- package/dist/snapshot/schema.js.map +1 -0
- package/dist/snapshot/writer.d.ts +17 -0
- package/dist/snapshot/writer.d.ts.map +1 -0
- package/dist/snapshot/writer.js +44 -0
- package/dist/snapshot/writer.js.map +1 -0
- package/dist/tools/drift.d.ts +15 -0
- package/dist/tools/drift.d.ts.map +1 -0
- package/dist/tools/drift.js +31 -0
- package/dist/tools/drift.js.map +1 -0
- package/dist/tools/export.d.ts +14 -0
- package/dist/tools/export.d.ts.map +1 -0
- package/dist/tools/export.js +53 -0
- package/dist/tools/export.js.map +1 -0
- package/dist/tools/init.d.ts +28 -0
- package/dist/tools/init.d.ts.map +1 -0
- package/dist/tools/init.js +103 -0
- package/dist/tools/init.js.map +1 -0
- package/dist/tools/install-hook.d.ts +15 -0
- package/dist/tools/install-hook.d.ts.map +1 -0
- package/dist/tools/install-hook.js +169 -0
- package/dist/tools/install-hook.js.map +1 -0
- package/dist/tools/lint.d.ts +24 -0
- package/dist/tools/lint.d.ts.map +1 -0
- package/dist/tools/lint.js +213 -0
- package/dist/tools/lint.js.map +1 -0
- package/dist/tools/scan-report.d.ts +14 -0
- package/dist/tools/scan-report.d.ts.map +1 -0
- package/dist/tools/scan-report.js +136 -0
- package/dist/tools/scan-report.js.map +1 -0
- package/dist/tools/status.d.ts +18 -0
- package/dist/tools/status.d.ts.map +1 -0
- package/dist/tools/status.js +38 -0
- package/dist/tools/status.js.map +1 -0
- package/dist/tools/sync.d.ts +22 -0
- package/dist/tools/sync.d.ts.map +1 -0
- package/dist/tools/sync.js +123 -0
- package/dist/tools/sync.js.map +1 -0
- package/dist/tools/validate.d.ts +22 -0
- package/dist/tools/validate.d.ts.map +1 -0
- package/dist/tools/validate.js +97 -0
- package/dist/tools/validate.js.map +1 -0
- package/docs/examples/.clinerules +29 -0
- package/docs/examples/.cursorrules +19 -0
- package/docs/examples/.windsurfrules +14 -0
- package/docs/examples/AGENTS.md +97 -0
- package/docs/examples/CLAUDE.md +88 -0
- package/docs/examples/GEMINI.md +61 -0
- package/docs/examples/copilot-instructions.md +24 -0
- package/docs/github-action.yml +89 -0
- package/package.json +63 -0
- package/scripts/demo.sh +138 -0
- 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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"}
|
package/dist/server.d.ts
ADDED
|
@@ -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"}
|