@googlarz/agents-sync 1.4.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 (186) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +507 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +267 -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 +93 -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 +134 -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 +125 -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 +6 -0
  64. package/dist/generator/agents-md.d.ts.map +1 -0
  65. package/dist/generator/agents-md.js +135 -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 +26 -0
  100. package/dist/scanner/index.d.ts.map +1 -0
  101. package/dist/scanner/index.js +95 -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 +245 -0
  130. package/dist/server.js.map +1 -0
  131. package/dist/snapshot/drift.d.ts +28 -0
  132. package/dist/snapshot/drift.d.ts.map +1 -0
  133. package/dist/snapshot/drift.js +205 -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 +51 -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/lint.d.ts +24 -0
  156. package/dist/tools/lint.d.ts.map +1 -0
  157. package/dist/tools/lint.js +213 -0
  158. package/dist/tools/lint.js.map +1 -0
  159. package/dist/tools/scan-report.d.ts +14 -0
  160. package/dist/tools/scan-report.d.ts.map +1 -0
  161. package/dist/tools/scan-report.js +136 -0
  162. package/dist/tools/scan-report.js.map +1 -0
  163. package/dist/tools/status.d.ts +18 -0
  164. package/dist/tools/status.d.ts.map +1 -0
  165. package/dist/tools/status.js +38 -0
  166. package/dist/tools/status.js.map +1 -0
  167. package/dist/tools/sync.d.ts +22 -0
  168. package/dist/tools/sync.d.ts.map +1 -0
  169. package/dist/tools/sync.js +123 -0
  170. package/dist/tools/sync.js.map +1 -0
  171. package/dist/tools/validate.d.ts +22 -0
  172. package/dist/tools/validate.d.ts.map +1 -0
  173. package/dist/tools/validate.js +97 -0
  174. package/dist/tools/validate.js.map +1 -0
  175. package/docs/agents-md-spec.md +233 -0
  176. package/docs/examples/.clinerules +29 -0
  177. package/docs/examples/.cursorrules +19 -0
  178. package/docs/examples/.windsurfrules +14 -0
  179. package/docs/examples/AGENTS.md +97 -0
  180. package/docs/examples/CLAUDE.md +88 -0
  181. package/docs/examples/GEMINI.md +61 -0
  182. package/docs/examples/copilot-instructions.md +24 -0
  183. package/docs/github-action.yml +89 -0
  184. package/package.json +63 -0
  185. package/scripts/demo.sh +138 -0
  186. package/skill/SKILL.md +158 -0
