@kanchingyg/repomcp 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +114 -2
  3. package/SKILL.md +10 -0
  4. package/dist/adapters/api-routes.d.ts +31 -0
  5. package/dist/adapters/api-routes.d.ts.map +1 -0
  6. package/dist/adapters/api-routes.js +680 -0
  7. package/dist/adapters/api-routes.js.map +1 -0
  8. package/dist/adapters/cli-crawler.d.ts +28 -0
  9. package/dist/adapters/cli-crawler.d.ts.map +1 -0
  10. package/dist/adapters/cli-crawler.js +467 -0
  11. package/dist/adapters/cli-crawler.js.map +1 -0
  12. package/dist/adapters/data-sources.d.ts +6 -0
  13. package/dist/adapters/data-sources.d.ts.map +1 -0
  14. package/dist/adapters/data-sources.js +672 -0
  15. package/dist/adapters/data-sources.js.map +1 -0
  16. package/dist/adapters/docs-bm25.d.ts +50 -0
  17. package/dist/adapters/docs-bm25.d.ts.map +1 -0
  18. package/dist/adapters/docs-bm25.js +484 -0
  19. package/dist/adapters/docs-bm25.js.map +1 -0
  20. package/dist/adapters/index.d.ts +18 -0
  21. package/dist/adapters/index.d.ts.map +1 -0
  22. package/dist/adapters/index.js +66 -0
  23. package/dist/adapters/index.js.map +1 -0
  24. package/dist/adapters/polyglot-code.d.ts +65 -0
  25. package/dist/adapters/polyglot-code.d.ts.map +1 -0
  26. package/dist/adapters/polyglot-code.js +691 -0
  27. package/dist/adapters/polyglot-code.js.map +1 -0
  28. package/dist/adapters/remote-target.d.ts +30 -0
  29. package/dist/adapters/remote-target.d.ts.map +1 -0
  30. package/dist/adapters/remote-target.js +559 -0
  31. package/dist/adapters/remote-target.js.map +1 -0
  32. package/dist/adapters/task-runners.d.ts +8 -0
  33. package/dist/adapters/task-runners.d.ts.map +1 -0
  34. package/dist/adapters/task-runners.js +468 -0
  35. package/dist/adapters/task-runners.js.map +1 -0
  36. package/dist/adapters/types.d.ts +9 -0
  37. package/dist/adapters/types.d.ts.map +1 -0
  38. package/dist/adapters/types.js +21 -0
  39. package/dist/adapters/types.js.map +1 -0
  40. package/dist/bridge.d.ts +136 -0
  41. package/dist/bridge.d.ts.map +1 -0
  42. package/dist/bridge.js +488 -0
  43. package/dist/bridge.js.map +1 -0
  44. package/dist/checkpoints.d.ts +41 -0
  45. package/dist/checkpoints.d.ts.map +1 -0
  46. package/dist/checkpoints.js +208 -0
  47. package/dist/checkpoints.js.map +1 -0
  48. package/dist/cli.d.ts +3 -0
  49. package/dist/cli.d.ts.map +1 -0
  50. package/dist/cli.js +124 -0
  51. package/dist/cli.js.map +1 -0
  52. package/dist/dirty-parser.d.ts +10 -0
  53. package/dist/dirty-parser.d.ts.map +1 -0
  54. package/dist/dirty-parser.js +220 -0
  55. package/dist/dirty-parser.js.map +1 -0
  56. package/dist/harnesses.d.ts +74 -0
  57. package/dist/harnesses.d.ts.map +1 -0
  58. package/dist/harnesses.js +204 -0
  59. package/dist/harnesses.js.map +1 -0
  60. package/dist/introspect.d.ts +18 -0
  61. package/dist/introspect.d.ts.map +1 -0
  62. package/dist/introspect.js +125 -0
  63. package/dist/introspect.js.map +1 -0
  64. package/dist/path-containment.d.ts +2 -0
  65. package/dist/path-containment.d.ts.map +1 -0
  66. package/dist/path-containment.js +20 -0
  67. package/dist/path-containment.js.map +1 -0
  68. package/dist/providers.d.ts +17 -0
  69. package/dist/providers.d.ts.map +1 -0
  70. package/dist/providers.js +127 -0
  71. package/dist/providers.js.map +1 -0
  72. package/dist/types.d.ts +58 -0
  73. package/dist/types.d.ts.map +1 -0
  74. package/dist/types.js +2 -0
  75. package/dist/types.js.map +1 -0
  76. package/jsr.json +24 -0
  77. package/package.json +57 -4
