@splicr/mcp-server 0.3.8 → 0.3.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -8,6 +8,7 @@ import { getRecentInsightsSchema, handleGetRecentInsights } from './tools/get-re
8
8
  import { saveFromAgentSchema, handleSaveFromAgent } from './tools/save-from-agent.js';
9
9
  import { retryFailedSchema, handleRetryFailed } from './tools/retry-failed.js';
10
10
  import { getFullContentSchema, handleGetFullContent } from './tools/get-full-content.js';
11
+ import { getRelevantContextSchema, handleGetRelevantContext } from './tools/get-relevant-context.js';
11
12
  // Prevent unhandled errors from crashing the MCP server
12
13
  process.on('uncaughtException', (err) => {
13
14
  console.error('[Splicr MCP] Uncaught exception:', err.message);
@@ -17,7 +18,9 @@ process.on('unhandledRejection', (err) => {
17
18
  });
18
19
  const server = new Server({ name: 'splicr', version: '0.1.0' }, {
19
20
  capabilities: { tools: {} },
20
- instructions: `RULE #1: ALWAYS call search_knowledge BEFORE answering. The ONLY exceptions are pure code edits, git commands, and file operations. For EVERYTHING else implementation questions, architecture, debugging, "how do I", "build me", technical decisions search first. NO EXCEPTIONS. The user's saved knowledge MUST inform your answers.
21
+ instructions: `RULE #1: Call get_relevant_context at the START of any task. Pass your understanding of the task (the user's message), any files you're reading/modifying, and any errors you've encountered. It automatically searches the user's knowledge base using full context awareness your task, git branch, recent commits, changed files, and more.
22
+
23
+ For follow-up or narrow searches during the same task, use search_knowledge with a specific query.
21
24
 
22
25
  When results have high relevance (>50%), call get_full_content(id) to get the complete saved content before responding.
23
26
 
@@ -32,6 +35,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
32
35
  saveFromAgentSchema,
33
36
  retryFailedSchema,
34
37
  getFullContentSchema,
38
+ getRelevantContextSchema,
35
39
  ],
36
40
  }));
37
41
  // Handle tool calls with per-tool timeout
@@ -45,6 +49,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
45
49
  save_from_agent: handleSaveFromAgent,
46
50
  retry_failed: handleRetryFailed,
47
51
  get_full_content: handleGetFullContent,
52
+ get_relevant_context: handleGetRelevantContext,
48
53
  }[name];
