@pimzino/sgrep 1.3.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.
Files changed (73) hide show
  1. package/README.md +413 -0
  2. package/build/.claude-plugin/marketplace.json +20 -0
  3. package/build/commands/ask.d.ts +11 -0
  4. package/build/commands/ask.d.ts.map +1 -0
  5. package/build/commands/ask.js +65 -0
  6. package/build/commands/ask.js.map +1 -0
  7. package/build/commands/enhance.d.ts +16 -0
  8. package/build/commands/enhance.d.ts.map +1 -0
  9. package/build/commands/enhance.js +107 -0
  10. package/build/commands/enhance.js.map +1 -0
  11. package/build/commands/search.d.ts +12 -0
  12. package/build/commands/search.d.ts.map +1 -0
  13. package/build/commands/search.js +65 -0
  14. package/build/commands/search.js.map +1 -0
  15. package/build/commands/watch.d.ts +13 -0
  16. package/build/commands/watch.d.ts.map +1 -0
  17. package/build/commands/watch.js +179 -0
  18. package/build/commands/watch.js.map +1 -0
  19. package/build/index.d.ts +3 -0
  20. package/build/index.d.ts.map +1 -0
  21. package/build/index.js +124 -0
  22. package/build/index.js.map +1 -0
  23. package/build/install/claude-code.d.ts +10 -0
  24. package/build/install/claude-code.d.ts.map +1 -0
  25. package/build/install/claude-code.js +255 -0
  26. package/build/install/claude-code.js.map +1 -0
  27. package/build/install/codex.d.ts +4 -0
  28. package/build/install/codex.d.ts.map +1 -0
  29. package/build/install/codex.js +123 -0
  30. package/build/install/codex.js.map +1 -0
  31. package/build/install/cursor.d.ts +4 -0
  32. package/build/install/cursor.d.ts.map +1 -0
  33. package/build/install/cursor.js +91 -0
  34. package/build/install/cursor.js.map +1 -0
  35. package/build/install/droid.d.ts +4 -0
  36. package/build/install/droid.d.ts.map +1 -0
  37. package/build/install/droid.js +226 -0
  38. package/build/install/droid.js.map +1 -0
  39. package/build/install/opencode.d.ts +4 -0
  40. package/build/install/opencode.d.ts.map +1 -0
  41. package/build/install/opencode.js +276 -0
  42. package/build/install/opencode.js.map +1 -0
  43. package/build/plugins/sgrep/.claude-plugin/plugin.json +9 -0
  44. package/build/plugins/sgrep/hooks/hooks.json +39 -0
  45. package/build/plugins/sgrep/hooks/sgrep_enhance.js +160 -0
  46. package/build/plugins/sgrep/hooks/sgrep_watch.js +240 -0
  47. package/build/plugins/sgrep/hooks/sgrep_watch_kill.js +158 -0
  48. package/build/plugins/sgrep/skills/sgrep/SKILL.md +97 -0
  49. package/build/utils/config.d.ts +26 -0
  50. package/build/utils/config.d.ts.map +1 -0
  51. package/build/utils/config.js +106 -0
  52. package/build/utils/config.js.map +1 -0
  53. package/build/utils/context-manager.d.ts +33 -0
  54. package/build/utils/context-manager.d.ts.map +1 -0
  55. package/build/utils/context-manager.js +244 -0
  56. package/build/utils/context-manager.js.map +1 -0
  57. package/build/utils/context.d.ts +25 -0
  58. package/build/utils/context.d.ts.map +1 -0
  59. package/build/utils/context.js +132 -0
  60. package/build/utils/context.js.map +1 -0
  61. package/build/utils/file-walker.d.ts +20 -0
  62. package/build/utils/file-walker.d.ts.map +1 -0
  63. package/build/utils/file-walker.js +239 -0
  64. package/build/utils/file-walker.js.map +1 -0
  65. package/build/utils/output.d.ts +38 -0
  66. package/build/utils/output.d.ts.map +1 -0
  67. package/build/utils/output.js +150 -0
  68. package/build/utils/output.js.map +1 -0
  69. package/build/utils/prompt-parser.d.ts +12 -0
  70. package/build/utils/prompt-parser.d.ts.map +1 -0
  71. package/build/utils/prompt-parser.js +54 -0
  72. package/build/utils/prompt-parser.js.map +1 -0
  73. package/package.json +59 -0
