argustack 0.1.6 → 0.1.7
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/README.md +25 -12
- package/dist/adapters/git/mapper.d.ts +1 -1
- package/dist/adapters/git/mapper.js +1 -1
- package/dist/adapters/github/mapper.d.ts +1 -1
- package/dist/adapters/github/mapper.js +1 -1
- package/dist/cli/init/generators.d.ts +6 -0
- package/dist/cli/init/generators.d.ts.map +1 -0
- package/dist/cli/init/generators.js +153 -0
- package/dist/cli/init/generators.js.map +1 -0
- package/dist/cli/init/index.d.ts +4 -0
- package/dist/cli/init/index.d.ts.map +1 -0
- package/dist/cli/init/index.js +254 -0
- package/dist/cli/init/index.js.map +1 -0
- package/dist/cli/init/setup-csv.d.ts +4 -0
- package/dist/cli/init/setup-csv.d.ts.map +1 -0
- package/dist/cli/init/setup-csv.js +52 -0
- package/dist/cli/init/setup-csv.js.map +1 -0
- package/dist/cli/init/setup-db.d.ts +4 -0
- package/dist/cli/init/setup-db.d.ts.map +1 -0
- package/dist/cli/init/setup-db.js +33 -0
- package/dist/cli/init/setup-db.js.map +1 -0
- package/dist/cli/init/setup-git.d.ts +4 -0
- package/dist/cli/init/setup-git.d.ts.map +1 -0
- package/dist/cli/init/setup-git.js +244 -0
- package/dist/cli/init/setup-git.js.map +1 -0
- package/dist/cli/init/setup-github.d.ts +4 -0
- package/dist/cli/init/setup-github.d.ts.map +1 -0
- package/dist/cli/init/setup-github.js +102 -0
- package/dist/cli/init/setup-github.js.map +1 -0
- package/dist/cli/init/setup-jira.d.ts +4 -0
- package/dist/cli/init/setup-jira.d.ts.map +1 -0
- package/dist/cli/init/setup-jira.js +124 -0
- package/dist/cli/init/setup-jira.js.map +1 -0
- package/dist/cli/init/types.d.ts +59 -0
- package/dist/cli/init/types.d.ts.map +1 -0
- package/dist/cli/init/types.js +31 -0
- package/dist/cli/init/types.js.map +1 -0
- package/dist/core/types/config.js +1 -1
- package/dist/core/types/config.js.map +1 -1
- package/dist/mcp/helpers.d.ts +24 -0
- package/dist/mcp/helpers.d.ts.map +1 -0
- package/dist/mcp/helpers.js +73 -0
- package/dist/mcp/helpers.js.map +1 -0
- package/dist/mcp/server.d.ts +2 -3
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +12 -1579
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/estimate.d.ts +3 -0
- package/dist/mcp/tools/estimate.d.ts.map +1 -0
- package/dist/mcp/tools/estimate.js +478 -0
- package/dist/mcp/tools/estimate.js.map +1 -0
- package/dist/mcp/tools/issue.d.ts +3 -0
- package/dist/mcp/tools/issue.d.ts.map +1 -0
- package/dist/mcp/tools/issue.js +468 -0
- package/dist/mcp/tools/issue.js.map +1 -0
- package/dist/mcp/tools/query.d.ts +3 -0
- package/dist/mcp/tools/query.d.ts.map +1 -0
- package/dist/mcp/tools/query.js +319 -0
- package/dist/mcp/tools/query.js.map +1 -0
- package/dist/mcp/tools/search.d.ts +3 -0
- package/dist/mcp/tools/search.d.ts.map +1 -0
- package/dist/mcp/tools/search.js +61 -0
- package/dist/mcp/tools/search.js.map +1 -0
- package/dist/mcp/tools/workspace.d.ts +3 -0
- package/dist/mcp/tools/workspace.d.ts.map +1 -0
- package/dist/mcp/tools/workspace.js +86 -0
- package/dist/mcp/tools/workspace.js.map +1 -0
- package/dist/mcp/types.d.ts +157 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +2 -0
- package/dist/mcp/types.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
import { loadWorkspace, createAdapters, textResponse, errorResponse, getErrorMessage, str, } from '../helpers.js';
|
|
3
|
+
export function registerQueryTools(server) {
|
|
4
|
+
server.registerTool('query_issues', {
|
|
5
|
+
description: 'Search and query Jira issues stored in the local Argustack database. Supports full-text search, filtering by project/status/assignee, and SQL for complex queries.',
|
|
6
|
+
inputSchema: {
|
|
7
|
+
search: z.string().optional().describe('Full-text search query (e.g. "payment bug", "template recipients")'),
|
|
8
|
+
project: z.string().optional().describe('Filter by project key (e.g. "PROJ")'),
|
|
9
|
+
status: z.string().optional().describe('Filter by status (e.g. "Open", "In Progress", "Done")'),
|
|
10
|
+
assignee: z.string().optional().describe('Filter by assignee display name'),
|
|
11
|
+
issue_type: z.string().optional().describe('Filter by issue type (e.g. "Bug", "Story", "Task")'),
|
|
12
|
+
limit: z.number().optional().describe('Max results to return (default: 50)'),
|
|
13
|
+
sql: z.string().optional().describe('Raw SQL query for advanced queries. Table: issues. Use for complex analysis.'),
|
|
14
|
+
},
|
|
15
|
+
}, async ({ search, project, status, assignee, issue_type: issueType, limit, sql }) => {
|
|
16
|
+
const ws = loadWorkspace();
|
|
17
|
+
if (!ws.ok) {
|
|
18
|
+
return errorResponse(`Workspace not found: ${ws.reason}`);
|
|
19
|
+
}
|
|
20
|
+
const { storage } = await createAdapters(ws.root);
|
|
21
|
+
try {
|
|
22
|
+
const maxResults = limit ?? 50;
|
|
23
|
+
let sqlQuery;
|
|
24
|
+
let params;
|
|
25
|
+
if (sql) {
|
|
26
|
+
sqlQuery = sql;
|
|
27
|
+
params = [];
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
const conditions = [];
|
|
31
|
+
params = [];
|
|
32
|
+
let paramIdx = 1;
|
|
33
|
+
if (search) {
|
|
34
|
+
conditions.push(`search_vector @@ plainto_tsquery('english', $${String(paramIdx)})`);
|
|
35
|
+
params.push(search);
|
|
36
|
+
paramIdx++;
|
|
37
|
+
}
|
|
38
|
+
if (project) {
|
|
39
|
+
conditions.push(`project_key = $${String(paramIdx)}`);
|
|
40
|
+
params.push(project.toUpperCase());
|
|
41
|
+
paramIdx++;
|
|
42
|
+
}
|
|
43
|
+
if (status) {
|
|
44
|
+
conditions.push(`status ILIKE $${String(paramIdx)}`);
|
|
45
|
+
params.push(status);
|
|
46
|
+
paramIdx++;
|
|
47
|
+
}
|
|
48
|
+
if (assignee) {
|
|
49
|
+
conditions.push(`assignee ILIKE $${String(paramIdx)}`);
|
|
50
|
+
params.push(`%${assignee}%`);
|
|
51
|
+
paramIdx++;
|
|
52
|
+
}
|
|
53
|
+
if (issueType) {
|
|
54
|
+
conditions.push(`issue_type ILIKE $${String(paramIdx)}`);
|
|
55
|
+
params.push(issueType);
|
|
56
|
+
paramIdx++;
|
|
57
|
+
}
|
|
58
|
+
const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
59
|
+
sqlQuery = `
|
|
60
|
+
SELECT issue_key, summary, status, priority, assignee, issue_type,
|
|
61
|
+
project_key, created, updated
|
|
62
|
+
FROM issues
|
|
63
|
+
${where}
|
|
64
|
+
ORDER BY updated DESC NULLS LAST
|
|
65
|
+
LIMIT ${String(maxResults)}
|
|
66
|
+
`;
|
|
67
|
+
}
|
|
68
|
+
const result = await storage.query(sqlQuery, params);
|
|
69
|
+
await storage.close();
|
|
70
|
+
if (result.rows.length === 0) {
|
|
71
|
+
return textResponse('No issues found matching your criteria.');
|
|
72
|
+
}
|
|
73
|
+
const lines = result.rows.map((row) => {
|
|
74
|
+
const typed = row;
|
|
75
|
+
if (typed.issue_key) {
|
|
76
|
+
return `${typed.issue_key} [${str(typed.status) || '?'}] ${str(typed.summary)} (${str(typed.assignee) || 'unassigned'})`;
|
|
77
|
+
}
|
|
78
|
+
return JSON.stringify(row);
|
|
79
|
+
});
|
|
80
|
+
return textResponse([
|
|
81
|
+
`Found ${String(result.rows.length)} results:`,
|
|
82
|
+
'',
|
|
83
|
+
...lines,
|
|
84
|
+
].join('\n'));
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
return errorResponse(`Query failed: ${getErrorMessage(err)}`);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
server.registerTool('query_commits', {
|
|
91
|
+
description: 'Search and query Git commits stored in the local database. Supports full-text search, filtering by author/date, and raw SQL.',
|
|
92
|
+
inputSchema: {
|
|
93
|
+
search: z.string().optional().describe('Full-text search in commit messages (e.g. "fix login", "PROJ-123")'),
|
|
94
|
+
author: z.string().optional().describe('Filter by author name'),
|
|
95
|
+
since: z.string().optional().describe('Commits after this date (YYYY-MM-DD)'),
|
|
96
|
+
until: z.string().optional().describe('Commits before this date (YYYY-MM-DD)'),
|
|
97
|
+
file_path: z.string().optional().describe('Filter by changed file path (e.g. "src/auth/login.ts")'),
|
|
98
|
+
repo_path: z.string().optional().describe('Filter by repository path (substring match)'),
|
|
99
|
+
limit: z.number().optional().describe('Max results (default: 50)'),
|
|
100
|
+
sql: z.string().optional().describe('Raw SQL query. Tables: commits, commit_files, commit_issue_refs'),
|
|
101
|
+
},
|
|
102
|
+
}, async ({ search, author, since, until, file_path: filePath, repo_path: repoPath, limit, sql }) => {
|
|
103
|
+
const ws = loadWorkspace();
|
|
104
|
+
if (!ws.ok) {
|
|
105
|
+
return errorResponse(`Workspace not found: ${ws.reason}`);
|
|
106
|
+
}
|
|
107
|
+
const { storage } = await createAdapters(ws.root);
|
|
108
|
+
try {
|
|
109
|
+
const maxResults = limit ?? 50;
|
|
110
|
+
let sqlQuery;
|
|
111
|
+
let params;
|
|
112
|
+
if (sql) {
|
|
113
|
+
sqlQuery = sql;
|
|
114
|
+
params = [];
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
const conditions = [];
|
|
118
|
+
params = [];
|
|
119
|
+
let paramIdx = 1;
|
|
120
|
+
let needJoin = false;
|
|
121
|
+
if (search) {
|
|
122
|
+
conditions.push(`c.search_vector @@ plainto_tsquery('english', $${String(paramIdx)})`);
|
|
123
|
+
params.push(search);
|
|
124
|
+
paramIdx++;
|
|
125
|
+
}
|
|
126
|
+
if (author) {
|
|
127
|
+
conditions.push(`c.author ILIKE $${String(paramIdx)}`);
|
|
128
|
+
params.push(`%${author}%`);
|
|
129
|
+
paramIdx++;
|
|
130
|
+
}
|
|
131
|
+
if (since) {
|
|
132
|
+
conditions.push(`c.committed_at >= $${String(paramIdx)}`);
|
|
133
|
+
params.push(since);
|
|
134
|
+
paramIdx++;
|
|
135
|
+
}
|
|
136
|
+
if (until) {
|
|
137
|
+
conditions.push(`c.committed_at <= $${String(paramIdx)}`);
|
|
138
|
+
params.push(until);
|
|
139
|
+
paramIdx++;
|
|
140
|
+
}
|
|
141
|
+
if (filePath) {
|
|
142
|
+
needJoin = true;
|
|
143
|
+
conditions.push(`cf.file_path ILIKE $${String(paramIdx)}`);
|
|
144
|
+
params.push(`%${filePath}%`);
|
|
145
|
+
paramIdx++;
|
|
146
|
+
}
|
|
147
|
+
if (repoPath) {
|
|
148
|
+
conditions.push(`c.repo_path ILIKE $${String(paramIdx)}`);
|
|
149
|
+
params.push(`%${repoPath}%`);
|
|
150
|
+
paramIdx++;
|
|
151
|
+
}
|
|
152
|
+
const from = needJoin
|
|
153
|
+
? 'commits c JOIN commit_files cf ON c.hash = cf.commit_hash'
|
|
154
|
+
: 'commits c';
|
|
155
|
+
const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
156
|
+
sqlQuery = `
|
|
157
|
+
SELECT DISTINCT c.hash, c.message, c.author, c.email, c.committed_at, c.repo_path
|
|
158
|
+
FROM ${from}
|
|
159
|
+
${where}
|
|
160
|
+
ORDER BY c.committed_at DESC NULLS LAST
|
|
161
|
+
LIMIT ${String(maxResults)}
|
|
162
|
+
`;
|
|
163
|
+
}
|
|
164
|
+
const result = await storage.query(sqlQuery, params);
|
|
165
|
+
await storage.close();
|
|
166
|
+
if (result.rows.length === 0) {
|
|
167
|
+
return textResponse('No commits found matching your criteria.');
|
|
168
|
+
}
|
|
169
|
+
const lines = result.rows.map((row) => {
|
|
170
|
+
const typed = row;
|
|
171
|
+
if (typed.hash) {
|
|
172
|
+
const shortHash = typed.hash.substring(0, 7);
|
|
173
|
+
const date = typed.committed_at ? str(typed.committed_at).substring(0, 10) : '?';
|
|
174
|
+
return `${shortHash} ${date} ${str(typed.author)}: ${str(typed.message).split('\n')[0]}`;
|
|
175
|
+
}
|
|
176
|
+
return JSON.stringify(row);
|
|
177
|
+
});
|
|
178
|
+
return textResponse([`Found ${String(result.rows.length)} commits:`, '', ...lines].join('\n'));
|
|
179
|
+
}
|
|
180
|
+
catch (err) {
|
|
181
|
+
return errorResponse(`Query failed: ${getErrorMessage(err)}`);
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
server.registerTool('query_prs', {
|
|
185
|
+
description: 'Search GitHub pull requests stored in the local database. Supports full-text search, filtering by state/author/base branch, and raw SQL.',
|
|
186
|
+
inputSchema: {
|
|
187
|
+
search: z.string().optional().describe('Full-text search in PR title and body'),
|
|
188
|
+
state: z.string().optional().describe('Filter by state: open, closed, merged'),
|
|
189
|
+
author: z.string().optional().describe('Filter by PR author'),
|
|
190
|
+
base_ref: z.string().optional().describe('Filter by base branch (e.g. "main")'),
|
|
191
|
+
since: z.string().optional().describe('PRs updated since date (YYYY-MM-DD)'),
|
|
192
|
+
limit: z.number().optional().describe('Max results (default: 50)'),
|
|
193
|
+
sql: z.string().optional().describe('Raw SQL. Tables: pull_requests, pr_reviews, pr_comments, pr_files, pr_issue_refs'),
|
|
194
|
+
},
|
|
195
|
+
}, async ({ search, state, author, base_ref: baseRef, since, limit, sql }) => {
|
|
196
|
+
const ws = loadWorkspace();
|
|
197
|
+
if (!ws.ok) {
|
|
198
|
+
return errorResponse(`Workspace not found: ${ws.reason}`);
|
|
199
|
+
}
|
|
200
|
+
const { storage } = await createAdapters(ws.root);
|
|
201
|
+
try {
|
|
202
|
+
const maxResults = limit ?? 50;
|
|
203
|
+
let sqlQuery;
|
|
204
|
+
let params;
|
|
205
|
+
if (sql) {
|
|
206
|
+
sqlQuery = sql;
|
|
207
|
+
params = [];
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
const conditions = [];
|
|
211
|
+
params = [];
|
|
212
|
+
let paramIdx = 1;
|
|
213
|
+
if (search) {
|
|
214
|
+
conditions.push(`search_vector @@ plainto_tsquery('english', $${String(paramIdx)})`);
|
|
215
|
+
params.push(search);
|
|
216
|
+
paramIdx++;
|
|
217
|
+
}
|
|
218
|
+
if (state) {
|
|
219
|
+
conditions.push(`state = $${String(paramIdx)}`);
|
|
220
|
+
params.push(state.toLowerCase());
|
|
221
|
+
paramIdx++;
|
|
222
|
+
}
|
|
223
|
+
if (author) {
|
|
224
|
+
conditions.push(`author ILIKE $${String(paramIdx)}`);
|
|
225
|
+
params.push(`%${author}%`);
|
|
226
|
+
paramIdx++;
|
|
227
|
+
}
|
|
228
|
+
if (baseRef) {
|
|
229
|
+
conditions.push(`base_ref = $${String(paramIdx)}`);
|
|
230
|
+
params.push(baseRef);
|
|
231
|
+
paramIdx++;
|
|
232
|
+
}
|
|
233
|
+
if (since) {
|
|
234
|
+
conditions.push(`updated_at >= $${String(paramIdx)}`);
|
|
235
|
+
params.push(since);
|
|
236
|
+
paramIdx++;
|
|
237
|
+
}
|
|
238
|
+
const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
239
|
+
sqlQuery = `
|
|
240
|
+
SELECT number, title, state, author, created_at, updated_at, merged_at,
|
|
241
|
+
base_ref, additions, deletions
|
|
242
|
+
FROM pull_requests
|
|
243
|
+
${where}
|
|
244
|
+
ORDER BY updated_at DESC NULLS LAST
|
|
245
|
+
LIMIT ${String(maxResults)}
|
|
246
|
+
`;
|
|
247
|
+
}
|
|
248
|
+
const result = await storage.query(sqlQuery, params);
|
|
249
|
+
await storage.close();
|
|
250
|
+
if (result.rows.length === 0) {
|
|
251
|
+
return textResponse('No pull requests found. Run "argustack sync git" with GITHUB_TOKEN configured.');
|
|
252
|
+
}
|
|
253
|
+
const lines = result.rows.map((row) => {
|
|
254
|
+
const typed = row;
|
|
255
|
+
if (typed.number) {
|
|
256
|
+
const date = typed.merged_at ? str(typed.merged_at).substring(0, 10) : str(typed.updated_at ?? '').substring(0, 10);
|
|
257
|
+
return `#${str(typed.number)} [${str(typed.state)}] ${str(typed.title)} by ${str(typed.author)} (${date}) +${str(typed.additions)}/-${str(typed.deletions)}`;
|
|
258
|
+
}
|
|
259
|
+
return JSON.stringify(row);
|
|
260
|
+
});
|
|
261
|
+
return textResponse([`Found ${String(result.rows.length)} pull requests:`, '', ...lines].join('\n'));
|
|
262
|
+
}
|
|
263
|
+
catch (err) {
|
|
264
|
+
return errorResponse(`Query failed: ${getErrorMessage(err)}`);
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
server.registerTool('query_releases', {
|
|
268
|
+
description: 'List GitHub releases for the repository. Useful for understanding release cadence and what was shipped.',
|
|
269
|
+
inputSchema: {
|
|
270
|
+
search: z.string().optional().describe('Full-text search in release name/body'),
|
|
271
|
+
limit: z.number().optional().describe('Max results (default: 20)'),
|
|
272
|
+
},
|
|
273
|
+
}, async ({ search, limit }) => {
|
|
274
|
+
const ws = loadWorkspace();
|
|
275
|
+
if (!ws.ok) {
|
|
276
|
+
return errorResponse(`Workspace not found: ${ws.reason}`);
|
|
277
|
+
}
|
|
278
|
+
const { storage } = await createAdapters(ws.root);
|
|
279
|
+
try {
|
|
280
|
+
const maxResults = limit ?? 20;
|
|
281
|
+
let sqlQuery;
|
|
282
|
+
const params = [];
|
|
283
|
+
if (search) {
|
|
284
|
+
sqlQuery = `
|
|
285
|
+
SELECT tag_name, name, author, published_at, draft, prerelease
|
|
286
|
+
FROM releases
|
|
287
|
+
WHERE search_vector @@ plainto_tsquery('english', $1)
|
|
288
|
+
ORDER BY published_at DESC NULLS LAST
|
|
289
|
+
LIMIT ${String(maxResults)}
|
|
290
|
+
`;
|
|
291
|
+
params.push(search);
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
sqlQuery = `
|
|
295
|
+
SELECT tag_name, name, author, published_at, draft, prerelease
|
|
296
|
+
FROM releases
|
|
297
|
+
ORDER BY published_at DESC NULLS LAST
|
|
298
|
+
LIMIT ${String(maxResults)}
|
|
299
|
+
`;
|
|
300
|
+
}
|
|
301
|
+
const result = await storage.query(sqlQuery, params);
|
|
302
|
+
await storage.close();
|
|
303
|
+
if (result.rows.length === 0) {
|
|
304
|
+
return textResponse('No releases found. Run "argustack sync git" with GITHUB_TOKEN.');
|
|
305
|
+
}
|
|
306
|
+
const lines = result.rows.map((row) => {
|
|
307
|
+
const r = row;
|
|
308
|
+
const flags = [r.draft ? 'draft' : '', r.prerelease ? 'pre' : ''].filter(Boolean).join(',');
|
|
309
|
+
const date = str(r.published_at ?? '').substring(0, 10);
|
|
310
|
+
return `${str(r.tag_name)} — ${str(r.name) || '(no name)'} by ${str(r.author)} (${date})${flags ? ` [${flags}]` : ''}`;
|
|
311
|
+
});
|
|
312
|
+
return textResponse([`Found ${String(result.rows.length)} releases:`, '', ...lines].join('\n'));
|
|
313
|
+
}
|
|
314
|
+
catch (err) {
|
|
315
|
+
return errorResponse(`Query failed: ${getErrorMessage(err)}`);
|
|
316
|
+
}
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
//# sourceMappingURL=query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/mcp/tools/query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAYzE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA+E3D"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
import { loadWorkspace, createAdapters, textResponse, errorResponse, getErrorMessage, str, } from '../helpers.js';
|
|
3
|
+
export function registerSearchTools(server) {
|
|
4
|
+
server.registerTool('semantic_search', {
|
|
5
|
+
description: 'Semantic vector similarity search across issues. Uses AI embeddings to find issues by meaning, not just keywords. Requires embeddings generated first ("argustack embed").',
|
|
6
|
+
inputSchema: {
|
|
7
|
+
query: z.string().describe('Natural language search query (e.g. "authentication timeout problems")'),
|
|
8
|
+
limit: z.number().optional().describe('Max results (default: 10)'),
|
|
9
|
+
threshold: z.number().optional().describe('Minimum similarity score 0-1 (default: 0.5)'),
|
|
10
|
+
},
|
|
11
|
+
}, async ({ query, limit, threshold }) => {
|
|
12
|
+
const ws = loadWorkspace();
|
|
13
|
+
if (!ws.ok) {
|
|
14
|
+
return errorResponse(`Workspace not found: ${ws.reason}`);
|
|
15
|
+
}
|
|
16
|
+
const { storage } = await createAdapters(ws.root);
|
|
17
|
+
try {
|
|
18
|
+
const apiKey = process.env['OPENAI_API_KEY'];
|
|
19
|
+
if (!apiKey) {
|
|
20
|
+
await storage.close();
|
|
21
|
+
return errorResponse('OPENAI_API_KEY not configured. Add it to .env and run "argustack embed" first.');
|
|
22
|
+
}
|
|
23
|
+
const { OpenAIEmbeddingProvider } = await import('../../adapters/openai/index.js');
|
|
24
|
+
const embeddingProvider = new OpenAIEmbeddingProvider({ apiKey });
|
|
25
|
+
const vectors = await embeddingProvider.embed([query]);
|
|
26
|
+
const queryVector = vectors[0];
|
|
27
|
+
if (!queryVector) {
|
|
28
|
+
await storage.close();
|
|
29
|
+
return errorResponse('Failed to generate embedding for query.');
|
|
30
|
+
}
|
|
31
|
+
const results = await storage.semanticSearch(queryVector, limit ?? 10, threshold ?? 0.5);
|
|
32
|
+
if (results.length === 0) {
|
|
33
|
+
await storage.close();
|
|
34
|
+
return textResponse('No similar issues found. Make sure embeddings are generated ("argustack embed").');
|
|
35
|
+
}
|
|
36
|
+
const issueKeys = results.map((r) => r.issueKey);
|
|
37
|
+
const placeholders = issueKeys.map((_, i) => `$${String(i + 1)}`).join(',');
|
|
38
|
+
const issuesResult = await storage.query(`SELECT issue_key, summary, status, assignee, issue_type FROM issues WHERE issue_key IN (${placeholders})`, issueKeys);
|
|
39
|
+
await storage.close();
|
|
40
|
+
const issueMap = new Map();
|
|
41
|
+
for (const row of issuesResult.rows) {
|
|
42
|
+
const r = row;
|
|
43
|
+
issueMap.set(r.issue_key, row);
|
|
44
|
+
}
|
|
45
|
+
const lines = results.map((r) => {
|
|
46
|
+
const issue = issueMap.get(r.issueKey);
|
|
47
|
+
const sim = (r.similarity * 100).toFixed(1);
|
|
48
|
+
if (issue) {
|
|
49
|
+
return `${r.issueKey} [${str(issue.status)}] ${str(issue.summary)} (${sim}% match)`;
|
|
50
|
+
}
|
|
51
|
+
return `${r.issueKey} (${sim}% match)`;
|
|
52
|
+
});
|
|
53
|
+
return textResponse([`Semantic search: "${query}" (${String(results.length)} results):`, '', ...lines].join('\n'));
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
await storage.close();
|
|
57
|
+
return errorResponse(`Search failed: ${getErrorMessage(err)}`);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/mcp/tools/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAYzE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgH9D"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
import { SOURCE_META } from '../../core/types/index.js';
|
|
3
|
+
import { loadWorkspace, createAdapters, getEnabledSources, textResponse, errorResponse, getErrorMessage, } from '../helpers.js';
|
|
4
|
+
export function registerWorkspaceTools(server) {
|
|
5
|
+
server.registerTool('workspace_info', {
|
|
6
|
+
description: 'Get information about the current Argustack workspace — configured sources, paths, database connection',
|
|
7
|
+
}, () => {
|
|
8
|
+
const ws = loadWorkspace();
|
|
9
|
+
if (!ws.ok) {
|
|
10
|
+
return errorResponse(`No Argustack workspace found.\n\nDiagnostic: ${ws.reason}\n\nRun \`argustack init\` to create one.`);
|
|
11
|
+
}
|
|
12
|
+
const enabled = getEnabledSources(ws.config);
|
|
13
|
+
const sourceInfo = enabled.map((s) => ` • ${SOURCE_META[s].label}: ${SOURCE_META[s].description}`);
|
|
14
|
+
const text = [
|
|
15
|
+
`Argustack Workspace`,
|
|
16
|
+
`Root: ${ws.root}`,
|
|
17
|
+
`Created: ${ws.config.createdAt}`,
|
|
18
|
+
``,
|
|
19
|
+
`Configured sources (${String(enabled.length)}):`,
|
|
20
|
+
...(sourceInfo.length > 0 ? sourceInfo : [' (none)']),
|
|
21
|
+
``,
|
|
22
|
+
`Source order: ${enabled.map((s) => SOURCE_META[s].label).join(' → ') || 'none'}`,
|
|
23
|
+
].join('\n');
|
|
24
|
+
return textResponse(text);
|
|
25
|
+
});
|
|
26
|
+
server.registerTool('list_projects', {
|
|
27
|
+
description: 'List all Jira projects available in the configured Jira instance',
|
|
28
|
+
}, async () => {
|
|
29
|
+
const ws = loadWorkspace();
|
|
30
|
+
if (!ws.ok) {
|
|
31
|
+
return errorResponse(`Workspace not found: ${ws.reason}`);
|
|
32
|
+
}
|
|
33
|
+
const { source } = await createAdapters(ws.root);
|
|
34
|
+
if (!source) {
|
|
35
|
+
return errorResponse('Jira is not configured. Add credentials to .env.');
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
const projects = await source.getProjects();
|
|
39
|
+
const lines = projects.map((p) => ` ${p.key} — ${p.name}`);
|
|
40
|
+
return textResponse(`Found ${String(projects.length)} Jira projects:\n${lines.join('\n')}`);
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
return errorResponse(`Failed to list projects: ${getErrorMessage(err)}`);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
server.registerTool('pull_jira', {
|
|
47
|
+
description: 'Pull all issues from Jira into Argustack PostgreSQL database. Supports incremental pulls (only new/updated issues). Use project parameter to pull a specific project.',
|
|
48
|
+
inputSchema: {
|
|
49
|
+
project: z.string().optional().describe('Specific project key (e.g. "PROJ"). Omit to pull all configured projects.'),
|
|
50
|
+
since: z.string().optional().describe('Pull issues updated since this date (YYYY-MM-DD). Omit for auto-incremental.'),
|
|
51
|
+
},
|
|
52
|
+
}, async ({ project, since }) => {
|
|
53
|
+
const ws = loadWorkspace();
|
|
54
|
+
if (!ws.ok) {
|
|
55
|
+
return errorResponse(`Workspace not found: ${ws.reason}`);
|
|
56
|
+
}
|
|
57
|
+
const { source, storage } = await createAdapters(ws.root);
|
|
58
|
+
if (!source) {
|
|
59
|
+
return errorResponse('Jira is not configured.');
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
const { PullUseCase } = await import('../../use-cases/pull.js');
|
|
63
|
+
const pullUseCase = new PullUseCase(source, storage);
|
|
64
|
+
const progressLines = [];
|
|
65
|
+
const results = await pullUseCase.execute({
|
|
66
|
+
...(project ? { projectKey: project } : {}),
|
|
67
|
+
...(since ? { since } : {}),
|
|
68
|
+
onProgress: (msg) => progressLines.push(msg),
|
|
69
|
+
});
|
|
70
|
+
await storage.close();
|
|
71
|
+
const summary = results.map((r) => `${r.projectKey}: ${String(r.issuesCount)} issues, ${String(r.commentsCount)} comments, ${String(r.changelogsCount)} changelogs, ${String(r.worklogsCount)} worklogs, ${String(r.linksCount)} links`);
|
|
72
|
+
return textResponse([
|
|
73
|
+
'Pull complete!',
|
|
74
|
+
'',
|
|
75
|
+
...summary,
|
|
76
|
+
'',
|
|
77
|
+
`Progress log:`,
|
|
78
|
+
...progressLines,
|
|
79
|
+
].join('\n'));
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
return errorResponse(`Pull failed: ${getErrorMessage(err)}`);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../../src/mcp/tools/workspace.ts"],"names":[],"mappings":"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"}
|