@promptwheel/mcp 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/README.md +178 -0
  2. package/dist/advance-helpers.d.ts +27 -0
  3. package/dist/advance-helpers.d.ts.map +1 -0
  4. package/dist/advance-helpers.js +127 -0
  5. package/dist/advance-helpers.js.map +1 -0
  6. package/dist/advance-prompts.d.ts +48 -0
  7. package/dist/advance-prompts.d.ts.map +1 -0
  8. package/dist/advance-prompts.js +420 -0
  9. package/dist/advance-prompts.js.map +1 -0
  10. package/dist/advance.d.ts +30 -0
  11. package/dist/advance.d.ts.map +1 -0
  12. package/dist/advance.js +752 -0
  13. package/dist/advance.js.map +1 -0
  14. package/dist/codebase-index.d.ts +5 -0
  15. package/dist/codebase-index.d.ts.map +1 -0
  16. package/dist/codebase-index.js +5 -0
  17. package/dist/codebase-index.js.map +1 -0
  18. package/dist/dedup-memory.d.ts +30 -0
  19. package/dist/dedup-memory.d.ts.map +1 -0
  20. package/dist/dedup-memory.js +76 -0
  21. package/dist/dedup-memory.js.map +1 -0
  22. package/dist/direct-client.d.ts +57 -0
  23. package/dist/direct-client.d.ts.map +1 -0
  24. package/dist/direct-client.js +92 -0
  25. package/dist/direct-client.js.map +1 -0
  26. package/dist/event-handlers-qa.d.ts +5 -0
  27. package/dist/event-handlers-qa.d.ts.map +1 -0
  28. package/dist/event-handlers-qa.js +186 -0
  29. package/dist/event-handlers-qa.js.map +1 -0
  30. package/dist/event-handlers-scout.d.ts +5 -0
  31. package/dist/event-handlers-scout.d.ts.map +1 -0
  32. package/dist/event-handlers-scout.js +270 -0
  33. package/dist/event-handlers-scout.js.map +1 -0
  34. package/dist/event-handlers-ticket.d.ts +5 -0
  35. package/dist/event-handlers-ticket.d.ts.map +1 -0
  36. package/dist/event-handlers-ticket.js +232 -0
  37. package/dist/event-handlers-ticket.js.map +1 -0
  38. package/dist/event-helpers.d.ts +46 -0
  39. package/dist/event-helpers.d.ts.map +1 -0
  40. package/dist/event-helpers.js +125 -0
  41. package/dist/event-helpers.js.map +1 -0
  42. package/dist/event-processor.d.ts +15 -0
  43. package/dist/event-processor.d.ts.map +1 -0
  44. package/dist/event-processor.js +111 -0
  45. package/dist/event-processor.js.map +1 -0
  46. package/dist/formulas.d.ts +27 -0
  47. package/dist/formulas.d.ts.map +1 -0
  48. package/dist/formulas.js +109 -0
  49. package/dist/formulas.js.map +1 -0
  50. package/dist/guidelines.d.ts +16 -0
  51. package/dist/guidelines.d.ts.map +1 -0
  52. package/dist/guidelines.js +44 -0
  53. package/dist/guidelines.js.map +1 -0
  54. package/dist/index.d.ts +9 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +42 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/learnings.d.ts +42 -0
  59. package/dist/learnings.d.ts.map +1 -0
  60. package/dist/learnings.js +117 -0
  61. package/dist/learnings.js.map +1 -0
  62. package/dist/project-metadata.d.ts +34 -0
  63. package/dist/project-metadata.d.ts.map +1 -0
  64. package/dist/project-metadata.js +617 -0
  65. package/dist/project-metadata.js.map +1 -0
  66. package/dist/proposals.d.ts +23 -0
  67. package/dist/proposals.d.ts.map +1 -0
  68. package/dist/proposals.js +201 -0
  69. package/dist/proposals.js.map +1 -0
  70. package/dist/qa-stats.d.ts +51 -0
  71. package/dist/qa-stats.d.ts.map +1 -0
  72. package/dist/qa-stats.js +121 -0
  73. package/dist/qa-stats.js.map +1 -0
  74. package/dist/run-manager.d.ts +97 -0
  75. package/dist/run-manager.d.ts.map +1 -0
  76. package/dist/run-manager.js +583 -0
  77. package/dist/run-manager.js.map +1 -0
  78. package/dist/run-state-bridge.d.ts +13 -0
  79. package/dist/run-state-bridge.d.ts.map +1 -0
  80. package/dist/run-state-bridge.js +101 -0
  81. package/dist/run-state-bridge.js.map +1 -0
  82. package/dist/scope-policy.d.ts +83 -0
  83. package/dist/scope-policy.d.ts.map +1 -0
  84. package/dist/scope-policy.js +278 -0
  85. package/dist/scope-policy.js.map +1 -0
  86. package/dist/server.d.ts +18 -0
  87. package/dist/server.d.ts.map +1 -0
  88. package/dist/server.js +35 -0
  89. package/dist/server.js.map +1 -0
  90. package/dist/spindle.d.ts +41 -0
  91. package/dist/spindle.d.ts.map +1 -0
  92. package/dist/spindle.js +230 -0
  93. package/dist/spindle.js.map +1 -0
  94. package/dist/state.d.ts +36 -0
  95. package/dist/state.d.ts.map +1 -0
  96. package/dist/state.js +50 -0
  97. package/dist/state.js.map +1 -0
  98. package/dist/ticket-worker.d.ts +37 -0
  99. package/dist/ticket-worker.d.ts.map +1 -0
  100. package/dist/ticket-worker.js +527 -0
  101. package/dist/ticket-worker.js.map +1 -0
  102. package/dist/tool-registry.d.ts +35 -0
  103. package/dist/tool-registry.d.ts.map +1 -0
  104. package/dist/tool-registry.js +129 -0
  105. package/dist/tool-registry.js.map +1 -0
  106. package/dist/tools/execute.d.ts +17 -0
  107. package/dist/tools/execute.d.ts.map +1 -0
  108. package/dist/tools/execute.js +418 -0
  109. package/dist/tools/execute.js.map +1 -0
  110. package/dist/tools/git.d.ts +7 -0
  111. package/dist/tools/git.d.ts.map +1 -0
  112. package/dist/tools/git.js +98 -0
  113. package/dist/tools/git.js.map +1 -0
  114. package/dist/tools/intelligence.d.ts +10 -0
  115. package/dist/tools/intelligence.d.ts.map +1 -0
  116. package/dist/tools/intelligence.js +432 -0
  117. package/dist/tools/intelligence.js.map +1 -0
  118. package/dist/tools/session.d.ts +7 -0
  119. package/dist/tools/session.d.ts.map +1 -0
  120. package/dist/tools/session.js +533 -0
  121. package/dist/tools/session.js.map +1 -0
  122. package/dist/tools/trajectory.d.ts +10 -0
  123. package/dist/tools/trajectory.d.ts.map +1 -0
  124. package/dist/tools/trajectory.js +374 -0
  125. package/dist/tools/trajectory.js.map +1 -0
  126. package/dist/trajectory-io.d.ts +21 -0
  127. package/dist/trajectory-io.d.ts.map +1 -0
  128. package/dist/trajectory-io.js +105 -0
  129. package/dist/trajectory-io.js.map +1 -0
  130. package/dist/types.d.ts +229 -0
  131. package/dist/types.d.ts.map +1 -0
  132. package/dist/types.js +13 -0
  133. package/dist/types.js.map +1 -0
  134. package/package.json +63 -0
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Git operations tool: git_setup
3
+ */
4
+ import { z } from 'zod';
5
+ import { repos } from '@promptwheel/core';
6
+ import { execFileSync } from 'node:child_process';
7
+ /**
8
+ * Validates a git branch name to prevent command injection.
9
+ * Only allows alphanumeric characters, hyphens, underscores, forward slashes, and dots.
10
+ * Must not start with a hyphen (to prevent option injection).
11
+ */
12
+ function validateBranchName(branch) {
13
+ // Git branch name rules:
14
+ // - Cannot start with a hyphen (prevents option injection like --delete)
15
+ // - Only alphanumeric, hyphens, underscores, forward slashes, and dots allowed
16
+ // - Cannot contain shell metacharacters like ; | & $ ` etc.
17
+ const validPattern = /^[a-zA-Z0-9][a-zA-Z0-9\-_./]*$/;
18
+ return validPattern.test(branch);
19
+ }
20
+ export function registerGitTools(server, getState) {
21
+ server.tool('promptwheel_git_setup', 'Create/checkout a branch for the current ticket. Returns branch name. Use after completing a ticket to prepare for PR creation.', {
22
+ ticketId: z.string().optional().describe('The ticket ID to create a branch for.'),
23
+ ticket_id: z.string().optional().describe('Alias for ticketId.'),
24
+ baseBranch: z.string().optional().describe('Base branch to branch from (default: main).'),
25
+ base_branch: z.string().optional().describe('Alias for baseBranch.'),
26
+ }, async (raw) => {
27
+ const params = {
28
+ ticketId: (raw.ticketId ?? raw.ticket_id),
29
+ baseBranch: raw.baseBranch ?? raw.base_branch,
30
+ };
31
+ const state = getState();
32
+ state.requireActive(); // ensure session is active
33
+ const ticket = await repos.tickets.getById(state.db, params.ticketId);
34
+ if (!ticket) {
35
+ return {
36
+ content: [{ type: 'text', text: JSON.stringify({ error: 'Ticket not found.' }) }],
37
+ isError: true,
38
+ };
39
+ }
40
+ const baseBranch = params.baseBranch ?? 'main';
41
+ // Validate baseBranch to prevent command injection
42
+ if (!validateBranchName(baseBranch)) {
43
+ return {
44
+ content: [{
45
+ type: 'text',
46
+ text: JSON.stringify({
47
+ error: `Invalid base branch name: "${baseBranch}". Branch names must start with an alphanumeric character and contain only alphanumeric characters, hyphens, underscores, forward slashes, and dots.`,
48
+ }),
49
+ }],
50
+ isError: true,
51
+ };
52
+ }
53
+ // Create branch name from ticket
54
+ const slug = ticket.title
55
+ .toLowerCase()
56
+ .replace(/[^a-z0-9]+/g, '-')
57
+ .replace(/^-|-$/g, '')
58
+ .slice(0, 50);
59
+ const branchName = `promptwheel/${ticket.id}/${slug}`;
60
+ const cwd = state.project.rootPath;
61
+ try {
62
+ // Check if branch exists
63
+ try {
64
+ execFileSync('git', ['rev-parse', '--verify', branchName], { cwd, stdio: 'pipe' });
65
+ // Branch exists, just checkout
66
+ execFileSync('git', ['checkout', branchName], { cwd, stdio: 'pipe' });
67
+ }
68
+ catch {
69
+ // Branch doesn't exist, create from base
70
+ execFileSync('git', ['checkout', '-b', branchName, baseBranch], { cwd, stdio: 'pipe' });
71
+ }
72
+ return {
73
+ content: [{
74
+ type: 'text',
75
+ text: JSON.stringify({
76
+ branchName,
77
+ baseBranch,
78
+ ticketId: ticket.id,
79
+ message: `Branch ${branchName} ready. Make your changes, then commit and push.`,
80
+ }, null, 2),
81
+ }],
82
+ };
83
+ }
84
+ catch (e) {
85
+ return {
86
+ content: [{
87
+ type: 'text',
88
+ text: JSON.stringify({
89
+ error: `Git operation failed: ${e.message}`,
90
+ branchName,
91
+ }),
92
+ }],
93
+ isError: true,
94
+ };
95
+ }
96
+ });
97
+ }
98
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/tools/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Intelligence tools: validate_ticket, audit_tickets, ticket_stats, heal_blocked
3
+ *
4
+ * Expose intelligence-layer functionality that was previously only
5
+ * available as ad-hoc scripts or internal-only logic.
6
+ */
7
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
8
+ import type { SessionManager } from '../state.js';
9
+ export declare function registerIntelligenceTools(server: McpServer, getState: () => SessionManager): void;
10
+ //# sourceMappingURL=intelligence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intelligence.d.ts","sourceRoot":"","sources":["../../src/tools/intelligence.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAQlD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,cAAc,QAye1F"}
@@ -0,0 +1,432 @@
1
+ /**
2
+ * Intelligence tools: validate_ticket, audit_tickets, ticket_stats, heal_blocked
3
+ *
4
+ * Expose intelligence-layer functionality that was previously only
5
+ * available as ad-hoc scripts or internal-only logic.
6
+ */
7
+ import { z } from 'zod';
8
+ import { repos } from '@promptwheel/core';
9
+ import { deriveScopePolicy, isFileAllowed, } from '../scope-policy.js';
10
+ import { checkSpindle } from '../spindle.js';
11
+ export function registerIntelligenceTools(server, getState) {
12
+ // ── promptwheel_validate_ticket ────────────────────────────────────────────
13
+ server.tool('promptwheel_validate_ticket', 'Validates a ticket against quality gates without executing it. Answers "why can\'t this ticket run?"', {
14
+ ticket_id: z.string().describe('The ticket ID to validate.'),
15
+ }, async (params) => {
16
+ const state = getState();
17
+ try {
18
+ const ticket = await repos.tickets.getById(state.db, params.ticket_id);
19
+ if (!ticket) {
20
+ return {
21
+ content: [{
22
+ type: 'text',
23
+ text: JSON.stringify({ error: `Ticket ${params.ticket_id} not found` }),
24
+ }],
25
+ isError: true,
26
+ };
27
+ }
28
+ const reasons = [];
29
+ const suggestions = [];
30
+ // 1. Check required fields
31
+ if (!ticket.title) {
32
+ reasons.push('Missing title');
33
+ }
34
+ if (!ticket.description) {
35
+ reasons.push('Missing description');
36
+ suggestions.push('Add a description explaining what changes to make');
37
+ }
38
+ if (ticket.allowedPaths.length === 0) {
39
+ suggestions.push('Consider adding allowed_paths to scope the changes');
40
+ }
41
+ if (ticket.verificationCommands.length === 0) {
42
+ reasons.push('No verification commands');
43
+ suggestions.push('Add verification commands (e.g., npm test, npx vitest run)');
44
+ }
45
+ // 2. Check status
46
+ if (ticket.status === 'done') {
47
+ reasons.push('Ticket already completed');
48
+ }
49
+ else if (ticket.status === 'aborted') {
50
+ reasons.push('Ticket was aborted');
51
+ suggestions.push('Create a new ticket if this work is still needed');
52
+ }
53
+ else if (ticket.status === 'blocked') {
54
+ reasons.push('Ticket is currently blocked');
55
+ suggestions.push('Use promptwheel_heal_blocked to diagnose and recover');
56
+ }
57
+ else if (ticket.status === 'in_progress') {
58
+ reasons.push('Ticket is already in progress');
59
+ }
60
+ // 3. Check scope policy
61
+ const run = state.run.current;
62
+ if (run) {
63
+ const policy = deriveScopePolicy({
64
+ allowedPaths: ticket.allowedPaths,
65
+ category: ticket.category ?? 'refactor',
66
+ maxLinesPerTicket: run.max_lines_per_ticket,
67
+ });
68
+ // Check if allowed_paths overlap with denied paths
69
+ for (const p of ticket.allowedPaths) {
70
+ if (!isFileAllowed(p, policy)) {
71
+ reasons.push(`Allowed path "${p}" conflicts with denied policy`);
72
+ }
73
+ }
74
+ }
75
+ // 4. Check retry exhaustion
76
+ if (ticket.retryCount >= ticket.maxRetries) {
77
+ reasons.push(`Retry limit exhausted (${ticket.retryCount}/${ticket.maxRetries})`);
78
+ suggestions.push('Increase maxRetries or simplify the ticket scope');
79
+ }
80
+ const runnable = reasons.length === 0;
81
+ const gateStatus = runnable ? 'PASS' : 'FAIL';
82
+ return {
83
+ content: [{
84
+ type: 'text',
85
+ text: JSON.stringify({
86
+ ticket_id: params.ticket_id,
87
+ title: ticket.title,
88
+ status: ticket.status,
89
+ runnable,
90
+ gate_status: gateStatus,
91
+ reasons,
92
+ suggestions,
93
+ }, null, 2),
94
+ }],
95
+ };
96
+ }
97
+ catch (e) {
98
+ return {
99
+ content: [{
100
+ type: 'text',
101
+ text: JSON.stringify({ error: e.message }),
102
+ }],
103
+ isError: true,
104
+ };
105
+ }
106
+ });
107
+ // ── promptwheel_audit_tickets ──────────────────────────────────────────────
108
+ server.tool('promptwheel_audit_tickets', 'Analyzes ticket quality across the current session/project.', {
109
+ status_filter: z.string().optional().describe('Filter by status (e.g., "ready", "blocked", "done").'),
110
+ }, async (params) => {
111
+ const state = getState();
112
+ try {
113
+ const run = state.run.current;
114
+ const projectId = run?.project_id ?? state.project.id;
115
+ // Get all tickets, optionally filtered by status
116
+ const statusOpt = params.status_filter
117
+ ? { status: params.status_filter }
118
+ : undefined;
119
+ const allTickets = await repos.tickets.listByProject(state.db, projectId, { ...statusOpt, limit: 500 });
120
+ // Aggregate by status
121
+ const byStatus = {};
122
+ for (const t of allTickets) {
123
+ byStatus[t.status] = (byStatus[t.status] ?? 0) + 1;
124
+ }
125
+ // Aggregate by category
126
+ const byCategory = {};
127
+ for (const t of allTickets) {
128
+ const cat = t.category ?? 'uncategorized';
129
+ byCategory[cat] = (byCategory[cat] ?? 0) + 1;
130
+ }
131
+ // Detect quality issues
132
+ const qualityIssues = [];
133
+ const noDescription = allTickets.filter(t => !t.description);
134
+ if (noDescription.length > 0) {
135
+ qualityIssues.push(`${noDescription.length} ticket(s) missing description`);
136
+ }
137
+ const noVerification = allTickets.filter(t => t.verificationCommands.length === 0);
138
+ if (noVerification.length > 0) {
139
+ qualityIssues.push(`${noVerification.length} ticket(s) missing verification commands`);
140
+ }
141
+ const noScope = allTickets.filter(t => t.allowedPaths.length === 0);
142
+ if (noScope.length > 0) {
143
+ qualityIssues.push(`${noScope.length} ticket(s) with no allowed_paths (unrestricted scope)`);
144
+ }
145
+ const retryExhausted = allTickets.filter(t => t.retryCount >= t.maxRetries && t.status !== 'done');
146
+ if (retryExhausted.length > 0) {
147
+ qualityIssues.push(`${retryExhausted.length} ticket(s) exhausted retries without completing`);
148
+ }
149
+ const blocked = allTickets.filter(t => t.status === 'blocked');
150
+ if (blocked.length > 3) {
151
+ qualityIssues.push(`High blocked count: ${blocked.length} tickets blocked`);
152
+ }
153
+ return {
154
+ content: [{
155
+ type: 'text',
156
+ text: JSON.stringify({
157
+ total: allTickets.length,
158
+ by_status: byStatus,
159
+ by_category: byCategory,
160
+ quality_issues: qualityIssues,
161
+ }, null, 2),
162
+ }],
163
+ };
164
+ }
165
+ catch (e) {
166
+ return {
167
+ content: [{
168
+ type: 'text',
169
+ text: JSON.stringify({ error: e.message }),
170
+ }],
171
+ isError: true,
172
+ };
173
+ }
174
+ });
175
+ // ── promptwheel_ticket_stats ───────────────────────────────────────────────
176
+ server.tool('promptwheel_ticket_stats', 'Throughput metrics — completions by type, by day, success rates.', {
177
+ days: z.number().optional().describe('Number of days to look back (default: 7).'),
178
+ }, async (params) => {
179
+ const state = getState();
180
+ try {
181
+ const run = state.run.current;
182
+ const projectId = run?.project_id ?? state.project.id;
183
+ const lookbackDays = params.days ?? 7;
184
+ const cutoff = new Date(Date.now() - lookbackDays * 24 * 60 * 60 * 1000);
185
+ // Get all tickets
186
+ const allTickets = await repos.tickets.listByProject(state.db, projectId, { limit: 1000 });
187
+ // Get runs for duration/success tracking
188
+ const allRuns = await repos.runs.listByProject(state.db, projectId, { limit: 1000 });
189
+ // Filter to recent window
190
+ const recentTickets = allTickets.filter(t => t.updatedAt >= cutoff);
191
+ const recentRuns = allRuns.filter(r => r.createdAt >= cutoff);
192
+ // Completions by day
193
+ const completionsByDay = {};
194
+ const completedTickets = recentTickets.filter(t => t.status === 'done');
195
+ for (const t of completedTickets) {
196
+ const day = t.updatedAt.toISOString().slice(0, 10);
197
+ completionsByDay[day] = (completionsByDay[day] ?? 0) + 1;
198
+ }
199
+ // By category
200
+ const byCategory = {};
201
+ for (const t of completedTickets) {
202
+ const cat = t.category ?? 'uncategorized';
203
+ byCategory[cat] = (byCategory[cat] ?? 0) + 1;
204
+ }
205
+ // Success rate
206
+ const workerRuns = recentRuns.filter(r => r.type === 'worker');
207
+ const successRuns = workerRuns.filter(r => r.status === 'success');
208
+ const successRate = workerRuns.length > 0
209
+ ? Math.round((successRuns.length / workerRuns.length) * 100) / 100
210
+ : 0;
211
+ // Average duration
212
+ const durations = workerRuns
213
+ .filter(r => r.completedAt && r.startedAt)
214
+ .map(r => r.completedAt.getTime() - r.startedAt.getTime());
215
+ const avgDurationMs = durations.length > 0
216
+ ? Math.round(durations.reduce((a, b) => a + b, 0) / durations.length)
217
+ : 0;
218
+ return {
219
+ content: [{
220
+ type: 'text',
221
+ text: JSON.stringify({
222
+ lookback_days: lookbackDays,
223
+ completions_by_day: completionsByDay,
224
+ by_category: byCategory,
225
+ total_completed: completedTickets.length,
226
+ total_runs: workerRuns.length,
227
+ success_rate: successRate,
228
+ avg_duration_ms: avgDurationMs,
229
+ }, null, 2),
230
+ }],
231
+ };
232
+ }
233
+ catch (e) {
234
+ return {
235
+ content: [{
236
+ type: 'text',
237
+ text: JSON.stringify({ error: e.message }),
238
+ }],
239
+ isError: true,
240
+ };
241
+ }
242
+ });
243
+ // ── promptwheel_history ───────────────────────────────────────────────────
244
+ server.tool('promptwheel_history', 'View recent session runs with summary stats.', {
245
+ limit: z.number().optional().describe('Max number of runs to return (default: 10).'),
246
+ }, async (params) => {
247
+ const state = getState();
248
+ try {
249
+ const run = state.run.current;
250
+ const projectId = run?.project_id ?? state.project.id;
251
+ const limit = params.limit ?? 10;
252
+ const allRuns = await repos.runs.listByProject(state.db, projectId, { limit });
253
+ const runs = allRuns.map(r => ({
254
+ id: r.id,
255
+ type: r.type,
256
+ status: r.status,
257
+ ticketId: r.ticketId,
258
+ createdAt: r.createdAt.toISOString(),
259
+ startedAt: r.startedAt?.toISOString() ?? null,
260
+ completedAt: r.completedAt?.toISOString() ?? null,
261
+ durationMs: r.completedAt && r.startedAt
262
+ ? r.completedAt.getTime() - r.startedAt.getTime()
263
+ : null,
264
+ }));
265
+ // Summary stats
266
+ const total = runs.length;
267
+ const successful = runs.filter(r => r.status === 'success').length;
268
+ const failed = runs.filter(r => r.status === 'failure').length;
269
+ const successRate = total > 0 ? Math.round((successful / total) * 100) : 0;
270
+ return {
271
+ content: [{
272
+ type: 'text',
273
+ text: JSON.stringify({
274
+ total,
275
+ successful,
276
+ failed,
277
+ success_rate_percent: successRate,
278
+ runs,
279
+ }, null, 2),
280
+ }],
281
+ };
282
+ }
283
+ catch (e) {
284
+ return {
285
+ content: [{
286
+ type: 'text',
287
+ text: JSON.stringify({ error: e.message }),
288
+ }],
289
+ isError: true,
290
+ };
291
+ }
292
+ });
293
+ // ── promptwheel_heal_blocked ───────────────────────────────────────────────
294
+ server.tool('promptwheel_heal_blocked', 'Diagnose and recover blocked tickets.', {
295
+ ticket_id: z.string().describe('The ticket ID to diagnose/heal.'),
296
+ action: z.enum(['diagnose', 'retry', 'expand_scope']).optional()
297
+ .describe('Action: diagnose (default), retry (reset to ready), expand_scope (widen allowed_paths).'),
298
+ }, async (params) => {
299
+ const state = getState();
300
+ try {
301
+ const ticket = await repos.tickets.getById(state.db, params.ticket_id);
302
+ if (!ticket) {
303
+ return {
304
+ content: [{
305
+ type: 'text',
306
+ text: JSON.stringify({ error: `Ticket ${params.ticket_id} not found` }),
307
+ }],
308
+ isError: true,
309
+ };
310
+ }
311
+ const action = params.action ?? 'diagnose';
312
+ const suggestedActions = [];
313
+ let diagnosis = '';
314
+ let applied;
315
+ // ── Diagnose ──
316
+ if (ticket.status !== 'blocked' && action === 'diagnose') {
317
+ diagnosis = `Ticket is not blocked (status: ${ticket.status})`;
318
+ }
319
+ else {
320
+ // Analyze why it might be blocked
321
+ const diagParts = [];
322
+ // Check retry exhaustion
323
+ if (ticket.retryCount >= ticket.maxRetries) {
324
+ diagParts.push(`Retry limit exhausted (${ticket.retryCount}/${ticket.maxRetries})`);
325
+ suggestedActions.push('retry — reset retry count and status to ready');
326
+ }
327
+ // Check scope issues
328
+ if (ticket.allowedPaths.length > 0) {
329
+ const run = state.run.current;
330
+ if (run) {
331
+ const policy = deriveScopePolicy({
332
+ allowedPaths: ticket.allowedPaths,
333
+ category: ticket.category ?? 'refactor',
334
+ maxLinesPerTicket: run.max_lines_per_ticket,
335
+ });
336
+ // Check if all allowed paths are valid
337
+ const invalidPaths = ticket.allowedPaths.filter(p => !isFileAllowed(p, policy));
338
+ if (invalidPaths.length > 0) {
339
+ diagParts.push(`Allowed paths conflict with denied policy: ${invalidPaths.join(', ')}`);
340
+ }
341
+ }
342
+ // Scope too narrow?
343
+ if (ticket.allowedPaths.length <= 2) {
344
+ diagParts.push('Very narrow scope — may need expansion for related files');
345
+ suggestedActions.push('expand_scope — widen allowed_paths for related files');
346
+ }
347
+ }
348
+ // Check spindle state
349
+ const run = state.run.current;
350
+ if (run?.spindle) {
351
+ const spindleCheck = checkSpindle(run.spindle);
352
+ if (spindleCheck.shouldAbort || spindleCheck.shouldBlock) {
353
+ diagParts.push(`Spindle detected: ${spindleCheck.reason ?? 'loop pattern'}`);
354
+ suggestedActions.push('retry — reset after fixing the underlying issue');
355
+ }
356
+ }
357
+ // Check missing verification
358
+ if (ticket.verificationCommands.length === 0) {
359
+ diagParts.push('No verification commands — QA cannot validate');
360
+ suggestedActions.push('Add verification commands before retrying');
361
+ }
362
+ diagnosis = diagParts.length > 0
363
+ ? diagParts.join('; ')
364
+ : 'No obvious issues found — may need manual investigation';
365
+ }
366
+ // ── Apply action ──
367
+ if (action === 'retry') {
368
+ await repos.tickets.updateStatus(state.db, params.ticket_id, 'ready');
369
+ applied = 'Reset ticket status to ready';
370
+ state.run.appendEvent('USER_OVERRIDE', {
371
+ ticket_id: params.ticket_id,
372
+ action: 'retry',
373
+ });
374
+ }
375
+ else if (action === 'expand_scope') {
376
+ if (ticket.allowedPaths.length === 0) {
377
+ applied = 'Ticket has no scope restrictions — expansion not needed';
378
+ }
379
+ else {
380
+ // Expand to include parent directories and sibling patterns
381
+ const expanded = [...ticket.allowedPaths];
382
+ for (const p of ticket.allowedPaths) {
383
+ const parts = p.split('/');
384
+ if (parts.length >= 2) {
385
+ // Add sibling pattern: same directory, any file
386
+ const dir = parts.slice(0, -1).join('/');
387
+ const pattern = `${dir}/**`;
388
+ if (!expanded.includes(pattern)) {
389
+ expanded.push(pattern);
390
+ }
391
+ }
392
+ }
393
+ // We can't directly update allowedPaths through the standard repo API
394
+ // so we reset the ticket to ready with a note about expanded scope
395
+ await repos.tickets.updateStatus(state.db, params.ticket_id, 'ready');
396
+ applied = `Reset to ready. Suggested expanded paths: ${expanded.join(', ')}`;
397
+ state.run.appendEvent('USER_OVERRIDE', {
398
+ ticket_id: params.ticket_id,
399
+ action: 'expand_scope',
400
+ expanded_paths: expanded,
401
+ });
402
+ }
403
+ }
404
+ if (suggestedActions.length === 0 && action === 'diagnose') {
405
+ suggestedActions.push('retry — reset status and try again');
406
+ }
407
+ return {
408
+ content: [{
409
+ type: 'text',
410
+ text: JSON.stringify({
411
+ ticket_id: params.ticket_id,
412
+ title: ticket.title,
413
+ status: ticket.status,
414
+ diagnosis,
415
+ suggested_actions: suggestedActions,
416
+ ...(applied ? { applied } : {}),
417
+ }, null, 2),
418
+ }],
419
+ };
420
+ }
421
+ catch (e) {
422
+ return {
423
+ content: [{
424
+ type: 'text',
425
+ text: JSON.stringify({ error: e.message }),
426
+ }],
427
+ isError: true,
428
+ };
429
+ }
430
+ });
431
+ }
432
+ //# sourceMappingURL=intelligence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intelligence.js","sourceRoot":"","sources":["../../src/tools/intelligence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Session management tools: start_session, session_status, end_session, advance, ingest_event
3
+ */
4
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ import type { SessionManager } from '../state.js';
6
+ export declare function registerSessionTools(server: McpServer, getState: () => SessionManager): void;
7
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/tools/session.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AASlD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,cAAc,QAijBrF"}