@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.
Files changed (183) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +190 -0
  3. package/dist/agent-parser.d.ts +146 -0
  4. package/dist/agent-parser.d.ts.map +1 -0
  5. package/dist/agent-parser.js +448 -0
  6. package/dist/agent-parser.js.map +1 -0
  7. package/dist/config.d.ts +54 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +146 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/coordination.d.ts +102 -0
  12. package/dist/coordination.d.ts.map +1 -0
  13. package/dist/coordination.js +157 -0
  14. package/dist/coordination.js.map +1 -0
  15. package/dist/index.d.ts +3 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +256 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/indexer.d.ts +83 -0
  20. package/dist/indexer.d.ts.map +1 -0
  21. package/dist/indexer.js +467 -0
  22. package/dist/indexer.js.map +1 -0
  23. package/dist/resources/agents-status.d.ts +32 -0
  24. package/dist/resources/agents-status.d.ts.map +1 -0
  25. package/dist/resources/agents-status.js +73 -0
  26. package/dist/resources/agents-status.js.map +1 -0
  27. package/dist/resources/decisions-log.d.ts +21 -0
  28. package/dist/resources/decisions-log.d.ts.map +1 -0
  29. package/dist/resources/decisions-log.js +146 -0
  30. package/dist/resources/decisions-log.js.map +1 -0
  31. package/dist/resources/index.d.ts +10 -0
  32. package/dist/resources/index.d.ts.map +1 -0
  33. package/dist/resources/index.js +74 -0
  34. package/dist/resources/index.js.map +1 -0
  35. package/dist/resources/plans-full.d.ts +11 -0
  36. package/dist/resources/plans-full.d.ts.map +1 -0
  37. package/dist/resources/plans-full.js +71 -0
  38. package/dist/resources/plans-full.js.map +1 -0
  39. package/dist/resources/plans-index.d.ts +30 -0
  40. package/dist/resources/plans-index.d.ts.map +1 -0
  41. package/dist/resources/plans-index.js +177 -0
  42. package/dist/resources/plans-index.js.map +1 -0
  43. package/dist/resources/plans-summary.d.ts +33 -0
  44. package/dist/resources/plans-summary.d.ts.map +1 -0
  45. package/dist/resources/plans-summary.js +238 -0
  46. package/dist/resources/plans-summary.js.map +1 -0
  47. package/dist/rlm/extractors.d.ts +39 -0
  48. package/dist/rlm/extractors.d.ts.map +1 -0
  49. package/dist/rlm/extractors.js +291 -0
  50. package/dist/rlm/extractors.js.map +1 -0
  51. package/dist/rlm/helpers-inject.d.ts +13 -0
  52. package/dist/rlm/helpers-inject.d.ts.map +1 -0
  53. package/dist/rlm/helpers-inject.js +586 -0
  54. package/dist/rlm/helpers-inject.js.map +1 -0
  55. package/dist/rlm/helpers.d.ts +124 -0
  56. package/dist/rlm/helpers.d.ts.map +1 -0
  57. package/dist/rlm/helpers.js +381 -0
  58. package/dist/rlm/helpers.js.map +1 -0
  59. package/dist/rlm/index.d.ts +12 -0
  60. package/dist/rlm/index.d.ts.map +1 -0
  61. package/dist/rlm/index.js +19 -0
  62. package/dist/rlm/index.js.map +1 -0
  63. package/dist/rlm/parallel.d.ts +45 -0
  64. package/dist/rlm/parallel.d.ts.map +1 -0
  65. package/dist/rlm/parallel.js +76 -0
  66. package/dist/rlm/parallel.js.map +1 -0
  67. package/dist/rlm/recursion.d.ts +96 -0
  68. package/dist/rlm/recursion.d.ts.map +1 -0
  69. package/dist/rlm/recursion.js +113 -0
  70. package/dist/rlm/recursion.js.map +1 -0
  71. package/dist/rlm/sampling.d.ts +100 -0
  72. package/dist/rlm/sampling.d.ts.map +1 -0
  73. package/dist/rlm/sampling.js +96 -0
  74. package/dist/rlm/sampling.js.map +1 -0
  75. package/dist/rlm/sandbox.d.ts +73 -0
  76. package/dist/rlm/sandbox.d.ts.map +1 -0
  77. package/dist/rlm/sandbox.js +160 -0
  78. package/dist/rlm/sandbox.js.map +1 -0
  79. package/dist/rlm/security.d.ts +28 -0
  80. package/dist/rlm/security.d.ts.map +1 -0
  81. package/dist/rlm/security.js +154 -0
  82. package/dist/rlm/security.js.map +1 -0
  83. package/dist/server.d.ts +21 -0
  84. package/dist/server.d.ts.map +1 -0
  85. package/dist/server.js +107 -0
  86. package/dist/server.js.map +1 -0
  87. package/dist/task-parser.d.ts +47 -0
  88. package/dist/task-parser.d.ts.map +1 -0
  89. package/dist/task-parser.js +112 -0
  90. package/dist/task-parser.js.map +1 -0
  91. package/dist/test-setup.d.ts +6 -0
  92. package/dist/test-setup.d.ts.map +1 -0
  93. package/dist/test-setup.js +37 -0
  94. package/dist/test-setup.js.map +1 -0
  95. package/dist/tools/claim-task.d.ts +28 -0
  96. package/dist/tools/claim-task.d.ts.map +1 -0
  97. package/dist/tools/claim-task.js +288 -0
  98. package/dist/tools/claim-task.js.map +1 -0
  99. package/dist/tools/create-doc.d.ts +47 -0
  100. package/dist/tools/create-doc.d.ts.map +1 -0
  101. package/dist/tools/create-doc.js +137 -0
  102. package/dist/tools/create-doc.js.map +1 -0
  103. package/dist/tools/create-plan.d.ts +25 -0
  104. package/dist/tools/create-plan.d.ts.map +1 -0
  105. package/dist/tools/create-plan.js +179 -0
  106. package/dist/tools/create-plan.js.map +1 -0
  107. package/dist/tools/delete-doc.d.ts +51 -0
  108. package/dist/tools/delete-doc.d.ts.map +1 -0
  109. package/dist/tools/delete-doc.js +194 -0
  110. package/dist/tools/delete-doc.js.map +1 -0
  111. package/dist/tools/get-next-task.d.ts +49 -0
  112. package/dist/tools/get-next-task.d.ts.map +1 -0
  113. package/dist/tools/get-next-task.js +204 -0
  114. package/dist/tools/get-next-task.js.map +1 -0
  115. package/dist/tools/index.d.ts +10 -0
  116. package/dist/tools/index.d.ts.map +1 -0
  117. package/dist/tools/index.js +122 -0
  118. package/dist/tools/index.js.map +1 -0
  119. package/dist/tools/list-docs.d.ts +53 -0
  120. package/dist/tools/list-docs.d.ts.map +1 -0
  121. package/dist/tools/list-docs.js +236 -0
  122. package/dist/tools/list-docs.js.map +1 -0
  123. package/dist/tools/open-document-in-cursor.d.ts +62 -0
  124. package/dist/tools/open-document-in-cursor.d.ts.map +1 -0
  125. package/dist/tools/open-document-in-cursor.js +211 -0
  126. package/dist/tools/open-document-in-cursor.js.map +1 -0
  127. package/dist/tools/read-doc.d.ts +44 -0
  128. package/dist/tools/read-doc.d.ts.map +1 -0
  129. package/dist/tools/read-doc.js +174 -0
  130. package/dist/tools/read-doc.js.map +1 -0
  131. package/dist/tools/release-task.d.ts +28 -0
  132. package/dist/tools/release-task.d.ts.map +1 -0
  133. package/dist/tools/release-task.js +154 -0
  134. package/dist/tools/release-task.js.map +1 -0
  135. package/dist/tools/rlm-multi-query.d.ts +110 -0
  136. package/dist/tools/rlm-multi-query.d.ts.map +1 -0
  137. package/dist/tools/rlm-multi-query.js +348 -0
  138. package/dist/tools/rlm-multi-query.js.map +1 -0
  139. package/dist/tools/rlm-query.d.ts +56 -0
  140. package/dist/tools/rlm-query.d.ts.map +1 -0
  141. package/dist/tools/rlm-query.js +228 -0
  142. package/dist/tools/rlm-query.js.map +1 -0
  143. package/dist/tools/search-docs.d.ts +34 -0
  144. package/dist/tools/search-docs.d.ts.map +1 -0
  145. package/dist/tools/search-docs.js +292 -0
  146. package/dist/tools/search-docs.js.map +1 -0
  147. package/dist/tools/update-doc.d.ts +149 -0
  148. package/dist/tools/update-doc.d.ts.map +1 -0
  149. package/dist/tools/update-doc.js +195 -0
  150. package/dist/tools/update-doc.js.map +1 -0
  151. package/dist/tools/update-task-status.d.ts +31 -0
  152. package/dist/tools/update-task-status.d.ts.map +1 -0
  153. package/dist/tools/update-task-status.js +303 -0
  154. package/dist/tools/update-task-status.js.map +1 -0
  155. package/dist/types.d.ts +50 -0
  156. package/dist/types.d.ts.map +1 -0
  157. package/dist/types.js +2 -0
  158. package/dist/types.js.map +1 -0
  159. package/dist/utils/backup.d.ts +76 -0
  160. package/dist/utils/backup.d.ts.map +1 -0
  161. package/dist/utils/backup.js +172 -0
  162. package/dist/utils/backup.js.map +1 -0
  163. package/dist/utils/errors.d.ts +93 -0
  164. package/dist/utils/errors.d.ts.map +1 -0
  165. package/dist/utils/errors.js +125 -0
  166. package/dist/utils/errors.js.map +1 -0
  167. package/dist/utils/index.d.ts +8 -0
  168. package/dist/utils/index.d.ts.map +1 -0
  169. package/dist/utils/index.js +9 -0
  170. package/dist/utils/index.js.map +1 -0
  171. package/dist/utils/os-paths.d.ts +45 -0
  172. package/dist/utils/os-paths.d.ts.map +1 -0
  173. package/dist/utils/os-paths.js +81 -0
  174. package/dist/utils/os-paths.js.map +1 -0
  175. package/dist/utils/paths.d.ts +71 -0
  176. package/dist/utils/paths.d.ts.map +1 -0
  177. package/dist/utils/paths.js +165 -0
  178. package/dist/utils/paths.js.map +1 -0
  179. package/dist/watcher.d.ts +19 -0
  180. package/dist/watcher.d.ts.map +1 -0
  181. package/dist/watcher.js +109 -0
  182. package/dist/watcher.js.map +1 -0
  183. 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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"}
@@ -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":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Test setup file for Vitest.
3
+ * Provides shared test fixtures and configuration.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=test-setup.d.ts.map
@@ -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"}