@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,83 @@
|
|
|
1
|
+
import { readFileSafe } from "../lib/file-utils.js";
|
|
2
|
+
const CUSTOM_START = "<!-- AGENTS-SYNC:CUSTOM:START -->";
|
|
3
|
+
const CUSTOM_END = "<!-- AGENTS-SYNC:CUSTOM:END -->";
|
|
4
|
+
const CUSTOM_DIVIDER = "\n---\n<!-- Custom additions — preserved on re-sync. Edit freely. -->\n";
|
|
5
|
+
/**
|
|
6
|
+
* Returns all text between CUSTOM_START and CUSTOM_END markers.
|
|
7
|
+
* Multiple blocks are supported; each returned string is the inner content
|
|
8
|
+
* (exclusive of the marker lines themselves).
|
|
9
|
+
*/
|
|
10
|
+
export function extractCustomBlocks(content) {
|
|
11
|
+
const blocks = [];
|
|
12
|
+
let searchFrom = 0;
|
|
13
|
+
while (true) {
|
|
14
|
+
const startIdx = content.indexOf(CUSTOM_START, searchFrom);
|
|
15
|
+
if (startIdx === -1)
|
|
16
|
+
break;
|
|
17
|
+
const endIdx = content.indexOf(CUSTOM_END, startIdx + CUSTOM_START.length);
|
|
18
|
+
if (endIdx === -1)
|
|
19
|
+
break;
|
|
20
|
+
const inner = content.slice(startIdx + CUSTOM_START.length, endIdx);
|
|
21
|
+
// Only include non-empty blocks (after trimming surrounding newlines).
|
|
22
|
+
if (inner.trim().length > 0) {
|
|
23
|
+
blocks.push(inner);
|
|
24
|
+
}
|
|
25
|
+
searchFrom = endIdx + CUSTOM_END.length;
|
|
26
|
+
}
|
|
27
|
+
return blocks;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Appends custom blocks at the end of the generated content, each wrapped in
|
|
31
|
+
* markers and preceded by a divider on the first block.
|
|
32
|
+
*/
|
|
33
|
+
export function injectCustomBlocks(generated, blocks) {
|
|
34
|
+
if (blocks.length === 0)
|
|
35
|
+
return generated;
|
|
36
|
+
const wrapped = blocks
|
|
37
|
+
.map((block) => `${CUSTOM_START}${block}${CUSTOM_END}`)
|
|
38
|
+
.join("\n");
|
|
39
|
+
return `${generated}${CUSTOM_DIVIDER}${wrapped}\n`;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Reads the file at filePath (if it exists) and extracts its custom blocks.
|
|
43
|
+
* Returns [] when the file is missing or contains no custom blocks.
|
|
44
|
+
*/
|
|
45
|
+
export async function loadExistingCustomBlocks(filePath) {
|
|
46
|
+
const content = await readFileSafe(filePath);
|
|
47
|
+
if (content === null)
|
|
48
|
+
return [];
|
|
49
|
+
return extractCustomBlocks(content);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Wraps user-provided content in the CUSTOM markers so it can be embedded in a
|
|
53
|
+
* managed file.
|
|
54
|
+
*/
|
|
55
|
+
export function buildCustomSection(userContent) {
|
|
56
|
+
return `${CUSTOM_START}\n${userContent}\n${CUSTOM_END}`;
|
|
57
|
+
}
|
|
58
|
+
const MANAGED_MARKER = "<!-- Generated by agents-sync";
|
|
59
|
+
/**
|
|
60
|
+
* Returns true when the file content was written by agents-sync (has the
|
|
61
|
+
* generated-by comment at the top).
|
|
62
|
+
*/
|
|
63
|
+
export function isManagedByAgentsSync(content) {
|
|
64
|
+
return content.includes(MANAGED_MARKER);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* If the file at filePath exists and was NOT previously managed by agents-sync,
|
|
68
|
+
* returns the entire file content wrapped as a single custom block so it
|
|
69
|
+
* survives the next write. Returns [] when:
|
|
70
|
+
* - the file does not exist
|
|
71
|
+
* - the file is already managed (has the generated-by marker)
|
|
72
|
+
* - the file is empty
|
|
73
|
+
*/
|
|
74
|
+
export async function loadUnmanagedFileAsCustomBlock(filePath) {
|
|
75
|
+
const content = await readFileSafe(filePath);
|
|
76
|
+
if (!content || content.trim().length === 0)
|
|
77
|
+
return [];
|
|
78
|
+
if (isManagedByAgentsSync(content))
|
|
79
|
+
return [];
|
|
80
|
+
// Wrap the entire existing file as one preserved block
|
|
81
|
+
return [`\n<!-- Pre-existing file content preserved by agents-sync -->\n${content}\n`];
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=merger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merger.js","sourceRoot":"","sources":["../../src/derivers/merger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,MAAM,YAAY,GAAG,mCAAmC,CAAC;AACzD,MAAM,UAAU,GAAG,iCAAiC,CAAC;AAErD,MAAM,cAAc,GAClB,yEAAyE,CAAC;AAE5E;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QAC3D,IAAI,QAAQ,KAAK,CAAC,CAAC;YAAE,MAAM;QAE3B,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAC3E,IAAI,MAAM,KAAK,CAAC,CAAC;YAAE,MAAM;QAEzB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACpE,uEAAuE;QACvE,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QAED,UAAU,GAAG,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC1C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAiB,EAAE,MAAgB;IACpE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAE1C,MAAM,OAAO,GAAG,MAAM;SACnB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,YAAY,GAAG,KAAK,GAAG,UAAU,EAAE,CAAC;SACtD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO,GAAG,SAAS,GAAG,cAAc,GAAG,OAAO,IAAI,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,QAAgB;IAC7D,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAChC,OAAO,mBAAmB,CAAC,OAAO,CAAC,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,WAAmB;IACpD,OAAO,GAAG,YAAY,KAAK,WAAW,KAAK,UAAU,EAAE,CAAC;AAC1D,CAAC;AAED,MAAM,cAAc,GAAG,+BAA+B,CAAC;AAEvD;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,OAAO,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;AAC1C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAAC,QAAgB;IACnE,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACvD,IAAI,qBAAqB,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IAC9C,uDAAuD;IACvD,OAAO,CAAC,kEAAkE,OAAO,IAAI,CAAC,CAAC;AACzF,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ProjectMetadata } from "../extractor/schema.js";
|
|
2
|
+
export interface RooDerivationOptions {
|
|
3
|
+
projectPath: string;
|
|
4
|
+
agentsMdContent: string;
|
|
5
|
+
metadata: ProjectMetadata;
|
|
6
|
+
/** @default true */
|
|
7
|
+
preserveCustom?: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Derives `.roomodes` content for Roo Code.
|
|
11
|
+
*
|
|
12
|
+
* Generates a single custom mode that packages project context — conventions,
|
|
13
|
+
* never rules, and stack information — into Roo Code's JSON format.
|
|
14
|
+
*
|
|
15
|
+
* Does NOT write the file — the caller is responsible.
|
|
16
|
+
*/
|
|
17
|
+
export declare function deriveRooModes(options: RooDerivationOptions): Promise<string>;
|
|
18
|
+
//# sourceMappingURL=roo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roo.d.ts","sourceRoot":"","sources":["../../src/derivers/roo.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAG9D,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,eAAe,CAAC;IAC1B,oBAAoB;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAyDD;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CA2DnF"}
|
|
@@ -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
|
+
function toSlug(name) {
|
|
33
|
+
return name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "") || "project";
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Derives `.roomodes` content for Roo Code.
|
|
37
|
+
*
|
|
38
|
+
* Generates a single custom mode that packages project context — conventions,
|
|
39
|
+
* never rules, and stack information — into Roo Code's JSON format.
|
|
40
|
+
*
|
|
41
|
+
* Does NOT write the file — the caller is responsible.
|
|
42
|
+
*/
|
|
43
|
+
export async function deriveRooModes(options) {
|
|
44
|
+
const { projectPath, agentsMdContent, metadata, preserveCustom = true } = options;
|
|
45
|
+
const { project, conventions: metaConventions, boundaries, testing } = metadata;
|
|
46
|
+
const conventionsSection = sectionToLines(extractSection(agentsMdContent, "Conventions"));
|
|
47
|
+
const neverSection = sectionToLines(extractSubSection(agentsMdContent, "Never"));
|
|
48
|
+
const alwaysSection = sectionToLines(extractSubSection(agentsMdContent, "Always"));
|
|
49
|
+
const allConventions = deduplicateLines([...metaConventions, ...conventionsSection]);
|
|
50
|
+
const allNever = deduplicateLines([...boundaries.never, ...neverSection]);
|
|
51
|
+
const allAlways = deduplicateLines([...boundaries.alwaysDo, ...alwaysSection]);
|
|
52
|
+
const fwPart = project.framework ? ` using ${project.framework}` : "";
|
|
53
|
+
const roleDefinition = [
|
|
54
|
+
`You are an expert ${project.language}${fwPart} developer working on ${project.name ?? "this project"}.`,
|
|
55
|
+
project.description ? `\n${project.description}` : "",
|
|
56
|
+
].filter(Boolean).join(" ");
|
|
57
|
+
const instructionParts = [];
|
|
58
|
+
if (allConventions.length > 0) {
|
|
59
|
+
instructionParts.push("## Conventions\n" + allConventions.map((r) => `- ${r}`).join("\n"));
|
|
60
|
+
}
|
|
61
|
+
if (allNever.length > 0) {
|
|
62
|
+
instructionParts.push("## Never\n" + allNever.map((r) => `- ${r}`).join("\n"));
|
|
63
|
+
}
|
|
64
|
+
if (allAlways.length > 0) {
|
|
65
|
+
instructionParts.push("## Always\n" + allAlways.map((r) => `- ${r}`).join("\n"));
|
|
66
|
+
}
|
|
67
|
+
if (testing.command) {
|
|
68
|
+
instructionParts.push(`## Testing\nRun tests with: \`${testing.command}\``);
|
|
69
|
+
}
|
|
70
|
+
const customInstructions = instructionParts.join("\n\n");
|
|
71
|
+
const mode = {
|
|
72
|
+
slug: toSlug(project.name ?? "project"),
|
|
73
|
+
name: project.name ?? "Project",
|
|
74
|
+
roleDefinition,
|
|
75
|
+
customInstructions,
|
|
76
|
+
groups: ["read", "edit", "browser", "command", "mcp"],
|
|
77
|
+
};
|
|
78
|
+
const roomodes = { customModes: [mode] };
|
|
79
|
+
const generated = JSON.stringify(roomodes, null, 2) + "\n";
|
|
80
|
+
// .roomodes is JSON — custom block injection would corrupt it.
|
|
81
|
+
// If there's an existing file, we merge the customModes arrays instead.
|
|
82
|
+
if (!preserveCustom)
|
|
83
|
+
return generated;
|
|
84
|
+
const existingPath = path.join(projectPath, ".roomodes");
|
|
85
|
+
const existingBlocks = await loadExistingCustomBlocks(existingPath);
|
|
86
|
+
// For JSON files, custom block markers don't apply.
|
|
87
|
+
// Return generated as-is (existing user modes can be manually added).
|
|
88
|
+
return existingBlocks.length > 0
|
|
89
|
+
? injectCustomBlocks(generated, existingBlocks)
|
|
90
|
+
: generated;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=roo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roo.js","sourceRoot":"","sources":["../../src/derivers/roo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ProjectMetadata } from "../extractor/schema.js";
|
|
2
|
+
export interface WindsurfDerivationOptions {
|
|
3
|
+
projectPath: string;
|
|
4
|
+
agentsMdContent: string;
|
|
5
|
+
metadata: ProjectMetadata;
|
|
6
|
+
/** @default true */
|
|
7
|
+
preserveCustom?: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Derives `.windsurfrules` content from AGENTS.md + metadata.
|
|
11
|
+
* Same directive style as .cursorrules — target < 400 words.
|
|
12
|
+
*
|
|
13
|
+
* Does NOT write the file — the caller is responsible for writing.
|
|
14
|
+
*/
|
|
15
|
+
export declare function deriveWindsurfRules(options: WindsurfDerivationOptions): Promise<string>;
|
|
16
|
+
//# sourceMappingURL=windsurf.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"windsurf.d.ts","sourceRoot":"","sources":["../../src/derivers/windsurf.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAG9D,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,eAAe,CAAC;IAC1B,oBAAoB;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAyCD;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiE7F"}
|
|
@@ -0,0 +1,91 @@
|
|
|
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 `.windsurfrules` content from AGENTS.md + metadata.
|
|
34
|
+
* Same directive style as .cursorrules — target < 400 words.
|
|
35
|
+
*
|
|
36
|
+
* Does NOT write the file — the caller is responsible for writing.
|
|
37
|
+
*/
|
|
38
|
+
export async function deriveWindsurfRules(options) {
|
|
39
|
+
const { projectPath, agentsMdContent, metadata, preserveCustom = true } = options;
|
|
40
|
+
const { project, conventions: metaConventions, gotchas: metaGotchas, boundaries, testing } = metadata;
|
|
41
|
+
const conventionsSection = sectionToLines(extractSection(agentsMdContent, "Conventions"));
|
|
42
|
+
const gotchasSection = sectionToLines(extractSection(agentsMdContent, "Gotchas"));
|
|
43
|
+
const neverSection = sectionToLines(extractSubSection(agentsMdContent, "Never"));
|
|
44
|
+
const allConventions = deduplicateLines([...metaConventions, ...conventionsSection]);
|
|
45
|
+
const allGotchas = deduplicateLines([...metaGotchas, ...gotchasSection]);
|
|
46
|
+
const allNever = deduplicateLines([...boundaries.never, ...neverSection]);
|
|
47
|
+
const lines = [];
|
|
48
|
+
const fwPart = project.framework ? ` / ${project.framework}` : "";
|
|
49
|
+
lines.push(`# .windsurfrules — managed by agents-sync`);
|
|
50
|
+
lines.push(`# Language: ${project.language}${fwPart}`);
|
|
51
|
+
lines.push("");
|
|
52
|
+
if (allConventions.length > 0) {
|
|
53
|
+
lines.push("## Conventions");
|
|
54
|
+
for (const rule of allConventions) {
|
|
55
|
+
lines.push(`- Always: ${rule}`);
|
|
56
|
+
}
|
|
57
|
+
lines.push("");
|
|
58
|
+
}
|
|
59
|
+
if (allGotchas.length > 0) {
|
|
60
|
+
lines.push("## Gotchas");
|
|
61
|
+
for (const gotcha of allGotchas) {
|
|
62
|
+
lines.push(`- Never: ${gotcha}`);
|
|
63
|
+
}
|
|
64
|
+
lines.push("");
|
|
65
|
+
}
|
|
66
|
+
if (allNever.length > 0) {
|
|
67
|
+
lines.push("## Hard boundaries");
|
|
68
|
+
for (const rule of allNever) {
|
|
69
|
+
lines.push(`- Never: ${rule}`);
|
|
70
|
+
}
|
|
71
|
+
lines.push("");
|
|
72
|
+
}
|
|
73
|
+
if (boundaries.alwaysDo.length > 0) {
|
|
74
|
+
lines.push("## Always do");
|
|
75
|
+
for (const rule of boundaries.alwaysDo) {
|
|
76
|
+
lines.push(`- ${rule}`);
|
|
77
|
+
}
|
|
78
|
+
lines.push("");
|
|
79
|
+
}
|
|
80
|
+
if (testing.command) {
|
|
81
|
+
lines.push(`Tests: \`${testing.command}\``);
|
|
82
|
+
lines.push("");
|
|
83
|
+
}
|
|
84
|
+
const generated = lines.join("\n").trimEnd() + "\n";
|
|
85
|
+
if (!preserveCustom)
|
|
86
|
+
return generated;
|
|
87
|
+
const windsurfPath = path.join(projectPath, ".windsurfrules");
|
|
88
|
+
const existingBlocks = await loadExistingCustomBlocks(windsurfPath);
|
|
89
|
+
return injectCustomBlocks(generated, existingBlocks);
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=windsurf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"windsurf.js","sourceRoot":"","sources":["../../src/derivers/windsurf.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../../src/extractor/extractor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,eAAe,EAAyB,MAAM,aAAa,CAAC;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAwBrD,wBAAsB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,eAAe,CAAC,CAmCjF"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { callClaude } from "../lib/claude-client.js";
|
|
2
|
+
import { AgentsSyncError } from "../lib/errors.js";
|
|
3
|
+
import { ProjectMetadataSchema } from "./schema.js";
|
|
4
|
+
const SYSTEM_PROMPT = `You are a code analyst. Your job is to extract factual information about a software project from the files provided.
|
|
5
|
+
|
|
6
|
+
Rules:
|
|
7
|
+
- Extract ONLY concrete facts you can observe in the provided files
|
|
8
|
+
- NEVER hallucinate framework names, directories, or conventions you cannot see
|
|
9
|
+
- If you are not certain about a field, omit it entirely
|
|
10
|
+
- Conventions must be specific: "kebab-case filenames" not "follow best practices"
|
|
11
|
+
- Gotchas must include the consequence: "Do X or Y will happen"
|
|
12
|
+
- Return ONLY valid JSON matching the schema — no markdown, no explanation
|
|
13
|
+
|
|
14
|
+
Schema:
|
|
15
|
+
{
|
|
16
|
+
"project": { "name", "description", "language", "framework?", "version?" },
|
|
17
|
+
"stack": { "runtime?", "database?", "auth?", "testing?", "deploy?", "other": [] },
|
|
18
|
+
"architecture": { "style?", "keyDirs": {}, "entryPoints": [] },
|
|
19
|
+
"conventions": [],
|
|
20
|
+
"gotchas": [],
|
|
21
|
+
"boundaries": { "alwaysDo": [], "askFirst": [], "never": [] },
|
|
22
|
+
"testing": { "framework?", "command?", "location?", "coverageCommand?" },
|
|
23
|
+
"deployment": { "target?", "command?", "envFile?", "notes": [] }
|
|
24
|
+
}`;
|
|
25
|
+
export async function extractMetadata(corpus) {
|
|
26
|
+
const userPrompt = buildPrompt(corpus);
|
|
27
|
+
for (let attempt = 1; attempt <= 2; attempt++) {
|
|
28
|
+
const { content } = await callClaude(SYSTEM_PROMPT, userPrompt, 2048);
|
|
29
|
+
try {
|
|
30
|
+
const raw = extractJson(content);
|
|
31
|
+
return ProjectMetadataSchema.parse(raw);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
if (attempt === 2) {
|
|
35
|
+
throw new AgentsSyncError("EXTRACTION_FAILED", "Failed to extract valid project metadata after 2 attempts.", "Run with AGENTS_SYNC_DEBUG=1 to see Claude's raw output.");
|
|
36
|
+
}
|
|
37
|
+
// Retry with correction hint appended to next call
|
|
38
|
+
const retryPrompt = `${userPrompt}\n\nYour previous output was not valid JSON. Output ONLY the JSON object, no other text.`;
|
|
39
|
+
const { content: retryContent } = await callClaude(SYSTEM_PROMPT, retryPrompt, 2048);
|
|
40
|
+
try {
|
|
41
|
+
const raw = extractJson(retryContent);
|
|
42
|
+
return ProjectMetadataSchema.parse(raw);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
throw new AgentsSyncError("EXTRACTION_FAILED", "Failed to extract valid project metadata after 2 attempts.", "Run with AGENTS_SYNC_DEBUG=1 to see Claude's raw output.");
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// TypeScript requires this but it's unreachable
|
|
50
|
+
throw new AgentsSyncError("EXTRACTION_FAILED", "Unexpected extraction failure.");
|
|
51
|
+
}
|
|
52
|
+
function extractJson(text) {
|
|
53
|
+
// Strip markdown code fences if present
|
|
54
|
+
const stripped = text.replace(/^```(?:json)?\n?/m, "").replace(/\n?```$/m, "").trim();
|
|
55
|
+
return JSON.parse(stripped);
|
|
56
|
+
}
|
|
57
|
+
function buildPrompt(corpus) {
|
|
58
|
+
const sections = [];
|
|
59
|
+
sections.push("=== MANIFEST / DEPENDENCIES ===");
|
|
60
|
+
sections.push(`Language: ${corpus.manifest.language}`);
|
|
61
|
+
if (corpus.manifest.framework)
|
|
62
|
+
sections.push(`Detected framework: ${corpus.manifest.framework}`);
|
|
63
|
+
if (corpus.manifest.runtime)
|
|
64
|
+
sections.push(`Runtime: ${corpus.manifest.runtime}`);
|
|
65
|
+
if (corpus.manifest.projectName)
|
|
66
|
+
sections.push(`Project name: ${corpus.manifest.projectName}`);
|
|
67
|
+
sections.push(`Dependencies (${corpus.manifest.dependencies.length}): ${corpus.manifest.dependencies.slice(0, 25).join(", ")}`);
|
|
68
|
+
if (corpus.manifest.devDependencies.length > 0) {
|
|
69
|
+
sections.push(`Dev deps: ${corpus.manifest.devDependencies.slice(0, 15).join(", ")}`);
|
|
70
|
+
}
|
|
71
|
+
if (Object.keys(corpus.manifest.scripts).length > 0) {
|
|
72
|
+
sections.push(`Scripts: ${JSON.stringify(corpus.manifest.scripts)}`);
|
|
73
|
+
}
|
|
74
|
+
sections.push("\n=== PROJECT STRUCTURE ===");
|
|
75
|
+
sections.push(`Top-level dirs: ${corpus.structure.topLevelDirs.join(", ")}`);
|
|
76
|
+
sections.push(`Entry points: ${corpus.structure.entryPoints.join(", ") || "none detected"}`);
|
|
77
|
+
sections.push(`Test dirs: ${corpus.structure.testDirs.join(", ") || "none detected"}`);
|
|
78
|
+
sections.push(`Naming convention: ${corpus.structure.namingConvention}`);
|
|
79
|
+
sections.push(`Total files: ~${corpus.structure.totalFileCount}`);
|
|
80
|
+
sections.push(`\nDirectory tree:\n${corpus.structure.tree}`);
|
|
81
|
+
if (corpus.source.files.length > 0) {
|
|
82
|
+
sections.push("\n=== SAMPLED SOURCE FILES ===");
|
|
83
|
+
sections.push(`Import style: ${corpus.source.importStyle}`);
|
|
84
|
+
if (corpus.source.detectedPatterns.length > 0) {
|
|
85
|
+
sections.push(`Detected patterns: ${corpus.source.detectedPatterns.join(", ")}`);
|
|
86
|
+
}
|
|
87
|
+
for (const f of corpus.source.files.slice(0, 10)) {
|
|
88
|
+
sections.push(`\n--- ${f.path} ---`);
|
|
89
|
+
sections.push(f.content.slice(0, 800));
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (corpus.docs.readme) {
|
|
93
|
+
sections.push("\n=== README ===");
|
|
94
|
+
sections.push(corpus.docs.readme.slice(0, 1500));
|
|
95
|
+
}
|
|
96
|
+
if (corpus.docs.contributing) {
|
|
97
|
+
sections.push("\n=== CONTRIBUTING ===");
|
|
98
|
+
sections.push(corpus.docs.contributing.slice(0, 800));
|
|
99
|
+
}
|
|
100
|
+
if (corpus.docs.existingAgentsMd) {
|
|
101
|
+
sections.push("\n=== EXISTING AGENTS.MD (use as baseline) ===");
|
|
102
|
+
sections.push(corpus.docs.existingAgentsMd);
|
|
103
|
+
}
|
|
104
|
+
if (corpus.docs.existingClaudeMd) {
|
|
105
|
+
sections.push("\n=== EXISTING CLAUDE.MD (extract unique conventions) ===");
|
|
106
|
+
sections.push(corpus.docs.existingClaudeMd.slice(0, 1000));
|
|
107
|
+
}
|
|
108
|
+
if (corpus.gotchas.length > 0) {
|
|
109
|
+
sections.push("\n=== GOTCHAS FOUND IN SOURCE (TODO/FIXME/HACK comments) ===");
|
|
110
|
+
for (const g of corpus.gotchas) {
|
|
111
|
+
sections.push(`${g.type} in ${g.file}:${g.line} — ${g.comment}`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
sections.push("\nNow extract the project metadata as JSON:");
|
|
115
|
+
return sections.join("\n");
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractor.js","sourceRoot":"","sources":["../../src/extractor/extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const ProjectMetadataSchema: z.ZodObject<{
|
|
3
|
+
project: z.ZodObject<{
|
|
4
|
+
name: z.ZodString;
|
|
5
|
+
description: z.ZodString;
|
|
6
|
+
language: z.ZodString;
|
|
7
|
+
framework: z.ZodOptional<z.ZodString>;
|
|
8
|
+
version: z.ZodOptional<z.ZodString>;
|
|
9
|
+
}, "strip", z.ZodTypeAny, {
|
|
10
|
+
name: string;
|
|
11
|
+
language: string;
|
|
12
|
+
description: string;
|
|
13
|
+
version?: string | undefined;
|
|
14
|
+
framework?: string | undefined;
|
|
15
|
+
}, {
|
|
16
|
+
name: string;
|
|
17
|
+
language: string;
|
|
18
|
+
description: string;
|
|
19
|
+
version?: string | undefined;
|
|
20
|
+
framework?: string | undefined;
|
|
21
|
+
}>;
|
|
22
|
+
stack: z.ZodObject<{
|
|
23
|
+
runtime: z.ZodOptional<z.ZodString>;
|
|
24
|
+
database: z.ZodOptional<z.ZodString>;
|
|
25
|
+
auth: z.ZodOptional<z.ZodString>;
|
|
26
|
+
testing: z.ZodOptional<z.ZodString>;
|
|
27
|
+
deploy: z.ZodOptional<z.ZodString>;
|
|
28
|
+
other: z.ZodArray<z.ZodString, "many">;
|
|
29
|
+
}, "strip", z.ZodTypeAny, {
|
|
30
|
+
other: string[];
|
|
31
|
+
runtime?: string | undefined;
|
|
32
|
+
database?: string | undefined;
|
|
33
|
+
auth?: string | undefined;
|
|
34
|
+
testing?: string | undefined;
|
|
35
|
+
deploy?: string | undefined;
|
|
36
|
+
}, {
|
|
37
|
+
other: string[];
|
|
38
|
+
runtime?: string | undefined;
|
|
39
|
+
database?: string | undefined;
|
|
40
|
+
auth?: string | undefined;
|
|
41
|
+
testing?: string | undefined;
|
|
42
|
+
deploy?: string | undefined;
|
|
43
|
+
}>;
|
|
44
|
+
architecture: z.ZodObject<{
|
|
45
|
+
style: z.ZodOptional<z.ZodString>;
|
|
46
|
+
keyDirs: z.ZodRecord<z.ZodString, z.ZodString>;
|
|
47
|
+
entryPoints: z.ZodArray<z.ZodString, "many">;
|
|
48
|
+
}, "strip", z.ZodTypeAny, {
|
|
49
|
+
entryPoints: string[];
|
|
50
|
+
keyDirs: Record<string, string>;
|
|
51
|
+
style?: string | undefined;
|
|
52
|
+
}, {
|
|
53
|
+
entryPoints: string[];
|
|
54
|
+
keyDirs: Record<string, string>;
|
|
55
|
+
style?: string | undefined;
|
|
56
|
+
}>;
|
|
57
|
+
conventions: z.ZodArray<z.ZodString, "many">;
|
|
58
|
+
gotchas: z.ZodArray<z.ZodString, "many">;
|
|
59
|
+
boundaries: z.ZodObject<{
|
|
60
|
+
alwaysDo: z.ZodArray<z.ZodString, "many">;
|
|
61
|
+
askFirst: z.ZodArray<z.ZodString, "many">;
|
|
62
|
+
never: z.ZodArray<z.ZodString, "many">;
|
|
63
|
+
}, "strip", z.ZodTypeAny, {
|
|
64
|
+
never: string[];
|
|
65
|
+
alwaysDo: string[];
|
|
66
|
+
askFirst: string[];
|
|
67
|
+
}, {
|
|
68
|
+
never: string[];
|
|
69
|
+
alwaysDo: string[];
|
|
70
|
+
askFirst: string[];
|
|
71
|
+
}>;
|
|
72
|
+
testing: z.ZodObject<{
|
|
73
|
+
framework: z.ZodOptional<z.ZodString>;
|
|
74
|
+
command: z.ZodOptional<z.ZodString>;
|
|
75
|
+
location: z.ZodOptional<z.ZodString>;
|
|
76
|
+
coverageCommand: z.ZodOptional<z.ZodString>;
|
|
77
|
+
}, "strip", z.ZodTypeAny, {
|
|
78
|
+
framework?: string | undefined;
|
|
79
|
+
command?: string | undefined;
|
|
80
|
+
location?: string | undefined;
|
|
81
|
+
coverageCommand?: string | undefined;
|
|
82
|
+
}, {
|
|
83
|
+
framework?: string | undefined;
|
|
84
|
+
command?: string | undefined;
|
|
85
|
+
location?: string | undefined;
|
|
86
|
+
coverageCommand?: string | undefined;
|
|
87
|
+
}>;
|
|
88
|
+
deployment: z.ZodObject<{
|
|
89
|
+
target: z.ZodOptional<z.ZodString>;
|
|
90
|
+
command: z.ZodOptional<z.ZodString>;
|
|
91
|
+
envFile: z.ZodOptional<z.ZodString>;
|
|
92
|
+
notes: z.ZodArray<z.ZodString, "many">;
|
|
93
|
+
}, "strip", z.ZodTypeAny, {
|
|
94
|
+
notes: string[];
|
|
95
|
+
command?: string | undefined;
|
|
96
|
+
target?: string | undefined;
|
|
97
|
+
envFile?: string | undefined;
|
|
98
|
+
}, {
|
|
99
|
+
notes: string[];
|
|
100
|
+
command?: string | undefined;
|
|
101
|
+
target?: string | undefined;
|
|
102
|
+
envFile?: string | undefined;
|
|
103
|
+
}>;
|
|
104
|
+
}, "strip", z.ZodTypeAny, {
|
|
105
|
+
architecture: {
|
|
106
|
+
entryPoints: string[];
|
|
107
|
+
keyDirs: Record<string, string>;
|
|
108
|
+
style?: string | undefined;
|
|
109
|
+
};
|
|
110
|
+
gotchas: string[];
|
|
111
|
+
project: {
|
|
112
|
+
name: string;
|
|
113
|
+
language: string;
|
|
114
|
+
description: string;
|
|
115
|
+
version?: string | undefined;
|
|
116
|
+
framework?: string | undefined;
|
|
117
|
+
};
|
|
118
|
+
stack: {
|
|
119
|
+
other: string[];
|
|
120
|
+
runtime?: string | undefined;
|
|
121
|
+
database?: string | undefined;
|
|
122
|
+
auth?: string | undefined;
|
|
123
|
+
testing?: string | undefined;
|
|
124
|
+
deploy?: string | undefined;
|
|
125
|
+
};
|
|
126
|
+
testing: {
|
|
127
|
+
framework?: string | undefined;
|
|
128
|
+
command?: string | undefined;
|
|
129
|
+
location?: string | undefined;
|
|
130
|
+
coverageCommand?: string | undefined;
|
|
131
|
+
};
|
|
132
|
+
conventions: string[];
|
|
133
|
+
boundaries: {
|
|
134
|
+
never: string[];
|
|
135
|
+
alwaysDo: string[];
|
|
136
|
+
askFirst: string[];
|
|
137
|
+
};
|
|
138
|
+
deployment: {
|
|
139
|
+
notes: string[];
|
|
140
|
+
command?: string | undefined;
|
|
141
|
+
target?: string | undefined;
|
|
142
|
+
envFile?: string | undefined;
|
|
143
|
+
};
|
|
144
|
+
}, {
|
|
145
|
+
architecture: {
|
|
146
|
+
entryPoints: string[];
|
|
147
|
+
keyDirs: Record<string, string>;
|
|
148
|
+
style?: string | undefined;
|
|
149
|
+
};
|
|
150
|
+
gotchas: string[];
|
|
151
|
+
project: {
|
|
152
|
+
name: string;
|
|
153
|
+
language: string;
|
|
154
|
+
description: string;
|
|
155
|
+
version?: string | undefined;
|
|
156
|
+
framework?: string | undefined;
|
|
157
|
+
};
|
|
158
|
+
stack: {
|
|
159
|
+
other: string[];
|
|
160
|
+
runtime?: string | undefined;
|
|
161
|
+
database?: string | undefined;
|
|
162
|
+
auth?: string | undefined;
|
|
163
|
+
testing?: string | undefined;
|
|
164
|
+
deploy?: string | undefined;
|
|
165
|
+
};
|
|
166
|
+
testing: {
|
|
167
|
+
framework?: string | undefined;
|
|
168
|
+
command?: string | undefined;
|
|
169
|
+
location?: string | undefined;
|
|
170
|
+
coverageCommand?: string | undefined;
|
|
171
|
+
};
|
|
172
|
+
conventions: string[];
|
|
173
|
+
boundaries: {
|
|
174
|
+
never: string[];
|
|
175
|
+
alwaysDo: string[];
|
|
176
|
+
askFirst: string[];
|
|
177
|
+
};
|
|
178
|
+
deployment: {
|
|
179
|
+
notes: string[];
|
|
180
|
+
command?: string | undefined;
|
|
181
|
+
target?: string | undefined;
|
|
182
|
+
envFile?: string | undefined;
|
|
183
|
+
};
|
|
184
|
+
}>;
|
|
185
|
+
export type ProjectMetadata = z.infer<typeof ProjectMetadataSchema>;
|
|
186
|
+
export declare const METADATA_VERSION = "1.0";
|
|
187
|
+
//# sourceMappingURL=schema.d.ts.map
|