@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.
- package/README.md +178 -0
- package/dist/advance-helpers.d.ts +27 -0
- package/dist/advance-helpers.d.ts.map +1 -0
- package/dist/advance-helpers.js +127 -0
- package/dist/advance-helpers.js.map +1 -0
- package/dist/advance-prompts.d.ts +48 -0
- package/dist/advance-prompts.d.ts.map +1 -0
- package/dist/advance-prompts.js +420 -0
- package/dist/advance-prompts.js.map +1 -0
- package/dist/advance.d.ts +30 -0
- package/dist/advance.d.ts.map +1 -0
- package/dist/advance.js +752 -0
- package/dist/advance.js.map +1 -0
- package/dist/codebase-index.d.ts +5 -0
- package/dist/codebase-index.d.ts.map +1 -0
- package/dist/codebase-index.js +5 -0
- package/dist/codebase-index.js.map +1 -0
- package/dist/dedup-memory.d.ts +30 -0
- package/dist/dedup-memory.d.ts.map +1 -0
- package/dist/dedup-memory.js +76 -0
- package/dist/dedup-memory.js.map +1 -0
- package/dist/direct-client.d.ts +57 -0
- package/dist/direct-client.d.ts.map +1 -0
- package/dist/direct-client.js +92 -0
- package/dist/direct-client.js.map +1 -0
- package/dist/event-handlers-qa.d.ts +5 -0
- package/dist/event-handlers-qa.d.ts.map +1 -0
- package/dist/event-handlers-qa.js +186 -0
- package/dist/event-handlers-qa.js.map +1 -0
- package/dist/event-handlers-scout.d.ts +5 -0
- package/dist/event-handlers-scout.d.ts.map +1 -0
- package/dist/event-handlers-scout.js +270 -0
- package/dist/event-handlers-scout.js.map +1 -0
- package/dist/event-handlers-ticket.d.ts +5 -0
- package/dist/event-handlers-ticket.d.ts.map +1 -0
- package/dist/event-handlers-ticket.js +232 -0
- package/dist/event-handlers-ticket.js.map +1 -0
- package/dist/event-helpers.d.ts +46 -0
- package/dist/event-helpers.d.ts.map +1 -0
- package/dist/event-helpers.js +125 -0
- package/dist/event-helpers.js.map +1 -0
- package/dist/event-processor.d.ts +15 -0
- package/dist/event-processor.d.ts.map +1 -0
- package/dist/event-processor.js +111 -0
- package/dist/event-processor.js.map +1 -0
- package/dist/formulas.d.ts +27 -0
- package/dist/formulas.d.ts.map +1 -0
- package/dist/formulas.js +109 -0
- package/dist/formulas.js.map +1 -0
- package/dist/guidelines.d.ts +16 -0
- package/dist/guidelines.d.ts.map +1 -0
- package/dist/guidelines.js +44 -0
- package/dist/guidelines.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -0
- package/dist/learnings.d.ts +42 -0
- package/dist/learnings.d.ts.map +1 -0
- package/dist/learnings.js +117 -0
- package/dist/learnings.js.map +1 -0
- package/dist/project-metadata.d.ts +34 -0
- package/dist/project-metadata.d.ts.map +1 -0
- package/dist/project-metadata.js +617 -0
- package/dist/project-metadata.js.map +1 -0
- package/dist/proposals.d.ts +23 -0
- package/dist/proposals.d.ts.map +1 -0
- package/dist/proposals.js +201 -0
- package/dist/proposals.js.map +1 -0
- package/dist/qa-stats.d.ts +51 -0
- package/dist/qa-stats.d.ts.map +1 -0
- package/dist/qa-stats.js +121 -0
- package/dist/qa-stats.js.map +1 -0
- package/dist/run-manager.d.ts +97 -0
- package/dist/run-manager.d.ts.map +1 -0
- package/dist/run-manager.js +583 -0
- package/dist/run-manager.js.map +1 -0
- package/dist/run-state-bridge.d.ts +13 -0
- package/dist/run-state-bridge.d.ts.map +1 -0
- package/dist/run-state-bridge.js +101 -0
- package/dist/run-state-bridge.js.map +1 -0
- package/dist/scope-policy.d.ts +83 -0
- package/dist/scope-policy.d.ts.map +1 -0
- package/dist/scope-policy.js +278 -0
- package/dist/scope-policy.js.map +1 -0
- package/dist/server.d.ts +18 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +35 -0
- package/dist/server.js.map +1 -0
- package/dist/spindle.d.ts +41 -0
- package/dist/spindle.d.ts.map +1 -0
- package/dist/spindle.js +230 -0
- package/dist/spindle.js.map +1 -0
- package/dist/state.d.ts +36 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +50 -0
- package/dist/state.js.map +1 -0
- package/dist/ticket-worker.d.ts +37 -0
- package/dist/ticket-worker.d.ts.map +1 -0
- package/dist/ticket-worker.js +527 -0
- package/dist/ticket-worker.js.map +1 -0
- package/dist/tool-registry.d.ts +35 -0
- package/dist/tool-registry.d.ts.map +1 -0
- package/dist/tool-registry.js +129 -0
- package/dist/tool-registry.js.map +1 -0
- package/dist/tools/execute.d.ts +17 -0
- package/dist/tools/execute.d.ts.map +1 -0
- package/dist/tools/execute.js +418 -0
- package/dist/tools/execute.js.map +1 -0
- package/dist/tools/git.d.ts +7 -0
- package/dist/tools/git.d.ts.map +1 -0
- package/dist/tools/git.js +98 -0
- package/dist/tools/git.js.map +1 -0
- package/dist/tools/intelligence.d.ts +10 -0
- package/dist/tools/intelligence.d.ts.map +1 -0
- package/dist/tools/intelligence.js +432 -0
- package/dist/tools/intelligence.js.map +1 -0
- package/dist/tools/session.d.ts +7 -0
- package/dist/tools/session.d.ts.map +1 -0
- package/dist/tools/session.js +533 -0
- package/dist/tools/session.js.map +1 -0
- package/dist/tools/trajectory.d.ts +10 -0
- package/dist/tools/trajectory.d.ts.map +1 -0
- package/dist/tools/trajectory.js +374 -0
- package/dist/tools/trajectory.js.map +1 -0
- package/dist/trajectory-io.d.ts +21 -0
- package/dist/trajectory-io.d.ts.map +1 -0
- package/dist/trajectory-io.js +105 -0
- package/dist/trajectory-io.js.map +1 -0
- package/dist/types.d.ts +229 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +13 -0
- package/dist/types.js.map +1 -0
- 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":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD;;;;GAIG;AACH,SAAS,kBAAkB,CAAC,MAAc;IACxC,yBAAyB;IACzB,yEAAyE;IACzE,+EAA+E;IAC/E,4DAA4D;IAC5D,MAAM,YAAY,GAAG,gCAAgC,CAAC;IACtD,OAAO,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,QAA8B;IAChF,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,iIAAiI,EACjI;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;QACjF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QAChE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;QACzF,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;KACrE,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;QACZ,MAAM,MAAM,GAAG;YACb,QAAQ,EAAE,CAAC,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,SAAS,CAAE;YAC1C,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,WAAW;SAC9C,CAAC;QACF,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,2BAA2B;QAElD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,EAAE,CAAC;gBAC1F,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC;QAE/C,mDAAmD;QACnD,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;YACpC,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,8BAA8B,UAAU,sJAAsJ;yBACtM,CAAC;qBACH,CAAC;gBACF,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,iCAAiC;QACjC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK;aACtB,WAAW,EAAE;aACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;aAC3B,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;aACrB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChB,MAAM,UAAU,GAAG,eAAe,MAAM,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;QAEtD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QAEnC,IAAI,CAAC;YACH,yBAAyB;YACzB,IAAI,CAAC;gBACH,YAAY,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;gBACnF,+BAA+B;gBAC/B,YAAY,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YACxE,CAAC;YAAC,MAAM,CAAC;gBACP,yCAAyC;gBACzC,YAAY,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAC1F,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,UAAU;4BACV,UAAU;4BACV,QAAQ,EAAE,MAAM,CAAC,EAAE;4BACnB,OAAO,EAAE,UAAU,UAAU,kDAAkD;yBAChF,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,yBAA0B,CAAW,CAAC,OAAO,EAAE;4BACtD,UAAU;yBACX,CAAC;qBACH,CAAC;gBACF,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -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"}
|