@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,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;AAG9D,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;AAkBD;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBtF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { injectCustomBlocks, loadExistingCustomBlocks, loadUnmanagedFileAsCustomBlock } from "./merger.js";
|
|
3
|
+
const CLAUDE_CODE_SECTION = `---
|
|
4
|
+
|
|
5
|
+
## Claude Code Notes
|
|
6
|
+
|
|
7
|
+
> This file is managed by agents-sync. Edit \`AGENTS.md\` and run \`/agents-sync sync\`.
|
|
8
|
+
|
|
9
|
+
### Tool Files
|
|
10
|
+
- Canonical: \`AGENTS.md\`
|
|
11
|
+
- Cursor: \`.cursorrules\`
|
|
12
|
+
- Copilot: \`.github/copilot-instructions.md\`
|
|
13
|
+
|
|
14
|
+
### Re-sync
|
|
15
|
+
Run \`/agents-sync sync\` after major refactors, new dependencies, or architecture changes.
|
|
16
|
+
Run \`/agents-sync drift\` to check what's changed since last sync.
|
|
17
|
+
`;
|
|
18
|
+
/**
|
|
19
|
+
* Derives the full content for CLAUDE.md.
|
|
20
|
+
*
|
|
21
|
+
* Content = canonical AGENTS.md + Claude Code-specific section.
|
|
22
|
+
* If preserveCustom is true (default) any existing custom blocks from the
|
|
23
|
+
* current CLAUDE.md are appended after the generated body.
|
|
24
|
+
*
|
|
25
|
+
* Does NOT write the file — the caller is responsible for writing.
|
|
26
|
+
*/
|
|
27
|
+
export async function deriveClaudeMd(options) {
|
|
28
|
+
const { projectPath, agentsMdContent, preserveCustom = true } = options;
|
|
29
|
+
const generated = `${agentsMdContent.trimEnd()}\n\n${CLAUDE_CODE_SECTION}`;
|
|
30
|
+
if (!preserveCustom)
|
|
31
|
+
return generated;
|
|
32
|
+
const claudeMdPath = path.join(projectPath, "CLAUDE.md");
|
|
33
|
+
// Preserve managed custom blocks first; fall back to wrapping the whole
|
|
34
|
+
// file if it exists but was never managed by agents-sync.
|
|
35
|
+
const existingBlocks = await loadExistingCustomBlocks(claudeMdPath);
|
|
36
|
+
const blocks = existingBlocks.length > 0
|
|
37
|
+
? existingBlocks
|
|
38
|
+
: await loadUnmanagedFileAsCustomBlock(claudeMdPath);
|
|
39
|
+
return injectCustomBlocks(generated, blocks);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=claude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/derivers/claude.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAU3G,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;CAc3B,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAgC;IACnE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,cAAc,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAExE,MAAM,SAAS,GAAG,GAAG,eAAe,CAAC,OAAO,EAAE,OAAO,mBAAmB,EAAE,CAAC;IAE3E,IAAI,CAAC,cAAc;QAAE,OAAO,SAAS,CAAC;IAEtC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACzD,wEAAwE;IACxE,0DAA0D;IAC1D,MAAM,cAAc,GAAG,MAAM,wBAAwB,CAAC,YAAY,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC;QACtC,CAAC,CAAC,cAAc;QAChB,CAAC,CAAC,MAAM,8BAA8B,CAAC,YAAY,CAAC,CAAC;IAEvD,OAAO,kBAAkB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ProjectMetadata } from "../extractor/schema.js";
|
|
2
|
+
export interface ClineDerivationOptions {
|
|
3
|
+
projectPath: string;
|
|
4
|
+
agentsMdContent: string;
|
|
5
|
+
metadata: ProjectMetadata;
|
|
6
|
+
/** @default true */
|
|
7
|
+
preserveCustom?: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Derives `.clinerules` content from AGENTS.md + metadata.
|
|
11
|
+
* Cline reads this file for project-specific AI instructions.
|
|
12
|
+
* Target < 400 words.
|
|
13
|
+
*
|
|
14
|
+
* Does NOT write the file — the caller is responsible for writing.
|
|
15
|
+
*/
|
|
16
|
+
export declare function deriveClineRules(options: ClineDerivationOptions): Promise<string>;
|
|
17
|
+
//# sourceMappingURL=cline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cline.d.ts","sourceRoot":"","sources":["../../src/derivers/cline.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;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiEvF"}
|
|
@@ -0,0 +1,92 @@
|
|
|
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 `.clinerules` content from AGENTS.md + metadata.
|
|
34
|
+
* Cline reads this file for project-specific AI instructions.
|
|
35
|
+
* Target < 400 words.
|
|
36
|
+
*
|
|
37
|
+
* Does NOT write the file — the caller is responsible for writing.
|
|
38
|
+
*/
|
|
39
|
+
export async function deriveClineRules(options) {
|
|
40
|
+
const { projectPath, agentsMdContent, metadata, preserveCustom = true } = options;
|
|
41
|
+
const { project, conventions: metaConventions, gotchas: metaGotchas, boundaries, testing } = metadata;
|
|
42
|
+
const conventionsSection = sectionToLines(extractSection(agentsMdContent, "Conventions"));
|
|
43
|
+
const gotchasSection = sectionToLines(extractSection(agentsMdContent, "Gotchas"));
|
|
44
|
+
const neverSection = sectionToLines(extractSubSection(agentsMdContent, "Never"));
|
|
45
|
+
const allConventions = deduplicateLines([...metaConventions, ...conventionsSection]);
|
|
46
|
+
const allGotchas = deduplicateLines([...metaGotchas, ...gotchasSection]);
|
|
47
|
+
const allNever = deduplicateLines([...boundaries.never, ...neverSection]);
|
|
48
|
+
const lines = [];
|
|
49
|
+
const fwPart = project.framework ? ` / ${project.framework}` : "";
|
|
50
|
+
lines.push(`# .clinerules — managed by agents-sync`);
|
|
51
|
+
lines.push(`# Language: ${project.language}${fwPart}`);
|
|
52
|
+
lines.push("");
|
|
53
|
+
if (allConventions.length > 0) {
|
|
54
|
+
lines.push("## Conventions");
|
|
55
|
+
for (const rule of allConventions) {
|
|
56
|
+
lines.push(`- ${rule}`);
|
|
57
|
+
}
|
|
58
|
+
lines.push("");
|
|
59
|
+
}
|
|
60
|
+
if (allGotchas.length > 0) {
|
|
61
|
+
lines.push("## Gotchas");
|
|
62
|
+
for (const gotcha of allGotchas) {
|
|
63
|
+
lines.push(`- ${gotcha}`);
|
|
64
|
+
}
|
|
65
|
+
lines.push("");
|
|
66
|
+
}
|
|
67
|
+
if (allNever.length > 0) {
|
|
68
|
+
lines.push("## Never");
|
|
69
|
+
for (const rule of allNever) {
|
|
70
|
+
lines.push(`- ${rule}`);
|
|
71
|
+
}
|
|
72
|
+
lines.push("");
|
|
73
|
+
}
|
|
74
|
+
if (boundaries.alwaysDo.length > 0) {
|
|
75
|
+
lines.push("## Always");
|
|
76
|
+
for (const rule of boundaries.alwaysDo) {
|
|
77
|
+
lines.push(`- ${rule}`);
|
|
78
|
+
}
|
|
79
|
+
lines.push("");
|
|
80
|
+
}
|
|
81
|
+
if (testing.command) {
|
|
82
|
+
lines.push(`**Tests:** \`${testing.command}\``);
|
|
83
|
+
lines.push("");
|
|
84
|
+
}
|
|
85
|
+
const generated = lines.join("\n").trimEnd() + "\n";
|
|
86
|
+
if (!preserveCustom)
|
|
87
|
+
return generated;
|
|
88
|
+
const clinePath = path.join(projectPath, ".clinerules");
|
|
89
|
+
const existingBlocks = await loadExistingCustomBlocks(clinePath);
|
|
90
|
+
return injectCustomBlocks(generated, existingBlocks);
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=cline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cline.js","sourceRoot":"","sources":["../../src/derivers/cline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ProjectMetadata } from "../extractor/schema.js";
|
|
2
|
+
export interface CopilotDerivationOptions {
|
|
3
|
+
projectPath: string;
|
|
4
|
+
agentsMdContent: string;
|
|
5
|
+
metadata: ProjectMetadata;
|
|
6
|
+
/** @default true */
|
|
7
|
+
preserveCustom?: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Derives `.github/copilot-instructions.md` content from AGENTS.md + metadata.
|
|
11
|
+
* Focuses strictly on inline code-generation context — target < 300 words.
|
|
12
|
+
*
|
|
13
|
+
* Does NOT write the file — the caller is responsible for writing.
|
|
14
|
+
*/
|
|
15
|
+
export declare function deriveCopilotInstructions(options: CopilotDerivationOptions): Promise<string>;
|
|
16
|
+
//# sourceMappingURL=copilot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copilot.d.ts","sourceRoot":"","sources":["../../src/derivers/copilot.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAG9D,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,eAAe,CAAC;IAC1B,oBAAoB;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAyGD;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,MAAM,CAAC,CA4EjB"}
|