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,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 @@
|
|
|
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"}
|