@wb200/mgrep 0.1.10

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 (46) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +288 -0
  3. package/dist/commands/login.js +28 -0
  4. package/dist/commands/login.js.map +1 -0
  5. package/dist/commands/search.js +191 -0
  6. package/dist/commands/search.js.map +1 -0
  7. package/dist/commands/watch.js +134 -0
  8. package/dist/commands/watch.js.map +1 -0
  9. package/dist/commands/watch_mcp.js +77 -0
  10. package/dist/commands/watch_mcp.js.map +1 -0
  11. package/dist/index.js +36 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/install/claude-code.js +71 -0
  14. package/dist/install/claude-code.js.map +1 -0
  15. package/dist/install/codex.js +116 -0
  16. package/dist/install/codex.js.map +1 -0
  17. package/dist/install/droid.js +191 -0
  18. package/dist/install/droid.js.map +1 -0
  19. package/dist/install/opencode.js +161 -0
  20. package/dist/install/opencode.js.map +1 -0
  21. package/dist/lib/config.js +216 -0
  22. package/dist/lib/config.js.map +1 -0
  23. package/dist/lib/context.js +35 -0
  24. package/dist/lib/context.js.map +1 -0
  25. package/dist/lib/file.js +154 -0
  26. package/dist/lib/file.js.map +1 -0
  27. package/dist/lib/git.js +167 -0
  28. package/dist/lib/git.js.map +1 -0
  29. package/dist/lib/logger.js +80 -0
  30. package/dist/lib/logger.js.map +1 -0
  31. package/dist/lib/model-studio.js +205 -0
  32. package/dist/lib/model-studio.js.map +1 -0
  33. package/dist/lib/store.js +639 -0
  34. package/dist/lib/store.js.map +1 -0
  35. package/dist/lib/sync-helpers.js +51 -0
  36. package/dist/lib/sync-helpers.js.map +1 -0
  37. package/dist/lib/utils.js +300 -0
  38. package/dist/lib/utils.js.map +1 -0
  39. package/dist/lib/warning.js +34 -0
  40. package/dist/lib/warning.js.map +1 -0
  41. package/dist/plugins/mgrep/.claude-plugin/plugin.json +9 -0
  42. package/dist/plugins/mgrep/hooks/hook.json +27 -0
  43. package/dist/plugins/mgrep/hooks/mgrep_watch.py +55 -0
  44. package/dist/plugins/mgrep/hooks/mgrep_watch_kill.py +50 -0
  45. package/dist/plugins/mgrep/skills/mgrep/SKILL.md +59 -0
  46. package/package.json +74 -0
