@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.
- package/LICENSE +21 -0
- package/README.md +507 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +267 -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 +93 -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 +134 -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 +125 -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 +6 -0
- package/dist/generator/agents-md.d.ts.map +1 -0
- package/dist/generator/agents-md.js +135 -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 +26 -0
- package/dist/scanner/index.d.ts.map +1 -0
- package/dist/scanner/index.js +95 -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 +245 -0
- package/dist/server.js.map +1 -0
- package/dist/snapshot/drift.d.ts +28 -0
- package/dist/snapshot/drift.d.ts.map +1 -0
- package/dist/snapshot/drift.js +205 -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 +51 -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/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/agents-md-spec.md +233 -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
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
|
package/dist/cli.js.map
ADDED
|
@@ -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"}
|