@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
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import Anthropic from "@anthropic-ai/sdk";
|
|
2
|
+
import { AgentsSyncError } from "./errors.js";
|
|
3
|
+
const MODEL = "claude-sonnet-4-6";
|
|
4
|
+
const MAX_RETRIES = 3;
|
|
5
|
+
const RETRY_DELAY_MS = 2000;
|
|
6
|
+
let _client = null;
|
|
7
|
+
function getClient() {
|
|
8
|
+
if (!_client) {
|
|
9
|
+
const apiKey = process.env.ANTHROPIC_API_KEY;
|
|
10
|
+
if (!apiKey) {
|
|
11
|
+
throw new AgentsSyncError("MISSING_API_KEY", "ANTHROPIC_API_KEY environment variable is not set.", "Export it: export ANTHROPIC_API_KEY=sk-ant-...");
|
|
12
|
+
}
|
|
13
|
+
_client = new Anthropic({ apiKey });
|
|
14
|
+
}
|
|
15
|
+
return _client;
|
|
16
|
+
}
|
|
17
|
+
function debug(msg) {
|
|
18
|
+
if (process.env.AGENTS_SYNC_DEBUG === "1") {
|
|
19
|
+
process.stderr.write(`[agents-sync:debug] ${msg}\n`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export async function callClaude(systemPrompt, userPrompt, maxTokens = 4096) {
|
|
23
|
+
const client = getClient();
|
|
24
|
+
for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
|
|
25
|
+
try {
|
|
26
|
+
debug(`Claude call attempt ${attempt}, maxTokens=${maxTokens}`);
|
|
27
|
+
const response = await client.messages.create({
|
|
28
|
+
model: MODEL,
|
|
29
|
+
max_tokens: maxTokens,
|
|
30
|
+
system: [
|
|
31
|
+
{
|
|
32
|
+
type: "text",
|
|
33
|
+
text: systemPrompt,
|
|
34
|
+
cache_control: { type: "ephemeral" },
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
messages: [{ role: "user", content: userPrompt }],
|
|
38
|
+
});
|
|
39
|
+
const content = response.content
|
|
40
|
+
.filter((b) => b.type === "text")
|
|
41
|
+
.map((b) => b.text)
|
|
42
|
+
.join("");
|
|
43
|
+
const usage = {
|
|
44
|
+
inputTokens: response.usage.input_tokens,
|
|
45
|
+
outputTokens: response.usage.output_tokens,
|
|
46
|
+
cacheReadTokens: response.usage.cache_read_input_tokens ?? 0,
|
|
47
|
+
cacheWriteTokens: response.usage.cache_creation_input_tokens ?? 0,
|
|
48
|
+
};
|
|
49
|
+
debug(`Response: ${usage.outputTokens} out, ${usage.cacheReadTokens} cache_read, ${usage.cacheWriteTokens} cache_write`);
|
|
50
|
+
return { content, usage };
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
const err = e;
|
|
54
|
+
if (err.status === 429 && attempt < MAX_RETRIES) {
|
|
55
|
+
debug(`Rate limited, retrying in ${RETRY_DELAY_MS * attempt}ms...`);
|
|
56
|
+
await sleep(RETRY_DELAY_MS * attempt);
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (err.status === 529 && attempt < MAX_RETRIES) {
|
|
60
|
+
debug(`Overloaded, retrying in ${RETRY_DELAY_MS}ms...`);
|
|
61
|
+
await sleep(RETRY_DELAY_MS);
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
throw new AgentsSyncError(err.status === 429 ? "RATE_LIMIT" : "API_ERROR", `Claude API error: ${err.message ?? String(e)}`, err.status === 429
|
|
65
|
+
? "Rate limited. Try again in ~60 seconds. Use --fast flag to skip re-extraction."
|
|
66
|
+
: "Run with AGENTS_SYNC_DEBUG=1 to see full error.");
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
throw new AgentsSyncError("RATE_LIMIT", "Rate limited after 3 retries.", "Wait ~60 seconds and try again.");
|
|
70
|
+
}
|
|
71
|
+
function sleep(ms) {
|
|
72
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=claude-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-client.js","sourceRoot":"","sources":["../../src/lib/claude-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type ErrorCode = "MISSING_API_KEY" | "INVALID_PROJECT_PATH" | "NO_SNAPSHOT" | "RATE_LIMIT" | "API_ERROR" | "EXTRACTION_FAILED" | "GENERATION_FAILED" | "WRITE_ERROR" | "PARSE_ERROR" | "TIMEOUT";
|
|
2
|
+
export declare class AgentsSyncError extends Error {
|
|
3
|
+
readonly code: ErrorCode;
|
|
4
|
+
readonly hint?: string | undefined;
|
|
5
|
+
constructor(code: ErrorCode, message: string, hint?: string | undefined);
|
|
6
|
+
format(): string;
|
|
7
|
+
}
|
|
8
|
+
export declare function isAgentsSyncError(e: unknown): e is AgentsSyncError;
|
|
9
|
+
export declare function toMcpError(e: unknown): string;
|
|
10
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GACjB,iBAAiB,GACjB,sBAAsB,GACtB,aAAa,GACb,YAAY,GACZ,WAAW,GACX,mBAAmB,GACnB,mBAAmB,GACnB,aAAa,GACb,aAAa,GACb,SAAS,CAAC;AAEd,qBAAa,eAAgB,SAAQ,KAAK;aAEtB,IAAI,EAAE,SAAS;aAEf,IAAI,CAAC,EAAE,MAAM;gBAFb,IAAI,EAAE,SAAS,EAC/B,OAAO,EAAE,MAAM,EACC,IAAI,CAAC,EAAE,MAAM,YAAA;IAM/B,MAAM,IAAI,MAAM;CAKjB;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,eAAe,CAElE;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAI7C"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export class AgentsSyncError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
hint;
|
|
4
|
+
constructor(code, message, hint) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.code = code;
|
|
7
|
+
this.hint = hint;
|
|
8
|
+
this.name = "AgentsSyncError";
|
|
9
|
+
}
|
|
10
|
+
format() {
|
|
11
|
+
const lines = [`[${this.code}] ${this.message}`];
|
|
12
|
+
if (this.hint)
|
|
13
|
+
lines.push(` → ${this.hint}`);
|
|
14
|
+
return lines.join("\n");
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export function isAgentsSyncError(e) {
|
|
18
|
+
return e instanceof AgentsSyncError;
|
|
19
|
+
}
|
|
20
|
+
export function toMcpError(e) {
|
|
21
|
+
if (e instanceof AgentsSyncError)
|
|
22
|
+
return e.format();
|
|
23
|
+
if (e instanceof Error)
|
|
24
|
+
return e.message;
|
|
25
|
+
return String(e);
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAEtB;IAEA;IAHlB,YACkB,IAAe,EAC/B,OAAe,EACC,IAAa;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,SAAI,GAAJ,IAAI,CAAW;QAEf,SAAI,GAAJ,IAAI,CAAS;QAG7B,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;IAED,MAAM;QACJ,MAAM,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACjD,IAAI,IAAI,CAAC,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CACF;AAED,MAAM,UAAU,iBAAiB,CAAC,CAAU;IAC1C,OAAO,CAAC,YAAY,eAAe,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,CAAU;IACnC,IAAI,CAAC,YAAY,eAAe;QAAE,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;IACpD,IAAI,CAAC,YAAY,KAAK;QAAE,OAAO,CAAC,CAAC,OAAO,CAAC;IACzC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function readFileSafe(filePath: string): Promise<string | null>;
|
|
2
|
+
export declare function writeFileAtomic(filePath: string, content: string): Promise<void>;
|
|
3
|
+
export declare function dirExists(p: string): Promise<boolean>;
|
|
4
|
+
export declare function fileExists(p: string): Promise<boolean>;
|
|
5
|
+
export declare function assertAbsolutePath(p: string): void;
|
|
6
|
+
export declare function assertProjectDir(p: string): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=file-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-utils.d.ts","sourceRoot":"","sources":["../../src/lib/file-utils.ts"],"names":[],"mappings":"AAIA,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAM3E;AAED,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CActF;AAED,wBAAsB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO3D;AAED,wBAAsB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO5D;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAQlD;AAED,wBAAsB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS/D"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { AgentsSyncError } from "./errors.js";
|
|
4
|
+
export async function readFileSafe(filePath) {
|
|
5
|
+
try {
|
|
6
|
+
return await fs.readFile(filePath, "utf-8");
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export async function writeFileAtomic(filePath, content) {
|
|
13
|
+
const tmp = filePath + ".agents-sync.tmp";
|
|
14
|
+
try {
|
|
15
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
16
|
+
await fs.writeFile(tmp, content, "utf-8");
|
|
17
|
+
await fs.rename(tmp, filePath);
|
|
18
|
+
}
|
|
19
|
+
catch (e) {
|
|
20
|
+
try {
|
|
21
|
+
await fs.unlink(tmp);
|
|
22
|
+
}
|
|
23
|
+
catch { /* ignore */ }
|
|
24
|
+
throw new AgentsSyncError("WRITE_ERROR", `Cannot write to ${filePath}: ${e.message}`, "Check file permissions and disk space.");
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export async function dirExists(p) {
|
|
28
|
+
try {
|
|
29
|
+
const stat = await fs.stat(p);
|
|
30
|
+
return stat.isDirectory();
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export async function fileExists(p) {
|
|
37
|
+
try {
|
|
38
|
+
await fs.stat(p);
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export function assertAbsolutePath(p) {
|
|
46
|
+
if (!path.isAbsolute(p)) {
|
|
47
|
+
throw new AgentsSyncError("INVALID_PROJECT_PATH", `Path must be absolute: ${p}`, "Pass the full path, e.g. /Users/you/my-project");
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export async function assertProjectDir(p) {
|
|
51
|
+
assertAbsolutePath(p);
|
|
52
|
+
if (!(await dirExists(p))) {
|
|
53
|
+
throw new AgentsSyncError("INVALID_PROJECT_PATH", `Project path not found: ${p}`, "Make sure the directory exists and the path is correct.");
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=file-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../src/lib/file-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,OAAe;IACrE,MAAM,GAAG,GAAG,QAAQ,GAAG,kBAAkB,CAAC;IAC1C,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1C,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC;YAAC,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACpD,MAAM,IAAI,eAAe,CACvB,aAAa,EACb,mBAAmB,QAAQ,KAAM,CAAW,CAAC,OAAO,EAAE,EACtD,wCAAwC,CACzC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,CAAS;IACvC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,CAAS;IACxC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,CAAS;IAC1C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,eAAe,CACvB,sBAAsB,EACtB,0BAA0B,CAAC,EAAE,EAC7B,gDAAgD,CACjD,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,CAAS;IAC9C,kBAAkB,CAAC,CAAC,CAAC,CAAC;IACtB,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,eAAe,CACvB,sBAAsB,EACtB,2BAA2B,CAAC,EAAE,EAC9B,yDAAyD,CAC1D,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Rough token estimate: ~4 chars per token for code */
|
|
2
|
+
export declare function estimateTokens(text: string): number;
|
|
3
|
+
export declare function truncateToTokenBudget(text: string, maxTokens: number): {
|
|
4
|
+
text: string;
|
|
5
|
+
truncated: boolean;
|
|
6
|
+
};
|
|
7
|
+
//# sourceMappingURL=token-estimate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-estimate.d.ts","sourceRoot":"","sources":["../../src/lib/token-estimate.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAChB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAStC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Rough token estimate: ~4 chars per token for code */
|
|
2
|
+
export function estimateTokens(text) {
|
|
3
|
+
return Math.ceil(text.length / 4);
|
|
4
|
+
}
|
|
5
|
+
export function truncateToTokenBudget(text, maxTokens) {
|
|
6
|
+
const estimated = estimateTokens(text);
|
|
7
|
+
if (estimated <= maxTokens)
|
|
8
|
+
return { text, truncated: false };
|
|
9
|
+
const maxChars = maxTokens * 4;
|
|
10
|
+
return {
|
|
11
|
+
text: text.slice(0, maxChars) + `\n\n[... truncated at ~${maxTokens} tokens]`,
|
|
12
|
+
truncated: true,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=token-estimate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-estimate.js","sourceRoot":"","sources":["../../src/lib/token-estimate.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,IAAY,EACZ,SAAiB;IAEjB,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,SAAS,IAAI,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAE9D,MAAM,QAAQ,GAAG,SAAS,GAAG,CAAC,CAAC;IAC/B,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,0BAA0B,SAAS,UAAU;QAC7E,SAAS,EAAE,IAAI;KAChB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface CodegraphSummary {
|
|
2
|
+
available: boolean;
|
|
3
|
+
communities: CodegraphCommunity[];
|
|
4
|
+
hubNodes: string[];
|
|
5
|
+
entryPoints: string[];
|
|
6
|
+
}
|
|
7
|
+
export interface CodegraphCommunity {
|
|
8
|
+
name: string;
|
|
9
|
+
files: string[];
|
|
10
|
+
}
|
|
11
|
+
export declare function readCodegraphIndex(projectPath: string): Promise<CodegraphSummary>;
|
|
12
|
+
export declare function formatCodegraphContext(summary: CodegraphSummary): string;
|
|
13
|
+
//# sourceMappingURL=codegraph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codegraph.d.ts","sourceRoot":"","sources":["../../src/scanner/codegraph.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,kBAAkB,EAAE,CAAC;IAClC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAcD,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAqCvF;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAuBxE"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* codegraph scanner
|
|
3
|
+
*
|
|
4
|
+
* Reads .codegraph/index.json (if present) and returns a lightweight summary
|
|
5
|
+
* of community clusters + hub nodes that can be injected into the corpus.
|
|
6
|
+
* This enriches AGENTS.md with evidence-backed architecture notes.
|
|
7
|
+
*
|
|
8
|
+
* Gracefully no-ops when .codegraph/ is absent — works without codegraph.
|
|
9
|
+
*/
|
|
10
|
+
import path from "node:path";
|
|
11
|
+
import fs from "node:fs/promises";
|
|
12
|
+
export async function readCodegraphIndex(projectPath) {
|
|
13
|
+
const candidates = [
|
|
14
|
+
path.join(projectPath, ".codegraph", "index.json"),
|
|
15
|
+
path.join(projectPath, ".codegraph", "graph.json"),
|
|
16
|
+
path.join(projectPath, "codegraph.json"),
|
|
17
|
+
];
|
|
18
|
+
for (const candidate of candidates) {
|
|
19
|
+
const raw = await fs.readFile(candidate, "utf-8").catch(() => null);
|
|
20
|
+
if (!raw)
|
|
21
|
+
continue;
|
|
22
|
+
let parsed;
|
|
23
|
+
try {
|
|
24
|
+
parsed = JSON.parse(raw);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
const communities = (parsed.communities ?? []).slice(0, 8).map((c) => ({
|
|
30
|
+
name: c.label ?? c.name ?? "unnamed",
|
|
31
|
+
files: (c.files ?? c.nodes?.map((n) => n.file ?? n.path ?? "").filter(Boolean) ?? []).slice(0, 5),
|
|
32
|
+
}));
|
|
33
|
+
const hubNodes = (parsed.hubNodes ?? parsed.nodes?.filter((n) => (n.hubScore ?? 0) > 0.5) ?? [])
|
|
34
|
+
.slice(0, 10)
|
|
35
|
+
.map((n) => n.file ?? n.path ?? n.name ?? "")
|
|
36
|
+
.filter(Boolean);
|
|
37
|
+
const entryPoints = (parsed.entryPoints ?? parsed.nodes?.filter((n) => n.isEntry) ?? [])
|
|
38
|
+
.slice(0, 8)
|
|
39
|
+
.map((n) => n.file ?? n.path ?? "")
|
|
40
|
+
.filter(Boolean);
|
|
41
|
+
return { available: true, communities, hubNodes, entryPoints };
|
|
42
|
+
}
|
|
43
|
+
return { available: false, communities: [], hubNodes: [], entryPoints: [] };
|
|
44
|
+
}
|
|
45
|
+
export function formatCodegraphContext(summary) {
|
|
46
|
+
if (!summary.available)
|
|
47
|
+
return "";
|
|
48
|
+
const lines = ["## Code Graph (from .codegraph/)"];
|
|
49
|
+
if (summary.communities.length > 0) {
|
|
50
|
+
lines.push("\n### Architecture clusters");
|
|
51
|
+
for (const c of summary.communities) {
|
|
52
|
+
lines.push(`- **${c.name}**: ${c.files.join(", ")}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (summary.hubNodes.length > 0) {
|
|
56
|
+
lines.push("\n### High-connectivity files (call hubs)");
|
|
57
|
+
lines.push(summary.hubNodes.map((n) => `- ${n}`).join("\n"));
|
|
58
|
+
}
|
|
59
|
+
if (summary.entryPoints.length > 0) {
|
|
60
|
+
lines.push("\n### Entry points");
|
|
61
|
+
lines.push(summary.entryPoints.map((n) => `- ${n}`).join("\n"));
|
|
62
|
+
}
|
|
63
|
+
return lines.join("\n");
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=codegraph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codegraph.js","sourceRoot":"","sources":["../../src/scanner/codegraph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface DocData {
|
|
2
|
+
readme: string | null;
|
|
3
|
+
contributing: string | null;
|
|
4
|
+
architecture: string | null;
|
|
5
|
+
existingAgentsMd: string | null;
|
|
6
|
+
existingClaudeMd: string | null;
|
|
7
|
+
existingCursorRules: string | null;
|
|
8
|
+
hasExistingClaudeMd: boolean;
|
|
9
|
+
hasExistingAgentsMd: boolean;
|
|
10
|
+
totalTokens: number;
|
|
11
|
+
}
|
|
12
|
+
export declare function scanDocs(projectPath: string): Promise<DocData>;
|
|
13
|
+
//# sourceMappingURL=docs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../src/scanner/docs.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;CACrB;AAyCD,wBAAsB,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAkCpE"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { readFileSafe } from "../lib/file-utils.js";
|
|
3
|
+
import { estimateTokens, truncateToTokenBudget } from "../lib/token-estimate.js";
|
|
4
|
+
const DOC_SPECS = [
|
|
5
|
+
{ field: "existingAgentsMd", candidates: ["AGENTS.md"], budget: 3000 },
|
|
6
|
+
{ field: "existingClaudeMd", candidates: ["CLAUDE.md"], budget: 2000 },
|
|
7
|
+
{ field: "readme", candidates: ["README.md", "readme.md", "README.rst"], budget: 2500 },
|
|
8
|
+
{ field: "contributing", candidates: ["CONTRIBUTING.md", "contributing.md"], budget: 1000 },
|
|
9
|
+
{
|
|
10
|
+
field: "architecture",
|
|
11
|
+
candidates: [
|
|
12
|
+
"ARCHITECTURE.md",
|
|
13
|
+
"architecture.md",
|
|
14
|
+
"docs/ARCHITECTURE.md",
|
|
15
|
+
"docs/architecture.md",
|
|
16
|
+
],
|
|
17
|
+
budget: 1500,
|
|
18
|
+
},
|
|
19
|
+
{ field: "existingCursorRules", candidates: [".cursorrules"], budget: 500 },
|
|
20
|
+
];
|
|
21
|
+
async function readFirstMatch(projectPath, candidates, budget) {
|
|
22
|
+
for (const candidate of candidates) {
|
|
23
|
+
const raw = await readFileSafe(path.join(projectPath, candidate));
|
|
24
|
+
if (raw !== null) {
|
|
25
|
+
const { text } = truncateToTokenBudget(raw, budget);
|
|
26
|
+
return text;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
export async function scanDocs(projectPath) {
|
|
32
|
+
const result = {
|
|
33
|
+
readme: null,
|
|
34
|
+
contributing: null,
|
|
35
|
+
architecture: null,
|
|
36
|
+
existingAgentsMd: null,
|
|
37
|
+
existingClaudeMd: null,
|
|
38
|
+
existingCursorRules: null,
|
|
39
|
+
hasExistingClaudeMd: false,
|
|
40
|
+
hasExistingAgentsMd: false,
|
|
41
|
+
totalTokens: 0,
|
|
42
|
+
};
|
|
43
|
+
for (const spec of DOC_SPECS) {
|
|
44
|
+
try {
|
|
45
|
+
const content = await readFirstMatch(projectPath, spec.candidates, spec.budget);
|
|
46
|
+
result[spec.field] = content;
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// leave null
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
result.hasExistingClaudeMd = result.existingClaudeMd !== null;
|
|
53
|
+
result.hasExistingAgentsMd = result.existingAgentsMd !== null;
|
|
54
|
+
result.totalTokens =
|
|
55
|
+
estimateTokens(result.readme ?? "") +
|
|
56
|
+
estimateTokens(result.contributing ?? "") +
|
|
57
|
+
estimateTokens(result.architecture ?? "") +
|
|
58
|
+
estimateTokens(result.existingAgentsMd ?? "") +
|
|
59
|
+
estimateTokens(result.existingClaudeMd ?? "") +
|
|
60
|
+
estimateTokens(result.existingCursorRules ?? "");
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=docs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/scanner/docs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface Gotcha {
|
|
2
|
+
file: string;
|
|
3
|
+
line: number;
|
|
4
|
+
type: "HACK" | "FIXME" | "WARNING" | "IMPORTANT" | "TODO" | "NOTE";
|
|
5
|
+
comment: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function scanGotchas(projectPath: string, maxResults?: number): Promise<Gotcha[]>;
|
|
8
|
+
//# sourceMappingURL=gotchas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gotchas.d.ts","sourceRoot":"","sources":["../../src/scanner/gotchas.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC;IACnE,OAAO,EAAE,MAAM,CAAC;CACjB;AAmDD,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,UAAU,SAAK,GACd,OAAO,CAAC,MAAM,EAAE,CAAC,CA6DnB"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import fg from "fast-glob";
|
|
3
|
+
import { readFileSafe } from "../lib/file-utils.js";
|
|
4
|
+
const IGNORE_PATTERNS = [
|
|
5
|
+
"**/node_modules/**",
|
|
6
|
+
"**/.git/**",
|
|
7
|
+
"**/dist/**",
|
|
8
|
+
"**/build/**",
|
|
9
|
+
"**/__pycache__/**",
|
|
10
|
+
"**/.venv/**",
|
|
11
|
+
"**/target/**",
|
|
12
|
+
"**/.next/**",
|
|
13
|
+
"**/coverage/**",
|
|
14
|
+
"**/.cache/**",
|
|
15
|
+
"**/*.min.js",
|
|
16
|
+
"**/*.gen.*",
|
|
17
|
+
"**/*.d.ts",
|
|
18
|
+
"**/package-lock.json",
|
|
19
|
+
"**/yarn.lock",
|
|
20
|
+
"**/pnpm-lock.yaml",
|
|
21
|
+
"**/Cargo.lock",
|
|
22
|
+
"**/poetry.lock",
|
|
23
|
+
];
|
|
24
|
+
const TYPE_RANK = {
|
|
25
|
+
HACK: 0,
|
|
26
|
+
FIXME: 1,
|
|
27
|
+
WARNING: 2,
|
|
28
|
+
IMPORTANT: 3,
|
|
29
|
+
TODO: 4,
|
|
30
|
+
NOTE: 5,
|
|
31
|
+
};
|
|
32
|
+
// Regex to match keyword and capture everything after it on the line
|
|
33
|
+
const GOTCHA_REGEX = /\b(HACK|FIXME|WARNING|IMPORTANT|TODO|NOTE)\b[:\s]*(.*)/i;
|
|
34
|
+
function extractComment(rawMatch) {
|
|
35
|
+
// Remove leading comment markers: //, #, *, /*, etc.
|
|
36
|
+
return rawMatch
|
|
37
|
+
.replace(/^[/*#\s]+/, "")
|
|
38
|
+
.replace(/\*\/$/, "")
|
|
39
|
+
.trim();
|
|
40
|
+
}
|
|
41
|
+
function isBinary(content) {
|
|
42
|
+
const probe = content.slice(0, 512);
|
|
43
|
+
return probe.includes("\0");
|
|
44
|
+
}
|
|
45
|
+
export async function scanGotchas(projectPath, maxResults = 20) {
|
|
46
|
+
try {
|
|
47
|
+
const files = await fg("**/*", {
|
|
48
|
+
cwd: projectPath,
|
|
49
|
+
onlyFiles: true,
|
|
50
|
+
ignore: IGNORE_PATTERNS,
|
|
51
|
+
dot: false,
|
|
52
|
+
});
|
|
53
|
+
const found = [];
|
|
54
|
+
const seenComments = new Map(); // text → count
|
|
55
|
+
for (const relPath of files) {
|
|
56
|
+
const absPath = path.join(projectPath, relPath);
|
|
57
|
+
const raw = await readFileSafe(absPath);
|
|
58
|
+
if (!raw)
|
|
59
|
+
continue;
|
|
60
|
+
if (isBinary(raw))
|
|
61
|
+
continue;
|
|
62
|
+
const lines = raw.split("\n");
|
|
63
|
+
for (let i = 0; i < lines.length; i++) {
|
|
64
|
+
const line = lines[i];
|
|
65
|
+
const match = GOTCHA_REGEX.exec(line);
|
|
66
|
+
if (!match)
|
|
67
|
+
continue;
|
|
68
|
+
const type = match[1].toUpperCase();
|
|
69
|
+
const rawComment = match[2] ?? "";
|
|
70
|
+
const comment = extractComment(rawComment);
|
|
71
|
+
if (!comment)
|
|
72
|
+
continue;
|
|
73
|
+
const count = (seenComments.get(comment) ?? 0) + 1;
|
|
74
|
+
seenComments.set(comment, count);
|
|
75
|
+
// Deduplicate: if same text seen 3+ times, skip subsequent occurrences
|
|
76
|
+
if (count >= 3 && count > 1) {
|
|
77
|
+
if (count > 3)
|
|
78
|
+
continue;
|
|
79
|
+
// Keep the first occurrence (count=1 already added), skip count 2+
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (count === 2)
|
|
83
|
+
continue;
|
|
84
|
+
found.push({
|
|
85
|
+
file: relPath,
|
|
86
|
+
line: i + 1,
|
|
87
|
+
type,
|
|
88
|
+
comment,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Sort by rank (HACK first, NOTE last), then by file/line for stable order
|
|
93
|
+
found.sort((a, b) => {
|
|
94
|
+
const rankDiff = TYPE_RANK[a.type] - TYPE_RANK[b.type];
|
|
95
|
+
if (rankDiff !== 0)
|
|
96
|
+
return rankDiff;
|
|
97
|
+
if (a.file !== b.file)
|
|
98
|
+
return a.file.localeCompare(b.file);
|
|
99
|
+
return a.line - b.line;
|
|
100
|
+
});
|
|
101
|
+
return found.slice(0, maxResults);
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return [];
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=gotchas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gotchas.js","sourceRoot":"","sources":["../../src/scanner/gotchas.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,WAAW,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AASpD,MAAM,eAAe,GAAG;IACtB,oBAAoB;IACpB,YAAY;IACZ,YAAY;IACZ,aAAa;IACb,mBAAmB;IACnB,aAAa;IACb,cAAc;IACd,aAAa;IACb,gBAAgB;IAChB,cAAc;IACd,aAAa;IACb,YAAY;IACZ,WAAW;IACX,sBAAsB;IACtB,cAAc;IACd,mBAAmB;IACnB,eAAe;IACf,gBAAgB;CACjB,CAAC;AAIF,MAAM,SAAS,GAA+B;IAC5C,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,OAAO,EAAE,CAAC;IACV,SAAS,EAAE,CAAC;IACZ,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;CACR,CAAC;AAEF,qEAAqE;AACrE,MAAM,YAAY,GAChB,yDAAyD,CAAC;AAE5D,SAAS,cAAc,CAAC,QAAgB;IACtC,qDAAqD;IACrD,OAAO,QAAQ;SACZ,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;SACxB,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;SACpB,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,QAAQ,CAAC,OAAe;IAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACpC,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,WAAmB,EACnB,UAAU,GAAG,EAAE;IAEf,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,MAAM,EAAE;YAC7B,GAAG,EAAE,WAAW;YAChB,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,eAAe;YACvB,GAAG,EAAE,KAAK;SACX,CAAC,CAAC;QAEH,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,eAAe;QAE/D,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAChD,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;YACxC,IAAI,CAAC,GAAG;gBAAE,SAAS;YACnB,IAAI,QAAQ,CAAC,GAAG,CAAC;gBAAE,SAAS;YAE5B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACtB,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACtC,IAAI,CAAC,KAAK;oBAAE,SAAS;gBAErB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAgB,CAAC;gBAClD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAClC,MAAM,OAAO,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;gBAC3C,IAAI,CAAC,OAAO;oBAAE,SAAS;gBAEvB,MAAM,KAAK,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBACnD,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBAEjC,uEAAuE;gBACvE,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;oBAC5B,IAAI,KAAK,GAAG,CAAC;wBAAE,SAAS;oBACxB,mEAAmE;oBACnE,SAAS;gBACX,CAAC;gBACD,IAAI,KAAK,KAAK,CAAC;oBAAE,SAAS;gBAE1B,KAAK,CAAC,IAAI,CAAC;oBACT,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,CAAC,GAAG,CAAC;oBACX,IAAI;oBACJ,OAAO;iBACR,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,2EAA2E;QAC3E,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAClB,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACvD,IAAI,QAAQ,KAAK,CAAC;gBAAE,OAAO,QAAQ,CAAC;YACpC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;gBAAE,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC3D,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type ManifestData } from "./manifest.js";
|
|
2
|
+
import { type StructureData } from "./structure.js";
|
|
3
|
+
import { type SourceData } from "./source.js";
|
|
4
|
+
import { type DocData } from "./docs.js";
|
|
5
|
+
import { type Gotcha } from "./gotchas.js";
|
|
6
|
+
import { type CodegraphSummary } from "./codegraph.js";
|
|
7
|
+
import { type McpScanResult } from "./mcp.js";
|
|
8
|
+
export type { ManifestData, StructureData, SourceData, DocData, Gotcha };
|
|
9
|
+
export type { CodegraphSummary, McpScanResult };
|
|
10
|
+
export interface RawCorpus {
|
|
11
|
+
manifest: ManifestData;
|
|
12
|
+
structure: StructureData;
|
|
13
|
+
source: SourceData;
|
|
14
|
+
docs: DocData;
|
|
15
|
+
gotchas: Gotcha[];
|
|
16
|
+
codegraph: CodegraphSummary;
|
|
17
|
+
mcp: McpScanResult;
|
|
18
|
+
totalEstimatedTokens: number;
|
|
19
|
+
scanDurationMs: number;
|
|
20
|
+
}
|
|
21
|
+
export interface ScanOptions {
|
|
22
|
+
/** Path to a repomix output file. When provided, replaces filesystem source sampling. */
|
|
23
|
+
repomixPath?: string;
|
|
24
|
+
}
|
|
25
|
+
export declare function scan(projectPath: string, options?: ScanOptions): Promise<RawCorpus>;
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAY,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAe,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAExD,OAAO,EAAsB,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9D,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AACzE,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,CAAC;AAEhD,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,YAAY,CAAC;IACvB,SAAS,EAAE,aAAa,CAAC;IACzB,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,gBAAgB,CAAC;IAC5B,GAAG,EAAE,aAAa,CAAC;IACnB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;CACxB;AAuDD,MAAM,WAAW,WAAW;IAC1B,yFAAyF;IACzF,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,SAAS,CAAC,CAkD7F"}
|