@@ -0,0 +1,255 @@
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { Command } from "commander";
6
+ import chalk from "chalk";
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = path.dirname(__filename);
9
+ const PLUGIN_ROOT = process.env.CLAUDE_PLUGIN_ROOT ||
10
+ path.resolve(__dirname, "../plugins/sgrep");
11
+ const PLUGIN_HOOKS_DIR = path.join(PLUGIN_ROOT, "hooks");
12
+ const PLUGIN_SKILL_PATH = path.join(PLUGIN_ROOT, "skills", "sgrep", "SKILL.md");
13
+ function resolveClaudeRoot() {
14
+ return path.join(os.homedir(), ".claude");
15
+ }
16
+ function readPluginAsset(assetPath) {
17
+ if (!fs.existsSync(assetPath)) {
18
+ throw new Error(`Plugin asset missing: ${assetPath}`);
19
+ }
20
+ return fs.readFileSync(assetPath, "utf-8");
21
+ }
22
+ function writeFileIfChanged(filePath, content) {
23
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
24
+ const already = fs.existsSync(filePath)
25
+ ? fs.readFileSync(filePath, "utf-8")
26
+ : undefined;
27
+ if (already !== content) {
28
+ fs.writeFileSync(filePath, content);
29
+ return true;
30
+ }
31
+ return false;
32
+ }
33
+ function parseJsonWithComments(content) {
34
+ const stripped = content
35
+ .split("\n")
36
+ .map((line) => line.replace(/^\s*\/\/.*$/, ""))
37
+ .join("\n");
38
+ const parsed = JSON.parse(stripped);
39
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
40
+ throw new Error("Settings must be a JSON object");
41
+ }
42
+ return parsed;
43
+ }
44
+ function loadSettings(settingsPath) {
45
+ if (!fs.existsSync(settingsPath)) {
46
+ return {};
47
+ }
48
+ const raw = fs.readFileSync(settingsPath, "utf-8");
49
+ try {
50
+ const parsed = parseJsonWithComments(raw);
51
+ return parsed;
52
+ }
53
+ catch {
54
+ return {};
55
+ }
56
+ }
57
+ function saveSettings(settingsPath, settings) {
58
+ fs.mkdirSync(path.dirname(settingsPath), { recursive: true });
59
+ fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2));
60
+ }
61
+ function isHooksConfig(value) {
62
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
63
+ return false;
64
+ }
65
+ return Object.values(value).every((entry) => Array.isArray(entry));
66
+ }
67
+ function mergeHooks(existingHooks, newHooks) {
68
+ const merged = existingHooks
69
+ ? JSON.parse(JSON.stringify(existingHooks))
70
+ : {};
71
+ for (const [event, entries] of Object.entries(newHooks)) {
72
+ const current = Array.isArray(merged[event])
73
+ ? merged[event]
74
+ : [];
75
+ for (const entry of entries) {
76
+ const command = entry?.hooks?.[0]?.command;
77
+ const matcher = entry?.matcher ?? null;
78
+ const duplicate = current.some((item) => (item?.matcher ?? null) === matcher &&
79
+ item?.hooks?.[0]?.command === command &&
80
+ item?.hooks?.[0]?.type === entry?.hooks?.[0]?.type);
81
+ if (!duplicate) {
82
+ current.push(entry);
83
+ }
84
+ }
85
+ merged[event] = current;
86
+ }
87
+ return merged;
88
+ }
89
+ /**
90
+ * Install the sgrep plugin for Claude Code
91
+ */
92
+ async function installPlugin() {
93
+ console.log(chalk.cyan("Installing sgrep plugin for Claude Code..."));
94
+ console.log("");
95
+ try {
96
+ const root = resolveClaudeRoot();
97
+ const hooksDir = path.join(root, "hooks", "sgrep");
98
+ const skillsDir = path.join(root, "skills", "sgrep");
99
+ const settingsPath = path.join(root, "settings.json");
100
+ // Read plugin assets
101
+ const watchHook = readPluginAsset(path.join(PLUGIN_HOOKS_DIR, "sgrep_watch.js"));
102
+ const killHook = readPluginAsset(path.join(PLUGIN_HOOKS_DIR, "sgrep_watch_kill.js"));
103
+ const enhanceHook = readPluginAsset(path.join(PLUGIN_HOOKS_DIR, "sgrep_enhance.js"));
104
+ const skillContent = readPluginAsset(PLUGIN_SKILL_PATH);
105
+ // Install hooks
106
+ const watchJs = path.join(hooksDir, "sgrep_watch.js");
107
+ const killJs = path.join(hooksDir, "sgrep_watch_kill.js");
108
+ const enhanceJs = path.join(hooksDir, "sgrep_enhance.js");
109
+ if (writeFileIfChanged(watchJs, watchHook)) {
110
+ console.log(chalk.green(`Installed hook: ${watchJs}`));
111
+ }
112
+ if (writeFileIfChanged(killJs, killHook)) {
113
+ console.log(chalk.green(`Installed hook: ${killJs}`));
114
+ }
115
+ if (writeFileIfChanged(enhanceJs, enhanceHook)) {
116
+ console.log(chalk.green(`Installed hook: ${enhanceJs}`));
117
+ }
118
+ // Install skill
119
+ const skillPath = path.join(skillsDir, "SKILL.md");
120
+ if (writeFileIfChanged(skillPath, skillContent.trimStart())) {
121
+ console.log(chalk.green(`Installed skill: ${skillPath}`));
122
+ }
123
+ // Configure hooks in settings.json
124
+ const hookConfig = {
125
+ UserPromptSubmit: [
126
+ {
127
+ hooks: [
128
+ {
129
+ type: "command",
130
+ command: `node "${enhanceJs}"`,
131
+ timeout: 60,
132
+ },
133
+ ],
134
+ },
135
+ ],
136
+ SessionStart: [
137
+ {
138
+ matcher: "startup|resume",
139
+ hooks: [
140
+ {
141
+ type: "command",
142
+ command: `node "${watchJs}"`,
143
+ timeout: 10,
144
+ },
145
+ ],
146
+ },
147
+ ],
148
+ SessionEnd: [
149
+ {
150
+ hooks: [
151
+ {
152
+ type: "command",
153
+ command: `node "${killJs}"`,
154
+ timeout: 10,
155
+ },
156
+ ],
157
+ },
158
+ ],
159
+ };
160
+ const settings = loadSettings(settingsPath);
161
+ settings.hooks = mergeHooks(isHooksConfig(settings.hooks) ? settings.hooks : undefined, hookConfig);
162
+ saveSettings(settingsPath, settings);
163
+ console.log(chalk.green(`Updated settings: ${settingsPath}`));
164
+ console.log("");
165
+ console.log(chalk.green("Installation complete!"));
166
+ console.log("");
167
+ console.log("The sgrep skill is now available in Claude Code.");
168
+ console.log("- Skill: " + chalk.cyan("/sgrep") + " or Claude will use it automatically");
169
+ console.log("- Prompt enhancement: your prompts are automatically enhanced with codebase context");
170
+ console.log("- Index sync: sgrep watch starts/stops with your session");
171
+ console.log("");
172
+ console.log(chalk.gray("To uninstall: sgrep uninstall-claude-code"));
173
+ }
174
+ catch (error) {
175
+ const errorMessage = error instanceof Error ? error.message : String(error);
176
+ console.error(chalk.red(`Error installing plugin: ${errorMessage}`));
177
+ process.exit(1);
178
+ }
179
+ }
180
+ /**
181
+ * Uninstall the sgrep plugin from Claude Code
182
+ */
183
+ async function uninstallPlugin() {
184
+ console.log(chalk.cyan("Uninstalling sgrep plugin from Claude Code..."));
185
+ console.log("");
186
+ try {
187
+ const root = resolveClaudeRoot();
188
+ const hooksDir = path.join(root, "hooks", "sgrep");
189
+ const skillsDir = path.join(root, "skills", "sgrep");
190
+ const settingsPath = path.join(root, "settings.json");
191
+ // Remove hooks directory
192
+ if (fs.existsSync(hooksDir)) {
193
+ fs.rmSync(hooksDir, { recursive: true, force: true });
194
+ console.log(chalk.green("Removed sgrep hooks"));
195
+ }
196
+ // Remove skill directory
197
+ if (fs.existsSync(skillsDir)) {
198
+ fs.rmSync(skillsDir, { recursive: true, force: true });
199
+ console.log(chalk.green("Removed sgrep skill"));
200
+ }
201
+ // Remove hooks from settings.json
202
+ if (fs.existsSync(settingsPath)) {
203
+ try {
204
+ const settings = loadSettings(settingsPath);
205
+ const hooks = isHooksConfig(settings.hooks) ? settings.hooks : undefined;
206
+ if (hooks) {
207
+ for (const event of Object.keys(hooks)) {
208
+ const filtered = hooks[event].filter((entry) => {
209
+ const cmd = entry?.hooks?.[0]?.command || "";
210
+ return !cmd.includes("sgrep_watch") && !cmd.includes("sgrep_enhance");
211
+ });
212
+ if (filtered.length === 0) {
213
+ delete hooks[event];
214
+ }
215
+ else {
216
+ hooks[event] = filtered;
217
+ }
218
+ }
219
+ if (Object.keys(hooks).length === 0) {
220
+ delete settings.hooks;
221
+ }
222
+ saveSettings(settingsPath, settings);
223
+ console.log(chalk.green("Updated settings.json"));
224
+ }
225
+ }
226
+ catch (error) {
227
+ console.warn(chalk.yellow(`Failed to update settings: ${error}`));
228
+ }
229
+ }
230
+ console.log("");
231
+ console.log(chalk.green("Uninstallation complete!"));
232
+ }
233
+ catch (error) {
234
+ const errorMessage = error instanceof Error ? error.message : String(error);
235
+ console.error(chalk.red(`Error uninstalling plugin: ${errorMessage}`));
236
+ process.exit(1);
237
+ }
238
+ }
239
+ /**
240
+ * Install command for Claude Code
241
+ */
242
+ export const installClaudeCode = new Command("install-claude-code")
243
+ .description("Install the sgrep plugin for Claude Code")
244
+ .action(async () => {
245
+ await installPlugin();
246
+ });
247
+ /**
248
+ * Uninstall command for Claude Code
249
+ */
250
+ export const uninstallClaudeCode = new Command("uninstall-claude-code")
251
+ .description("Uninstall the sgrep plugin from Claude Code")
252
+ .action(async () => {
253
+ await uninstallPlugin();
254
+ });
255
+ //# sourceMappingURL=claude-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/install/claude-code.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Command } from "commander";
2
+ export declare const installCodex: Command;
3
+ export declare const uninstallCodex: Command;
4
+ //# sourceMappingURL=codex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/install/codex.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0HpC,eAAO,MAAM,YAAY,SAIrB,CAAC;AAEL,eAAO,MAAM,cAAc,SAIvB,CAAC"}
@@ -0,0 +1,123 @@
1
+ import { exec } from "node:child_process";
2
+ import fs from "node:fs";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import { promisify } from "node:util";
6
+ import { Command } from "commander";
7
+ import chalk from "chalk";
8
+ const shell = process.env.SHELL ||
9
+ (process.platform === "win32" ? process.env.COMSPEC || "cmd.exe" : "/bin/sh");
10
+ const SKILL = `
11
+ ---
12
+ name: sgrep
13
+ description: Semantic grep - search codebases by meaning using AI. Substantially better than built-in search tools for finding code by functionality.
14
+ license: MIT
15
+ ---
16
+
17
+ ## When to use this skill
18
+
19
+ Whenever you need to search local files by functionality or understand code. Use this instead of grep when you need semantic understanding.
20
+
21
+ ## How to use this skill
22
+
23
+ Use \`sgrep\` to search your local files semantically. Describe what you're looking for in natural language.
24
+
25
+ ### Do
26
+
27
+ \`\`\`bash
28
+ sgrep "authentication middleware" # search in current directory
29
+ sgrep "database connection setup" ./src # search in specific directory
30
+ sgrep ask "how does the auth flow work?" # ask questions about code
31
+ sgrep enhance "fix the bug" # enhance vague prompts with context
32
+ \`\`\`
33
+
34
+ ### Don't
35
+
36
+ \`\`\`bash
37
+ sgrep "function" # Too vague, use a more specific query
38
+ sgrep "const x =" # For exact text matching, use regular grep
39
+ \`\`\`
40
+
41
+ ## Keywords
42
+ search, grep, semantic, files, local files, code search, natural language, codebase
43
+ `;
44
+ const execAsync = promisify(exec);
45
+ async function installPlugin() {
46
+ console.log(chalk.cyan("Installing sgrep plugin for Codex..."));
47
+ console.log("");
48
+ try {
49
+ await execAsync("codex mcp add sgrep sgrep mcp", {
50
+ shell,
51
+ env: process.env,
52
+ });
53
+ console.log(chalk.green("Successfully installed the sgrep MCP server"));
54
+ const destPath = path.join(os.homedir(), ".codex", "AGENTS.md");
55
+ fs.mkdirSync(path.dirname(destPath), { recursive: true });
56
+ let existingContent = "";
57
+ if (fs.existsSync(destPath)) {
58
+ existingContent = fs.readFileSync(destPath, "utf-8");
59
+ }
60
+ const skillTrimmed = SKILL.trim();
61
+ if (!existingContent.includes(SKILL) &&
62
+ !existingContent.includes(skillTrimmed)) {
63
+ fs.appendFileSync(destPath, SKILL);
64
+ console.log(chalk.green("Successfully added the sgrep skill to Codex agent"));
65
+ }
66
+ else {
67
+ console.log(chalk.yellow("The sgrep skill is already installed in Codex"));
68
+ }
69
+ console.log("");
70
+ console.log(chalk.green("Installation complete!"));
71
+ console.log("");
72
+ console.log(chalk.gray("To uninstall: sgrep uninstall-codex"));
73
+ }
74
+ catch (error) {
75
+ const errorMessage = error instanceof Error ? error.message : String(error);
76
+ console.error(chalk.red(`Error installing plugin: ${errorMessage}`));
77
+ console.error(chalk.yellow("Do you have Codex CLI installed?"));
78
+ process.exit(1);
79
+ }
80
+ }
81
+ async function uninstallPlugin() {
82
+ console.log(chalk.cyan("Uninstalling sgrep plugin from Codex..."));
83
+ console.log("");
84
+ try {
85
+ await execAsync("codex mcp remove sgrep", { shell, env: process.env });
86
+ console.log(chalk.green("Successfully removed the sgrep MCP server"));
87
+ }
88
+ catch (error) {
89
+ const errorMessage = error instanceof Error ? error.message : String(error);
90
+ console.error(chalk.red(`Error uninstalling MCP: ${errorMessage}`));
91
+ }
92
+ const destPath = path.join(os.homedir(), ".codex", "AGENTS.md");
93
+ if (fs.existsSync(destPath)) {
94
+ const existingContent = fs.readFileSync(destPath, "utf-8");
95
+ let updatedContent = existingContent;
96
+ let previousContent = "";
97
+ while (updatedContent !== previousContent) {
98
+ previousContent = updatedContent;
99
+ updatedContent = updatedContent.replace(SKILL, "");
100
+ updatedContent = updatedContent.replace(SKILL.trim(), "");
101
+ }
102
+ if (updatedContent.trim() === "") {
103
+ fs.unlinkSync(destPath);
104
+ }
105
+ else {
106
+ fs.writeFileSync(destPath, updatedContent);
107
+ }
108
+ console.log(chalk.green("Successfully removed the sgrep skill from Codex"));
109
+ }
110
+ console.log("");
111
+ console.log(chalk.green("Uninstallation complete!"));
112
+ }
113
+ export const installCodex = new Command("install-codex")
114
+ .description("Install the sgrep plugin for Codex CLI")
115
+ .action(async () => {
116
+ await installPlugin();
117
+ });
118
+ export const uninstallCodex = new Command("uninstall-codex")
119
+ .description("Uninstall the sgrep plugin from Codex CLI")
120
+ .action(async () => {
121
+ await uninstallPlugin();
122
+ });
123
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/install/codex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,KAAK,GACT,OAAO,CAAC,GAAG,CAAC,KAAK;IACjB,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAEhF,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCb,CAAC;AAEF,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,KAAK,UAAU,aAAa;IAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,+BAA+B,EAAE;YAC/C,KAAK;YACL,GAAG,EAAE,OAAO,CAAC,GAAG;SACjB,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC,CAAC;QAExE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;QAChE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE1D,IAAI,eAAe,GAAG,EAAE,CAAC;QACzB,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,eAAe,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAClC,IACE,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC;YAChC,CAAC,eAAe,CAAC,QAAQ,CAAC,YAAY,CAAC,EACvC,CAAC;YACD,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC,CAAC;QAChF,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,+CAA+C,CAAC,CAAC,CAAC;QAC7E,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5E,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,YAAY,EAAE,CAAC,CAAC,CAAC;QACrE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,kCAAkC,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe;IAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC,CAAC;IACxE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5E,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,YAAY,EAAE,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IAChE,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,MAAM,eAAe,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC3D,IAAI,cAAc,GAAG,eAAe,CAAC;QACrC,IAAI,eAAe,GAAG,EAAE,CAAC;QAEzB,OAAO,cAAc,KAAK,eAAe,EAAE,CAAC;YAC1C,eAAe,GAAG,cAAc,CAAC;YACjC,cAAc,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACnD,cAAc,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACjC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,eAAe,CAAC;KACrD,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,aAAa,EAAE,CAAC;AACxB,CAAC,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,iBAAiB,CAAC;KACzD,WAAW,CAAC,2CAA2C,CAAC;KACxD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,eAAe,EAAE,CAAC;AAC1B,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Command } from "commander";
2
+ export declare const installCursor: Command;
3
+ export declare const uninstallCursor: Command;
4
+ //# sourceMappingURL=cursor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/install/cursor.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwFpC,eAAO,MAAM,aAAa,SAItB,CAAC;AAEL,eAAO,MAAM,eAAe,SAIxB,CAAC"}
@@ -0,0 +1,91 @@
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { Command } from "commander";
6
+ import chalk from "chalk";
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = path.dirname(__filename);
9
+ const PLUGIN_ROOT = process.env.CURSOR_PLUGIN_ROOT ||
10
+ path.resolve(__dirname, "../plugins/sgrep");
11
+ const PLUGIN_SKILL_PATH = path.join(PLUGIN_ROOT, "skills", "sgrep", "SKILL.md");
12
+ function resolveCursorSkillsDir() {
13
+ return path.join(os.homedir(), ".cursor", "skills");
14
+ }
15
+ function readPluginAsset(assetPath) {
16
+ if (!fs.existsSync(assetPath)) {
17
+ throw new Error(`Plugin asset missing: ${assetPath}`);
18
+ }
19
+ return fs.readFileSync(assetPath, "utf-8");
20
+ }
21
+ function writeFileIfChanged(filePath, content) {
22
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
23
+ const already = fs.existsSync(filePath)
24
+ ? fs.readFileSync(filePath, "utf-8")
25
+ : undefined;
26
+ if (already !== content) {
27
+ fs.writeFileSync(filePath, content);
28
+ return true;
29
+ }
30
+ return false;
31
+ }
32
+ async function installPlugin() {
33
+ console.log(chalk.cyan("Installing sgrep skill for Cursor..."));
34
+ console.log("");
35
+ try {
36
+ const skillsDir = resolveCursorSkillsDir();
37
+ const destPath = path.join(skillsDir, "sgrep", "SKILL.md");
38
+ const skillContent = readPluginAsset(PLUGIN_SKILL_PATH);
39
+ if (writeFileIfChanged(destPath, skillContent.trimStart())) {
40
+ console.log(chalk.green(`Installed sgrep skill to ${destPath}`));
41
+ }
42
+ else {
43
+ console.log(chalk.yellow("The sgrep skill is already installed and up to date"));
44
+ }
45
+ console.log("");
46
+ console.log(chalk.green("Installation complete!"));
47
+ console.log("");
48
+ console.log("The sgrep skill is now available in Cursor.");
49
+ console.log("You can use it by typing " + chalk.cyan("/sgrep") + " or Cursor will automatically use it for semantic searches.");
50
+ console.log("");
51
+ console.log(chalk.gray("To uninstall: sgrep uninstall-cursor"));
52
+ }
53
+ catch (error) {
54
+ const errorMessage = error instanceof Error ? error.message : String(error);
55
+ console.error(chalk.red(`Error installing skill: ${errorMessage}`));
56
+ process.exit(1);
57
+ }
58
+ }
59
+ async function uninstallPlugin() {
60
+ console.log(chalk.cyan("Uninstalling sgrep skill from Cursor..."));
61
+ console.log("");
62
+ try {
63
+ const skillsDir = resolveCursorSkillsDir();
64
+ const skillDir = path.join(skillsDir, "sgrep");
65
+ if (fs.existsSync(skillDir)) {
66
+ fs.rmSync(skillDir, { recursive: true, force: true });
67
+ console.log(chalk.green("Removed sgrep skill from Cursor"));
68
+ }
69
+ else {
70
+ console.log(chalk.yellow("The sgrep skill is not installed in Cursor"));
71
+ }
72
+ console.log("");
73
+ console.log(chalk.green("Uninstallation complete!"));
74
+ }
75
+ catch (error) {
76
+ const errorMessage = error instanceof Error ? error.message : String(error);
77
+ console.error(chalk.red(`Error uninstalling skill: ${errorMessage}`));
78
+ process.exit(1);
79
+ }
80
+ }
81
+ export const installCursor = new Command("install-cursor")
82
+ .description("Install the sgrep skill for Cursor")
83
+ .action(async () => {
84
+ await installPlugin();
85
+ });
86
+ export const uninstallCursor = new Command("uninstall-cursor")
87
+ .description("Uninstall the sgrep skill from Cursor")
88
+ .action(async () => {
89
+ await uninstallPlugin();
90
+ });
91
+ //# sourceMappingURL=cursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/install/cursor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Command } from "commander";
2
+ export declare const installDroid: Command;
3
+ export declare const uninstallDroid: Command;
4
+ //# sourceMappingURL=droid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"droid.d.ts","sourceRoot":"","sources":["../../src/install/droid.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoRpC,eAAO,MAAM,YAAY,SAIrB,CAAC;AAEL,eAAO,MAAM,cAAc,SAIvB,CAAC"}