49
54
  if (!handler) {
50
55
  return { content: [{ type: 'text', text: `Unknown tool: ${name}` }], isError: true };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -59,5 +59,19 @@ export declare function retryFailed(): Promise<{
59
59
  retried: number;
60
60
  message: string;
61
61
  }>;
62
+ export declare function getRelevantContext(params: {
63
+ queries: Array<{
64
+ text: string;
65
+ weight: number;
66
+ source: string;
67
+ }>;
68
+ project_name?: string;
69
+ tech_stack?: string[];
70
+ cross_project?: boolean;
71
+ limit?: number;
72
+ }): Promise<{
73
+ results: any[];
74
+ search_strategy: string;
75
+ }>;
62
76
  export { API_URL };
63
77
  //# sourceMappingURL=api-client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,OAAO,QAA6E,CAAC;AAmC3F,wBAAsB,eAAe,CAAC,MAAM,EAAE;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAGjB;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAC9C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,GAAG,EAAE,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAErD;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAKrD;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,CAEpF;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE;QACd,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAEnE;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE;IAC3C,EAAE,EAAE,MAAM,CAAC;CACZ,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAAC,CAEhH;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAEjF;AAED,OAAO,EAAE,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"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"}
@@ -55,5 +55,9 @@ export async function getFullContent(params) {
55
55
  export async function retryFailed() {
56
56
  return await apiRequest('POST', '/captures/retry-failed', {});
57
57
  }
58
+ export async function getRelevantContext(params) {
59
+ const data = await apiRequest('POST', '/mcp/relevant-context', params);
60
+ return { results: data.results ?? [], search_strategy: data.search_strategy ?? '' };
61
+ }
58
62
  export { API_URL };
59
63
  //# sourceMappingURL=api-client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { EnvironmentSignals } from './signal-gatherer.js';
2
+ export interface AgentSignals {
3
+ task?: string;
4
+ files?: string[];
5
+ errors?: string[];
6
+ diff_summary?: string;
7
+ }
8
+ export interface FusedQuery {
9
+ text: string;
10
+ weight: number;
11
+ source: string;
12
+ }
13
+ export interface FusedPayload {
14
+ queries: FusedQuery[];
15
+ project_name: string | null;
16
+ tech_stack: string[];
17
+ cross_project: boolean;
18
+ }
19
+ /**
20
+ * Fuse agent-provided signals and environment signals into weighted search queries.
21
+ * Pure logic, no I/O.
22
+ */
23
+ export declare function fuseSignals(agent: AgentSignals, env: EnvironmentSignals): FusedPayload;
24
+ /**
25
+ * Parse branch name into meaningful intent.
26
+ * "feat/rate-limiting" → "rate limiting"
27
+ * "fix/auth-redirect-loop" → "auth redirect loop fix"
28
+ */
29
+ export declare function parseBranchName(name: string): string | null;
30
+ /**
31
+ * Extract meaningful concepts from file paths.
32
+ * ["src/routes/auth.ts", "src/middleware/rate-limit.ts"] → "auth routes rate-limit middleware"
33
+ */
34
+ export declare function extractConceptsFromPaths(files: string[]): string | null;
35
+ //# sourceMappingURL=signal-fusion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signal-fusion.d.ts","sourceRoot":"","sources":["../../src/lib/signal-fusion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;CACxB;AAKD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,kBAAkB,GAAG,YAAY,CAiEtF;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmB3D;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CA2BvE"}
@@ -0,0 +1,129 @@
1
+ const BRANCH_PREFIXES = ['feat', 'fix', 'chore', 'refactor', 'hotfix', 'bugfix', 'feature', 'release', 'docs', 'test'];
2
+ const NOISE_WORDS = new Set(['src', 'lib', 'utils', 'util', 'helpers', 'helper', 'index', 'test', 'tests', 'spec', 'specs', '__tests__', 'dist', 'build', 'node_modules', 'components', 'pages', 'app']);
3
+ /**
4
+ * Fuse agent-provided signals and environment signals into weighted search queries.
5
+ * Pure logic, no I/O.
6
+ */
7
+ export function fuseSignals(agent, env) {
8
+ const queries = [];
9
+ // 1. Task description — primary signal (weight 1.0)
10
+ if (agent.task?.trim()) {
11
+ queries.push({ text: agent.task.trim().slice(0, 500), weight: 1.0, source: 'task' });
12
+ }
13
+ // 2. Error messages — high signal (weight 0.8), first 2 only
14
+ if (agent.errors?.length) {
15
+ for (const error of agent.errors.slice(0, 2)) {
16
+ const cleaned = cleanError(error);
17
+ if (cleaned) {
18
+ queries.push({ text: cleaned, weight: 0.8, source: 'error' });
19
+ }
20
+ }
21
+ }
22
+ // 3. Branch name — intent signal (weight 0.5)
23
+ if (env.branch_name) {
24
+ const intent = parseBranchName(env.branch_name);
25
+ if (intent) {
26
+ queries.push({ text: intent, weight: 0.5, source: 'branch' });
27
+ }
28
+ }
29
+ // 4. File paths — domain signal (weight 0.4)
30
+ const allFiles = dedupeStrings([
31
+ ...(agent.files || []),
32
+ ...env.changed_files,
33
+ ...env.staged_files,
34
+ ]);
35
+ if (allFiles.length > 0) {
36
+ const concepts = extractConceptsFromPaths(allFiles);
37
+ if (concepts) {
38
+ queries.push({ text: concepts, weight: 0.4, source: 'files' });
39
+ }
40
+ }
41
+ // 5. Diff summary from agent (weight 0.4)
42
+ if (agent.diff_summary?.trim()) {
43
+ queries.push({ text: agent.diff_summary.trim().slice(0, 300), weight: 0.4, source: 'diff' });
44
+ }
45
+ // 6. Recent commits — direction signal (weight 0.3)
46
+ if (env.recent_commits.length > 0) {
47
+ // Strip commit hashes, take first 3
48
+ const messages = env.recent_commits
49
+ .slice(0, 3)
50
+ .map(c => c.replace(/^[a-f0-9]+\s+/, ''))
51
+ .join('; ');
52
+ if (messages.length > 5) {
53
+ queries.push({ text: messages, weight: 0.3, source: 'commits' });
54
+ }
55
+ }
56
+ // Enable cross-project search when we have rich signals (3+ queries)
57
+ const cross_project = queries.length >= 3;
58
+ return {
59
+ queries: queries.slice(0, 6), // max 6 queries to API
60
+ project_name: env.project_name,
61
+ tech_stack: env.tech_stack,
62
+ cross_project,
63
+ };
64
+ }
65
+ /**
66
+ * Parse branch name into meaningful intent.
67
+ * "feat/rate-limiting" → "rate limiting"
68
+ * "fix/auth-redirect-loop" → "auth redirect loop fix"
69
+ */
70
+ export function parseBranchName(name) {
71
+ // Split on /
72
+ const parts = name.split('/');
73
+ const prefix = parts[0].toLowerCase();
74
+ const rest = parts.slice(1).join('/');
75
+ if (!rest) {
76
+ // No prefix/body pattern (e.g., "main", "develop")
77
+ if (BRANCH_PREFIXES.includes(prefix))
78
+ return null;
79
+ return null; // Don't search for "main" or "develop"
80
+ }
81
+ // Split the body on - and _
82
+ const words = rest.split(/[-_]+/).filter(w => w.length > 1);
83
+ if (words.length === 0)
84
+ return null;
85
+ // Add context from prefix
86
+ const suffix = prefix === 'fix' || prefix === 'bugfix' || prefix === 'hotfix' ? ' fix' : '';
87
+ return words.join(' ') + suffix;
88
+ }
89
+ /**
90
+ * Extract meaningful concepts from file paths.
91
+ * ["src/routes/auth.ts", "src/middleware/rate-limit.ts"] → "auth routes rate-limit middleware"
92
+ */
93
+ export function extractConceptsFromPaths(files) {
94
+ const concepts = new Set();
95
+ for (const file of files.slice(0, 20)) { // cap at 20 files
96
+ const parts = file
97
+ .replace(/\\/g, '/')
98
+ .split('/')
99
+ .map(p => p.replace(/\.[^.]+$/, '')) // strip extension
100
+ .filter(p => p.length > 1 && !NOISE_WORDS.has(p.toLowerCase()));
101
+ for (const part of parts) {
102
+ // Split camelCase and kebab-case
103
+ const words = part
104
+ .replace(/([a-z])([A-Z])/g, '$1 $2')
105
+ .replace(/[-_]+/g, ' ')
106
+ .toLowerCase()
107
+ .split(/\s+/)
108
+ .filter(w => w.length > 1 && !NOISE_WORDS.has(w));
109
+ for (const word of words) {
110
+ concepts.add(word);
111
+ }
112
+ }
113
+ }
114
+ const result = [...concepts].slice(0, 15).join(' ');
115
+ return result.length > 3 ? result : null;
116
+ }
117
+ function cleanError(error) {
118
+ // Truncate, strip ANSI codes, strip file paths that are just noise
119
+ const cleaned = error
120
+ .replace(/\x1B\[[0-9;]*m/g, '') // strip ANSI
121
+ .replace(/at\s+.*\(.*:\d+:\d+\)/g, '') // strip stack traces
122
+ .trim()
123
+ .slice(0, 200);
124
+ return cleaned.length > 5 ? cleaned : null;
125
+ }
126
+ function dedupeStrings(arr) {
127
+ return [...new Set(arr.map(s => s.trim()).filter(Boolean))];
128
+ }
129
+ //# sourceMappingURL=signal-fusion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signal-fusion.js","sourceRoot":"","sources":["../../src/lib/signal-fusion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export interface EnvironmentSignals {
2
+ branch_name: string | null;
3
+ recent_commits: string[];
4
+ changed_files: string[];
5
+ staged_files: string[];
6
+ recently_modified_files: string[];
7
+ tech_stack: string[];
8
+ project_name: string | null;
9
+ }
10
+ /**
11
+ * Gather environment signals from the local repo.
12
+ * Every operation is individually try/caught — one failure never blocks the rest.
13
+ * Target: < 1 second total.
14
+ */
15
+ export declare function gatherSignals(cwd: string): EnvironmentSignals;
16
+ //# sourceMappingURL=signal-gatherer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signal-gatherer.d.ts","sourceRoot":"","sources":["../../src/lib/signal-gatherer.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,uBAAuB,EAAE,MAAM,EAAE,CAAC;IAClC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAsBD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,CAqB7D"}
@@ -0,0 +1,93 @@
1
+ import { execSync } from 'child_process';
2
+ import { existsSync, readFileSync } from 'fs';
3
+ import { join } from 'path';
4
+ const GIT_TIMEOUT = 1000; // 1 second per command
5
+ function gitCommand(cmd, cwd) {
6
+ try {
7
+ return execSync(cmd, {
8
+ cwd,
9
+ encoding: 'utf-8',
10
+ timeout: GIT_TIMEOUT,
11
+ stdio: ['pipe', 'pipe', 'pipe'],
12
+ }).trim();
13
+ }
14
+ catch {
15
+ return null;
16
+ }
17
+ }
18
+ function splitLines(output) {
19
+ if (!output)
20
+ return [];
21
+ return output.split('\n').map(l => l.trim()).filter(Boolean);
22
+ }
23
+ /**
24
+ * Gather environment signals from the local repo.
25
+ * Every operation is individually try/caught — one failure never blocks the rest.
26
+ * Target: < 1 second total.
27
+ */
28
+ export function gatherSignals(cwd) {
29
+ // Run git commands (sync but each with 1s timeout — fast enough in practice)
30
+ const branch_name = gitCommand('git branch --show-current', cwd);
31
+ const recentCommitsRaw = gitCommand('git log --oneline -5 --no-decorate', cwd);
32
+ const changedFilesRaw = gitCommand('git diff --name-only HEAD', cwd);
33
+ const stagedFilesRaw = gitCommand('git diff --name-only --cached', cwd);
34
+ const recentFilesRaw = gitCommand('git diff --name-only HEAD~5..HEAD', cwd);
35
+ // Detect tech stack + project name from local files (reuse existing logic)
36
+ const tech_stack = detectTechStack(cwd);
37
+ const project_name = detectProjectName(cwd);
38
+ return {
39
+ branch_name,
40
+ recent_commits: splitLines(recentCommitsRaw),
41
+ changed_files: splitLines(changedFilesRaw),
42
+ staged_files: splitLines(stagedFilesRaw),
43
+ recently_modified_files: splitLines(recentFilesRaw),
44
+ tech_stack,
45
+ project_name,
46
+ };
47
+ }
48
+ // --- Reused from project-detector.ts (kept local to avoid circular imports) ---
49
+ const KNOWN_TECH = [
50
+ 'react', 'next', 'express', 'fastify', 'vue', 'angular', 'svelte',
51
+ 'tailwindcss', 'prisma', '@supabase/supabase-js', 'typescript',
52
+ 'react-native', 'expo', 'electron', '@modelcontextprotocol/sdk',
53
+ 'zod', 'drizzle-orm', 'mongoose', 'graphql', 'trpc',
54
+ ];
55
+ function detectTechStack(cwd) {
56
+ const techStack = [];
57
+ const pkgPath = join(cwd, 'package.json');
58
+ if (existsSync(pkgPath)) {
59
+ try {
60
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
61
+ const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
62
+ for (const tech of KNOWN_TECH) {
63
+ if (allDeps[tech]) {
64
+ techStack.push(tech.replace('@supabase/supabase-js', 'supabase').replace('@modelcontextprotocol/sdk', 'mcp'));
65
+ }
66
+ }
67
+ if (!allDeps['typescript'] && existsSync(join(cwd, 'tsconfig.json'))) {
68
+ techStack.push('typescript');
69
+ }
70
+ }
71
+ catch { /* ignore */ }
72
+ }
73
+ if (existsSync(join(cwd, 'requirements.txt')) || existsSync(join(cwd, 'pyproject.toml')))
74
+ techStack.push('python');
75
+ if (existsSync(join(cwd, 'go.mod')))
76
+ techStack.push('go');
77
+ if (existsSync(join(cwd, 'Cargo.toml')))
78
+ techStack.push('rust');
79
+ return techStack;
80
+ }
81
+ function detectProjectName(cwd) {
82
+ const pkgPath = join(cwd, 'package.json');
83
+ if (existsSync(pkgPath)) {
84
+ try {
85
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
86
+ if (pkg.name)
87
+ return pkg.name.replace(/^@[^/]+\//, '');
88
+ }
89
+ catch { /* ignore */ }
90
+ }
91
+ return cwd.replace(/\\/g, '/').split('/').pop() || null;
92
+ }
93
+ //# sourceMappingURL=signal-gatherer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signal-gatherer.js","sourceRoot":"","sources":["../../src/lib/signal-gatherer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ export declare const getRelevantContextSchema: {
2
+ name: "get_relevant_context";
3
+ description: string;
4
+ inputSchema: {
5
+ type: "object";
6
+ properties: {
7
+ task: {
8
+ type: "string";
9
+ description: string;
10
+ };
11
+ files: {
12
+ type: "array";
13
+ items: {
14
+ type: "string";
15
+ };
16
+ description: string;
17
+ };
18
+ errors: {
19
+ type: "array";
20
+ items: {
21
+ type: "string";
22
+ };
23
+ description: string;
24
+ };
25
+ diff_summary: {
26
+ type: "string";
27
+ description: string;
28
+ };
29
+ };
30
+ };
31
+ };
32
+ export declare function handleGetRelevantContext(args: Record<string, unknown>): Promise<string>;
33
+ //# sourceMappingURL=get-relevant-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-relevant-context.d.ts","sourceRoot":"","sources":["../../src/tools/get-relevant-context.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCpC,CAAC;AAeF,wBAAsB,wBAAwB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CA4D7F"}
@@ -0,0 +1,115 @@
1
+ import { getRelevantContext } from '../lib/api-client.js';
2
+ import { detectProject } from '../lib/project-detector.js';
3
+ import { gatherSignals } from '../lib/signal-gatherer.js';
4
+ import { fuseSignals } from '../lib/signal-fusion.js';
5
+ export const getRelevantContextSchema = {
6
+ name: 'get_relevant_context',
7
+ description: `Proactively surface relevant knowledge based on what you're currently working on. This tool understands your full working context — task, files, errors, git branch, recent commits — and finds the most relevant saved knowledge automatically.
8
+
9
+ Call this at the START of any implementation task. You do NOT need all parameters — pass whatever you have.
10
+
11
+ WHEN TO CALL:
12
+ - At the start of any implementation task (pass the user's message as "task")
13
+ - When you encounter an error (pass error messages in "errors")
14
+ - When switching to a different part of the codebase
15
+
16
+ This tool also reads the local git state (branch, diff, recent commits) to understand context you don't need to pass explicitly.
17
+
18
+ For follow-up or narrow searches mid-task, use search_knowledge instead.`,
19
+ inputSchema: {
20
+ type: 'object',
21
+ properties: {
22
+ task: {
23
+ type: 'string',
24
+ description: 'What the user asked you to do (their message or a summary of the task)',
25
+ },
26
+ files: {
27
+ type: 'array',
28
+ items: { type: 'string' },
29
+ description: 'Files being read or modified (full or relative paths)',
30
+ },
31
+ errors: {
32
+ type: 'array',
33
+ items: { type: 'string' },
34
+ description: 'Error messages encountered during the task',
35
+ },
36
+ diff_summary: {
37
+ type: 'string',
38
+ description: 'Brief summary of code changes made so far',
39
+ },
40
+ },
41
+ },
42
+ };
43
+ function formatAge(dateStr) {
44
+ const date = new Date(dateStr);
45
+ if (isNaN(date.getTime()))
46
+ return 'unknown';
47
+ const days = Math.floor((Date.now() - date.getTime()) / 86400000);
48
+ if (days < 0)
49
+ return 'just now';
50
+ if (days === 0)
51
+ return 'today';
52
+ if (days === 1)
53
+ return 'yesterday';
54
+ if (days < 7)
55
+ return `${days}d ago`;
56
+ if (days < 30)
57
+ return `${Math.floor(days / 7)}w ago`;
58
+ if (days < 365)
59
+ return `${Math.floor(days / 30)}mo ago`;
60
+ return `${Math.floor(days / 365)}y ago`;
61
+ }
62
+ export async function handleGetRelevantContext(args) {
63
+ const agentSignals = {
64
+ task: args.task,
65
+ files: args.files,
66
+ errors: args.errors,
67
+ diff_summary: args.diff_summary,
68
+ };
69
+ // Gather environment signals from the local repo
70
+ const envSignals = gatherSignals(process.cwd());
71
+ // Fuse agent + environment signals into search queries
72
+ const fused = fuseSignals(agentSignals, envSignals);
73
+ if (fused.queries.length === 0) {
74
+ return 'No context signals available. Provide a task description or work in a git repository.';
75
+ }
76
+ // Detect project for the API call
77
+ let projectName;
78
+ try {
79
+ const detected = await detectProject(process.cwd());
80
+ projectName = detected?.name;
81
+ }
82
+ catch { /* proceed without project */ }
83
+ // Call the API
84
+ const { results, search_strategy } = await getRelevantContext({
85
+ queries: fused.queries,
86
+ project_name: projectName || fused.project_name || undefined,
87
+ tech_stack: fused.tech_stack,
88
+ cross_project: fused.cross_project,
89
+ limit: 5,
90
+ });
91
+ if (!results || results.length === 0) {
92
+ return 'No relevant knowledge found in Splicr for your current context.';
93
+ }
94
+ // Format results with why_relevant
95
+ const formatted = results.map((r, i) => {
96
+ const age = formatAge(r.created_at);
97
+ const score = r.rrf_score
98
+ ? `${(r.rrf_score * 100).toFixed(0)}%`
99
+ : r.similarity
100
+ ? `${(r.similarity * 100).toFixed(0)}%`
101
+ : r.score
102
+ ? `${(r.score * 100).toFixed(0)}%`
103
+ : 'n/a';
104
+ const why = r.why_relevant ? `\n why: ${r.why_relevant}` : '';
105
+ const crossTag = r.cross_project ? ' (cross-project)' : '';
106
+ return `${i + 1}. **${r.title || 'Untitled'}**${crossTag}\n` +
107
+ ` ${r.insight}\n` +
108
+ ` source: ${r.source_type || 'unknown'} | saved: ${age} | match: ${score} | tags: ${r.tags?.join(', ') || 'none'}${r.source_url ? `\n url: ${r.source_url}` : ''}` +
109
+ why +
110
+ `\n id: ${r.id}`;
111
+ }).join('\n\n');
112
+ const header = `*Splicr context — ${results.length} relevant save(s) [${search_strategy}]:*`;
113
+ return `${header}\n\n${formatted}`;
114
+ }
115
+ //# sourceMappingURL=get-relevant-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-relevant-context.js","sourceRoot":"","sources":["../../src/tools/get-relevant-context.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@splicr/mcp-server",
3
- "version": "0.3.8",
3
+ "version": "0.3.9",
4
4
  "description": "Splicr MCP server — route what you read to what you're building",
5
5
  "type": "module",
6
6
  "bin": "./dist/cli.js",