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.
Files changed (72) hide show
  1. package/README.md +25 -12
  2. package/dist/adapters/git/mapper.d.ts +1 -1
  3. package/dist/adapters/git/mapper.js +1 -1
  4. package/dist/adapters/github/mapper.d.ts +1 -1
  5. package/dist/adapters/github/mapper.js +1 -1
  6. package/dist/cli/init/generators.d.ts +6 -0
  7. package/dist/cli/init/generators.d.ts.map +1 -0
  8. package/dist/cli/init/generators.js +153 -0
  9. package/dist/cli/init/generators.js.map +1 -0
  10. package/dist/cli/init/index.d.ts +4 -0
  11. package/dist/cli/init/index.d.ts.map +1 -0
  12. package/dist/cli/init/index.js +254 -0
  13. package/dist/cli/init/index.js.map +1 -0
  14. package/dist/cli/init/setup-csv.d.ts +4 -0
  15. package/dist/cli/init/setup-csv.d.ts.map +1 -0
  16. package/dist/cli/init/setup-csv.js +52 -0
  17. package/dist/cli/init/setup-csv.js.map +1 -0
  18. package/dist/cli/init/setup-db.d.ts +4 -0
  19. package/dist/cli/init/setup-db.d.ts.map +1 -0
  20. package/dist/cli/init/setup-db.js +33 -0
  21. package/dist/cli/init/setup-db.js.map +1 -0
  22. package/dist/cli/init/setup-git.d.ts +4 -0
  23. package/dist/cli/init/setup-git.d.ts.map +1 -0
  24. package/dist/cli/init/setup-git.js +244 -0
  25. package/dist/cli/init/setup-git.js.map +1 -0
  26. package/dist/cli/init/setup-github.d.ts +4 -0
  27. package/dist/cli/init/setup-github.d.ts.map +1 -0
  28. package/dist/cli/init/setup-github.js +102 -0
  29. package/dist/cli/init/setup-github.js.map +1 -0
  30. package/dist/cli/init/setup-jira.d.ts +4 -0
  31. package/dist/cli/init/setup-jira.d.ts.map +1 -0
  32. package/dist/cli/init/setup-jira.js +124 -0
  33. package/dist/cli/init/setup-jira.js.map +1 -0
  34. package/dist/cli/init/types.d.ts +59 -0
  35. package/dist/cli/init/types.d.ts.map +1 -0
  36. package/dist/cli/init/types.js +31 -0
  37. package/dist/cli/init/types.js.map +1 -0
  38. package/dist/core/types/config.js +1 -1
  39. package/dist/core/types/config.js.map +1 -1
  40. package/dist/mcp/helpers.d.ts +24 -0
  41. package/dist/mcp/helpers.d.ts.map +1 -0
  42. package/dist/mcp/helpers.js +73 -0
  43. package/dist/mcp/helpers.js.map +1 -0
  44. package/dist/mcp/server.d.ts +2 -3
  45. package/dist/mcp/server.d.ts.map +1 -1
  46. package/dist/mcp/server.js +12 -1579
  47. package/dist/mcp/server.js.map +1 -1
  48. package/dist/mcp/tools/estimate.d.ts +3 -0
  49. package/dist/mcp/tools/estimate.d.ts.map +1 -0
  50. package/dist/mcp/tools/estimate.js +478 -0
  51. package/dist/mcp/tools/estimate.js.map +1 -0
  52. package/dist/mcp/tools/issue.d.ts +3 -0
  53. package/dist/mcp/tools/issue.d.ts.map +1 -0
  54. package/dist/mcp/tools/issue.js +468 -0
  55. package/dist/mcp/tools/issue.js.map +1 -0
  56. package/dist/mcp/tools/query.d.ts +3 -0
  57. package/dist/mcp/tools/query.d.ts.map +1 -0
  58. package/dist/mcp/tools/query.js +319 -0
  59. package/dist/mcp/tools/query.js.map +1 -0
  60. package/dist/mcp/tools/search.d.ts +3 -0
  61. package/dist/mcp/tools/search.d.ts.map +1 -0
  62. package/dist/mcp/tools/search.js +61 -0
  63. package/dist/mcp/tools/search.js.map +1 -0
  64. package/dist/mcp/tools/workspace.d.ts +3 -0
  65. package/dist/mcp/tools/workspace.d.ts.map +1 -0
  66. package/dist/mcp/tools/workspace.js +86 -0
  67. package/dist/mcp/tools/workspace.js.map +1 -0
  68. package/dist/mcp/types.d.ts +157 -0
  69. package/dist/mcp/types.d.ts.map +1 -0
  70. package/dist/mcp/types.js +2 -0
  71. package/dist/mcp/types.js.map +1 -0
  72. package/package.json +1 -1