@@ -0,0 +1,74 @@
1
+ import type { InitOptions, RepomcpTool } from "./types.js";
2
+ export type { InitOptions } from "./types.js";
3
+ export declare function generatePiMcpJson(opts: InitOptions): {
4
+ mcpServers: {
5
+ [opts.serverName]: {
6
+ command: string;
7
+ args: string[];
8
+ };
9
+ };
10
+ };
11
+ export declare function generatePiExtension(opts: InitOptions): string;
12
+ /** Executes `emitOmpHostToolsFrame` to emit omp host tools frame in `repomcp`. */
13
+ export declare function emitOmpHostToolsFrame(id: string, tools: RepomcpTool[]): string;
14
+ export declare function generateOmpSkillMd(opts: InitOptions): string;
15
+ export declare function generateHermesYamlBlock(opts: InitOptions): string;
16
+ export declare function generateCcSwitchSkill(opts: InitOptions): string;
17
+ export declare function generateClaudeMcpJson(opts: InitOptions): {
18
+ mcpServers: {
19
+ [opts.serverName]: {
20
+ command: string;
21
+ args: string[];
22
+ };
23
+ };
24
+ };
25
+ export declare function generateKiloMcpJson(opts: InitOptions): {
26
+ mcpServers: {
27
+ [opts.serverName]: {
28
+ command: string;
29
+ args: string[];
30
+ };
31
+ };
32
+ codebaseIndexing: {
33
+ embeddingsProvider: string;
34
+ openAiCompatible: {
35
+ baseUrl: string;
36
+ apiKey: string;
37
+ modelId: string;
38
+ options: {
39
+ dimensions: number;
40
+ };
41
+ };
42
+ embeddingBatchSize: number;
43
+ };
44
+ };
45
+ export declare function generateCursorMcpJson(opts: InitOptions): {
46
+ mcpServers: {
47
+ [opts.serverName]: {
48
+ command: string;
49
+ args: string[];
50
+ };
51
+ };
52
+ };
53
+ export declare function generateRooMcpJson(opts: InitOptions): {
54
+ mcpServers: {
55
+ [opts.serverName]: {
56
+ command: string;
57
+ args: string[];
58
+ };
59
+ };
60
+ };
61
+ export declare function generateClineMcpJson(opts: InitOptions): {
62
+ mcpServers: {
63
+ [opts.serverName]: {
64
+ command: string;
65
+ args: string[];
66
+ };
67
+ };
68
+ };
69
+ export declare function generateOpenCodeMcpJson(opts: InitOptions): Record<string, unknown>;
70
+ /** Configuration and data shape for `HarnessTarget` (harness target). */
71
+ export type HarnessTarget = "pi" | "omp" | "hermes" | "cc-switch" | "claude" | "kilo" | "roo" | "cline" | "opencode" | "cursor";
72
+ /** Executes `initHarness` to init harness in `repomcp`. */
73
+ export declare function initHarness(target: HarnessTarget | "all" | string, opts: InitOptions): string[];
74
+ //# sourceMappingURL=harnesses.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harnesses.d.ts","sourceRoot":"","sources":["../src/harnesses.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE3D,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAU9C,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW;;QAGvC,CAAC,IAAI,CAAC,UAAU,CAAC;;;UAGhB;;EAGZ;AACD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAwB7D;AACD,kFAAkF;AAClF,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CAiB9E;AACD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAS5D;AACD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CASjE;AACD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAS/D;AACD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,WAAW;;QAjF3C,CAAC,IAAI,CAAC,UAAU,CAAC;;;UAGhB;;EAgFZ;AACD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,WAAW;;QAIzC,CAAC,IAAI,CAAC,UAAU,CAAC;;;UAGhB;;;;;;;;;;;;;;EAaZ;AACD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,WAAW;;QAG3C,CAAC,IAAI,CAAC,UAAU,CAAC;;;UAGhB;;EAGZ;AACD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,WAAW;;QAPxC,CAAC,IAAI,CAAC,UAAU,CAAC;;;UAGhB;;EAMZ;AACD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,WAAW;;QAG1C,CAAC,IAAI,CAAC,UAAU,CAAC;;;UAGhB;;EAGZ;AACD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAElF;AACD,yEAAyE;AACzE,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,KAAK,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,UAAU,GAAG,QAAQ,CAAC;AAiDhI,2DAA2D;AAC3D,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,KAAK,GAAG,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,MAAM,EAAE,CAU/F"}
@@ -0,0 +1,204 @@
1
+ import { writeFileSync, mkdirSync, existsSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ function ensureDir(p) {
4
+ if (!existsSync(p))
5
+ mkdirSync(p, { recursive: true });
6
+ }
7
+ function tier1Description(text) {
8
+ const first = text.split(/[.!?]/)[0]?.trim() ?? text;
9
+ return first.length <= 60 ? first : first.slice(0, 57) + "...";
10
+ }
11
+ export function generatePiMcpJson(opts) {
12
+ return {
13
+ mcpServers: {
14
+ [opts.serverName]: {
15
+ command: opts.command,
16
+ args: [...opts.args, "--mcp"],
17
+ },
18
+ },
19
+ };
20
+ }
21
+ export function generatePiExtension(opts) {
22
+ return `/** Pi extension - register MCP server on session_start */
23
+ export default function register(pi: {
24
+ on: (ev: string, fn: () => void) => void;
25
+ registerMcpServer: (name: string, cfg: object) => void;
26
+ }) {
27
+ pi.on("session_start", () => {
28
+ pi.registerMcpServer("${opts.serverName}", {
29
+ command: "${opts.command}",
30
+ args: ${JSON.stringify([...opts.args, "--mcp"])},
31
+ exposure: "codemode",
32
+ toolExposure: "discoverable",
33
+ });
34
+ });
35
+ pi.on("mcp_servers_change", () => {
36
+ pi.registerMcpServer("${opts.serverName}", {
37
+ command: "${opts.command}",
38
+ args: ${JSON.stringify([...opts.args, "--mcp"])},
39
+ exposure: "codemode",
40
+ toolExposure: "discoverable",
41
+ });
42
+ });
43
+ }
44
+ `;
45
+ }
46
+ /** Executes `emitOmpHostToolsFrame` to emit omp host tools frame in `repomcp`. */
47
+ export function emitOmpHostToolsFrame(id, tools) {
48
+ const payload = {
49
+ id,
50
+ type: "set_host_tools",
51
+ tools: tools.map((t) => ({
52
+ name: t.name,
53
+ label: t.name.replace(/_/g, " "),
54
+ description: tier1Description(t.description),
55
+ loadMode: "essential",
56
+ readsSkillUris: true,
57
+ parameters: {
58
+ ...t.inputSchema,
59
+ additionalProperties: t.inputSchema.additionalProperties ?? false,
60
+ },
61
+ })),
62
+ };
63
+ return JSON.stringify(payload) + "\n";
64
+ }
65
+ export function generateOmpSkillMd(opts) {
66
+ return `---
67
+ name: ${opts.serverName}
68
+ description: ${tier1Description(`MCP tools for ${opts.serverName}`)}
69
+ ---
70
+ # ${opts.serverName}
71
+
72
+ Repo MCP tools via repomcp.
73
+ `;
74
+ }
75
+ export function generateHermesYamlBlock(opts) {
76
+ const lines = [
77
+ ` ${opts.serverName}:`,
78
+ ` command: ${opts.command}`,
79
+ ` args:`,
80
+ ...opts.args.map((a) => ` - ${JSON.stringify(a)}`),
81
+ ` - "--mcp"`,
82
+ ];
83
+ return lines.join("\n");
84
+ }
85
+ export function generateCcSwitchSkill(opts) {
86
+ return `---
87
+ name: ${opts.serverName}
88
+ description: ${tier1Description(opts.serverName + " MCP bridge")}
89
+ ---
90
+ # ${opts.serverName}
91
+
92
+ Synced via repomcp for cc-switch.
93
+ `;
94
+ }
95
+ export function generateClaudeMcpJson(opts) {
96
+ return generatePiMcpJson(opts);
97
+ }
98
+ export function generateKiloMcpJson(opts) {
99
+ const port = opts.embedPort ?? 11435;
100
+ return {
101
+ mcpServers: {
102
+ [opts.serverName]: {
103
+ command: opts.command,
104
+ args: [...opts.args, "--mcp"],
105
+ },
106
+ },
107
+ codebaseIndexing: {
108
+ embeddingsProvider: "openai-compatible",
109
+ openAiCompatible: {
110
+ baseUrl: `http://127.0.0.1:${port}/v1`,
111
+ apiKey: "repomcp",
112
+ modelId: "repomcp-normalized",
113
+ options: { dimensions: 1024 },
114
+ },
115
+ embeddingBatchSize: 60,
116
+ },
117
+ };
118
+ }
119
+ export function generateCursorMcpJson(opts) {
120
+ return {
121
+ mcpServers: {
122
+ [opts.serverName]: {
123
+ command: opts.command,
124
+ args: [...opts.args, "--mcp"],
125
+ },
126
+ },
127
+ };
128
+ }
129
+ export function generateRooMcpJson(opts) {
130
+ return generateCursorMcpJson(opts);
131
+ }
132
+ export function generateClineMcpJson(opts) {
133
+ return {
134
+ mcpServers: {
135
+ [opts.serverName]: {
136
+ command: opts.command,
137
+ args: [...opts.args, "--mcp"],
138
+ },
139
+ },
140
+ };
141
+ }
142
+ export function generateOpenCodeMcpJson(opts) {
143
+ return generateCursorMcpJson(opts);
144
+ }
145
+ const TARGET_WRITERS = {
146
+ pi: (opts, repoRoot) => {
147
+ const dir = join(repoRoot, ".pi");
148
+ ensureDir(dir);
149
+ writeFileSync(join(dir, "mcp.json"), JSON.stringify(generatePiMcpJson(opts), null, 2));
150
+ writeFileSync(join(dir, "register-mcp.ts"), generatePiExtension(opts));
151
+ },
152
+ omp: (opts, repoRoot) => {
153
+ const skillDir = join(repoRoot, ".omp", "skills", opts.serverName);
154
+ ensureDir(skillDir);
155
+ writeFileSync(join(skillDir, "SKILL.md"), generateOmpSkillMd(opts));
156
+ },
157
+ hermes: (_opts, repoRoot) => {
158
+ const snippet = join(repoRoot, ".repomcp", "hermes-mcp-snippet.yaml");
159
+ ensureDir(join(repoRoot, ".repomcp"));
160
+ writeFileSync(snippet, "# Paste under mcp_servers:\n" + generateHermesYamlBlock(_opts));
161
+ },
162
+ "cc-switch": (opts, repoRoot) => {
163
+ const skillDir = join(repoRoot, ".agents", "skills", opts.serverName);
164
+ ensureDir(skillDir);
165
+ writeFileSync(join(skillDir, "SKILL.md"), generateCcSwitchSkill(opts));
166
+ },
167
+ claude: (opts, repoRoot) => {
168
+ writeFileSync(join(repoRoot, ".mcp.json"), JSON.stringify(generateClaudeMcpJson(opts), null, 2));
169
+ },
170
+ kilo: (opts, repoRoot) => {
171
+ const dir = join(repoRoot, ".kilocode");
172
+ ensureDir(dir);
173
+ writeFileSync(join(dir, "mcp.json"), JSON.stringify(generateKiloMcpJson(opts), null, 2));
174
+ },
175
+ roo: (opts, repoRoot) => {
176
+ const dir = join(repoRoot, ".roo");
177
+ ensureDir(dir);
178
+ writeFileSync(join(dir, "mcp.json"), JSON.stringify(generateRooMcpJson(opts), null, 2));
179
+ },
180
+ cline: (opts, repoRoot) => {
181
+ writeFileSync(join(repoRoot, "cline_mcp_settings.json"), JSON.stringify(generateClineMcpJson(opts), null, 2));
182
+ },
183
+ opencode: (opts, repoRoot) => {
184
+ writeFileSync(join(repoRoot, "opencode.json"), JSON.stringify({ mcp: generateOpenCodeMcpJson(opts) }, null, 2));
185
+ },
186
+ cursor: (opts, repoRoot) => {
187
+ const dir = join(repoRoot, ".cursor");
188
+ ensureDir(dir);
189
+ writeFileSync(join(dir, "mcp.json"), JSON.stringify(generateCursorMcpJson(opts), null, 2));
190
+ },
191
+ };
192
+ /** Executes `initHarness` to init harness in `repomcp`. */
193
+ export function initHarness(target, opts) {
194
+ const written = [];
195
+ const targets = target === "all"
196
+ ? Object.keys(TARGET_WRITERS)
197
+ : [target];
198
+ for (const t of targets) {
199
+ TARGET_WRITERS[t](opts, opts.repoRoot);
200
+ written.push(t);
201
+ }
202
+ return written;
203
+ }
204
+ //# sourceMappingURL=harnesses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harnesses.js","sourceRoot":"","sources":["../src/harnesses.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { RepomcpTool } from "./types.js";
2
+ export declare function scanRepoExports(repoRoot: string): RepomcpTool[];
3
+ export declare function toolFromPackageBin(repoRoot: string): RepomcpTool[];
4
+ /** Executes `introspectRepo` to introspect repo in `repomcp`. */
5
+ export declare function introspectRepo(repoRoot: string): RepomcpTool[];
6
+ /** Configuration and data shape for `IntrospectFullOptions` (introspect full options). */
7
+ export type IntrospectFullOptions = {
8
+ allowWrite?: boolean;
9
+ baseUrl?: string;
10
+ };
11
+ /** Configuration and data shape for `IntrospectFullResult` (introspect full result). */
12
+ export type IntrospectFullResult = {
13
+ tools: RepomcpTool[];
14
+ handlers: Record<string, (args: Record<string, unknown>) => Promise<unknown> | unknown>;
15
+ };
16
+ /** Executes `introspectRepoFull` to introspect repo full in `repomcp`. */
17
+ export declare function introspectRepoFull(repoRoot: string, opts?: IntrospectFullOptions): Promise<IntrospectFullResult>;
18
+ //# sourceMappingURL=introspect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"introspect.d.ts","sourceRoot":"","sources":["../src/introspect.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA0D9C,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,EAAE,CAS/D;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,EAAE,CAgDlE;AAED,iEAAiE;AACjE,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,EAAE,CAO9D;AAED,0FAA0F;AAC1F,MAAM,MAAM,qBAAqB,GAAG;IAChC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wFAAwF;AACxF,MAAM,MAAM,oBAAoB,GAAG;IAC/B,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,CACZ,MAAM,EACN,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAChE,CAAC;CACL,CAAC;AAEF,0EAA0E;AAC1E,wBAAsB,kBAAkB,CACpC,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,qBAAqB,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CAG/B"}
@@ -0,0 +1,125 @@
1
+ import { readFileSync, readdirSync, existsSync, statSync } from "node:fs";
2
+ import { join, basename } from "node:path";
3
+ const EXPORT_RE = /export\s+(?:async\s+)?function\s+([a-zA-Z_][a-zA-Z0-9_]*)\s*\(([^)]*)\)/g;
4
+ const EXPORT_CONST_RE = /export\s+const\s+([a-zA-Z_][a-zA-Z0-9_]*)\s*=\s*(?:async\s*)?\([^)]*\)\s*=>/g;
5
+ function parseTsExports(filePath) {
6
+ const text = readFileSync(filePath, "utf8");
7
+ const names = [];
8
+ let m;
9
+ EXPORT_RE.lastIndex = 0;
10
+ while ((m = EXPORT_RE.exec(text)) !== null)
11
+ names.push(m[1]);
12
+ EXPORT_CONST_RE.lastIndex = 0;
13
+ while ((m = EXPORT_CONST_RE.exec(text)) !== null)
14
+ names.push(m[1]);
15
+ return names;
16
+ }
17
+ function walkTsFiles(dir, max = 200) {
18
+ const out = [];
19
+ if (!existsSync(dir))
20
+ return out;
21
+ const entries = readdirSync(dir);
22
+ for (const e of entries) {
23
+ if (out.length >= max)
24
+ break;
25
+ const p = join(dir, e);
26
+ if (e === "node_modules" || e === "dist" || e.startsWith("."))
27
+ continue;
28
+ const st = statSync(p);
29
+ if (st.isDirectory())
30
+ out.push(...walkTsFiles(p, max - out.length));
31
+ else if (/\.(ts|tsx|mts|cts)$/.test(e) && !e.endsWith(".d.ts"))
32
+ out.push(p);
33
+ }
34
+ return out;
35
+ }
36
+ function nameToTool(name) {
37
+ const snake = name.replace(/([A-Z])/g, "_$1").toLowerCase().replace(/^_/, "");
38
+ return {
39
+ name: snake,
40
+ description: `Invoke exported function ${name}`,
41
+ inputSchema: {
42
+ type: "object",
43
+ properties: {},
44
+ additionalProperties: true,
45
+ },
46
+ mutates: /write|delete|remove|update|mutate|deploy/i.test(name),
47
+ annotations: {
48
+ readOnlyHint: !/write|delete|remove|update|mutate/i.test(name),
49
+ destructiveHint: /delete|remove/i.test(name),
50
+ idempotentHint: /get|read|list|fetch/i.test(name),
51
+ openWorldHint: false,
52
+ },
53
+ };
54
+ }
55
+ export function scanRepoExports(repoRoot) {
56
+ const srcDir = join(repoRoot, "src");
57
+ const files = existsSync(srcDir) ? walkTsFiles(srcDir) : walkTsFiles(repoRoot);
58
+ const names = new Set();
59
+ for (const f of files) {
60
+ for (const n of parseTsExports(f))
61
+ names.add(n);
62
+ }
63
+ return [...names].map(nameToTool);
64
+ }
65
+ export function toolFromPackageBin(repoRoot) {
66
+ const pkgPath = join(repoRoot, "package.json");
67
+ if (!existsSync(pkgPath))
68
+ return [];
69
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
70
+ const tools = [];
71
+ if (pkg.bin) {
72
+ const bins = typeof pkg.bin === "string"
73
+ ? { [basename(repoRoot)]: pkg.bin }
74
+ : pkg.bin;
75
+ for (const [name] of Object.entries(bins)) {
76
+ tools.push({
77
+ name: `cli_${name.replace(/[^a-z0-9_]/gi, "_")}`,
78
+ description: `Run CLI binary ${name} (--help for args)`,
79
+ inputSchema: {
80
+ type: "object",
81
+ properties: {
82
+ args: { type: "array", description: "CLI arguments" },
83
+ },
84
+ additionalProperties: false,
85
+ },
86
+ mutates: true,
87
+ annotations: { destructiveHint: true, readOnlyHint: false },
88
+ });
89
+ }
90
+ }
91
+ if (pkg.scripts) {
92
+ for (const script of Object.keys(pkg.scripts)) {
93
+ tools.push({
94
+ name: `npm_script_${script.replace(/[^a-z0-9_]/gi, "_")}`,
95
+ description: `Run npm run ${script}`,
96
+ inputSchema: {
97
+ type: "object",
98
+ properties: {},
99
+ additionalProperties: false,
100
+ },
101
+ mutates: /deploy|publish|release/i.test(script),
102
+ annotations: {
103
+ readOnlyHint: /test|lint|check/i.test(script),
104
+ destructiveHint: /deploy|publish/i.test(script),
105
+ },
106
+ });
107
+ }
108
+ }
109
+ return tools;
110
+ }
111
+ /** Executes `introspectRepo` to introspect repo in `repomcp`. */
112
+ export function introspectRepo(repoRoot) {
113
+ const byName = new Map();
114
+ for (const t of [...scanRepoExports(repoRoot), ...toolFromPackageBin(repoRoot)]) {
115
+ if (!byName.has(t.name))
116
+ byName.set(t.name, t);
117
+ }
118
+ return [...byName.values()];
119
+ }
120
+ /** Executes `introspectRepoFull` to introspect repo full in `repomcp`. */
121
+ export async function introspectRepoFull(repoRoot, opts) {
122
+ const { discoverRepoAdapters } = await import("./adapters/index.js");
123
+ return discoverRepoAdapters(repoRoot, opts);
124
+ }
125
+ //# sourceMappingURL=introspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"introspect.js","sourceRoot":"","sources":["../src/introspect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function resolvePathUnderRepoRoot(repoRoot: string, input: string): string;
2
+ //# sourceMappingURL=path-containment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-containment.d.ts","sourceRoot":"","sources":["../src/path-containment.ts"],"names":[],"mappings":"AAGA,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAehF"}
@@ -0,0 +1,20 @@
1
+ import { realpathSync } from "node:fs";
2
+ import { isAbsolute, relative, resolve } from "node:path";
3
+ export function resolvePathUnderRepoRoot(repoRoot, input) {
4
+ const base = resolve(repoRoot);
5
+ let rootReal;
6
+ try {
7
+ rootReal = realpathSync.native(base);
8
+ }
9
+ catch {
10
+ rootReal = base;
11
+ }
12
+ const candidate = isAbsolute(input) ? resolve(input) : resolve(rootReal, input);
13
+ const targetReal = realpathSync.native(candidate);
14
+ const rel = relative(rootReal, targetReal);
15
+ if (rel.startsWith("..") || isAbsolute(rel)) {
16
+ throw new Error(`Path escapes repo root: ${input}`);
17
+ }
18
+ return targetReal;
19
+ }
20
+ //# sourceMappingURL=path-containment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-containment.js","sourceRoot":"","sources":["../src/path-containment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1D,MAAM,UAAU,wBAAwB,CAAC,QAAgB,EAAE,KAAa;IACtE,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/B,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC;IACD,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAChF,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC3C,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { ChatMessage, ProviderId, ReasoningState } from "./types.js";
2
+ /** Executes `detectProvider` to detect provider in `repomcp`. */
3
+ export declare function detectProvider(baseUrl: string, model?: string): ProviderId;
4
+ export declare function isReasoningModel(model: string): boolean;
5
+ /** Executes `sanitizeRequestBody` to sanitize request body in `repomcp`. */
6
+ export declare function sanitizeRequestBody(body: Record<string, unknown>, model: string): Record<string, unknown>;
7
+ /** Executes `normalizeToolChoice` to normalize tool choice in `repomcp`. */
8
+ export declare function normalizeToolChoice(toolChoice: unknown, provider: ProviderId): unknown;
9
+ /** Executes `createReasoningState` to create reasoning state in `repomcp`. */
10
+ export declare function createReasoningState(): ReasoningState;
11
+ /** DeepSeek R1: replay reasoning_content during tool loop; strip on new user turn. */
12
+ export declare function applyReasoningContentPolicy(messages: ChatMessage[], state: ReasoningState): {
13
+ messages: ChatMessage[];
14
+ state: ReasoningState;
15
+ };
16
+ export declare function prepareAssistantForToolStep(msg: ChatMessage): ChatMessage;
17
+ //# sourceMappingURL=providers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAgB1E,iEAAiE;AACjE,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU,CA4B1E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,4EAA4E;AAC5E,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAQzG;AAED,4EAA4E;AAC5E,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,GAAG,OAAO,CAqBtF;AAED,8EAA8E;AAC9E,wBAAgB,oBAAoB,IAAI,cAAc,CAErD;AAED,sFAAsF;AACtF,wBAAgB,2BAA2B,CACvC,QAAQ,EAAE,WAAW,EAAE,EACvB,KAAK,EAAE,cAAc,GACtB;IAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;IAAC,KAAK,EAAE,cAAc,CAAA;CAAE,CA2BpD;AAED,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,WAAW,GAAG,WAAW,CAYzE"}
@@ -0,0 +1,127 @@
1
+ import { stripRedactedThinking } from "./dirty-parser.js";
2
+ const REASONING_MODEL_PATTERNS = [
3
+ /deepseek-reasoner/i,
4
+ /qwq/i,
5
+ /glm-z1/i,
6
+ /kimi-k2-thinking/i,
7
+ /thinking/i,
8
+ ];
9
+ const FORBIDDEN_SAMPLING = new Set([
10
+ "temperature",
11
+ "top_p",
12
+ "presence_penalty",
13
+ "frequency_penalty",
14
+ ]);
15
+ /** Executes `detectProvider` to detect provider in `repomcp`. */
16
+ export function detectProvider(baseUrl, model) {
17
+ const u = baseUrl.toLowerCase();
18
+ const m = (model ?? "").toLowerCase();
19
+ if (u.includes("deepseek"))
20
+ return "deepseek";
21
+ if (u.includes("dashscope"))
22
+ return "dashscope";
23
+ if (u.includes("moonshot"))
24
+ return "moonshot";
25
+ if (u.includes("bigmodel") || u.includes("zhipu"))
26
+ return "zhipu";
27
+ if (u.includes("minimax"))
28
+ return "minimax";
29
+ if (u.includes("siliconflow"))
30
+ return "siliconflow";
31
+ if (u.includes("volces") || u.includes("doubao"))
32
+ return "doubao";
33
+ if (u.includes("stepfun"))
34
+ return "stepfun";
35
+ if (u.includes("01.ai") || m.startsWith("yi-"))
36
+ return "yi";
37
+ if (u.includes("11434") || u.includes("ollama"))
38
+ return "ollama";
39
+ if (u.includes("anthropic"))
40
+ return "anthropic";
41
+ if (u.includes("openai"))
42
+ return "openai";
43
+ return "generic";
44
+ }
45
+ export function isReasoningModel(model) {
46
+ return REASONING_MODEL_PATTERNS.some((re) => re.test(model));
47
+ }
48
+ /** Executes `sanitizeRequestBody` to sanitize request body in `repomcp`. */
49
+ export function sanitizeRequestBody(body, model) {
50
+ const out = { ...body };
51
+ if (isReasoningModel(model)) {
52
+ for (const key of FORBIDDEN_SAMPLING) {
53
+ delete out[key];
54
+ }
55
+ }
56
+ return out;
57
+ }
58
+ /** Executes `normalizeToolChoice` to normalize tool choice in `repomcp`. */
59
+ export function normalizeToolChoice(toolChoice, provider) {
60
+ if (toolChoice === "required" || toolChoice === "any") {
61
+ switch (provider) {
62
+ case "dashscope":
63
+ case "moonshot":
64
+ case "zhipu":
65
+ case "minimax":
66
+ case "siliconflow":
67
+ case "doubao":
68
+ return "auto";
69
+ default:
70
+ return toolChoice;
71
+ }
72
+ }
73
+ if (typeof toolChoice === "object" && toolChoice !== null) {
74
+ const tc = toolChoice;
75
+ if (provider === "dashscope" && tc.type === "function" && tc.function?.name) {
76
+ return { type: "function", function: { name: tc.function.name } };
77
+ }
78
+ }
79
+ return toolChoice;
80
+ }
81
+ /** Executes `createReasoningState` to create reasoning state in `repomcp`. */
82
+ export function createReasoningState() {
83
+ return { inToolLoop: false, lastUserTurnIndex: -1 };
84
+ }
85
+ /** DeepSeek R1: replay reasoning_content during tool loop; strip on new user turn. */
86
+ export function applyReasoningContentPolicy(messages, state) {
87
+ let lastUser = -1;
88
+ for (let i = 0; i < messages.length; i++) {
89
+ if (messages[i].role === "user")
90
+ lastUser = i;
91
+ }
92
+ const newUserTurn = lastUser > state.lastUserTurnIndex;
93
+ if (newUserTurn) {
94
+ state = { ...state, lastUserTurnIndex: lastUser, inToolLoop: false };
95
+ }
96
+ const hasPendingTools = messages.some((m) => m.role === "assistant" && m.tool_calls && m.tool_calls.length > 0);
97
+ if (hasPendingTools)
98
+ state = { ...state, inToolLoop: true };
99
+ const cleaned = messages.map((m, idx) => {
100
+ const copy = { ...m };
101
+ if (copy.content && typeof copy.content === "string") {
102
+ copy.content = stripRedactedThinking(copy.content);
103
+ }
104
+ if (newUserTurn && copy.role === "assistant" && idx < lastUser) {
105
+ delete copy.reasoning_content;
106
+ }
107
+ if (!state.inToolLoop && copy.role === "assistant") {
108
+ delete copy.reasoning_content;
109
+ }
110
+ return copy;
111
+ });
112
+ return { messages: cleaned, state };
113
+ }
114
+ export function prepareAssistantForToolStep(msg) {
115
+ if (!msg.reasoning_content && msg.content) {
116
+ const think = msg.content.match(/<think>([\s\S]*?)<\/redacted_thinking>/i);
117
+ if (think) {
118
+ return {
119
+ ...msg,
120
+ reasoning_content: think[1].trim(),
121
+ content: stripRedactedThinking(msg.content ?? ""),
122
+ };
123
+ }
124
+ }
125
+ return msg;
126
+ }
127
+ //# sourceMappingURL=providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"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"}