@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,41 @@
1
+ /** Constant `DEFAULT_N_CTX` defining default n ctx. */
2
+ export declare const DEFAULT_N_CTX = 4096;
3
+ export declare const TRUNCATION_MARKER = "[...TRUNCATED BY REPOMCP CONTEXT GUARD...]";
4
+ export declare const MULTI_FAMILY_STOP_SEQUENCES: string[];
5
+ /** Configuration and data shape for `NCtxProbeResult` (nctx probe result). */
6
+ export type NCtxProbeResult = {
7
+ nCtx: number;
8
+ source: "llama.cpp" | "ollama" | "vllm" | "fallback";
9
+ };
10
+ /** Executes `probeNCtx` to probe nctx in `repomcp`. */
11
+ export declare function probeNCtx(baseUrl: string, fetchImpl?: typeof fetch): Promise<NCtxProbeResult>;
12
+ /** Head 60% + tail 40% by character budget (approx token guard). */
13
+ export declare function headTailTruncate(text: string, maxChars: number): string;
14
+ export declare function toolOutputBudgetChars(nCtx: number, charsPerToken?: number): number;
15
+ /** Executes `truncateToolOutput` to truncate tool output in `repomcp`. */
16
+ export declare function truncateToolOutput(text: string, nCtx: number): string;
17
+ /** Executes `buildRecencyAnchor` to build recency anchor in `repomcp`. */
18
+ export declare function buildRecencyAnchor(sigs: {
19
+ name: string;
20
+ summary: string;
21
+ }[]): string;
22
+ /** Executes `anchorPromptTail` to anchor prompt tail in `repomcp`. */
23
+ export declare function anchorPromptTail(prompt: string, anchor: string): string;
24
+ export declare function pickRawCompletionEndpoint(baseUrl: string, prefer?: string): string;
25
+ export declare function chatOrRawFallback(baseUrl: string, chatPath: string, rawPath: string, options: {
26
+ forceRaw?: boolean;
27
+ fetchImpl?: typeof fetch;
28
+ }): Promise<{
29
+ mode: "raw" | "chat";
30
+ path: string;
31
+ }>;
32
+ export declare function injectStopSequences(body: Record<string, unknown>): Record<string, unknown>;
33
+ export declare class StreamToolJsonAbort {
34
+ depth: number;
35
+ started: boolean;
36
+ acc: string;
37
+ feed(chunk: string): boolean;
38
+ reset(): void;
39
+ }
40
+ export declare function readStreamUntilToolJsonDone(stream: ReadableStream<Uint8Array>, onAbort: () => void): Promise<string>;
41
+ //# sourceMappingURL=checkpoints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoints.d.ts","sourceRoot":"","sources":["../src/checkpoints.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,eAAO,MAAM,aAAa,OAAO,CAAC;AAClC,eAAO,MAAM,iBAAiB,+CAA+C,CAAC;AAE9E,eAAO,MAAM,2BAA2B,UAcvC,CAAC;AACF,8EAA8E;AAC9E,MAAM,MAAM,eAAe,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;CACxD,CAAC;AAEF,uDAAuD;AACvD,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,GAAE,OAAO,KAAa,GAAG,OAAO,CAAC,eAAe,CAAC,CA+C1G;AACD,oEAAoE;AACpE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQvE;AACD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,SAAI,GAAG,MAAM,CAE7E;AACD,0EAA0E;AAC1E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAErE;AACD,0EAA0E;AAC1E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,MAAM,CAOpF;AACD,sEAAsE;AACtE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CASvE;AACD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAOlF;AACD,wBAAsB,iBAAiB,CACnC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CAAE,GAC1D,OAAO,CAAC;IAAE,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAmBjD;AACD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAI1F;AACD,qBAAa,mBAAmB;IAC5B,KAAK,SAAK;IACV,OAAO,UAAS;IAChB,GAAG,SAAM;IACT,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAa5B,KAAK;CAKR;AA6BD,wBAAsB,2BAA2B,CAC7C,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,EAClC,OAAO,EAAE,MAAM,IAAI,GACpB,OAAO,CAAC,MAAM,CAAC,CAiBjB"}
@@ -0,0 +1,208 @@
1
+ /** Constant `DEFAULT_N_CTX` defining default n ctx. */
2
+ export const DEFAULT_N_CTX = 4096;
3
+ export const TRUNCATION_MARKER = "[...TRUNCATED BY REPOMCP CONTEXT GUARD...]";
4
+ const IM_END = "<|" + "redacted_im_end" + "|>";
5
+ export const MULTI_FAMILY_STOP_SEQUENCES = [
6
+ "</tool_call>",
7
+ "</tool_calls>",
8
+ IM_END,
9
+ "<|eot_id|>",
10
+ "<|end|>",
11
+ "<|observation|>",
12
+ "<|tool_calls_section_end|>",
13
+ "<\uFF5Ctool\u2581calls\u2581end\uFF5C>",
14
+ "\n\u273FRESULT\u273F",
15
+ "\nOBS:",
16
+ "\nObservation:",
17
+ "\nUSER:",
18
+ "\nHuman:",
19
+ ];
20
+ /** Executes `probeNCtx` to probe nctx in `repomcp`. */
21
+ export async function probeNCtx(baseUrl, fetchImpl = fetch) {
22
+ const base = baseUrl.replace(/\/$/, "");
23
+ try {
24
+ const props = await fetchImpl(`${base}/props`);
25
+ if (props.ok) {
26
+ const j = (await props.json());
27
+ const n = j.n_ctx ?? j.default_generation_settings?.n_ctx;
28
+ if (typeof n === "number" && n > 0)
29
+ return { nCtx: n, source: "llama.cpp" };
30
+ }
31
+ }
32
+ catch {
33
+ /* continue */
34
+ }
35
+ try {
36
+ const show = await fetchImpl(`${base}/api/show`, {
37
+ method: "POST",
38
+ headers: { "Content-Type": "application/json" },
39
+ body: JSON.stringify({ name: "dummy" }),
40
+ });
41
+ if (show.ok) {
42
+ const j = (await show.json());
43
+ const info = j.model_info ?? {};
44
+ for (const [k, v] of Object.entries(info)) {
45
+ if (k.includes("context_length") && typeof v === "number" && v > 0) {
46
+ return { nCtx: v, source: "ollama" };
47
+ }
48
+ }
49
+ }
50
+ }
51
+ catch {
52
+ /* continue */
53
+ }
54
+ try {
55
+ const models = await fetchImpl(`${base}/v1/models`);
56
+ if (models.ok) {
57
+ const j = (await models.json());
58
+ const first = j.data?.[0];
59
+ if (first?.max_model_len && first.max_model_len > 0) {
60
+ return { nCtx: first.max_model_len, source: "vllm" };
61
+ }
62
+ }
63
+ }
64
+ catch {
65
+ /* continue */
66
+ }
67
+ return { nCtx: DEFAULT_N_CTX, source: "fallback" };
68
+ }
69
+ /** Head 60% + tail 40% by character budget (approx token guard). */
70
+ export function headTailTruncate(text, maxChars) {
71
+ if (text.length <= maxChars)
72
+ return text;
73
+ const headLen = Math.floor(maxChars * 0.6);
74
+ const tailLen = Math.floor(maxChars * 0.4) - TRUNCATION_MARKER.length;
75
+ if (tailLen < 0)
76
+ return text.slice(0, maxChars);
77
+ return text.slice(0, headLen) + TRUNCATION_MARKER + text.slice(-tailLen);
78
+ }
79
+ export function toolOutputBudgetChars(nCtx, charsPerToken = 4) {
80
+ return Math.floor(nCtx * charsPerToken * 0.3);
81
+ }
82
+ /** Executes `truncateToolOutput` to truncate tool output in `repomcp`. */
83
+ export function truncateToolOutput(text, nCtx) {
84
+ return headTailTruncate(text, toolOutputBudgetChars(nCtx));
85
+ }
86
+ /** Executes `buildRecencyAnchor` to build recency anchor in `repomcp`. */
87
+ export function buildRecencyAnchor(sigs) {
88
+ const lines = sigs.map((s) => `- ${s.name}: ${s.summary}`);
89
+ return [
90
+ "[AVAILABLE TOOLS - ANCHORED FOR RECENCY]",
91
+ ...lines,
92
+ 'To call a tool, output ONLY: <tool_call>{"name": "TOOL_NAME", "arguments": {...}}</tool_call>',
93
+ ].join("\n");
94
+ }
95
+ /** Executes `anchorPromptTail` to anchor prompt tail in `repomcp`. */
96
+ export function anchorPromptTail(prompt, anchor) {
97
+ const marker = "\nASSISTANT:";
98
+ const idx = prompt.lastIndexOf(marker);
99
+ if (idx === -1) {
100
+ return `${prompt}\n\n${anchor}\n${marker}`;
101
+ }
102
+ const before = prompt.slice(0, idx);
103
+ const after = prompt.slice(idx);
104
+ return `${before}\n\n${anchor}\n${after}`;
105
+ }
106
+ export function pickRawCompletionEndpoint(baseUrl, prefer) {
107
+ if (prefer)
108
+ return prefer;
109
+ if (baseUrl.includes("11434") || baseUrl.includes("ollama")) {
110
+ return "/v1/completions";
111
+ }
112
+ return "/v1/completions";
113
+ }
114
+ export async function chatOrRawFallback(baseUrl, chatPath, rawPath, options) {
115
+ if (options.forceRaw) {
116
+ return { mode: "raw", path: rawPath };
117
+ }
118
+ const fetchImpl = options.fetchImpl ?? fetch;
119
+ try {
120
+ const res = await fetchImpl(`${baseUrl.replace(/\/$/, "")}${chatPath}`, {
121
+ method: "POST",
122
+ headers: { "Content-Type": "application/json" },
123
+ body: JSON.stringify({ model: "probe", messages: [] }),
124
+ });
125
+ if (res.status === 400 || res.status === 404 || res.status === 501) {
126
+ return { mode: "raw", path: rawPath };
127
+ }
128
+ }
129
+ catch {
130
+ return { mode: "raw", path: rawPath };
131
+ }
132
+ return { mode: "chat", path: chatPath };
133
+ }
134
+ export function injectStopSequences(body) {
135
+ const existing = Array.isArray(body.stop) ? body.stop : [];
136
+ const merged = [...new Set([...existing, ...MULTI_FAMILY_STOP_SEQUENCES])];
137
+ return { ...body, stop: merged };
138
+ }
139
+ export class StreamToolJsonAbort {
140
+ depth = 0;
141
+ started = false;
142
+ acc = "";
143
+ feed(chunk) {
144
+ this.acc += chunk;
145
+ if (!this.started) {
146
+ if (/<tool_call>/i.test(this.acc) ||
147
+ /\u273FFUNCTION\u273F/i.test(this.acc) ||
148
+ /<\|tool_call_argument_begin\|>/i.test(this.acc) ||
149
+ /"name"\s*:\s*"/.test(this.acc)) {
150
+ this.started = true;
151
+ }
152
+ }
153
+ this.depth = countBraceFrom(this.acc);
154
+ return this.started && this.depth === 0 && /\{[\s\S]*\}/.test(this.acc);
155
+ }
156
+ reset() {
157
+ this.depth = 0;
158
+ this.started = false;
159
+ this.acc = "";
160
+ }
161
+ }
162
+ function countBraceFrom(text) {
163
+ let depth = 0;
164
+ let inString = false;
165
+ let escape = false;
166
+ for (let i = 0; i < text.length; i++) {
167
+ const c = text[i];
168
+ if (escape) {
169
+ escape = false;
170
+ continue;
171
+ }
172
+ if (inString) {
173
+ if (c === "\\")
174
+ escape = true;
175
+ else if (c === '"')
176
+ inString = false;
177
+ continue;
178
+ }
179
+ if (c === '"') {
180
+ inString = true;
181
+ continue;
182
+ }
183
+ if (c === "{")
184
+ depth++;
185
+ else if (c === "}")
186
+ depth--;
187
+ }
188
+ return depth;
189
+ }
190
+ export async function readStreamUntilToolJsonDone(stream, onAbort) {
191
+ const decoder = new TextDecoder();
192
+ const reader = stream.getReader();
193
+ const guard = new StreamToolJsonAbort();
194
+ let out = "";
195
+ while (true) {
196
+ const { done, value } = await reader.read();
197
+ if (done)
198
+ break;
199
+ const chunk = decoder.decode(value, { stream: true });
200
+ out += chunk;
201
+ if (guard.feed(chunk)) {
202
+ onAbort();
203
+ break;
204
+ }
205
+ }
206
+ return out;
207
+ }
208
+ //# sourceMappingURL=checkpoints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoints.js","sourceRoot":"","sources":["../src/checkpoints.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export declare function runCli(argv: string[]): Promise<void>;
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AA4CA,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwF1D"}
package/dist/cli.js ADDED
@@ -0,0 +1,124 @@
1
+ #!/usr/bin/env node
2
+ import { existsSync, statSync } from "node:fs";
3
+ import { resolve } from "node:path";
4
+ import { crawlCliBinary, discoverFromRemote, discoverRepoAdapters } from "./adapters/index.js";
5
+ import { createDashScopeUpstream, setGuards, startEmbedServer, startMcpServer, } from "./bridge.js";
6
+ import { initHarness } from "./harnesses.js";
7
+ import { introspectRepoFull } from "./introspect.js";
8
+ import { parseRemoteTarget } from "./adapters/remote-target.js";
9
+ function looksLikeRemoteTarget(arg) {
10
+ const trimmed = arg.trim();
11
+ if (trimmed.toLowerCase().startsWith("github:"))
12
+ return true;
13
+ if (/^https?:\/\//i.test(trimmed))
14
+ return true;
15
+ const parsed = parseRemoteTarget(trimmed);
16
+ return parsed.kind === "github" || parsed.kind === "openapi-url";
17
+ }
18
+ function resolveRepoRootFromArg(arg) {
19
+ const abs = resolve(arg);
20
+ if (!existsSync(abs))
21
+ return null;
22
+ const st = statSync(abs);
23
+ if (st.isDirectory())
24
+ return abs;
25
+ return null;
26
+ }
27
+ async function startMcpForRoot(repoRoot, argv) {
28
+ setGuards({
29
+ allowWrite: argv.includes("--allow-write"),
30
+ dryRun: argv.includes("--dry-run"),
31
+ });
32
+ const { tools, handlers } = await introspectRepoFull(repoRoot, {
33
+ allowWrite: argv.includes("--allow-write"),
34
+ });
35
+ startMcpServer({ repoRoot, tools, handlers });
36
+ }
37
+ export async function runCli(argv) {
38
+ if (argv.length === 0) {
39
+ process.stderr.write("Usage: repomcp [--mcp] | wrap <binary> | init | embed | <path> | github:owner/repo | <url>\n");
40
+ return;
41
+ }
42
+ if (argv.includes("--mcp") && argv[0] !== "wrap") {
43
+ await startMcpForRoot(process.cwd(), argv);
44
+ return;
45
+ }
46
+ if (argv[0] === "wrap") {
47
+ const binary = argv[1];
48
+ if (!binary) {
49
+ process.stderr.write("Usage: repomcp wrap <binary> [--depth N] [--mcp]\n");
50
+ process.exitCode = 1;
51
+ return;
52
+ }
53
+ const depthIdx = argv.indexOf("--depth");
54
+ const depth = depthIdx >= 0 ? parseInt(argv[depthIdx + 1] ?? "2", 10) : undefined;
55
+ setGuards({
56
+ allowWrite: argv.includes("--allow-write"),
57
+ dryRun: argv.includes("--dry-run"),
58
+ });
59
+ const discovery = await crawlCliBinary(binary, { depth });
60
+ if (argv.includes("--mcp")) {
61
+ startMcpServer({ tools: discovery.tools, handlers: discovery.handlers });
62
+ return;
63
+ }
64
+ process.stdout.write(`${discovery.tools.length} tools\n`);
65
+ return;
66
+ }
67
+ if (argv[0] === "embed" || argv.includes("embed")) {
68
+ const portIdx = argv.indexOf("--port");
69
+ const port = portIdx >= 0 ? parseInt(argv[portIdx + 1], 10) : 11435;
70
+ startEmbedServer({
71
+ port,
72
+ repoRoot: process.cwd(),
73
+ upstream: createDashScopeUpstream(),
74
+ defaultModel: "text-embedding-v3",
75
+ });
76
+ return;
77
+ }
78
+ if (argv[0] === "init" || argv.includes("init")) {
79
+ const targetIdx = argv.indexOf("--target");
80
+ const target = targetIdx >= 0 ? argv[targetIdx + 1] : "all";
81
+ const repoRoot = process.cwd();
82
+ const { tools } = await discoverRepoAdapters(repoRoot);
83
+ initHarness(target ?? "all", {
84
+ repoRoot,
85
+ serverName: "repomcp",
86
+ command: "npx",
87
+ args: ["-y", "repomcp"],
88
+ tools,
89
+ });
90
+ return;
91
+ }
92
+ const first = argv[0];
93
+ if (first && looksLikeRemoteTarget(first)) {
94
+ const { root, kind } = await discoverFromRemote(first);
95
+ if (argv.includes("--mcp")) {
96
+ await startMcpForRoot(root, argv);
97
+ return;
98
+ }
99
+ process.stdout.write(`${root}\n`);
100
+ if (kind)
101
+ process.stderr.write(`kind: ${kind}\n`);
102
+ return;
103
+ }
104
+ const localRoot = first ? resolveRepoRootFromArg(first) : null;
105
+ if (localRoot) {
106
+ if (argv.includes("--mcp")) {
107
+ await startMcpForRoot(localRoot, argv);
108
+ return;
109
+ }
110
+ const { tools } = await discoverRepoAdapters(localRoot);
111
+ process.stdout.write(`${localRoot}\n${tools.length} tools\n`);
112
+ return;
113
+ }
114
+ process.stderr.write(`Unknown target or path: ${first ?? ""}\n`);
115
+ process.exitCode = 1;
116
+ }
117
+ const isMain = process.argv[1]?.includes("cli") || process.argv[1]?.endsWith("repomcp");
118
+ if (isMain && process.argv.length > 2) {
119
+ const sub = process.argv.slice(2);
120
+ if (sub[0] !== "test") {
121
+ void runCli(sub);
122
+ }
123
+ }
124
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { DirtyToolCall, JsonSchema } from "./types.js";
2
+ /** Remove thinking blocks before parsing tool calls. */
3
+ export declare function stripRedactedThinking(text: string): string;
4
+ export declare function coerceToSchema(args: Record<string, unknown>, schema: JsonSchema | undefined): Record<string, unknown>;
5
+ /** Lexical brace balancer for streaming stop (ignores strings). */
6
+ export declare function countJsonBraceDepth(chunk: string, priorDepth: number): number;
7
+ export declare function shouldAbortStreamOnToolJson(accumulated: string, started: boolean, depth: number): boolean;
8
+ /** Executes `parseDirtyToolCall` to parse dirty tool call in `repomcp`. */
9
+ export declare function parseDirtyToolCall(content: string, schema?: JsonSchema): DirtyToolCall | null;
10
+ //# sourceMappingURL=dirty-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dirty-parser.d.ts","sourceRoot":"","sources":["../src/dirty-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAsB,MAAM,YAAY,CAAC;AAEhF,wDAAwD;AACxD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1D;AAsED,wBAAgB,cAAc,CAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,UAAU,GAAG,SAAS,GAC/B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASzB;AAED,mEAAmE;AACnE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CA2B7E;AAED,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAIzG;AAED,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,aAAa,GAAG,IAAI,CA0G7F"}
@@ -0,0 +1,220 @@
1
+ /** Remove thinking blocks before parsing tool calls. */
2
+ export function stripRedactedThinking(text) {
3
+ return text.replace(/<think>[\s\S]*?(?:<\/redacted_thinking>|$)/gi, "");
4
+ }
5
+ function repairJson(raw) {
6
+ let s = raw.trim();
7
+ if (!s)
8
+ return "{}";
9
+ s = s.replace(/\/\/[^\n]*/g, "");
10
+ s = s.replace(/\/\*[\s\S]*?\*\//g, "");
11
+ s = s.replace(/,\s*([}\]])/g, "$1");
12
+ s = s.replace(/'/g, '"');
13
+ s = s.replace(/([{,]\s*)([a-zA-Z_][a-zA-Z0-9_]*)(\s*:)/g, '$1"$2"$3');
14
+ const open = (s.match(/\{/g) ?? []).length;
15
+ const close = (s.match(/\}/g) ?? []).length;
16
+ if (open > close) {
17
+ s += "}".repeat(open - close);
18
+ }
19
+ return s;
20
+ }
21
+ function tryParseObject(raw) {
22
+ const attempts = [raw, repairJson(raw)];
23
+ for (const a of attempts) {
24
+ try {
25
+ const v = JSON.parse(a);
26
+ if (v && typeof v === "object" && !Array.isArray(v)) {
27
+ return v;
28
+ }
29
+ }
30
+ catch {
31
+ /* next */
32
+ }
33
+ }
34
+ return null;
35
+ }
36
+ function coerceValue(value, prop) {
37
+ if (!prop?.type)
38
+ return value;
39
+ switch (prop.type) {
40
+ case "integer":
41
+ if (typeof value === "string" && /^-?\d+$/.test(value))
42
+ return parseInt(value, 10);
43
+ if (typeof value === "number")
44
+ return Math.trunc(value);
45
+ return value;
46
+ case "number":
47
+ if (typeof value === "string" && /^-?\d+(\.\d+)?$/.test(value))
48
+ return Number(value);
49
+ return value;
50
+ case "boolean":
51
+ if (value === "true")
52
+ return true;
53
+ if (value === "false")
54
+ return false;
55
+ return value;
56
+ case "array":
57
+ if (typeof value === "string") {
58
+ try {
59
+ return JSON.parse(value);
60
+ }
61
+ catch {
62
+ return value;
63
+ }
64
+ }
65
+ return value;
66
+ default:
67
+ return value;
68
+ }
69
+ }
70
+ export function coerceToSchema(args, schema) {
71
+ if (!schema?.properties)
72
+ return args;
73
+ const out = { ...args };
74
+ for (const [key, prop] of Object.entries(schema.properties)) {
75
+ if (key in out)
76
+ out[key] = coerceValue(out[key], prop);
77
+ }
78
+ return out;
79
+ }
80
+ /** Lexical brace balancer for streaming stop (ignores strings). */
81
+ export function countJsonBraceDepth(chunk, priorDepth) {
82
+ let depth = priorDepth;
83
+ let inString = false;
84
+ let escape = false;
85
+ for (let i = 0; i < chunk.length; i++) {
86
+ const c = chunk[i];
87
+ if (escape) {
88
+ escape = false;
89
+ continue;
90
+ }
91
+ if (inString) {
92
+ if (c === "\\")
93
+ escape = true;
94
+ else if (c === '"')
95
+ inString = false;
96
+ continue;
97
+ }
98
+ if (c === '"') {
99
+ inString = true;
100
+ continue;
101
+ }
102
+ if (c === "{")
103
+ depth++;
104
+ else if (c === "}")
105
+ depth--;
106
+ }
107
+ return depth;
108
+ }
109
+ export function shouldAbortStreamOnToolJson(accumulated, started, depth) {
110
+ if (!started)
111
+ return false;
112
+ return depth === 0 && /\{[\s\S]*\}/.test(accumulated);
113
+ }
114
+ /** Executes `parseDirtyToolCall` to parse dirty tool call in `repomcp`. */
115
+ export function parseDirtyToolCall(content, schema) {
116
+ const text = stripRedactedThinking(content);
117
+ const hermes = text.match(/<tool_call>\s*([\s\S]*?)\s*<\/tool_call>/i);
118
+ if (hermes) {
119
+ const obj = tryParseObject(hermes[1]);
120
+ if (obj?.name && typeof obj.name === "string") {
121
+ const args = (obj.arguments ?? obj.args ?? {});
122
+ return {
123
+ name: obj.name,
124
+ arguments: coerceToSchema(args, schema),
125
+ };
126
+ }
127
+ }
128
+ const minimax = text.match(/<tool_calls>\s*([\s\S]*?)\s*<\/tool_calls>/i);
129
+ if (minimax) {
130
+ const obj = tryParseObject(minimax[1]);
131
+ if (obj?.name && typeof obj.name === "string") {
132
+ return {
133
+ name: obj.name,
134
+ arguments: coerceToSchema((obj.arguments ?? {}), schema),
135
+ };
136
+ }
137
+ }
138
+ const deepseek = text.match(/<\|redacted_tool_call_begin\|>[\s\S]*?```json\s*([\s\S]*?)```[\s\S]*?<\|redacted_tool_call_end\|>/i);
139
+ if (deepseek) {
140
+ const obj = tryParseObject(deepseek[1]);
141
+ if (obj) {
142
+ const name = obj.name ?? obj.function ?? obj.tool;
143
+ if (name) {
144
+ return {
145
+ name: String(name),
146
+ arguments: coerceToSchema(obj, schema),
147
+ };
148
+ }
149
+ }
150
+ }
151
+ const kimi = text.match(/functions\.([^:<\|]+):\d+<\|tool_call_argument_begin\|>([\s\S]*?)<\|tool_call_end\|>/i);
152
+ if (kimi) {
153
+ const obj = tryParseObject(kimi[2]);
154
+ return {
155
+ name: kimi[1].trim(),
156
+ arguments: coerceToSchema(obj ?? {}, schema),
157
+ };
158
+ }
159
+ const glm = text.match(/<\|(?:redacted_tool_call_begin_kimi|tool_call_begin)\|>([^<\|]+)<\|tool_call_sep\|>([\s\S]*?)<\|(?:redacted_tool_call_end_kimi|tool_call_end)\|>/i);
160
+ if (glm) {
161
+ const obj = tryParseObject(glm[2]);
162
+ return {
163
+ name: glm[1].trim(),
164
+ arguments: coerceToSchema(obj ?? {}, schema),
165
+ };
166
+ }
167
+ const qwenFn = text.match(/\u273FFUNCTION\u273F:\s*([^\n]+)\s*\u273FARGS\u273F:\s*([\s\S]*?)(?:\u273FRESULT\u273F|$)/i);
168
+ if (qwenFn) {
169
+ const obj = tryParseObject(qwenFn[2]);
170
+ return {
171
+ name: qwenFn[1].trim(),
172
+ arguments: coerceToSchema(obj ?? {}, schema),
173
+ };
174
+ }
175
+ const step3 = text.match(/<steptml:invoke\s+name="([^"]+)"[^>]*>([\s\S]*?)<\/steptml:invoke>/i);
176
+ if (step3) {
177
+ const args = {};
178
+ const paramRe = /<steptml:parameter\s+name="([^"]+)"[^>]*>([\s\S]*?)<\/steptml:parameter>/gi;
179
+ let m;
180
+ while ((m = paramRe.exec(step3[2])) !== null) {
181
+ args[m[1]] = m[2].trim();
182
+ }
183
+ return { name: step3[1], arguments: coerceToSchema(args, schema) };
184
+ }
185
+ const py = text.match(/^([a-zA-Z_][a-zA-Z0-9_]*)\s*\(([\s\S]*)\)\s*$/m);
186
+ if (py) {
187
+ const args = {};
188
+ const inner = py[2].trim();
189
+ if (inner) {
190
+ for (const part of inner.split(",")) {
191
+ const eq = part.indexOf("=");
192
+ if (eq > 0) {
193
+ const k = part.slice(0, eq).trim();
194
+ let v = part.slice(eq + 1).trim();
195
+ if (typeof v === "string" && /^["']/.test(v)) {
196
+ v = v.slice(1, -1);
197
+ }
198
+ args[k] = v;
199
+ }
200
+ }
201
+ }
202
+ return { name: py[1], arguments: coerceToSchema(args, schema) };
203
+ }
204
+ const openAiBlock = text.match(/\{\s*"name"\s*:\s*"([^"]+)"[\s\S]*?"arguments"\s*:\s*(\{[\s\S]*\})/);
205
+ if (openAiBlock) {
206
+ const obj = tryParseObject(`{"name":"${openAiBlock[1]}","arguments":${openAiBlock[2]}}`);
207
+ if (obj?.name) {
208
+ return {
209
+ name: String(obj.name),
210
+ arguments: coerceToSchema((obj.arguments ?? {}), schema),
211
+ };
212
+ }
213
+ }
214
+ const iqBroken = text.match(/\{\s*['"]?cmd['"]?\s*:\s*['"]([^'"]+)['"]/);
215
+ if (iqBroken) {
216
+ return { name: "run_shell", arguments: { cmd: iqBroken[1] } };
217
+ }
218
+ return null;
219
+ }
220
+ //# sourceMappingURL=dirty-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dirty-parser.js","sourceRoot":"","sources":["../src/dirty-parser.ts"],"names":[],"mappings":"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"}