@sudosandwich/limps 0.2.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/LICENSE +21 -0
- package/README.md +190 -0
- package/dist/agent-parser.d.ts +146 -0
- package/dist/agent-parser.d.ts.map +1 -0
- package/dist/agent-parser.js +448 -0
- package/dist/agent-parser.js.map +1 -0
- package/dist/config.d.ts +54 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +146 -0
- package/dist/config.js.map +1 -0
- package/dist/coordination.d.ts +102 -0
- package/dist/coordination.d.ts.map +1 -0
- package/dist/coordination.js +157 -0
- package/dist/coordination.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +256 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer.d.ts +83 -0
- package/dist/indexer.d.ts.map +1 -0
- package/dist/indexer.js +467 -0
- package/dist/indexer.js.map +1 -0
- package/dist/resources/agents-status.d.ts +32 -0
- package/dist/resources/agents-status.d.ts.map +1 -0
- package/dist/resources/agents-status.js +73 -0
- package/dist/resources/agents-status.js.map +1 -0
- package/dist/resources/decisions-log.d.ts +21 -0
- package/dist/resources/decisions-log.d.ts.map +1 -0
- package/dist/resources/decisions-log.js +146 -0
- package/dist/resources/decisions-log.js.map +1 -0
- package/dist/resources/index.d.ts +10 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +74 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/plans-full.d.ts +11 -0
- package/dist/resources/plans-full.d.ts.map +1 -0
- package/dist/resources/plans-full.js +71 -0
- package/dist/resources/plans-full.js.map +1 -0
- package/dist/resources/plans-index.d.ts +30 -0
- package/dist/resources/plans-index.d.ts.map +1 -0
- package/dist/resources/plans-index.js +177 -0
- package/dist/resources/plans-index.js.map +1 -0
- package/dist/resources/plans-summary.d.ts +33 -0
- package/dist/resources/plans-summary.d.ts.map +1 -0
- package/dist/resources/plans-summary.js +238 -0
- package/dist/resources/plans-summary.js.map +1 -0
- package/dist/rlm/extractors.d.ts +39 -0
- package/dist/rlm/extractors.d.ts.map +1 -0
- package/dist/rlm/extractors.js +291 -0
- package/dist/rlm/extractors.js.map +1 -0
- package/dist/rlm/helpers-inject.d.ts +13 -0
- package/dist/rlm/helpers-inject.d.ts.map +1 -0
- package/dist/rlm/helpers-inject.js +586 -0
- package/dist/rlm/helpers-inject.js.map +1 -0
- package/dist/rlm/helpers.d.ts +124 -0
- package/dist/rlm/helpers.d.ts.map +1 -0
- package/dist/rlm/helpers.js +381 -0
- package/dist/rlm/helpers.js.map +1 -0
- package/dist/rlm/index.d.ts +12 -0
- package/dist/rlm/index.d.ts.map +1 -0
- package/dist/rlm/index.js +19 -0
- package/dist/rlm/index.js.map +1 -0
- package/dist/rlm/parallel.d.ts +45 -0
- package/dist/rlm/parallel.d.ts.map +1 -0
- package/dist/rlm/parallel.js +76 -0
- package/dist/rlm/parallel.js.map +1 -0
- package/dist/rlm/recursion.d.ts +96 -0
- package/dist/rlm/recursion.d.ts.map +1 -0
- package/dist/rlm/recursion.js +113 -0
- package/dist/rlm/recursion.js.map +1 -0
- package/dist/rlm/sampling.d.ts +100 -0
- package/dist/rlm/sampling.d.ts.map +1 -0
- package/dist/rlm/sampling.js +96 -0
- package/dist/rlm/sampling.js.map +1 -0
- package/dist/rlm/sandbox.d.ts +73 -0
- package/dist/rlm/sandbox.d.ts.map +1 -0
- package/dist/rlm/sandbox.js +160 -0
- package/dist/rlm/sandbox.js.map +1 -0
- package/dist/rlm/security.d.ts +28 -0
- package/dist/rlm/security.d.ts.map +1 -0
- package/dist/rlm/security.js +154 -0
- package/dist/rlm/security.js.map +1 -0
- package/dist/server.d.ts +21 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +107 -0
- package/dist/server.js.map +1 -0
- package/dist/task-parser.d.ts +47 -0
- package/dist/task-parser.d.ts.map +1 -0
- package/dist/task-parser.js +112 -0
- package/dist/task-parser.js.map +1 -0
- package/dist/test-setup.d.ts +6 -0
- package/dist/test-setup.d.ts.map +1 -0
- package/dist/test-setup.js +37 -0
- package/dist/test-setup.js.map +1 -0
- package/dist/tools/claim-task.d.ts +28 -0
- package/dist/tools/claim-task.d.ts.map +1 -0
- package/dist/tools/claim-task.js +288 -0
- package/dist/tools/claim-task.js.map +1 -0
- package/dist/tools/create-doc.d.ts +47 -0
- package/dist/tools/create-doc.d.ts.map +1 -0
- package/dist/tools/create-doc.js +137 -0
- package/dist/tools/create-doc.js.map +1 -0
- package/dist/tools/create-plan.d.ts +25 -0
- package/dist/tools/create-plan.d.ts.map +1 -0
- package/dist/tools/create-plan.js +179 -0
- package/dist/tools/create-plan.js.map +1 -0
- package/dist/tools/delete-doc.d.ts +51 -0
- package/dist/tools/delete-doc.d.ts.map +1 -0
- package/dist/tools/delete-doc.js +194 -0
- package/dist/tools/delete-doc.js.map +1 -0
- package/dist/tools/get-next-task.d.ts +49 -0
- package/dist/tools/get-next-task.d.ts.map +1 -0
- package/dist/tools/get-next-task.js +204 -0
- package/dist/tools/get-next-task.js.map +1 -0
- package/dist/tools/index.d.ts +10 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +122 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/list-docs.d.ts +53 -0
- package/dist/tools/list-docs.d.ts.map +1 -0
- package/dist/tools/list-docs.js +236 -0
- package/dist/tools/list-docs.js.map +1 -0
- package/dist/tools/open-document-in-cursor.d.ts +62 -0
- package/dist/tools/open-document-in-cursor.d.ts.map +1 -0
- package/dist/tools/open-document-in-cursor.js +211 -0
- package/dist/tools/open-document-in-cursor.js.map +1 -0
- package/dist/tools/read-doc.d.ts +44 -0
- package/dist/tools/read-doc.d.ts.map +1 -0
- package/dist/tools/read-doc.js +174 -0
- package/dist/tools/read-doc.js.map +1 -0
- package/dist/tools/release-task.d.ts +28 -0
- package/dist/tools/release-task.d.ts.map +1 -0
- package/dist/tools/release-task.js +154 -0
- package/dist/tools/release-task.js.map +1 -0
- package/dist/tools/rlm-multi-query.d.ts +110 -0
- package/dist/tools/rlm-multi-query.d.ts.map +1 -0
- package/dist/tools/rlm-multi-query.js +348 -0
- package/dist/tools/rlm-multi-query.js.map +1 -0
- package/dist/tools/rlm-query.d.ts +56 -0
- package/dist/tools/rlm-query.d.ts.map +1 -0
- package/dist/tools/rlm-query.js +228 -0
- package/dist/tools/rlm-query.js.map +1 -0
- package/dist/tools/search-docs.d.ts +34 -0
- package/dist/tools/search-docs.d.ts.map +1 -0
- package/dist/tools/search-docs.js +292 -0
- package/dist/tools/search-docs.js.map +1 -0
- package/dist/tools/update-doc.d.ts +149 -0
- package/dist/tools/update-doc.d.ts.map +1 -0
- package/dist/tools/update-doc.js +195 -0
- package/dist/tools/update-doc.js.map +1 -0
- package/dist/tools/update-task-status.d.ts +31 -0
- package/dist/tools/update-task-status.d.ts.map +1 -0
- package/dist/tools/update-task-status.js +303 -0
- package/dist/tools/update-task-status.js.map +1 -0
- package/dist/types.d.ts +50 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/backup.d.ts +76 -0
- package/dist/utils/backup.d.ts.map +1 -0
- package/dist/utils/backup.js +172 -0
- package/dist/utils/backup.js.map +1 -0
- package/dist/utils/errors.d.ts +93 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +125 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/os-paths.d.ts +45 -0
- package/dist/utils/os-paths.d.ts.map +1 -0
- package/dist/utils/os-paths.js +81 -0
- package/dist/utils/os-paths.js.map +1 -0
- package/dist/utils/paths.d.ts +71 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +165 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/watcher.d.ts +19 -0
- package/dist/watcher.d.ts.map +1 -0
- package/dist/watcher.js +109 -0
- package/dist/watcher.js.map +1 -0
- package/package.json +85 -0
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security validation for RLM sandbox execution.
|
|
3
|
+
* Feature #6: Security Sandbox
|
|
4
|
+
*
|
|
5
|
+
* Blocks dangerous APIs and validates code before execution.
|
|
6
|
+
* This is defense-in-depth; isolated-vm provides true isolation.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* APIs that are blocked from sandbox execution.
|
|
10
|
+
* These are validated via static analysis before code runs.
|
|
11
|
+
*/
|
|
12
|
+
export const BLOCKED_APIS = [
|
|
13
|
+
'require',
|
|
14
|
+
'import',
|
|
15
|
+
'eval',
|
|
16
|
+
'Function',
|
|
17
|
+
'process',
|
|
18
|
+
'global',
|
|
19
|
+
'globalThis',
|
|
20
|
+
'fetch',
|
|
21
|
+
'XMLHttpRequest',
|
|
22
|
+
'WebSocket',
|
|
23
|
+
'setTimeout',
|
|
24
|
+
'setInterval',
|
|
25
|
+
'setImmediate',
|
|
26
|
+
'Buffer',
|
|
27
|
+
'ArrayBuffer.transfer',
|
|
28
|
+
'__proto__',
|
|
29
|
+
'constructor.constructor',
|
|
30
|
+
];
|
|
31
|
+
/**
|
|
32
|
+
* Security error thrown when code contains prohibited operations.
|
|
33
|
+
*/
|
|
34
|
+
export class SecurityError extends Error {
|
|
35
|
+
violation;
|
|
36
|
+
constructor(violation, message) {
|
|
37
|
+
super(message);
|
|
38
|
+
this.name = 'SecurityError';
|
|
39
|
+
this.violation = violation;
|
|
40
|
+
// Ensure proper prototype chain for instanceof checks
|
|
41
|
+
Object.setPrototypeOf(this, SecurityError.prototype);
|
|
42
|
+
// Capture stack trace (V8 engines)
|
|
43
|
+
if (Error.captureStackTrace) {
|
|
44
|
+
Error.captureStackTrace(this, SecurityError);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const VIOLATION_RULES = [
|
|
49
|
+
{
|
|
50
|
+
violation: 'require',
|
|
51
|
+
pattern: /\brequire\b/,
|
|
52
|
+
message: 'Prohibited module access',
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
violation: 'import',
|
|
56
|
+
pattern: /\bimport\b/,
|
|
57
|
+
message: 'Dynamic import not allowed',
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
violation: 'eval',
|
|
61
|
+
pattern: /\beval\b/,
|
|
62
|
+
message: 'Dynamic code execution',
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
violation: 'Function',
|
|
66
|
+
pattern: /\bFunction\b/,
|
|
67
|
+
message: 'Dynamic code execution',
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
violation: 'process',
|
|
71
|
+
pattern: /\bprocess\b/,
|
|
72
|
+
message: 'Process access not allowed',
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
violation: 'global',
|
|
76
|
+
pattern: /\bglobal\b(?!This)/,
|
|
77
|
+
message: 'Global access not allowed',
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
violation: 'globalThis',
|
|
81
|
+
pattern: /\bglobalThis\b/,
|
|
82
|
+
message: 'Global access not allowed',
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
violation: 'fetch',
|
|
86
|
+
pattern: /\bfetch\b/,
|
|
87
|
+
message: 'Network access not allowed',
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
violation: 'XMLHttpRequest',
|
|
91
|
+
pattern: /\bXMLHttpRequest\b/,
|
|
92
|
+
message: 'Network access not allowed',
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
violation: 'WebSocket',
|
|
96
|
+
pattern: /\bWebSocket\b/,
|
|
97
|
+
message: 'Network access not allowed',
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
violation: 'setTimeout',
|
|
101
|
+
pattern: /\bsetTimeout\b/,
|
|
102
|
+
message: 'Timer functions not allowed',
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
violation: 'setInterval',
|
|
106
|
+
pattern: /\bsetInterval\b/,
|
|
107
|
+
message: 'Timer functions not allowed',
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
violation: 'setImmediate',
|
|
111
|
+
pattern: /\bsetImmediate\b/,
|
|
112
|
+
message: 'Timer functions not allowed',
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
violation: 'Buffer',
|
|
116
|
+
pattern: /\bBuffer\b/,
|
|
117
|
+
message: 'Buffer access not allowed',
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
violation: 'ArrayBuffer.transfer',
|
|
121
|
+
pattern: /ArrayBuffer\s*\.\s*transfer/,
|
|
122
|
+
message: 'ArrayBuffer.transfer not allowed',
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
violation: '__proto__',
|
|
126
|
+
pattern: /__proto__/,
|
|
127
|
+
message: 'Prototype pollution',
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
violation: 'constructor.constructor',
|
|
131
|
+
pattern: /constructor\s*\.\s*constructor/,
|
|
132
|
+
message: 'Prototype pollution',
|
|
133
|
+
},
|
|
134
|
+
];
|
|
135
|
+
/**
|
|
136
|
+
* Pre-execution validation of code string.
|
|
137
|
+
* Scans for BLOCKED_APIS patterns and throws SecurityError if found.
|
|
138
|
+
*
|
|
139
|
+
* @param code - JavaScript code to validate
|
|
140
|
+
* @throws SecurityError if code contains blocked patterns
|
|
141
|
+
*/
|
|
142
|
+
export function validateCode(code) {
|
|
143
|
+
// Empty or whitespace-only code is allowed
|
|
144
|
+
if (!code.trim()) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
// Check each violation rule
|
|
148
|
+
for (const rule of VIOLATION_RULES) {
|
|
149
|
+
if (rule.pattern.test(code)) {
|
|
150
|
+
throw new SecurityError(rule.violation, rule.message);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/rlm/security.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { ServerConfig } from './config.js';
|
|
3
|
+
import type { Database as DatabaseType } from 'better-sqlite3';
|
|
4
|
+
import type { CoordinationState } from './coordination.js';
|
|
5
|
+
/**
|
|
6
|
+
* Create an MCP server instance with the given configuration.
|
|
7
|
+
*
|
|
8
|
+
* @param config - Server configuration
|
|
9
|
+
* @param db - Database instance for tools and resources
|
|
10
|
+
* @param coordination - Coordination state for multi-agent orchestration
|
|
11
|
+
* @returns MCP server instance
|
|
12
|
+
*/
|
|
13
|
+
export declare function createServer(config: ServerConfig, db: DatabaseType, coordination: CoordinationState): McpServer;
|
|
14
|
+
/**
|
|
15
|
+
* Start the MCP server with stdio transport and handle graceful shutdown.
|
|
16
|
+
*
|
|
17
|
+
* @param server - MCP server instance to start
|
|
18
|
+
* @param onShutdown - Optional callback to run during graceful shutdown (e.g., stop watcher, close db)
|
|
19
|
+
*/
|
|
20
|
+
export declare function startServer(server: McpServer, onShutdown?: () => Promise<void>): Promise<void>;
|
|
21
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAK3D;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,YAAY,EACpB,EAAE,EAAE,YAAY,EAChB,YAAY,EAAE,iBAAiB,GAC9B,SAAS,CA8BX;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,SAAS,EACjB,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAC/B,OAAO,CAAC,IAAI,CAAC,CAkEf"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import { registerResources } from './resources/index.js';
|
|
4
|
+
import { registerTools } from './tools/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* Create an MCP server instance with the given configuration.
|
|
7
|
+
*
|
|
8
|
+
* @param config - Server configuration
|
|
9
|
+
* @param db - Database instance for tools and resources
|
|
10
|
+
* @param coordination - Coordination state for multi-agent orchestration
|
|
11
|
+
* @returns MCP server instance
|
|
12
|
+
*/
|
|
13
|
+
export function createServer(config, db, coordination) {
|
|
14
|
+
const server = new McpServer({
|
|
15
|
+
name: 'mcp-planning-server',
|
|
16
|
+
version: '0.2.0',
|
|
17
|
+
});
|
|
18
|
+
// Tool context for handlers
|
|
19
|
+
const toolContext = {
|
|
20
|
+
db,
|
|
21
|
+
coordination,
|
|
22
|
+
config,
|
|
23
|
+
};
|
|
24
|
+
// Store on server instance for tool handlers to access
|
|
25
|
+
server.toolContext = toolContext;
|
|
26
|
+
// Resource context for handlers
|
|
27
|
+
const resourceContext = {
|
|
28
|
+
db,
|
|
29
|
+
coordination,
|
|
30
|
+
config,
|
|
31
|
+
};
|
|
32
|
+
// Register resources
|
|
33
|
+
registerResources(server, resourceContext);
|
|
34
|
+
// Register tools
|
|
35
|
+
registerTools(server, toolContext);
|
|
36
|
+
return server;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Start the MCP server with stdio transport and handle graceful shutdown.
|
|
40
|
+
*
|
|
41
|
+
* @param server - MCP server instance to start
|
|
42
|
+
* @param onShutdown - Optional callback to run during graceful shutdown (e.g., stop watcher, close db)
|
|
43
|
+
*/
|
|
44
|
+
export async function startServer(server, onShutdown) {
|
|
45
|
+
const transport = new StdioServerTransport();
|
|
46
|
+
// Set up signal handlers for graceful shutdown
|
|
47
|
+
// Only register exit handlers if not in test environment
|
|
48
|
+
const isTestEnvironment = process.env.NODE_ENV === 'test' || process.env.VITEST === 'true';
|
|
49
|
+
const shutdown = async (signal) => {
|
|
50
|
+
console.error(`Received ${signal}, shutting down gracefully...`);
|
|
51
|
+
try {
|
|
52
|
+
// Run custom shutdown callback first (stop watcher, close db)
|
|
53
|
+
if (onShutdown) {
|
|
54
|
+
await onShutdown();
|
|
55
|
+
}
|
|
56
|
+
await server.close();
|
|
57
|
+
if (!isTestEnvironment) {
|
|
58
|
+
process.exit(0);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
console.error(`Error during shutdown:`, error);
|
|
63
|
+
if (!isTestEnvironment) {
|
|
64
|
+
process.exit(1);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
if (!isTestEnvironment) {
|
|
72
|
+
process.on('SIGINT', () => {
|
|
73
|
+
shutdown('SIGINT').catch((error) => {
|
|
74
|
+
console.error('Error in SIGINT handler:', error);
|
|
75
|
+
process.exit(1);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
process.on('SIGTERM', () => {
|
|
79
|
+
shutdown('SIGTERM').catch((error) => {
|
|
80
|
+
console.error('Error in SIGTERM handler:', error);
|
|
81
|
+
process.exit(1);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
// Handle uncaught errors
|
|
85
|
+
process.on('uncaughtException', (error) => {
|
|
86
|
+
console.error('Uncaught exception:', error);
|
|
87
|
+
shutdown('uncaughtException').catch(() => {
|
|
88
|
+
process.exit(1);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
process.on('unhandledRejection', (reason, promise) => {
|
|
92
|
+
console.error('Unhandled rejection at:', promise, 'reason:', reason);
|
|
93
|
+
shutdown('unhandledRejection').catch(() => {
|
|
94
|
+
process.exit(1);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
try {
|
|
99
|
+
await server.connect(transport);
|
|
100
|
+
console.error('MCP Planning Server running on stdio');
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
console.error('Failed to start server:', error);
|
|
104
|
+
throw error;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared task parsing utilities for MCP planning tools.
|
|
3
|
+
*
|
|
4
|
+
* This module provides common functions for parsing tasks from planning documents,
|
|
5
|
+
* used by get-next-task, claim-task, and update-task-status tools.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Parsed task interface representing a task extracted from a planning document.
|
|
9
|
+
*/
|
|
10
|
+
export interface ParsedTask {
|
|
11
|
+
id: string;
|
|
12
|
+
planId: string;
|
|
13
|
+
featureNumber: number;
|
|
14
|
+
title: string;
|
|
15
|
+
status: 'GAP' | 'WIP' | 'PASS' | 'BLOCKED';
|
|
16
|
+
dependencies: string[];
|
|
17
|
+
files: string[];
|
|
18
|
+
documentPath: string;
|
|
19
|
+
agentPersona?: 'coder' | 'reviewer' | 'pm' | 'customer';
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Extract plan ID from document path.
|
|
23
|
+
* Example: "/path/to/plans/0008-plan-name/plan.md" -> "0008-plan-name"
|
|
24
|
+
*
|
|
25
|
+
* @param path - Document path
|
|
26
|
+
* @returns Plan ID or null if not found
|
|
27
|
+
*/
|
|
28
|
+
export declare function extractPlanId(path: string): string | null;
|
|
29
|
+
/**
|
|
30
|
+
* Parse tasks from a planning document.
|
|
31
|
+
* Extracts features marked with ### #<number>: pattern.
|
|
32
|
+
*
|
|
33
|
+
* @param path - Document path
|
|
34
|
+
* @param content - Document content
|
|
35
|
+
* @param planId - Plan ID for task ID generation
|
|
36
|
+
* @returns Array of parsed tasks
|
|
37
|
+
*/
|
|
38
|
+
export declare function parseTasksFromDocument(path: string, content: string, planId: string): ParsedTask[];
|
|
39
|
+
/**
|
|
40
|
+
* Find a specific task in parsed tasks by ID.
|
|
41
|
+
*
|
|
42
|
+
* @param tasks - Array of parsed tasks
|
|
43
|
+
* @param taskId - Task ID to find
|
|
44
|
+
* @returns Parsed task or undefined if not found
|
|
45
|
+
*/
|
|
46
|
+
export declare function findTaskById(tasks: ParsedTask[], taskId: string): ParsedTask | undefined;
|
|
47
|
+
//# sourceMappingURL=task-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-parser.d.ts","sourceRoot":"","sources":["../src/task-parser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;IAC3C,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,IAAI,GAAG,UAAU,CAAC;CACzD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMzD;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,UAAU,EAAE,CAgFd;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAExF"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared task parsing utilities for MCP planning tools.
|
|
3
|
+
*
|
|
4
|
+
* This module provides common functions for parsing tasks from planning documents,
|
|
5
|
+
* used by get-next-task, claim-task, and update-task-status tools.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Extract plan ID from document path.
|
|
9
|
+
* Example: "/path/to/plans/0008-plan-name/plan.md" -> "0008-plan-name"
|
|
10
|
+
*
|
|
11
|
+
* @param path - Document path
|
|
12
|
+
* @returns Plan ID or null if not found
|
|
13
|
+
*/
|
|
14
|
+
export function extractPlanId(path) {
|
|
15
|
+
const plansMatch = path.match(/plans[/\\]([^/\\]+)/);
|
|
16
|
+
if (!plansMatch) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
return plansMatch[1];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Parse tasks from a planning document.
|
|
23
|
+
* Extracts features marked with ### #<number>: pattern.
|
|
24
|
+
*
|
|
25
|
+
* @param path - Document path
|
|
26
|
+
* @param content - Document content
|
|
27
|
+
* @param planId - Plan ID for task ID generation
|
|
28
|
+
* @returns Array of parsed tasks
|
|
29
|
+
*/
|
|
30
|
+
export function parseTasksFromDocument(path, content, planId) {
|
|
31
|
+
const tasks = [];
|
|
32
|
+
// Match feature markers: ### #<number>: <title>
|
|
33
|
+
const featureRegex = /^###\s+#(\d+):\s+(.+)$/gm;
|
|
34
|
+
const matches = Array.from(content.matchAll(featureRegex));
|
|
35
|
+
for (const match of matches) {
|
|
36
|
+
const featureNumber = parseInt(match[1], 10);
|
|
37
|
+
const title = match[2].trim();
|
|
38
|
+
const taskId = `${planId}#${featureNumber}`;
|
|
39
|
+
// Extract status from content after the feature marker
|
|
40
|
+
const featureStart = match.index || 0;
|
|
41
|
+
const nextFeatureMatch = content.indexOf('### #', featureStart + 1);
|
|
42
|
+
const featureSection = nextFeatureMatch > 0
|
|
43
|
+
? content.substring(featureStart, nextFeatureMatch)
|
|
44
|
+
: content.substring(featureStart);
|
|
45
|
+
// Extract status: Status: `GAP` or Status: `WIP`, etc.
|
|
46
|
+
const statusMatch = featureSection.match(/Status:\s*`?(\w+)`?/i);
|
|
47
|
+
const status = (statusMatch?.[1]?.toUpperCase() || 'GAP');
|
|
48
|
+
// Extract dependencies
|
|
49
|
+
const dependencies = [];
|
|
50
|
+
const depsMatch = featureSection.match(/Dependencies:\s*(.+?)(?:\n|$)/i);
|
|
51
|
+
if (depsMatch) {
|
|
52
|
+
const depsText = depsMatch[1].trim();
|
|
53
|
+
if (depsText && depsText.toLowerCase() !== 'none') {
|
|
54
|
+
// Extract feature references like #1, #2, or full task IDs
|
|
55
|
+
const depMatches = depsText.matchAll(/#(\d+)|(\d{4}[^#]*#\d+)/g);
|
|
56
|
+
for (const depMatch of depMatches) {
|
|
57
|
+
if (depMatch[1]) {
|
|
58
|
+
dependencies.push(`#${depMatch[1]}`);
|
|
59
|
+
}
|
|
60
|
+
else if (depMatch[2]) {
|
|
61
|
+
dependencies.push(depMatch[2]);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Extract files from Files: line
|
|
67
|
+
const files = [];
|
|
68
|
+
const filesMatch = featureSection.match(/Files:\s*(.+?)(?:\n|$)/i);
|
|
69
|
+
if (filesMatch) {
|
|
70
|
+
const filesText = filesMatch[1].trim();
|
|
71
|
+
// Extract file paths (may be comma-separated or on multiple lines)
|
|
72
|
+
const fileMatches = filesText.matchAll(/`?([^\s`,]+\.(?:ts|js|tsx|jsx|md|json))`?/g);
|
|
73
|
+
for (const fileMatch of fileMatches) {
|
|
74
|
+
if (fileMatch[1]) {
|
|
75
|
+
files.push(fileMatch[1]);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Extract agent persona if this is an agent file
|
|
80
|
+
let agentPersona;
|
|
81
|
+
if (path.includes('/agents/') || path.includes('\\agents\\')) {
|
|
82
|
+
// Try to extract from agent file content
|
|
83
|
+
const personaMatch = content.match(/persona[:\s]+(coder|reviewer|pm|customer)/i);
|
|
84
|
+
if (personaMatch) {
|
|
85
|
+
agentPersona = personaMatch[1].toLowerCase();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
tasks.push({
|
|
89
|
+
id: taskId,
|
|
90
|
+
planId,
|
|
91
|
+
featureNumber,
|
|
92
|
+
title,
|
|
93
|
+
status,
|
|
94
|
+
dependencies,
|
|
95
|
+
files,
|
|
96
|
+
documentPath: path,
|
|
97
|
+
agentPersona,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
return tasks;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Find a specific task in parsed tasks by ID.
|
|
104
|
+
*
|
|
105
|
+
* @param tasks - Array of parsed tasks
|
|
106
|
+
* @param taskId - Task ID to find
|
|
107
|
+
* @returns Parsed task or undefined if not found
|
|
108
|
+
*/
|
|
109
|
+
export function findTaskById(tasks, taskId) {
|
|
110
|
+
return tasks.find((t) => t.id === taskId);
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=task-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-parser.js","sourceRoot":"","sources":["../src/task-parser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiBH;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACrD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;AACvB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,sBAAsB,CACpC,IAAY,EACZ,OAAe,EACf,MAAc;IAEd,MAAM,KAAK,GAAiB,EAAE,CAAC;IAE/B,gDAAgD;IAChD,MAAM,YAAY,GAAG,0BAA0B,CAAC;IAChD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;IAE3D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,GAAG,MAAM,IAAI,aAAa,EAAE,CAAC;QAE5C,uDAAuD;QACvD,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;QACtC,MAAM,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC;QACpE,MAAM,cAAc,GAClB,gBAAgB,GAAG,CAAC;YAClB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,YAAY,EAAE,gBAAgB,CAAC;YACnD,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAEtC,uDAAuD;QACvD,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,KAAK,CAAuC,CAAC;QAEhG,uBAAuB;QACvB,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACzE,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACrC,IAAI,QAAQ,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;gBAClD,2DAA2D;gBAC3D,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,0BAA0B,CAAC,CAAC;gBACjE,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;oBAClC,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;wBAChB,YAAY,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBACvC,CAAC;yBAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;wBACvB,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;oBACjC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,iCAAiC;QACjC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACnE,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACvC,mEAAmE;YACnE,MAAM,WAAW,GAAG,SAAS,CAAC,QAAQ,CAAC,4CAA4C,CAAC,CAAC;YACrF,KAAK,MAAM,SAAS,IAAI,WAAW,EAAE,CAAC;gBACpC,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC;QACH,CAAC;QAED,iDAAiD;QACjD,IAAI,YAAkE,CAAC;QACvE,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7D,yCAAyC;YACzC,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;YACjF,IAAI,YAAY,EAAE,CAAC;gBACjB,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,WAAW,EAA8C,CAAC;YAC3F,CAAC;QACH,CAAC;QAED,KAAK,CAAC,IAAI,CAAC;YACT,EAAE,EAAE,MAAM;YACV,MAAM;YACN,aAAa;YACb,KAAK;YACL,MAAM;YACN,YAAY;YACZ,KAAK;YACL,YAAY,EAAE,IAAI;YAClB,YAAY;SACb,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,KAAmB,EAAE,MAAc;IAC9D,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-setup.d.ts","sourceRoot":"","sources":["../src/test-setup.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test setup file for Vitest.
|
|
3
|
+
* Provides shared test fixtures and configuration.
|
|
4
|
+
*/
|
|
5
|
+
import { beforeEach, afterEach } from 'vitest';
|
|
6
|
+
import { mkdirSync, rmSync, existsSync } from 'fs';
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
import { tmpdir } from 'os';
|
|
9
|
+
// Test directory for fixtures
|
|
10
|
+
const TEST_DIR = join(tmpdir(), 'mcp-test-repo');
|
|
11
|
+
beforeEach(async () => {
|
|
12
|
+
// Create fresh test directory structure
|
|
13
|
+
if (existsSync(TEST_DIR)) {
|
|
14
|
+
rmSync(TEST_DIR, { recursive: true, force: true });
|
|
15
|
+
}
|
|
16
|
+
mkdirSync(TEST_DIR, { recursive: true });
|
|
17
|
+
mkdirSync(join(TEST_DIR, 'addendums'), { recursive: true });
|
|
18
|
+
mkdirSync(join(TEST_DIR, 'examples'), { recursive: true });
|
|
19
|
+
mkdirSync(join(TEST_DIR, 'research'), { recursive: true });
|
|
20
|
+
mkdirSync(join(TEST_DIR, 'plans'), { recursive: true });
|
|
21
|
+
// Override config to use test directory if needed
|
|
22
|
+
// Note: Individual tests may override this with their own test directories
|
|
23
|
+
if (!process.env.REPO_ROOT) {
|
|
24
|
+
process.env.REPO_ROOT = TEST_DIR;
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
afterEach(async () => {
|
|
28
|
+
// Cleanup test directory
|
|
29
|
+
if (existsSync(TEST_DIR)) {
|
|
30
|
+
rmSync(TEST_DIR, { recursive: true, force: true });
|
|
31
|
+
}
|
|
32
|
+
// Reset env var if we set it
|
|
33
|
+
if (process.env.REPO_ROOT === TEST_DIR) {
|
|
34
|
+
delete process.env.REPO_ROOT;
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=test-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-setup.js","sourceRoot":"","sources":["../src/test-setup.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAE5B,8BAA8B;AAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC;AAEjD,UAAU,CAAC,KAAK,IAAI,EAAE;IACpB,wCAAwC;IACxC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAExD,kDAAkD;IAClD,2EAA2E;IAC3E,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,QAAQ,CAAC;IACnC,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,yBAAyB;IACzB,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,6BAA6B;IAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QACvC,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;IAC/B,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { ToolContext, ToolResult } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Input schema for claim_task tool.
|
|
5
|
+
*/
|
|
6
|
+
export declare const ClaimTaskInputSchema: z.ZodObject<{
|
|
7
|
+
taskId: z.ZodString;
|
|
8
|
+
agentId: z.ZodString;
|
|
9
|
+
persona: z.ZodOptional<z.ZodEnum<["coder", "reviewer", "pm", "customer"]>>;
|
|
10
|
+
}, "strip", z.ZodTypeAny, {
|
|
11
|
+
taskId: string;
|
|
12
|
+
agentId: string;
|
|
13
|
+
persona?: "coder" | "reviewer" | "pm" | "customer" | undefined;
|
|
14
|
+
}, {
|
|
15
|
+
taskId: string;
|
|
16
|
+
agentId: string;
|
|
17
|
+
persona?: "coder" | "reviewer" | "pm" | "customer" | undefined;
|
|
18
|
+
}>;
|
|
19
|
+
/**
|
|
20
|
+
* Handle claim_task tool request.
|
|
21
|
+
* Marks a task as in-progress by a specific agent with file locks.
|
|
22
|
+
*
|
|
23
|
+
* @param input - Tool input
|
|
24
|
+
* @param context - Tool context
|
|
25
|
+
* @returns Tool result
|
|
26
|
+
*/
|
|
27
|
+
export declare function handleClaimTask(input: z.infer<typeof ClaimTaskInputSchema>, context: ToolContext): Promise<ToolResult>;
|
|
28
|
+
//# sourceMappingURL=claim-task.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claim-task.d.ts","sourceRoot":"","sources":["../../src/tools/claim-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE3D;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;EAI/B,CAAC;AAiHH;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,EAC3C,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CAgMrB"}
|