package/dist/cli.js ADDED
@@ -0,0 +1,267 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * agents-sync CLI
4
+ *
5
+ * Usage:
6
+ * npx @googlarz/agents-sync Start MCP server (default)
7
+ * npx @googlarz/agents-sync init [path] Generate all context files
8
+ * npx @googlarz/agents-sync sync [path] Re-sync after codebase changes
9
+ * npx @googlarz/agents-sync drift [path] Check what changed
10
+ * npx @googlarz/agents-sync validate [path] Check files are in sync
11
+ * npx @googlarz/agents-sync status [path] Show sync status
12
+ * npx @googlarz/agents-sync export <tool> [path] Re-derive a single file
13
+ */
14
+ import { fileURLToPath } from "node:url";
15
+ import path from "node:path";
16
+ import fs from "node:fs";
17
+ import process from "node:process";
18
+ import { isAgentsSyncError } from "./lib/errors.js";
19
+ const args = process.argv.slice(2);
20
+ const cwd = process.cwd();
21
+ // ---------------------------------------------------------------------------
22
+ // Flags
23
+ // ---------------------------------------------------------------------------
24
+ function hasFlag(...flags) {
25
+ return flags.some((f) => args.includes(f));
26
+ }
27
+ function removeFlags(argv) {
28
+ return argv.filter((a) => !a.startsWith("--") && !a.startsWith("-"));
29
+ }
30
+ // ---------------------------------------------------------------------------
31
+ // --version / --help
32
+ // ---------------------------------------------------------------------------
33
+ if (hasFlag("--version", "-v")) {
34
+ const pkgPath = path.join(path.dirname(fileURLToPath(import.meta.url)), "..", "package.json");
35
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
36
+ process.stdout.write(`@googlarz/agents-sync v${pkg.version}\n`);
37
+ process.exit(0);
38
+ }
39
+ if (hasFlag("--help", "-h")) {
40
+ process.stdout.write(`
41
+ agents-sync — AI context file generator and syncer
42
+
43
+ USAGE
44
+ agents-sync [command] [path] [options]
45
+
46
+ COMMANDS
47
+ init [path] Analyze codebase, generate all context files
48
+ sync [path] Re-sync after codebase changes
49
+ drift [path] Check what changed since last sync
50
+ validate [path] Check if all files match AGENTS.md
51
+ scan [path] Show what agents-sync detected (no API key needed)
52
+ lint [path] Verify codebase against 'Never' rules in AGENTS.md
53
+ status [path] Show sync status and managed files
54
+ export <tool> [path] Re-derive a single tool file (no API call)
55
+ Tools: claude, cursor, copilot, gemini, windsurf, cline, roo, aider
56
+
57
+ (no command) Start MCP server (stdio transport)
58
+
59
+ OPTIONS
60
+ --dry-run Preview changes without writing files
61
+ --fast sync only — skip API call if drift is minor
62
+ --ci drift/lint — exit 1 when drift is HIGH or lint has violations
63
+ --tools <list> Comma-separated tools to generate (init/sync)
64
+ e.g. --tools claude,cursor,roo,aider
65
+ --repomix-output <file> Use repomix XML/text output as source corpus
66
+ (init/sync) instead of filesystem sampling
67
+ --version, -v Print version
68
+ --help, -h Show this help
69
+
70
+ EXAMPLES
71
+ npx @googlarz/agents-sync scan .
72
+ npx @googlarz/agents-sync init .
73
+ npx @googlarz/agents-sync sync . --fast
74
+ npx @googlarz/agents-sync drift . --ci
75
+ npx @googlarz/agents-sync export cursor .
76
+
77
+ SETUP (MCP — Claude Code)
78
+ Add to ~/.claude/claude_desktop_config.json or .claude/settings.json:
79
+
80
+ {
81
+ "mcpServers": {
82
+ "agents-sync": {
83
+ "command": "npx",
84
+ "args": ["@googlarz/agents-sync"],
85
+ "env": { "ANTHROPIC_API_KEY": "sk-ant-..." }
86
+ }
87
+ }
88
+ }
89
+
90
+ ENVIRONMENT
91
+ ANTHROPIC_API_KEY Required for init and sync
92
+ AGENTS_SYNC_DEBUG=1 Verbose debug output to stderr
93
+ NO_COLOR=1 Disable ANSI color
94
+
95
+ `);
96
+ process.exit(0);
97
+ }
98
+ // ---------------------------------------------------------------------------
99
+ // CLI subcommand dispatch
100
+ // ---------------------------------------------------------------------------
101
+ const positional = removeFlags(args);
102
+ const subcommand = positional[0];
103
+ const dryRun = hasFlag("--dry-run");
104
+ const fast = hasFlag("--fast");
105
+ const ci = hasFlag("--ci");
106
+ function resolvePath(pos) {
107
+ return pos ? path.resolve(pos) : cwd;
108
+ }
109
+ function getTools() {
110
+ const idx = args.indexOf("--tools");
111
+ if (idx === -1)
112
+ return undefined;
113
+ const val = args[idx + 1];
114
+ return val ? val.split(",").map((t) => t.trim()) : undefined;
115
+ }
116
+ function getFlag(name) {
117
+ const idx = args.indexOf(name);
118
+ if (idx === -1)
119
+ return undefined;
120
+ return args[idx + 1];
121
+ }
122
+ function die(msg) {
123
+ process.stderr.write(`agents-sync error: ${msg}\n`);
124
+ process.exit(1);
125
+ }
126
+ function printResult(data) {
127
+ process.stdout.write(JSON.stringify(data, null, 2) + "\n");
128
+ }
129
+ async function runCli() {
130
+ switch (subcommand) {
131
+ case "init": {
132
+ const { runInit } = await import("./tools/init.js");
133
+ const projectPath = resolvePath(positional[1]);
134
+ const tools = getTools();
135
+ const repomixOutput = getFlag("--repomix-output");
136
+ const result = await runInit({ projectPath, tools, dryRun, repomixOutput });
137
+ if (result.dryRun) {
138
+ process.stdout.write(`Dry run — no files written.\n`);
139
+ process.stdout.write(`Would generate:\n`);
140
+ process.stdout.write(` AGENTS.md\n`);
141
+ }
142
+ else {
143
+ process.stdout.write(`✓ AGENTS.md → ${result.agentsMdPath}\n`);
144
+ for (const f of result.filesWritten) {
145
+ process.stdout.write(`✓ ${f.tool} → ${f.path}\n`);
146
+ }
147
+ if (result.preservedExistingFiles.length > 0) {
148
+ process.stdout.write(`\n⚠ Preserved pre-existing files as custom sections:\n`);
149
+ for (const f of result.preservedExistingFiles) {
150
+ process.stdout.write(` ${f}\n`);
151
+ }
152
+ }
153
+ }
154
+ for (const w of result.warnings) {
155
+ process.stdout.write(` → ${w}\n`);
156
+ }
157
+ break;
158
+ }
159
+ case "sync": {
160
+ const { runSync } = await import("./tools/sync.js");
161
+ const projectPath = resolvePath(positional[1]);
162
+ const tools = getTools();
163
+ const repomixOutput = getFlag("--repomix-output");
164
+ const result = await runSync({ projectPath, tools, fast, dryRun, repomixOutput });
165
+ for (const f of result.filesUpdated) {
166
+ process.stdout.write(`✓ ${f.tool} → ${f.path}\n`);
167
+ }
168
+ for (const w of result.warnings) {
169
+ process.stdout.write(` → ${w}\n`);
170
+ }
171
+ break;
172
+ }
173
+ case "drift": {
174
+ const { runDrift } = await import("./tools/drift.js");
175
+ const projectPath = resolvePath(positional[1]);
176
+ const result = await runDrift({ projectPath });
177
+ process.stdout.write(result.report + "\n");
178
+ if (ci && result.highDrift) {
179
+ process.exit(1);
180
+ }
181
+ break;
182
+ }
183
+ case "validate": {
184
+ const { runValidate } = await import("./tools/validate.js");
185
+ const projectPath = resolvePath(positional[1]);
186
+ const result = await runValidate({ projectPath });
187
+ process.stdout.write(result.report + "\n");
188
+ if (!result.allInSync)
189
+ process.exit(1);
190
+ break;
191
+ }
192
+ case "status": {
193
+ const { runStatus } = await import("./tools/status.js");
194
+ const projectPath = resolvePath(positional[1]);
195
+ const result = await runStatus({ projectPath });
196
+ printResult(result);
197
+ break;
198
+ }
199
+ case "lint": {
200
+ const { runLint } = await import("./tools/lint.js");
201
+ const projectPath = resolvePath(positional[1]);
202
+ const result = await runLint({ projectPath, strict: ci });
203
+ process.stdout.write(result.report + "\n");
204
+ if (!result.passed)
205
+ process.exit(1);
206
+ break;
207
+ }
208
+ case "scan": {
209
+ const { runScanReport } = await import("./tools/scan-report.js");
210
+ const projectPath = resolvePath(positional[1]);
211
+ const result = await runScanReport({ projectPath });
212
+ process.stdout.write(result.report + "\n");
213
+ break;
214
+ }
215
+ case "export": {
216
+ const { runExport } = await import("./tools/export.js");
217
+ const tool = positional[1];
218
+ const projectPath = resolvePath(positional[2]);
219
+ if (!tool)
220
+ die("export requires a tool name: claude, cursor, copilot, gemini, windsurf, cline, roo, aider");
221
+ const result = await runExport({ projectPath, tool: tool });
222
+ process.stdout.write(result.report + "\n");
223
+ break;
224
+ }
225
+ case undefined:
226
+ case "--mcp": {
227
+ // Default: start MCP server
228
+ await import("./server.js");
229
+ break;
230
+ }
231
+ default:
232
+ die(`unknown command: ${subcommand}. Run --help for usage.`);
233
+ }
234
+ }
235
+ runCli().catch(async (err) => {
236
+ if (isAgentsSyncError(err) && err.code === "MISSING_API_KEY") {
237
+ // Show scan output first so the user knows what we found, then explain setup
238
+ try {
239
+ const { runScanReport } = await import("./tools/scan-report.js");
240
+ const projectPath = subcommand === "init" || subcommand === "sync"
241
+ ? resolvePath(positional[1])
242
+ : cwd;
243
+ const result = await runScanReport({ projectPath });
244
+ process.stdout.write(result.report + "\n");
245
+ }
246
+ catch {
247
+ // scan failed — skip it and show the plain error message
248
+ }
249
+ process.stderr.write([
250
+ " agents-sync: ANTHROPIC_API_KEY not set",
251
+ "",
252
+ " The init and sync commands call Claude to analyze your codebase.",
253
+ " These commands do NOT need an API key:",
254
+ " agents-sync scan agents-sync drift",
255
+ " agents-sync validate agents-sync status agents-sync export",
256
+ "",
257
+ " Get a key at: https://console.anthropic.com/",
258
+ " Then set it: export ANTHROPIC_API_KEY=sk-ant-...",
259
+ "",
260
+ ].join("\n"));
261
+ process.exit(1);
262
+ }
263
+ const msg = isAgentsSyncError(err) ? err.format() : err instanceof Error ? err.message : String(err);
264
+ process.stderr.write(`agents-sync error: ${msg}\n`);
265
+ process.exit(1);
266
+ });
267
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type AgentsSyncConfig } from "./schema.js";
2
+ import type { ProjectMetadata } from "../extractor/schema.js";
3
+ export declare function loadConfig(projectPath: string): Promise<AgentsSyncConfig | null>;
4
+ /**
5
+ * Merge config-defined conventions and boundaries into extracted metadata.
6
+ * Config items are appended after Claude-extracted ones so they survive re-sync.
7
+ */
8
+ export declare function applyConfig(metadata: ProjectMetadata, config: AgentsSyncConfig | null): ProjectMetadata;
9
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAGA,OAAO,EAA0B,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAI9D,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CA0BtF;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,GAAG,eAAe,CAevG"}
@@ -0,0 +1,55 @@
1
+ import path from "node:path";
2
+ import fs from "node:fs/promises";
3
+ import { ZodError } from "zod";
4
+ import { AgentsSyncConfigSchema } from "./schema.js";
5
+ const CONFIG_FILE = "agents-sync.config.json";
6
+ export async function loadConfig(projectPath) {
7
+ const configPath = path.join(projectPath, CONFIG_FILE);
8
+ let raw;
9
+ try {
10
+ raw = await fs.readFile(configPath, "utf-8");
11
+ }
12
+ catch (e) {
13
+ if (e.code === "ENOENT")
14
+ return null;
15
+ throw e;
16
+ }
17
+ let parsed;
18
+ try {
19
+ parsed = JSON.parse(raw);
20
+ }
21
+ catch (e) {
22
+ throw new Error(`${CONFIG_FILE} is not valid JSON: ${e.message}`);
23
+ }
24
+ try {
25
+ return AgentsSyncConfigSchema.parse(parsed);
26
+ }
27
+ catch (e) {
28
+ if (e instanceof ZodError) {
29
+ const issues = e.issues.map((i) => ` ${i.path.join(".")}: ${i.message}`).join("\n");
30
+ throw new Error(`${CONFIG_FILE} has validation errors:\n${issues}`);
31
+ }
32
+ throw e;
33
+ }
34
+ }
35
+ /**
36
+ * Merge config-defined conventions and boundaries into extracted metadata.
37
+ * Config items are appended after Claude-extracted ones so they survive re-sync.
38
+ */
39
+ export function applyConfig(metadata, config) {
40
+ if (!config)
41
+ return metadata;
42
+ return {
43
+ ...metadata,
44
+ conventions: [
45
+ ...metadata.conventions,
46
+ ...(config.conventions?.inject ?? []),
47
+ ],
48
+ boundaries: {
49
+ alwaysDo: [...metadata.boundaries.alwaysDo, ...(config.boundaries?.alwaysDo ?? [])],
50
+ askFirst: [...metadata.boundaries.askFirst, ...(config.boundaries?.askFirst ?? [])],
51
+ never: [...metadata.boundaries.never, ...(config.boundaries?.never ?? [])],
52
+ },
53
+ };
54
+ }
55
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC/B,OAAO,EAAE,sBAAsB,EAAyB,MAAM,aAAa,CAAC;AAG5E,MAAM,WAAW,GAAG,yBAAyB,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,WAAmB;IAClD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACvD,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAK,CAA2B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAChE,MAAM,CAAC,CAAC;IACV,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,GAAG,WAAW,uBAAwB,CAAiB,CAAC,OAAO,EAAE,CAAC,CAAC;IACrF,CAAC;IAED,IAAI,CAAC;QACH,OAAO,sBAAsB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrF,MAAM,IAAI,KAAK,CAAC,GAAG,WAAW,4BAA4B,MAAM,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,QAAyB,EAAE,MAA+B;IACpF,IAAI,CAAC,MAAM;QAAE,OAAO,QAAQ,CAAC;IAE7B,OAAO;QACL,GAAG,QAAQ;QACX,WAAW,EAAE;YACX,GAAG,QAAQ,CAAC,WAAW;YACvB,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,IAAI,EAAE,CAAC;SACtC;QACD,UAAU,EAAE;YACV,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC;YACnF,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC;YACnF,KAAK,EAAE,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;SAC3E;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,69 @@
1
+ import { z } from "zod";
2
+ export declare const ToolNameSchema: z.ZodEnum<["claude", "cursor", "copilot", "gemini", "windsurf", "cline"]>;
3
+ export declare const AgentsSyncConfigSchema: z.ZodObject<{
4
+ /** Which tool files to generate. Overridden by --tools flag. */
5
+ tools: z.ZodOptional<z.ZodArray<z.ZodEnum<["claude", "cursor", "copilot", "gemini", "windsurf", "cline"]>, "many">>;
6
+ /** Team conventions injected into every generated file. */
7
+ conventions: z.ZodOptional<z.ZodObject<{
8
+ inject: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
9
+ }, "strip", z.ZodTypeAny, {
10
+ inject?: string[] | undefined;
11
+ }, {
12
+ inject?: string[] | undefined;
13
+ }>>;
14
+ /** Team boundaries injected into every generated file. */
15
+ boundaries: z.ZodOptional<z.ZodObject<{
16
+ alwaysDo: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
17
+ askFirst: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
18
+ never: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
19
+ }, "strip", z.ZodTypeAny, {
20
+ never?: string[] | undefined;
21
+ alwaysDo?: string[] | undefined;
22
+ askFirst?: string[] | undefined;
23
+ }, {
24
+ never?: string[] | undefined;
25
+ alwaysDo?: string[] | undefined;
26
+ askFirst?: string[] | undefined;
27
+ }>>;
28
+ /** Tune the codebase scanner. */
29
+ extraction: z.ZodOptional<z.ZodObject<{
30
+ maxSourceFiles: z.ZodOptional<z.ZodNumber>;
31
+ maxTokensPerFile: z.ZodOptional<z.ZodNumber>;
32
+ }, "strip", z.ZodTypeAny, {
33
+ maxSourceFiles?: number | undefined;
34
+ maxTokensPerFile?: number | undefined;
35
+ }, {
36
+ maxSourceFiles?: number | undefined;
37
+ maxTokensPerFile?: number | undefined;
38
+ }>>;
39
+ }, "strict", z.ZodTypeAny, {
40
+ conventions?: {
41
+ inject?: string[] | undefined;
42
+ } | undefined;
43
+ boundaries?: {
44
+ never?: string[] | undefined;
45
+ alwaysDo?: string[] | undefined;
46
+ askFirst?: string[] | undefined;
47
+ } | undefined;
48
+ tools?: ("claude" | "cursor" | "copilot" | "gemini" | "windsurf" | "cline")[] | undefined;
49
+ extraction?: {
50
+ maxSourceFiles?: number | undefined;
51
+ maxTokensPerFile?: number | undefined;
52
+ } | undefined;
53
+ }, {
54
+ conventions?: {
55
+ inject?: string[] | undefined;
56
+ } | undefined;
57
+ boundaries?: {
58
+ never?: string[] | undefined;
59
+ alwaysDo?: string[] | undefined;
60
+ askFirst?: string[] | undefined;
61
+ } | undefined;
62
+ tools?: ("claude" | "cursor" | "copilot" | "gemini" | "windsurf" | "cline")[] | undefined;
63
+ extraction?: {
64
+ maxSourceFiles?: number | undefined;
65
+ maxTokensPerFile?: number | undefined;
66
+ } | undefined;
67
+ }>;
68
+ export type AgentsSyncConfig = z.infer<typeof AgentsSyncConfigSchema>;
69
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,cAAc,2EAAyE,CAAC;AAErG,eAAO,MAAM,sBAAsB;IAE/B,gEAAgE;;IAGhE,2DAA2D;;;;;;;;IAU3D,0DAA0D;;;;;;;;;;;;;;IAS1D,iCAAiC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQ1B,CAAC;AAEZ,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { z } from "zod";
2
+ export const ToolNameSchema = z.enum(["claude", "cursor", "copilot", "gemini", "windsurf", "cline"]);
3
+ export const AgentsSyncConfigSchema = z
4
+ .object({
5
+ /** Which tool files to generate. Overridden by --tools flag. */
6
+ tools: z.array(ToolNameSchema).optional(),
7
+ /** Team conventions injected into every generated file. */
8
+ conventions: z
9
+ .object({
10
+ inject: z
11
+ .array(z.string())
12
+ .optional()
13
+ .describe("Conventions appended to Claude-extracted ones"),
14
+ })
15
+ .optional(),
16
+ /** Team boundaries injected into every generated file. */
17
+ boundaries: z
18
+ .object({
19
+ alwaysDo: z.array(z.string()).optional(),
20
+ askFirst: z.array(z.string()).optional(),
21
+ never: z.array(z.string()).optional(),
22
+ })
23
+ .optional(),
24
+ /** Tune the codebase scanner. */
25
+ extraction: z
26
+ .object({
27
+ maxSourceFiles: z.number().int().positive().optional(),
28
+ maxTokensPerFile: z.number().int().positive().optional(),
29
+ })
30
+ .optional(),
31
+ })
32
+ .strict();
33
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;AAErG,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC;KACpC,MAAM,CAAC;IACN,gEAAgE;IAChE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE;IAEzC,2DAA2D;IAC3D,WAAW,EAAE,CAAC;SACX,MAAM,CAAC;QACN,MAAM,EAAE,CAAC;aACN,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;aACjB,QAAQ,EAAE;aACV,QAAQ,CAAC,+CAA+C,CAAC;KAC7D,CAAC;SACD,QAAQ,EAAE;IAEb,0DAA0D;IAC1D,UAAU,EAAE,CAAC;SACV,MAAM,CAAC;QACN,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;QACxC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;QACxC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;KACtC,CAAC;SACD,QAAQ,EAAE;IAEb,iCAAiC;IACjC,UAAU,EAAE,CAAC;SACV,MAAM,CAAC;QACN,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;QACtD,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;KACzD,CAAC;SACD,QAAQ,EAAE;CACd,CAAC;KACD,MAAM,EAAE,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { ProjectMetadata } from "../extractor/schema.js";
2
+ export interface AiderDerivationOptions {
3
+ projectPath: string;
4
+ agentsMdContent: string;
5
+ metadata: ProjectMetadata;
6
+ /** @default true */
7
+ preserveCustom?: boolean;
8
+ }
9
+ /**
10
+ * Derives `CONVENTIONS.md` for Aider.
11
+ *
12
+ * Aider reads CONVENTIONS.md (or .aider.conf.yml) from the project root and
13
+ * includes it as context in every session. We write conventions + boundaries
14
+ * in plain markdown — no tool-specific syntax needed.
15
+ *
16
+ * Does NOT write the file — the caller is responsible.
17
+ */
18
+ export declare function deriveAiderConventions(options: AiderDerivationOptions): Promise<string>;
19
+ //# sourceMappingURL=aider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aider.d.ts","sourceRoot":"","sources":["../../src/derivers/aider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAG9D,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,eAAe,CAAC;IAC1B,oBAAoB;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAyCD;;;;;;;;GAQG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAsF7F"}
@@ -0,0 +1,117 @@
1
+ import path from "node:path";
2
+ import { injectCustomBlocks, loadExistingCustomBlocks } from "./merger.js";
3
+ function escapeRegExp(s) {
4
+ return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
5
+ }
6
+ function extractSection(content, heading) {
7
+ const re = new RegExp(`^##\\s+${escapeRegExp(heading)}\\s*$([\\s\\S]*?)(?=^##\\s|$)`, "mi");
8
+ const match = re.exec(content);
9
+ return match ? match[1].trim() : "";
10
+ }
11
+ function extractSubSection(content, heading) {
12
+ const re = new RegExp(`^###\\s+${escapeRegExp(heading)}\\s*$([\\s\\S]*?)(?=^###\\s|^##\\s|$)`, "mi");
13
+ const match = re.exec(content);
14
+ return match ? match[1].trim() : "";
15
+ }
16
+ function sectionToLines(text) {
17
+ return text
18
+ .split("\n")
19
+ .map((l) => l.replace(/^[\s\-*>]+/, "").trim())
20
+ .filter((l) => l.length > 0);
21
+ }
22
+ function deduplicateLines(items) {
23
+ const seen = new Set();
24
+ return items.filter((item) => {
25
+ const key = item.toLowerCase().trim();
26
+ if (seen.has(key))
27
+ return false;
28
+ seen.add(key);
29
+ return true;
30
+ });
31
+ }
32
+ /**
33
+ * Derives `CONVENTIONS.md` for Aider.
34
+ *
35
+ * Aider reads CONVENTIONS.md (or .aider.conf.yml) from the project root and
36
+ * includes it as context in every session. We write conventions + boundaries
37
+ * in plain markdown — no tool-specific syntax needed.
38
+ *
39
+ * Does NOT write the file — the caller is responsible.
40
+ */
41
+ export async function deriveAiderConventions(options) {
42
+ const { projectPath, agentsMdContent, metadata, preserveCustom = true } = options;
43
+ const { project, conventions: metaConventions, gotchas: metaGotchas, boundaries, testing, stack } = metadata;
44
+ const conventionsSection = sectionToLines(extractSection(agentsMdContent, "Conventions"));
45
+ const gotchasSection = sectionToLines(extractSection(agentsMdContent, "Gotchas"));
46
+ const neverSection = sectionToLines(extractSubSection(agentsMdContent, "Never"));
47
+ const alwaysSection = sectionToLines(extractSubSection(agentsMdContent, "Always"));
48
+ const askFirstSection = sectionToLines(extractSubSection(agentsMdContent, "Ask first"));
49
+ const allConventions = deduplicateLines([...metaConventions, ...conventionsSection]);
50
+ const allGotchas = deduplicateLines([...metaGotchas, ...gotchasSection]);
51
+ const allNever = deduplicateLines([...boundaries.never, ...neverSection]);
52
+ const allAlways = deduplicateLines([...boundaries.alwaysDo, ...alwaysSection]);
53
+ const allAskFirst = deduplicateLines([...boundaries.askFirst, ...askFirstSection]);
54
+ const lines = [];
55
+ lines.push(`# CONVENTIONS.md — managed by agents-sync`);
56
+ lines.push(`# ${project.name ?? "Project"} · ${project.language}${project.framework ? ` / ${project.framework}` : ""}`);
57
+ lines.push("");
58
+ if (stack.database || stack.testing || stack.deploy) {
59
+ lines.push("## Stack");
60
+ if (stack.database)
61
+ lines.push(`- Database: ${stack.database}`);
62
+ if (stack.testing)
63
+ lines.push(`- Testing: ${stack.testing}`);
64
+ if (stack.deploy)
65
+ lines.push(`- Deploy: ${stack.deploy}`);
66
+ lines.push("");
67
+ }
68
+ if (allConventions.length > 0) {
69
+ lines.push("## Conventions");
70
+ for (const rule of allConventions) {
71
+ lines.push(`- ${rule}`);
72
+ }
73
+ lines.push("");
74
+ }
75
+ if (allNever.length > 0) {
76
+ lines.push("## Never");
77
+ for (const rule of allNever) {
78
+ lines.push(`- ${rule}`);
79
+ }
80
+ lines.push("");
81
+ }
82
+ if (allAlways.length > 0) {
83
+ lines.push("## Always");
84
+ for (const rule of allAlways) {
85
+ lines.push(`- ${rule}`);
86
+ }
87
+ lines.push("");
88
+ }
89
+ if (allAskFirst.length > 0) {
90
+ lines.push("## Ask first");
91
+ for (const rule of allAskFirst) {
92
+ lines.push(`- ${rule}`);
93
+ }
94
+ lines.push("");
95
+ }
96
+ if (allGotchas.length > 0) {
97
+ lines.push("## Gotchas");
98
+ for (const gotcha of allGotchas) {
99
+ lines.push(`- ${gotcha}`);
100
+ }
101
+ lines.push("");
102
+ }
103
+ if (testing.command) {
104
+ lines.push("## Testing");
105
+ lines.push(`- Run: \`${testing.command}\``);
106
+ if (testing.location)
107
+ lines.push(`- Tests in: \`${testing.location}\``);
108
+ lines.push("");
109
+ }
110
+ const generated = lines.join("\n").trimEnd() + "\n";
111
+ if (!preserveCustom)
112
+ return generated;
113
+ const conventionsPath = path.join(projectPath, "CONVENTIONS.md");
114
+ const existingBlocks = await loadExistingCustomBlocks(conventionsPath);
115
+ return injectCustomBlocks(generated, existingBlocks);
116
+ }
117
+ //# sourceMappingURL=aider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aider.js","sourceRoot":"","sources":["../../src/derivers/aider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { ProjectMetadata } from "../extractor/schema.js";
2
+ export interface ClaudeDerivationOptions {
3
+ projectPath: string;
4
+ agentsMdContent: string;
5
+ metadata: ProjectMetadata;
6
+ /** @default true */
7
+ preserveCustom?: boolean;
8
+ }
9
+ /**
10
+ * Derives the full content for CLAUDE.md.
11
+ *
12
+ * Content = canonical AGENTS.md + Claude Code-specific section.
13
+ * If preserveCustom is true (default) any existing custom blocks from the
14
+ * current CLAUDE.md are appended after the generated body.
15
+ *
16
+ * Does NOT write the file — the caller is responsible for writing.
17
+ */
18
+ export declare function deriveClaudeMd(options: ClaudeDerivationOptions): Promise<string>;
19
+ //# sourceMappingURL=claude.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/derivers/claude.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAI9D,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,eAAe,CAAC;IAC1B,oBAAoB;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAwED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyBtF"}