@@ -0,0 +1,478 @@
1
+ import { z } from 'zod/v4';
2
+ import { loadWorkspace, createAdapters, textResponse, errorResponse, getErrorMessage, } from '../helpers.js';
3
+ function calculateFamiliarityFactor(familiarityRows, taskComponents) {
4
+ if (!taskComponents || taskComponents.length === 0 || familiarityRows.length === 0) {
5
+ return { factor: 1.0, explanation: 'No component data' };
6
+ }
7
+ const matching = familiarityRows.filter((f) => taskComponents.some((c) => c.toLowerCase() === f.component.toLowerCase()));
8
+ if (matching.length === 0) {
9
+ return { factor: 1.0, explanation: 'No history in these components' };
10
+ }
11
+ const totalResolved = matching.reduce((sum, c) => sum + c.resolved_count, 0);
12
+ const factor = Math.max(0.6, Math.min(1.0, 1.0 - 0.08 * totalResolved));
13
+ const compNames = matching.map((c) => `${c.component}(${String(c.resolved_count)})`).join(', ');
14
+ return { factor, explanation: `${String(totalResolved)} resolved in ${compNames} — ×${factor.toFixed(2)}` };
15
+ }
16
+ function calculateBaseHours(metrics) {
17
+ if (metrics.length === 0) {
18
+ return { hours: 0, method: 'no data' };
19
+ }
20
+ const sorted = [...metrics].sort((a, b) => a.hours - b.hours);
21
+ const trimCount = metrics.length > 5 ? Math.max(1, Math.floor(metrics.length * 0.1)) : 0;
22
+ const trimmed = sorted.slice(trimCount, sorted.length - trimCount || undefined);
23
+ const totalWeight = trimmed.reduce((sum, m) => sum + m.weight, 0);
24
+ if (totalWeight === 0) {
25
+ const simple = trimmed.reduce((sum, m) => sum + m.hours, 0) / trimmed.length;
26
+ return { hours: simple, method: `simple average (${String(trimmed.length)}/${String(metrics.length)} tasks)` };
27
+ }
28
+ const weighted = trimmed.reduce((sum, m) => sum + m.hours * m.weight, 0) / totalWeight;
29
+ return { hours: weighted, method: `weighted trimmed mean (${String(trimmed.length)}/${String(metrics.length)} tasks)` };
30
+ }
31
+ function businessHoursBetween(start, end) {
32
+ let hours = 0;
33
+ const current = new Date(start);
34
+ current.setHours(0, 0, 0, 0);
35
+ const endDate = new Date(end);
36
+ endDate.setHours(0, 0, 0, 0);
37
+ while (current <= endDate) {
38
+ const day = current.getDay();
39
+ if (day !== 0 && day !== 6) {
40
+ hours += 8;
41
+ }
42
+ current.setDate(current.getDate() + 1);
43
+ }
44
+ return hours;
45
+ }
46
+ export function registerEstimateTools(server) {
47
+ server.registerTool('estimate', {
48
+ description: 'Predict how long a task will take for a specific developer. Returns TWO predictions: "without bugs" (pure development time) and "with bugs" (real cost including bug aftermath). Based on similar completed tasks, personal coefficient from full history, and component familiarity. Assignee is required — always specify who will do the task.',
49
+ inputSchema: {
50
+ description: z.string().describe('Description of the new task (e.g. "Stripe payment integration with subscriptions")'),
51
+ assignee: z.string().describe('Developer name to predict for (e.g. "John Smith")'),
52
+ issue_type: z.string().optional().describe('Issue type: Bug, Task, Story — finds same-type analogs and uses type-specific coefficients'),
53
+ components: z.array(z.string()).optional().describe('Component names (e.g. ["Payments", "Export"]) — finds tasks in same area and calculates familiarity'),
54
+ exclude_key: z.string().optional().describe('Issue key to exclude from results (e.g. "PROJ-123") — use when estimating a task that already exists in DB'),
55
+ limit: z.number().optional().describe('Number of similar tasks to analyze (default: 10)'),
56
+ },
57
+ }, async ({ description, assignee, issue_type: issueTypeInput, components, exclude_key: excludeKey, limit }) => {
58
+ const ws = loadWorkspace();
59
+ if (!ws.ok) {
60
+ return errorResponse(`Workspace not found: ${ws.reason}`);
61
+ }
62
+ const { storage } = await createAdapters(ws.root);
63
+ try {
64
+ const maxResults = limit ?? 10;
65
+ const issueType = issueTypeInput ?? null;
66
+ const comps = components && components.length > 0 ? components : null;
67
+ const similarResult = await storage.query(`WITH text_matches AS (
68
+ SELECT issue_key, summary, issue_type, status, assignee, created,
69
+ COALESCE(resolved, updated) as resolved,
70
+ parent_key, story_points, components, labels, original_estimate, time_spent,
71
+ ts_rank(search_vector, plainto_tsquery('english', $1)) as text_rank
72
+ FROM issues
73
+ WHERE search_vector @@ plainto_tsquery('english', $1)
74
+ AND status_category = 'Done'
75
+ AND status != 'Canceled'
76
+ AND ($5::text IS NULL OR issue_key != $5)
77
+ ),
78
+ scored AS (
79
+ SELECT *,
80
+ CASE WHEN $3::text IS NOT NULL AND issue_type = $3 THEN 1.0 ELSE 0.0 END as type_match,
81
+ CASE WHEN $4::text[] IS NOT NULL AND array_length($4::text[], 1) > 0
82
+ THEN COALESCE((
83
+ SELECT COUNT(*)::float / array_length($4::text[], 1)
84
+ FROM unnest($4::text[]) q_comp
85
+ WHERE q_comp = ANY(components)
86
+ ), 0)
87
+ ELSE 0.0
88
+ END as component_overlap,
89
+ 1.0 / (1.0 + EXTRACT(EPOCH FROM (NOW() - resolved)) / (86400.0 * 365)) as temporal_weight,
90
+ (
91
+ LEAST(text_rank * 10, 1.0) * 0.3
92
+ + CASE WHEN $3::text IS NOT NULL AND issue_type = $3 THEN 0.25 ELSE 0.0 END
93
+ + CASE WHEN $4::text[] IS NOT NULL AND array_length($4::text[], 1) > 0
94
+ THEN COALESCE((
95
+ SELECT COUNT(*)::float / array_length($4::text[], 1)
96
+ FROM unnest($4::text[]) q_comp
97
+ WHERE q_comp = ANY(components)
98
+ ), 0) * 0.35
99
+ ELSE 0.0
100
+ END
101
+ + (1.0 / (1.0 + EXTRACT(EPOCH FROM (NOW() - resolved)) / (86400.0 * 365))) * 0.1
102
+ ) as composite_score
103
+ FROM text_matches
104
+ )
105
+ SELECT *, composite_score as rank
106
+ FROM scored
107
+ ORDER BY composite_score DESC
108
+ LIMIT $2`, [description, maxResults, issueType, comps, excludeKey ?? null]);
109
+ const similar = similarResult.rows;
110
+ if (similar.length === 0) {
111
+ await storage.close();
112
+ return textResponse(`No similar completed tasks found for: "${description}"\n\nTry broader terms or different keywords.`);
113
+ }
114
+ const issueKeys = similar.map((r) => r.issue_key);
115
+ const keysParam = issueKeys.map((_, i) => `$${String(i + 1)}`).join(',');
116
+ const worklogsResult = await storage.query(`SELECT issue_key, author, SUM(time_spent_seconds) as total_seconds
117
+ FROM issue_worklogs
118
+ WHERE issue_key IN (${keysParam})
119
+ GROUP BY issue_key, author`, issueKeys);
120
+ const worklogs = worklogsResult.rows;
121
+ const devChangelogResult = await storage.query(`SELECT DISTINCT ON (issue_key) issue_key, to_value as dev_assignee
122
+ FROM issue_changelogs
123
+ WHERE issue_key IN (${keysParam})
124
+ AND field = 'assignee'
125
+ AND to_value IS NOT NULL
126
+ AND to_value != ''
127
+ ORDER BY issue_key, changed_at`, issueKeys);
128
+ const devChangelogs = devChangelogResult.rows;
129
+ const realDevMap = new Map();
130
+ for (const d of devChangelogs) {
131
+ realDevMap.set(d.issue_key, d.dev_assignee);
132
+ }
133
+ const commitsResult = await storage.query(`SELECT r.issue_key,
134
+ COUNT(*) as commits,
135
+ STRING_AGG(DISTINCT c.author, ', ') as authors,
136
+ SUM(cf_agg.additions) as total_additions,
137
+ SUM(cf_agg.deletions) as total_deletions,
138
+ MIN(c.committed_at) as first_commit,
139
+ MAX(c.committed_at) as last_commit
140
+ FROM commit_issue_refs r
141
+ JOIN commits c ON r.commit_hash = c.hash
142
+ LEFT JOIN (
143
+ SELECT commit_hash, SUM(additions) as additions, SUM(deletions) as deletions
144
+ FROM commit_files GROUP BY commit_hash
145
+ ) cf_agg ON c.hash = cf_agg.commit_hash
146
+ WHERE r.issue_key IN (${keysParam})
147
+ GROUP BY r.issue_key`, issueKeys);
148
+ const commitData = commitsResult.rows;
149
+ const notInParam = issueKeys.map((_, i) => `$${String(i + 1 + issueKeys.length)}`).join(',');
150
+ const childrenResult = await storage.query(`SELECT i.parent_key as related_to, i.issue_key as bug_key, i.summary, i.issue_type, i.resolved, i.created, i.time_spent as bug_time_spent
151
+ FROM issues i
152
+ WHERE i.parent_key IN (${keysParam})
153
+ AND i.issue_key NOT IN (${notInParam})`, [...issueKeys, ...issueKeys]);
154
+ const linkedResult = await storage.query(`SELECT il.source_key as related_to, i.issue_key as bug_key, i.summary, i.issue_type, i.resolved, i.created, i.time_spent as bug_time_spent
155
+ FROM issue_links il
156
+ JOIN issues i ON i.issue_key = il.target_key
157
+ WHERE il.source_key IN (${keysParam})
158
+ AND i.issue_key NOT IN (${notInParam})`, [...issueKeys, ...issueKeys]);
159
+ const bugs = [
160
+ ...childrenResult.rows,
161
+ ...linkedResult.rows,
162
+ ];
163
+ const rawEstimates = await storage.query(`SELECT issue_key, original_estimate, time_spent
164
+ FROM issues
165
+ WHERE issue_key IN (${keysParam})`, issueKeys);
166
+ const estimates = rawEstimates.rows;
167
+ let familiarity = { factor: 1.0, explanation: 'No component data' };
168
+ if (assignee && comps) {
169
+ const familiarityResult = await storage.query(`SELECT
170
+ unnest(components) as component,
171
+ COUNT(DISTINCT issue_key) as resolved_count,
172
+ AVG(time_spent::float / 3600) as avg_time_hours,
173
+ MAX(resolved)::text as last_resolved
174
+ FROM issues
175
+ WHERE assignee ILIKE $1
176
+ AND status_category = 'Done'
177
+ AND time_spent IS NOT NULL AND time_spent > 0
178
+ AND components IS NOT NULL AND array_length(components, 1) > 0
179
+ GROUP BY unnest(components)
180
+ ORDER BY resolved_count DESC`, [`%${assignee}%`]);
181
+ const familiarityRows = familiarityResult.rows;
182
+ familiarity = calculateFamiliarityFactor(familiarityRows, comps);
183
+ }
184
+ const coefficientResult = await storage.query(`WITH base AS (
185
+ SELECT
186
+ parent.assignee,
187
+ parent.issue_type,
188
+ parent.issue_key,
189
+ parent.original_estimate,
190
+ parent.time_spent,
191
+ COALESCE(bug_agg.bug_time, 0) as bug_time
192
+ FROM issues parent
193
+ LEFT JOIN (
194
+ SELECT parent_ref, SUM(bug_ts) as bug_time
195
+ FROM (
196
+ SELECT i.parent_key as parent_ref, i.time_spent as bug_ts
197
+ FROM issues i
198
+ WHERE i.issue_type IN ('Bug', 'Sub-bug')
199
+ AND i.time_spent IS NOT NULL AND i.time_spent > 0
200
+ UNION ALL
201
+ SELECT il.source_key as parent_ref, i.time_spent as bug_ts
202
+ FROM issue_links il
203
+ JOIN issues i ON i.issue_key = il.target_key
204
+ WHERE i.issue_type IN ('Bug', 'Sub-bug')
205
+ AND i.time_spent IS NOT NULL AND i.time_spent > 0
206
+ ) bugs
207
+ GROUP BY parent_ref
208
+ ) bug_agg ON bug_agg.parent_ref = parent.issue_key
209
+ WHERE parent.status_category = 'Done'
210
+ AND parent.original_estimate IS NOT NULL AND parent.original_estimate > 0
211
+ AND parent.time_spent IS NOT NULL AND parent.time_spent > 0
212
+ AND parent.issue_type NOT IN ('Bug', 'Sub-bug')
213
+ AND CAST(parent.time_spent AS FLOAT) / parent.original_estimate < 5.0
214
+ ),
215
+ context_coeffs AS (
216
+ SELECT
217
+ assignee,
218
+ COUNT(DISTINCT issue_key)::text as task_count,
219
+ PERCENTILE_CONT(0.5) WITHIN GROUP (
220
+ ORDER BY CAST(time_spent AS FLOAT) / original_estimate
221
+ ) as coeff_no_bugs,
222
+ PERCENTILE_CONT(0.5) WITHIN GROUP (
223
+ ORDER BY CAST(time_spent + bug_time AS FLOAT) / original_estimate
224
+ ) as coeff_with_bugs,
225
+ AVG(CAST(bug_time AS FLOAT) / NULLIF(time_spent, 0)) as bug_ratio,
226
+ COALESCE($1, 'all types') as context_label
227
+ FROM base
228
+ WHERE ($1::text IS NULL OR issue_type = $1)
229
+ GROUP BY assignee
230
+ HAVING COUNT(DISTINCT issue_key) >= 3
231
+ ),
232
+ global_coeffs AS (
233
+ SELECT
234
+ assignee,
235
+ COUNT(DISTINCT issue_key)::text as task_count,
236
+ PERCENTILE_CONT(0.5) WITHIN GROUP (
237
+ ORDER BY CAST(time_spent AS FLOAT) / original_estimate
238
+ ) as coeff_no_bugs,
239
+ PERCENTILE_CONT(0.5) WITHIN GROUP (
240
+ ORDER BY CAST(time_spent + bug_time AS FLOAT) / original_estimate
241
+ ) as coeff_with_bugs,
242
+ AVG(CAST(bug_time AS FLOAT) / NULLIF(time_spent, 0)) as bug_ratio,
243
+ 'all types (fallback)' as context_label
244
+ FROM base
245
+ GROUP BY assignee
246
+ HAVING COUNT(DISTINCT issue_key) >= 3
247
+ )
248
+ SELECT * FROM context_coeffs
249
+ UNION ALL
250
+ SELECT * FROM global_coeffs
251
+ WHERE assignee NOT IN (SELECT assignee FROM context_coeffs)`, [issueType]);
252
+ const coefficients = coefficientResult.rows;
253
+ await storage.close();
254
+ const sections = [];
255
+ sections.push(`# Estimate Prediction`);
256
+ const metaParts = [assignee ? `Developer: ${assignee}` : '', issueType ? `Type: ${issueType}` : '', comps ? `Components: ${comps.join(', ')}` : ''].filter(Boolean);
257
+ sections.push(`Query: "${description}"${metaParts.length > 0 ? ` | ${metaParts.join(' | ')}` : ''}`);
258
+ sections.push(`Based on ${String(similar.length)} similar completed tasks`);
259
+ sections.push(`Scoring: text 30% + type ${issueType ? '25%' : '0%'} + component ${comps ? '35%' : '0%'} + recency 10%\n`);
260
+ const worklogMap = new Map();
261
+ for (const w of worklogs) {
262
+ const arr = worklogMap.get(w.issue_key) ?? [];
263
+ arr.push(w);
264
+ worklogMap.set(w.issue_key, arr);
265
+ }
266
+ const commitMap = new Map();
267
+ for (const c of commitData) {
268
+ commitMap.set(c.issue_key, c);
269
+ }
270
+ const estimateMap = new Map();
271
+ for (const e of estimates) {
272
+ estimateMap.set(e.issue_key, e);
273
+ }
274
+ const bugMap = new Map();
275
+ for (const b of bugs) {
276
+ const arr = bugMap.get(b.related_to) ?? [];
277
+ arr.push(b);
278
+ bugMap.set(b.related_to, arr);
279
+ }
280
+ sections.push('## Similar Tasks\n');
281
+ let totalCycleHours = 0;
282
+ let totalCodingHours = 0;
283
+ let totalBugs = 0;
284
+ let validCycleCount = 0;
285
+ let validCodingCount = 0;
286
+ const developerStats = new Map();
287
+ for (const issue of similar) {
288
+ const cycleHours = issue.resolved
289
+ ? (new Date(issue.resolved).getTime() - new Date(issue.created).getTime()) / 3600000
290
+ : null;
291
+ if (cycleHours !== null) {
292
+ totalCycleHours += cycleHours;
293
+ validCycleCount++;
294
+ }
295
+ const issueWorklogs = worklogMap.get(issue.issue_key) ?? [];
296
+ const issueCommits = commitMap.get(issue.issue_key);
297
+ const issueBugs = bugMap.get(issue.issue_key) ?? [];
298
+ const issueEstimate = estimateMap.get(issue.issue_key);
299
+ const codingHours = (issueCommits?.first_commit && issueCommits.last_commit)
300
+ ? (new Date(issueCommits.last_commit).getTime() - new Date(issueCommits.first_commit).getTime()) / 3600000
301
+ : null;
302
+ if (codingHours !== null && codingHours > 0) {
303
+ totalCodingHours += codingHours;
304
+ validCodingCount++;
305
+ }
306
+ totalBugs += issueBugs.length;
307
+ const realDev = realDevMap.get(issue.issue_key);
308
+ const devName = realDev ?? (issueWorklogs.length > 0 ? issueWorklogs[0]?.author : null) ?? issueCommits?.authors ?? issue.assignee ?? 'unknown';
309
+ if (devName) {
310
+ const stats = developerStats.get(devName) ?? { tasks: 0, cycleHours: 0, codingHours: 0, bugs: 0, commits: 0 };
311
+ stats.tasks++;
312
+ stats.cycleHours += cycleHours ?? 0;
313
+ stats.codingHours += codingHours ?? 0;
314
+ stats.bugs += issueBugs.length;
315
+ stats.commits += Number(issueCommits?.commits ?? 0);
316
+ developerStats.set(devName, stats);
317
+ }
318
+ const estH = issueEstimate?.original_estimate ? Number(issueEstimate.original_estimate) / 3600 : null;
319
+ const actualH = issueEstimate?.time_spent ? Number(issueEstimate.time_spent) / 3600 : null;
320
+ const bugTimeH = issueBugs
321
+ .filter((b) => b.bug_time_spent !== null)
322
+ .reduce((sum, b) => sum + (b.bug_time_spent ?? 0), 0) / 3600;
323
+ const realCostH = (actualH ?? 0) + bugTimeH;
324
+ const taskCoeff = estH && estH > 0 && actualH ? actualH / estH : null;
325
+ const taskCoeffBugs = estH && estH > 0 ? realCostH / estH : null;
326
+ const cycleBizDays = issue.resolved ? businessHoursBetween(new Date(issue.created), new Date(issue.resolved)) / 8 : null;
327
+ const cycleStr = cycleBizDays !== null ? `${cycleBizDays.toFixed(0)}d cycle` : 'open';
328
+ const codingStr = codingHours !== null && codingHours > 0 ? ` | ${codingHours.toFixed(1)}h coding` : '';
329
+ const scoreStr = `score: ${Number(issue.composite_score).toFixed(2)}`;
330
+ const matchParts = [issue.type_match > 0 ? 'type' : '', issue.component_overlap > 0 ? `comp:${(issue.component_overlap * 100).toFixed(0)}%` : ''].filter(Boolean);
331
+ const matchStr = matchParts.length > 0 ? ` [${matchParts.join(', ')}]` : '';
332
+ sections.push(`### ${issue.issue_key}: ${issue.summary}`);
333
+ sections.push(`Type: ${issue.issue_type} | Dev: ${devName} | ${cycleStr}${codingStr} | ${scoreStr}${matchStr}`);
334
+ if (estH !== null || actualH !== null) {
335
+ const estStr = estH !== null ? `${Math.round(estH)}h est` : '';
336
+ const actStr = actualH !== null ? `${Math.round(actualH)}h actual` : '';
337
+ const coeffStr = taskCoeff !== null ? ` (×${taskCoeff.toFixed(2)})` : '';
338
+ sections.push(`Estimate: ${[estStr, actStr].filter(Boolean).join(' → ')}${coeffStr}`);
339
+ }
340
+ if (bugTimeH > 0) {
341
+ sections.push(`Bug aftermath: ${bugTimeH.toFixed(1)}h → real cost: ${realCostH.toFixed(1)}h (×${taskCoeffBugs?.toFixed(2) ?? '?'})`);
342
+ }
343
+ if (issueCommits) {
344
+ sections.push(`Code: ${issueCommits.commits} commits, +${issueCommits.total_additions}/-${issueCommits.total_deletions} lines (${issueCommits.authors})`);
345
+ }
346
+ if (issueWorklogs.length > 0) {
347
+ const wlLines = issueWorklogs.map((w) => ` ${w.author}: ${(Number(w.total_seconds) / 3600).toFixed(1)}h`);
348
+ sections.push(`Worklogs:\n${wlLines.join('\n')}`);
349
+ }
350
+ if (issueBugs.length > 0) {
351
+ const bugLines = issueBugs.map((b) => {
352
+ const bTimeStr = b.bug_time_spent ? ` [${(b.bug_time_spent / 3600).toFixed(1)}h]` : '';
353
+ return ` ${b.bug_key} [${b.issue_type}]${bTimeStr} ${b.summary}`;
354
+ });
355
+ sections.push(`Related issues (${String(issueBugs.length)}):\n${bugLines.join('\n')}`);
356
+ }
357
+ sections.push('');
358
+ }
359
+ const taskMetrics = [];
360
+ for (const issue of similar) {
361
+ const issueWorklogs = worklogMap.get(issue.issue_key) ?? [];
362
+ const issueCommits = commitMap.get(issue.issue_key);
363
+ const issueEstimate = estimateMap.get(issue.issue_key);
364
+ const codingHours = (issueCommits?.first_commit && issueCommits.last_commit)
365
+ ? (new Date(issueCommits.last_commit).getTime() - new Date(issueCommits.first_commit).getTime()) / 3600000
366
+ : null;
367
+ const worklogHours = issueWorklogs.reduce((sum, w) => sum + Number(w.total_seconds), 0) / 3600;
368
+ const actualH = issueEstimate?.time_spent ? Number(issueEstimate.time_spent) / 3600 : null;
369
+ const estimateH = issueEstimate?.original_estimate ? Number(issueEstimate.original_estimate) / 3600 : null;
370
+ const cycleBusinessH = issue.resolved
371
+ ? businessHoursBetween(new Date(issue.created), new Date(issue.resolved))
372
+ : null;
373
+ const hours = actualH ?? (worklogHours > 0 ? worklogHours : null) ?? (codingHours && codingHours > 0 ? codingHours : null) ?? estimateH ?? (cycleBusinessH && cycleBusinessH > 0 ? cycleBusinessH : null);
374
+ const isCycleFallback = hours !== null && hours === cycleBusinessH && actualH === null && !(worklogHours > 0) && !(codingHours && codingHours > 0) && estimateH === null;
375
+ if (hours !== null && hours > 0) {
376
+ taskMetrics.push({ issueKey: issue.issue_key, hours, weight: Number(issue.temporal_weight), isCycleFallback });
377
+ }
378
+ }
379
+ const base = calculateBaseHours(taskMetrics);
380
+ sections.push('## Similar Tasks Summary\n');
381
+ const avgCycle = validCycleCount > 0 ? totalCycleHours / validCycleCount : 0;
382
+ const avgCoding = validCodingCount > 0 ? totalCodingHours / validCodingCount : 0;
383
+ const avgBugs = similar.length > 0 ? totalBugs / similar.length : 0;
384
+ const allCycleFallback = taskMetrics.length > 0 && taskMetrics.every((m) => m.isCycleFallback);
385
+ if (!allCycleFallback) {
386
+ sections.push(`Base hours: ${base.hours.toFixed(1)}h (${base.method})`);
387
+ if (avgCoding > 0 && avgCycle > 0) {
388
+ sections.push(`Cycle time: ${avgCycle.toFixed(1)}h — coding was ${((avgCoding / avgCycle) * 100).toFixed(0)}% of it`);
389
+ }
390
+ }
391
+ sections.push(`Bug rate: ${avgBugs.toFixed(1)} bugs per task`);
392
+ if (!allCycleFallback && developerStats.size > 0) {
393
+ sections.push('\n## Developer Profiles (similar tasks)\n');
394
+ for (const [dev, stats] of developerStats) {
395
+ if (assignee && !dev.toLowerCase().includes(assignee.toLowerCase())) {
396
+ continue;
397
+ }
398
+ const avgDevCoding = stats.tasks > 0 ? stats.codingHours / stats.tasks : 0;
399
+ const avgDevCycle = stats.tasks > 0 ? stats.cycleHours / stats.tasks : 0;
400
+ const devBestHours = avgDevCoding > 0 ? avgDevCoding : avgDevCycle;
401
+ const bugRate = stats.tasks > 0 ? stats.bugs / stats.tasks : 0;
402
+ sections.push(`**${dev}**: ${String(stats.tasks)} similar tasks, avg ${devBestHours.toFixed(1)}h (${(devBestHours / 8).toFixed(1)}d), ${bugRate.toFixed(1)} bugs/task, ${String(stats.commits)} commits`);
403
+ }
404
+ }
405
+ if (!allCycleFallback && familiarity.factor < 1.0) {
406
+ sections.push(`\n## Developer Familiarity\n`);
407
+ sections.push(`${assignee}: ${familiarity.explanation}`);
408
+ }
409
+ if (!allCycleFallback && coefficients.length > 0) {
410
+ sections.push('\n## Developer Coefficients\n');
411
+ const relevantCoeffs = assignee
412
+ ? coefficients.filter((c) => c.assignee.toLowerCase().includes(assignee.toLowerCase()))
413
+ : coefficients;
414
+ for (const c of relevantCoeffs) {
415
+ const noBugs = Number(c.coeff_no_bugs).toFixed(2);
416
+ const withBugs = Number(c.coeff_with_bugs).toFixed(2);
417
+ const ratio = (Number(c.bug_ratio) * 100).toFixed(0);
418
+ sections.push(`**${c.assignee}**: ×${noBugs} without bugs, ×${withBugs} with bugs (${c.task_count} tasks, bug overhead ${ratio}%, ${c.context_label}, median, outliers excluded)`);
419
+ }
420
+ }
421
+ const baseHours = base.hours;
422
+ if (allCycleFallback) {
423
+ const cycleDays = taskMetrics.map((m) => m.hours / 8);
424
+ const minDays = Math.min(...cycleDays).toFixed(0);
425
+ const maxDays = Math.max(...cycleDays).toFixed(0);
426
+ const rangeStr = minDays === maxDays ? minDays : `${minDays}–${maxDays}`;
427
+ sections.push('\n## Resolution Timeline (cycle time only)\n');
428
+ sections.push(`Similar tasks were closed in **${rangeStr} business days** from creation.`);
429
+ sections.push(`This is lead time (backlog wait + development + code review), NOT active development time.`);
430
+ sections.push(`\n⚠ No effort tracking data available (time_spent, worklogs, commit history).`);
431
+ sections.push(`Connect **Jira API** or **Git** for actual work hours and per-developer predictions.`);
432
+ }
433
+ else if (baseHours === 0) {
434
+ sections.push('\n## Prediction\n');
435
+ sections.push('**No data available for prediction.**\n');
436
+ sections.push('Similar tasks have no effort data and no resolved dates.');
437
+ sections.push('Need at least one of: time_spent, worklogs, commit history, estimates, or resolved date.');
438
+ }
439
+ else {
440
+ sections.push('\n## Prediction\n');
441
+ const contextCoeffs = coefficients.filter((c) => c.context_label !== 'all types (fallback)');
442
+ const globalCoeffs = coefficients.filter((c) => c.context_label === 'all types (fallback)');
443
+ const buildDevPrediction = (dev) => {
444
+ const noBugs = Number(dev.coeff_no_bugs);
445
+ const withBugs = Number(dev.coeff_with_bugs);
446
+ const overhead = noBugs > 0 ? ((withBugs - noBugs) / noBugs * 100).toFixed(0) : '0';
447
+ const predNoBugs = baseHours * noBugs;
448
+ const predWithBugs = baseHours * withBugs;
449
+ const lines = [];
450
+ lines.push(`### ${dev.assignee}`);
451
+ lines.push(`Without bugs: ${baseHours.toFixed(1)}h ×${noBugs.toFixed(2)} = **${predNoBugs.toFixed(1)}h** (${(predNoBugs / 8).toFixed(1)}d)`);
452
+ lines.push(`With bugs: ${baseHours.toFixed(1)}h ×${withBugs.toFixed(2)} = **${predWithBugs.toFixed(1)}h** (${(predWithBugs / 8).toFixed(1)}d) — bug overhead +${overhead}%`);
453
+ lines.push(`Based on ${dev.task_count} completed tasks, ${dev.context_label}\n`);
454
+ return lines;
455
+ };
456
+ const devCtx = contextCoeffs.find((c) => c.assignee.toLowerCase().includes(assignee.toLowerCase()));
457
+ const devGlob = globalCoeffs.find((c) => c.assignee.toLowerCase().includes(assignee.toLowerCase()));
458
+ const dev = devCtx ?? devGlob;
459
+ if (dev) {
460
+ sections.push(...buildDevPrediction(dev));
461
+ }
462
+ else {
463
+ sections.push(`No coefficient data for "${assignee}". Need ≥3 completed tasks.`);
464
+ sections.push(`**${baseHours.toFixed(1)}h** based on similar tasks (no personal coefficient)\n`);
465
+ }
466
+ if (avgBugs > 0.5) {
467
+ sections.push(`High bug rate (${avgBugs.toFixed(1)}/task) among similar tasks`);
468
+ }
469
+ }
470
+ return textResponse(sections.join('\n'));
471
+ }
472
+ catch (err) {
473
+ await storage.close();
474
+ return errorResponse(`Estimate failed: ${getErrorMessage(err)}`);
475
+ }
476
+ });
477
+ }
478
+ //# sourceMappingURL=estimate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"estimate.js","sourceRoot":"","sources":["../../../src/mcp/tools/estimate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerIssueTools(server: McpServer): void;
3
+ //# sourceMappingURL=issue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/issue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAwBzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwmB1D"}