@@ -0,0 +1,80 @@
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import winston from "winston";
5
+ import DailyRotateFile from "winston-daily-rotate-file";
6
+ export function getLogDir(appName = "myapp") {
7
+ const xdgState = process.env.XDG_STATE_HOME;
8
+ if (xdgState)
9
+ return path.join(xdgState, appName, "logs");
10
+ // Default Linux/Mac: ~/.local/state/myapp/logs
11
+ return path.join(os.homedir(), ".local", "state", appName, "logs");
12
+ }
13
+ const LOG_DIR = getLogDir("mgrep");
14
+ function canWriteToDir(dir) {
15
+ try {
16
+ fs.mkdirSync(dir, { recursive: true });
17
+ const testFile = path.join(dir, ".write-test");
18
+ fs.writeFileSync(testFile, "");
19
+ fs.unlinkSync(testFile);
20
+ return true;
21
+ }
22
+ catch {
23
+ return false;
24
+ }
25
+ }
26
+ export function setupLogger() {
27
+ const transports = [];
28
+ if (canWriteToDir(LOG_DIR)) {
29
+ const fileTransport = new DailyRotateFile({
30
+ dirname: LOG_DIR,
31
+ filename: "%DATE%.log",
32
+ datePattern: "YYYY-MM-DD",
33
+ zippedArchive: false,
34
+ maxSize: "20m",
35
+ maxFiles: "31d",
36
+ });
37
+ transports.push(fileTransport);
38
+ }
39
+ const logger = winston.createLogger({
40
+ level: "info",
41
+ silent: transports.length === 0,
42
+ format: winston.format.combine(winston.format.timestamp(), winston.format.printf((info) => `[${info.timestamp}] ${info.level.toUpperCase()}: ${info.message}`)),
43
+ transports,
44
+ });
45
+ const originalConsoleLog = console.log;
46
+ console.log = (...args) => {
47
+ logger.info(args.join(" "));
48
+ originalConsoleLog(...args);
49
+ };
50
+ const originalConsoleError = console.error;
51
+ console.error = (...args) => {
52
+ logger.error(args.join(" "));
53
+ originalConsoleError(...args);
54
+ };
55
+ const originalConsoleWarn = console.warn;
56
+ console.warn = (...args) => {
57
+ logger.warn(args.join(" "));
58
+ originalConsoleWarn(...args);
59
+ };
60
+ const originalConsoleDebug = console.debug;
61
+ console.debug = (...args) => {
62
+ logger.debug(args.join(" "));
63
+ originalConsoleDebug(...args);
64
+ };
65
+ const originalConsoleTrace = console.trace;
66
+ console.trace = (...args) => {
67
+ logger.error(args.join(" "));
68
+ originalConsoleTrace(...args);
69
+ };
70
+ return logger;
71
+ }
72
+ /**
73
+ * Writes user-facing data output directly to stdout, bypassing winston.
74
+ * Use this instead of console.log for search results, answers, and other
75
+ * data that should NOT be persisted to disk log files.
76
+ */
77
+ export function output(...args) {
78
+ process.stdout.write(`${args.join(" ")}\n`);
79
+ }
80
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,205 @@
1
+ import OpenAI from "openai";
2
+ const DEEPINFRA_OPENAI_BASE_URL = "https://api.deepinfra.com/v1/openai";
3
+ const RESPONSES_BASE_URL = "https://dashscope-intl.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1";
4
+ const DEEPINFRA_INFERENCE_BASE_URL = "https://api.deepinfra.com/v1/inference";
5
+ const EMBEDDING_BATCH_SIZE = 10;
6
+ const DEFAULT_EMBED_DIMENSIONS = 2560;
7
+ const API_TIMEOUT_MS = 60_000;
8
+ export function getDashscopeApiKey() {
9
+ return process.env.DASHSCOPE_API_KEY;
10
+ }
11
+ export function getDeepInfraApiKey() {
12
+ return process.env.DEEPINFRA_API_KEY;
13
+ }
14
+ export function createModelStudioConfig(options) {
15
+ const deepinfraApiKey = getDeepInfraApiKey();
16
+ if (!deepinfraApiKey) {
17
+ throw new Error("DEEPINFRA_API_KEY is not set. Export a DeepInfra API key for embeddings and rerank before using mgrep.");
18
+ }
19
+ const dashscopeApiKey = getDashscopeApiKey();
20
+ if (!dashscopeApiKey) {
21
+ throw new Error("DASHSCOPE_API_KEY is not set. Export a Singapore Alibaba Cloud Model Studio API key for responses before using mgrep.");
22
+ }
23
+ return {
24
+ deepinfraApiKey,
25
+ dashscopeApiKey,
26
+ embedModel: options.embedModel,
27
+ embedDimensions: options.embedDimensions ?? DEFAULT_EMBED_DIMENSIONS,
28
+ rerankModel: options.rerankModel,
29
+ llmModel: options.llmModel,
30
+ };
31
+ }
32
+ function chunkArray(items, size) {
33
+ const chunks = [];
34
+ for (let i = 0; i < items.length; i += size) {
35
+ chunks.push(items.slice(i, i + size));
36
+ }
37
+ return chunks;
38
+ }
39
+ function stripCodeFence(text) {
40
+ const trimmed = text.trim();
41
+ if (!trimmed.startsWith("```")) {
42
+ return trimmed;
43
+ }
44
+ const withoutStart = trimmed.replace(/^```[a-zA-Z0-9_-]*\s*/, "");
45
+ return withoutStart.replace(/\s*```$/, "").trim();
46
+ }
47
+ function extractReasoning(output) {
48
+ const summaries = [];
49
+ for (const item of output) {
50
+ if (item.type !== "reasoning") {
51
+ continue;
52
+ }
53
+ for (const summary of item.summary) {
54
+ if ("text" in summary && typeof summary.text === "string") {
55
+ summaries.push(summary.text);
56
+ }
57
+ }
58
+ }
59
+ return summaries;
60
+ }
61
+ export class ModelStudioClient {
62
+ embeddingsClient;
63
+ responsesClient;
64
+ config;
65
+ constructor(config) {
66
+ this.config = config;
67
+ this.embeddingsClient = new OpenAI({
68
+ apiKey: config.deepinfraApiKey,
69
+ baseURL: DEEPINFRA_OPENAI_BASE_URL,
70
+ });
71
+ this.responsesClient = new OpenAI({
72
+ apiKey: config.dashscopeApiKey,
73
+ baseURL: RESPONSES_BASE_URL,
74
+ });
75
+ }
76
+ get embedModel() {
77
+ return this.config.embedModel;
78
+ }
79
+ get embedDimensions() {
80
+ return this.config.embedDimensions;
81
+ }
82
+ get rerankModel() {
83
+ return this.config.rerankModel;
84
+ }
85
+ get llmModel() {
86
+ return this.config.llmModel;
87
+ }
88
+ async embed(texts) {
89
+ if (texts.length === 0) {
90
+ return [];
91
+ }
92
+ const vectors = [];
93
+ for (const batch of chunkArray(texts, EMBEDDING_BATCH_SIZE)) {
94
+ const response = await this.embeddingsClient.embeddings.create({
95
+ model: this.config.embedModel,
96
+ input: batch,
97
+ encoding_format: "float",
98
+ dimensions: this.config.embedDimensions,
99
+ }, { signal: AbortSignal.timeout(API_TIMEOUT_MS) });
100
+ for (const item of response.data) {
101
+ vectors.push(item.embedding);
102
+ }
103
+ }
104
+ return vectors;
105
+ }
106
+ async rerank(query, documents) {
107
+ if (documents.length === 0) {
108
+ return [];
109
+ }
110
+ const response = await fetch(`${DEEPINFRA_INFERENCE_BASE_URL}/${encodeURIComponent(this.config.rerankModel)}`, {
111
+ method: "POST",
112
+ headers: {
113
+ Authorization: `Bearer ${this.config.deepinfraApiKey}`,
114
+ "Content-Type": "application/json",
115
+ },
116
+ body: JSON.stringify({
117
+ queries: [query],
118
+ documents,
119
+ }),
120
+ signal: AbortSignal.timeout(API_TIMEOUT_MS),
121
+ });
122
+ if (!response.ok) {
123
+ const message = await response.text();
124
+ throw new Error(`Rerank request failed: ${message}`);
125
+ }
126
+ const data = (await response.json());
127
+ return (data.scores ?? []).map((score, index) => ({
128
+ index,
129
+ relevance_score: score,
130
+ }));
131
+ }
132
+ async respond(options) {
133
+ const payload = {
134
+ model: this.config.llmModel,
135
+ instructions: options.instructions,
136
+ input: options.input,
137
+ enable_thinking: options.enableThinking ?? true,
138
+ };
139
+ const response = (await this.responsesClient.responses.create(payload, { signal: AbortSignal.timeout(API_TIMEOUT_MS) }));
140
+ if (response.error) {
141
+ throw new Error(response.error.message || "Responses API returned an error");
142
+ }
143
+ return {
144
+ text: response.output_text.trim(),
145
+ reasoning: extractReasoning(response.output),
146
+ };
147
+ }
148
+ async planQueries(question, maxQueries = 4) {
149
+ const instructions = [
150
+ "You are generating semantic code-search subqueries.",
151
+ `Return ONLY a JSON array of 1-${maxQueries} short search queries.`,
152
+ "Do not include markdown, prose, or explanations.",
153
+ "Preserve concrete identifiers from the user question when useful.",
154
+ "Prefer complementary subqueries over paraphrasing the same one.",
155
+ ].join(" ");
156
+ const { text } = await this.respond({
157
+ instructions,
158
+ input: question,
159
+ enableThinking: true,
160
+ });
161
+ try {
162
+ const parsed = JSON.parse(stripCodeFence(text));
163
+ if (!Array.isArray(parsed)) {
164
+ return [question];
165
+ }
166
+ const queries = parsed
167
+ .filter((item) => typeof item === "string")
168
+ .map((item) => item.trim())
169
+ .filter((item) => item.length > 0)
170
+ .slice(0, maxQueries);
171
+ return queries.length > 0 ? queries : [question];
172
+ }
173
+ catch {
174
+ return [question];
175
+ }
176
+ }
177
+ async answer(question, context) {
178
+ const instructions = [
179
+ "Answer only from the provided sources.",
180
+ "If the sources are insufficient, say so directly.",
181
+ 'Use citation tags in the exact format <cite i="N" /> where N is the source index.',
182
+ "Do not invent citations.",
183
+ "Prefer concise, factual answers.",
184
+ ].join(" ");
185
+ const input = `Question:\n${question}\n\nSources:\n${context}`;
186
+ const { text } = await this.respond({
187
+ instructions,
188
+ input,
189
+ enableThinking: true,
190
+ });
191
+ return text;
192
+ }
193
+ async validate() {
194
+ await this.embed(["mgrep configuration check"]);
195
+ await this.rerank("mgrep configuration check", [
196
+ "mgrep configuration check",
197
+ ]);
198
+ await this.respond({
199
+ instructions: 'Reply with exactly "OK".',
200
+ input: "Check the Responses API configuration.",
201
+ enableThinking: true,
202
+ });
203
+ }
204
+ }
205
+ //# sourceMappingURL=model-studio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-studio.js","sourceRoot":"","sources":["../../src/lib/model-studio.ts"],"names":[],"mappings":"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"}