@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,204 @@
1
+ import { z } from 'zod';
2
+ import { readCoordination } from '../coordination.js';
3
+ import { extractPlanId, parseTasksFromDocument } from '../task-parser.js';
4
+ /**
5
+ * Input schema for get_next_task tool.
6
+ */
7
+ export const GetNextTaskInputSchema = z.object({
8
+ agentType: z.enum(['coder', 'reviewer', 'pm', 'customer']),
9
+ excludeIds: z.array(z.string()).optional(),
10
+ });
11
+ /**
12
+ * Resolve dependency to task ID.
13
+ * Handles both feature numbers (#1) and full task IDs (0008#1).
14
+ */
15
+ function resolveDependency(dep, planId) {
16
+ // If it's already a full task ID (format: planId#featureNumber), return it
17
+ // A full task ID has at least one character before the #
18
+ const fullTaskIdMatch = dep.match(/^([^#]+)#(\d+)$/);
19
+ if (fullTaskIdMatch) {
20
+ return dep;
21
+ }
22
+ // If it's a feature number like #1, resolve to task ID
23
+ const featureMatch = dep.match(/#(\d+)/);
24
+ if (featureMatch) {
25
+ const featureNum = featureMatch[1];
26
+ const taskId = `${planId}#${featureNum}`;
27
+ return taskId;
28
+ }
29
+ return null;
30
+ }
31
+ /**
32
+ * Check if all dependencies are satisfied (status is PASS).
33
+ */
34
+ function areDependenciesSatisfied(task, coordination) {
35
+ if (task.dependencies.length === 0) {
36
+ return true;
37
+ }
38
+ for (const dep of task.dependencies) {
39
+ const taskId = resolveDependency(dep, task.planId);
40
+ if (!taskId) {
41
+ // Dependency not found - consider unsatisfied
42
+ return false;
43
+ }
44
+ const depTask = coordination.tasks[taskId];
45
+ if (!depTask || depTask.status !== 'PASS') {
46
+ return false;
47
+ }
48
+ }
49
+ return true;
50
+ }
51
+ /**
52
+ * Check if any files are locked by other agents.
53
+ */
54
+ function hasFileConflicts(task, coordination) {
55
+ for (const file of task.files) {
56
+ const lockedBy = coordination.fileLocks[file];
57
+ if (lockedBy) {
58
+ return true;
59
+ }
60
+ }
61
+ return false;
62
+ }
63
+ /**
64
+ * Score a task based on dependencies, agent match, and file conflicts.
65
+ *
66
+ * @param task - Task to score
67
+ * @param agentType - Requested agent persona type
68
+ * @param coordination - Coordination state
69
+ * @returns Task score with reasons
70
+ */
71
+ export function scoreTask(task, agentType, coordination) {
72
+ const reasons = [];
73
+ let score = 100; // Base score
74
+ // Only GAP tasks are eligible
75
+ if (task.status !== 'GAP') {
76
+ return {
77
+ taskId: task.id,
78
+ score: -1000,
79
+ reasons: [`Task status is ${task.status}, not GAP`],
80
+ };
81
+ }
82
+ // Check dependencies
83
+ if (!areDependenciesSatisfied(task, coordination)) {
84
+ return {
85
+ taskId: task.id,
86
+ score: -1000,
87
+ reasons: ['Not all dependencies are satisfied (PASS)'],
88
+ };
89
+ }
90
+ // Bonus for satisfied dependencies
91
+ if (task.dependencies.length > 0) {
92
+ score += 50;
93
+ reasons.push('All dependencies satisfied');
94
+ }
95
+ // Check agent persona match
96
+ if (task.agentPersona === agentType) {
97
+ score += 100;
98
+ reasons.push(`Agent persona matches (${agentType})`);
99
+ }
100
+ // Check file conflicts
101
+ if (hasFileConflicts(task, coordination)) {
102
+ return {
103
+ taskId: task.id,
104
+ score: -1000,
105
+ reasons: ['One or more files are locked by another agent'],
106
+ };
107
+ }
108
+ return {
109
+ taskId: task.id,
110
+ score,
111
+ reasons: reasons.length > 0 ? reasons : ['Base score'],
112
+ };
113
+ }
114
+ /**
115
+ * Handle get_next_task tool request.
116
+ * Returns the highest-priority available task based on scoring algorithm.
117
+ *
118
+ * @param input - Tool input
119
+ * @param context - Tool context
120
+ * @returns Tool result
121
+ */
122
+ export async function handleGetNextTask(input, context) {
123
+ const { agentType, excludeIds = [] } = input;
124
+ // Read fresh coordination state (will be used in scoring)
125
+ const coordination = await readCoordination(context.config.coordinationPath);
126
+ // Query database for all planning documents
127
+ const plansPath = context.config.plansPath;
128
+ const documents = context.db
129
+ .prepare(`
130
+ SELECT path, content
131
+ FROM documents
132
+ WHERE path LIKE ?
133
+ `)
134
+ .all(`${plansPath}%`);
135
+ // Parse all tasks from documents
136
+ const allTasks = [];
137
+ for (const doc of documents) {
138
+ const planId = extractPlanId(doc.path);
139
+ if (!planId) {
140
+ continue;
141
+ }
142
+ const tasks = parseTasksFromDocument(doc.path, doc.content, planId);
143
+ allTasks.push(...tasks);
144
+ }
145
+ // Filter and score tasks
146
+ const scoredTasks = [];
147
+ for (const task of allTasks) {
148
+ // Skip excluded tasks
149
+ if (excludeIds.includes(task.id)) {
150
+ continue;
151
+ }
152
+ // Score the task
153
+ const score = scoreTask(task, agentType, coordination);
154
+ // Only include eligible tasks (score >= 0)
155
+ if (score.score >= 0) {
156
+ scoredTasks.push(score);
157
+ }
158
+ }
159
+ // Sort by score (descending), then by planId (ascending), then by featureNumber (ascending)
160
+ scoredTasks.sort((a, b) => {
161
+ if (a.score !== b.score) {
162
+ return b.score - a.score; // Higher score first
163
+ }
164
+ // Tie-breaker: sort by task ID (planId#featureNumber)
165
+ const aParts = a.taskId.split('#');
166
+ const bParts = b.taskId.split('#');
167
+ const aPlanId = aParts[0];
168
+ const bPlanId = bParts[0];
169
+ if (aPlanId !== bPlanId) {
170
+ return aPlanId.localeCompare(bPlanId); // Lower planId first
171
+ }
172
+ const aFeature = parseInt(aParts[1] || '0', 10);
173
+ const bFeature = parseInt(bParts[1] || '0', 10);
174
+ return aFeature - bFeature; // Lower feature number first
175
+ });
176
+ // Return highest-scoring task
177
+ if (scoredTasks.length === 0) {
178
+ return {
179
+ content: [
180
+ {
181
+ type: 'text',
182
+ text: JSON.stringify({
183
+ taskId: null,
184
+ message: 'No available tasks found',
185
+ }, null, 2),
186
+ },
187
+ ],
188
+ };
189
+ }
190
+ const topTask = scoredTasks[0];
191
+ return {
192
+ content: [
193
+ {
194
+ type: 'text',
195
+ text: JSON.stringify({
196
+ taskId: topTask.taskId,
197
+ score: topTask.score,
198
+ reasons: topTask.reasons,
199
+ }, null, 2),
200
+ },
201
+ ],
202
+ };
203
+ }
204
+ //# sourceMappingURL=get-next-task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-next-task.js","sourceRoot":"","sources":["../../src/tools/get-next-task.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { ToolContext } from '../types.js';
3
+ /**
4
+ * Register all MCP tools with the server.
5
+ *
6
+ * @param server - MCP server instance
7
+ * @param context - Tool context with db, config, and coordination
8
+ */
9
+ export declare function registerTools(server: McpServer, context: ToolContext): void;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAsB/C;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,CAoL3E"}
@@ -0,0 +1,122 @@
1
+ // Import all tool schemas and handlers
2
+ import { CreatePlanInputSchema, handleCreatePlan } from './create-plan.js';
3
+ import { UpdateTaskStatusInputSchema, handleUpdateTaskStatus } from './update-task-status.js';
4
+ import { ClaimTaskInputSchema, handleClaimTask } from './claim-task.js';
5
+ import { ReleaseTaskInputSchema, handleReleaseTask } from './release-task.js';
6
+ import { GetNextTaskInputSchema, handleGetNextTask } from './get-next-task.js';
7
+ import { SearchDocsInputSchema, handleSearchDocs } from './search-docs.js';
8
+ import { ReadDocInputSchema, handleReadDoc } from './read-doc.js';
9
+ import { ListDocsInputSchema, handleListDocs } from './list-docs.js';
10
+ import { CreateDocInputSchema, handleCreateDoc } from './create-doc.js';
11
+ import { UpdateDocInputSchema, UpdateDocInputBaseSchema, handleUpdateDoc } from './update-doc.js';
12
+ import { DeleteDocInputSchema, handleDeleteDoc } from './delete-doc.js';
13
+ import { OpenDocumentInputSchema, handleOpenDocumentInCursor } from './open-document-in-cursor.js';
14
+ import { RlmQueryInputSchema, handleRlmQuery } from './rlm-query.js';
15
+ import { RlmMultiQueryInputBaseSchema, RlmMultiQueryInputSchema, handleRlmMultiQuery, } from './rlm-multi-query.js';
16
+ /**
17
+ * Register all MCP tools with the server.
18
+ *
19
+ * @param server - MCP server instance
20
+ * @param context - Tool context with db, config, and coordination
21
+ */
22
+ export function registerTools(server, context) {
23
+ // Plan Management Tools
24
+ server.tool('create_plan', 'Create a new feature plan with directory structure and agent files', CreatePlanInputSchema.shape, async (input) => {
25
+ const parsed = CreatePlanInputSchema.parse(input);
26
+ return handleCreatePlan(parsed, context);
27
+ });
28
+ server.tool('update_task_status', 'Update task status (GAP → WIP → PASS/BLOCKED)', UpdateTaskStatusInputSchema.shape, async (input) => {
29
+ const parsed = UpdateTaskStatusInputSchema.parse(input);
30
+ return handleUpdateTaskStatus(parsed, context);
31
+ });
32
+ // Task Coordination Tools
33
+ server.tool('claim_task', 'Claim a task for an agent with file locks', ClaimTaskInputSchema.shape, async (input) => {
34
+ const parsed = ClaimTaskInputSchema.parse(input);
35
+ return handleClaimTask(parsed, context);
36
+ });
37
+ server.tool('release_task', 'Release a claimed task and file locks', ReleaseTaskInputSchema.shape, async (input) => {
38
+ const parsed = ReleaseTaskInputSchema.parse(input);
39
+ return handleReleaseTask(parsed, context);
40
+ });
41
+ // Task Selection Tools
42
+ server.tool('get_next_task', 'Get highest-priority available task based on dependencies and agent type', GetNextTaskInputSchema.shape, async (input) => {
43
+ const parsed = GetNextTaskInputSchema.parse(input);
44
+ return handleGetNextTask(parsed, context);
45
+ });
46
+ // Search Tools
47
+ server.tool('search_docs', 'Full-text search across planning documents', SearchDocsInputSchema.shape, async (input) => {
48
+ const parsed = SearchDocsInputSchema.parse(input);
49
+ return handleSearchDocs(parsed, context);
50
+ });
51
+ // Document CRUD Tools
52
+ server.tool('read_doc', 'Read full content of a document in the repository', ReadDocInputSchema.shape, async (input) => {
53
+ const parsed = ReadDocInputSchema.parse(input);
54
+ return handleReadDoc(parsed, context);
55
+ });
56
+ server.tool('list_docs', 'List files and directories in the repository', ListDocsInputSchema.shape, async (input) => {
57
+ const parsed = ListDocsInputSchema.parse(input);
58
+ return handleListDocs(parsed, context);
59
+ });
60
+ server.tool('create_doc', 'Create a new document in the repository', CreateDocInputSchema.shape, async (input) => {
61
+ const parsed = CreateDocInputSchema.parse(input);
62
+ return handleCreateDoc(parsed, context);
63
+ });
64
+ server.tool('update_doc', 'Update an existing document in the repository', UpdateDocInputBaseSchema.shape, async (input) => {
65
+ const parsed = UpdateDocInputSchema.parse(input);
66
+ return handleUpdateDoc(parsed, context);
67
+ });
68
+ server.tool('delete_doc', 'Delete a document from the repository', DeleteDocInputSchema.shape, async (input) => {
69
+ const parsed = DeleteDocInputSchema.parse(input);
70
+ return handleDeleteDoc(parsed, context);
71
+ });
72
+ // Cursor Integration Tools
73
+ server.registerTool('open_document_in_cursor', {
74
+ description: 'Open a file in Cursor editor at an optional line/column position',
75
+ inputSchema: OpenDocumentInputSchema.shape,
76
+ }, async (input) => {
77
+ const parsed = OpenDocumentInputSchema.parse(input);
78
+ return handleOpenDocumentInCursor(parsed, context);
79
+ });
80
+ // RLM Query Tools
81
+ server.tool('rlm_query', `Execute JavaScript code on a single document for filtered extraction.
82
+
83
+ Available helpers: extractSections(), extractFrontmatter(), extractCodeBlocks(),
84
+ extractFeatures(), extractAgents(), findByPattern(), summarize()
85
+
86
+ Example:
87
+ path: "plans/0009/plan.md"
88
+ code: "extractFeatures(doc.content).filter(f => f.status === 'GAP')"`, RlmQueryInputSchema.shape, async (input) => {
89
+ const parsed = RlmQueryInputSchema.parse(input);
90
+ return handleRlmQuery(parsed, context);
91
+ });
92
+ server.tool('rlm_multi_query', `Execute JavaScript code on multiple documents for cross-document analysis.
93
+
94
+ Available helpers: extractSections(), extractFrontmatter(), extractCodeBlocks(),
95
+ extractFeatures(), extractAgents(), findByPattern(), summarize()
96
+
97
+ Example:
98
+ pattern: "plans/*/plan.md"
99
+ code: "docs.map(d => ({ name: extractFrontmatter(d.content).meta.name, features: extractFeatures(d.content).length }))"`, RlmMultiQueryInputBaseSchema.shape, async (input) => {
100
+ try {
101
+ const parsed = RlmMultiQueryInputSchema.parse(input);
102
+ return handleRlmMultiQuery(parsed, context);
103
+ }
104
+ catch (error) {
105
+ // Handle Zod validation errors
106
+ if (error && typeof error === 'object' && 'issues' in error) {
107
+ const zodError = error;
108
+ return {
109
+ content: [
110
+ {
111
+ type: 'text',
112
+ text: `Validation error: ${zodError.issues.map((i) => i.message).join(', ')}`,
113
+ },
114
+ ],
115
+ isError: true,
116
+ };
117
+ }
118
+ throw error;
119
+ }
120
+ });
121
+ }
122
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * list_docs tool: List files and directories with optional filtering.
3
+ */
4
+ import { z } from 'zod';
5
+ import type { ToolContext, ToolResult } from '../types.js';
6
+ /**
7
+ * Input schema for list_docs tool.
8
+ */
9
+ export declare const ListDocsInputSchema: z.ZodObject<{
10
+ path: z.ZodDefault<z.ZodString>;
11
+ pattern: z.ZodOptional<z.ZodString>;
12
+ depth: z.ZodDefault<z.ZodNumber>;
13
+ includeHidden: z.ZodDefault<z.ZodBoolean>;
14
+ }, "strip", z.ZodTypeAny, {
15
+ path: string;
16
+ depth: number;
17
+ includeHidden: boolean;
18
+ pattern?: string | undefined;
19
+ }, {
20
+ path?: string | undefined;
21
+ pattern?: string | undefined;
22
+ depth?: number | undefined;
23
+ includeHidden?: boolean | undefined;
24
+ }>;
25
+ export type ListDocsInput = z.infer<typeof ListDocsInputSchema>;
26
+ /**
27
+ * Directory entry interface.
28
+ */
29
+ export interface DirEntry {
30
+ name: string;
31
+ type: 'file' | 'directory';
32
+ size?: number;
33
+ children?: number;
34
+ modified?: string;
35
+ }
36
+ /**
37
+ * Output interface for list_docs tool.
38
+ */
39
+ export interface ListDocsOutput {
40
+ path: string;
41
+ entries: DirEntry[];
42
+ total: number;
43
+ }
44
+ /**
45
+ * Handle list_docs tool request.
46
+ * Lists directory contents with optional filtering.
47
+ *
48
+ * @param input - Tool input
49
+ * @param context - Tool context
50
+ * @returns Tool result
51
+ */
52
+ export declare function handleListDocs(input: ListDocsInput, context: ToolContext): Promise<ToolResult>;
53
+ //# sourceMappingURL=list-docs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-docs.d.ts","sourceRoot":"","sources":["../../src/tools/list-docs.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI3D;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;EAK9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAiID;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CA8GrB"}
@@ -0,0 +1,236 @@
1
+ /**
2
+ * list_docs tool: List files and directories with optional filtering.
3
+ */
4
+ import { z } from 'zod';
5
+ import { readdir, lstat } from 'fs/promises';
6
+ import { existsSync } from 'fs';
7
+ import { join, dirname } from 'path';
8
+ import micromatch from 'micromatch';
9
+ import { validatePath } from '../utils/paths.js';
10
+ import { notFound } from '../utils/errors.js';
11
+ /**
12
+ * Input schema for list_docs tool.
13
+ */
14
+ export const ListDocsInputSchema = z.object({
15
+ path: z.string().default('').describe('Directory path relative to repo root'),
16
+ pattern: z.string().optional().describe('Glob pattern, e.g., "*.md"'),
17
+ depth: z.number().int().min(1).max(5).default(2).describe('Max directory depth'),
18
+ includeHidden: z.boolean().default(false).describe('Include hidden files'),
19
+ });
20
+ /**
21
+ * Get repository root from config.
22
+ * Uses the first docsPath entry as the repo root, or derives from plansPath.
23
+ */
24
+ function getRepoRoot(config) {
25
+ // Prefer docsPaths[0] if it exists (it's the repo root)
26
+ if (config.docsPaths && config.docsPaths.length > 0) {
27
+ return config.docsPaths[0];
28
+ }
29
+ // Fallback: use plansPath parent directory
30
+ return dirname(config.plansPath);
31
+ }
32
+ /**
33
+ * Check if a name matches a glob pattern.
34
+ */
35
+ function matchesPattern(name, pattern) {
36
+ return micromatch.isMatch(name, pattern);
37
+ }
38
+ /**
39
+ * Recursively list directory entries with depth control.
40
+ */
41
+ async function listDirectoryRecursive(dirPath, repoRoot, relativePath, options) {
42
+ const entries = [];
43
+ // Check if directory exists
44
+ if (!existsSync(dirPath)) {
45
+ return entries;
46
+ }
47
+ // Read directory entries
48
+ const dirents = await readdir(dirPath, { withFileTypes: true });
49
+ // Sort: directories first, then alphabetical
50
+ dirents.sort((a, b) => {
51
+ if (a.isDirectory() && !b.isDirectory()) {
52
+ return -1;
53
+ }
54
+ if (!a.isDirectory() && b.isDirectory()) {
55
+ return 1;
56
+ }
57
+ return a.name.localeCompare(b.name);
58
+ });
59
+ for (const dirent of dirents) {
60
+ // Skip hidden files unless included
61
+ if (!options.includeHidden && dirent.name.startsWith('.')) {
62
+ continue;
63
+ }
64
+ // Apply pattern filter if specified
65
+ if (options.pattern && !matchesPattern(dirent.name, options.pattern)) {
66
+ continue;
67
+ }
68
+ const entryPath = join(dirPath, dirent.name);
69
+ const entryRelativePath = relativePath ? join(relativePath, dirent.name) : dirent.name;
70
+ if (dirent.isDirectory()) {
71
+ // Get directory stats
72
+ const stats = await lstat(entryPath);
73
+ // Count children if within depth limit
74
+ let children;
75
+ if (options.currentDepth < options.maxDepth) {
76
+ try {
77
+ const childEntries = await readdir(entryPath);
78
+ children = childEntries.length;
79
+ }
80
+ catch {
81
+ // If we can't read children, don't include count
82
+ children = undefined;
83
+ }
84
+ }
85
+ else {
86
+ // At max depth, summarize as "[N items]"
87
+ try {
88
+ const childEntries = await readdir(entryPath);
89
+ children = childEntries.length;
90
+ }
91
+ catch {
92
+ children = undefined;
93
+ }
94
+ }
95
+ entries.push({
96
+ name: dirent.name,
97
+ type: 'directory',
98
+ children,
99
+ modified: stats.mtime.toISOString(),
100
+ });
101
+ // Recurse if within depth limit
102
+ if (options.currentDepth < options.maxDepth) {
103
+ const nestedEntries = await listDirectoryRecursive(entryPath, repoRoot, entryRelativePath, {
104
+ ...options,
105
+ currentDepth: options.currentDepth + 1,
106
+ });
107
+ // Add nested entries with indentation or prefix
108
+ // For now, we'll flatten them but could add a prefix
109
+ entries.push(...nestedEntries);
110
+ }
111
+ }
112
+ else {
113
+ // File entry
114
+ const stats = await lstat(entryPath);
115
+ entries.push({
116
+ name: dirent.name,
117
+ type: 'file',
118
+ size: stats.size,
119
+ modified: stats.mtime.toISOString(),
120
+ });
121
+ }
122
+ }
123
+ return entries;
124
+ }
125
+ /**
126
+ * Handle list_docs tool request.
127
+ * Lists directory contents with optional filtering.
128
+ *
129
+ * @param input - Tool input
130
+ * @param context - Tool context
131
+ * @returns Tool result
132
+ */
133
+ export async function handleListDocs(input, context) {
134
+ const { path, pattern, depth = 2, includeHidden = false } = input;
135
+ const { config } = context;
136
+ try {
137
+ // Get repo root
138
+ const repoRoot = getRepoRoot(config);
139
+ // Validate path (for directory, we allow empty string for root)
140
+ const dirPath = path || '';
141
+ let validated;
142
+ if (!dirPath) {
143
+ // Empty path means repo root
144
+ validated = {
145
+ relative: '',
146
+ absolute: repoRoot,
147
+ type: 'other',
148
+ directory: '',
149
+ filename: '',
150
+ extension: '',
151
+ };
152
+ }
153
+ else {
154
+ validated = validatePath(dirPath, repoRoot);
155
+ }
156
+ // Check if path exists and is a directory
157
+ const targetPath = validated.absolute;
158
+ if (!existsSync(targetPath)) {
159
+ throw notFound(path || '');
160
+ }
161
+ const stats = await lstat(targetPath);
162
+ if (!stats.isDirectory()) {
163
+ return {
164
+ content: [
165
+ {
166
+ type: 'text',
167
+ text: `Error: Path "${path || ''}" is not a directory`,
168
+ },
169
+ ],
170
+ isError: true,
171
+ };
172
+ }
173
+ // List directory entries
174
+ const entries = await listDirectoryRecursive(targetPath, repoRoot, validated.relative, {
175
+ pattern,
176
+ maxDepth: depth,
177
+ currentDepth: 0,
178
+ includeHidden,
179
+ });
180
+ // Format output
181
+ const output = {
182
+ path: validated.relative || '',
183
+ entries,
184
+ total: entries.length,
185
+ };
186
+ return {
187
+ content: [
188
+ {
189
+ type: 'text',
190
+ text: JSON.stringify(output, null, 2),
191
+ },
192
+ ],
193
+ };
194
+ }
195
+ catch (error) {
196
+ // Handle DocumentError
197
+ if (error instanceof Error && 'code' in error) {
198
+ const docError = error;
199
+ return {
200
+ content: [
201
+ {
202
+ type: 'text',
203
+ text: `Error: ${docError.message}${docError.path ? ` (path: ${docError.path})` : ''}`,
204
+ },
205
+ ],
206
+ isError: true,
207
+ };
208
+ }
209
+ // Handle file system errors
210
+ if (error instanceof Error) {
211
+ // Check for ENOENT (directory not found)
212
+ if ('code' in error && error.code === 'ENOENT') {
213
+ throw notFound(path || '');
214
+ }
215
+ return {
216
+ content: [
217
+ {
218
+ type: 'text',
219
+ text: `Error listing directory: ${error.message}`,
220
+ },
221
+ ],
222
+ isError: true,
223
+ };
224
+ }
225
+ return {
226
+ content: [
227
+ {
228
+ type: 'text',
229
+ text: `Unknown error: ${String(error)}`,
230
+ },
231
+ ],
232
+ isError: true,
233
+ };
234
+ }
235
+ }
236
+ //# sourceMappingURL=list-docs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-docs.js","sourceRoot":"","sources":["../../src/tools/list-docs.ts"],"names":[],"mappings":"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"}