@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,179 @@
1
+ import { z } from 'zod';
2
+ import { existsSync, readdirSync, mkdirSync, writeFileSync, readFileSync, renameSync, rmSync, } from 'fs';
3
+ import { join, dirname } from 'path';
4
+ import { fileURLToPath } from 'url';
5
+ import { indexDocument } from '../indexer.js';
6
+ // ESM equivalent of __dirname
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = dirname(__filename);
9
+ /**
10
+ * Input schema for create_plan tool.
11
+ */
12
+ export const CreatePlanInputSchema = z.object({
13
+ name: z.string().min(1).max(100),
14
+ description: z.string().optional(),
15
+ });
16
+ /**
17
+ * Extract plan number from directory name.
18
+ * Handles both padded (0001-plan-name) and unpadded (1-plan-name) formats.
19
+ */
20
+ function extractPlanNumber(dirName) {
21
+ const match = dirName.match(/^0*(\d+)-/);
22
+ if (match) {
23
+ return parseInt(match[1], 10);
24
+ }
25
+ return null;
26
+ }
27
+ /**
28
+ * Find the next available plan number by scanning existing plans.
29
+ */
30
+ function findNextPlanNumber(plansPath) {
31
+ if (!existsSync(plansPath)) {
32
+ return 1;
33
+ }
34
+ const dirs = readdirSync(plansPath, { withFileTypes: true })
35
+ .filter((dirent) => dirent.isDirectory())
36
+ .map((dirent) => dirent.name);
37
+ const planNumbers = [];
38
+ for (const dir of dirs) {
39
+ const num = extractPlanNumber(dir);
40
+ if (num !== null) {
41
+ planNumbers.push(num);
42
+ }
43
+ }
44
+ if (planNumbers.length === 0) {
45
+ return 1;
46
+ }
47
+ const maxNum = Math.max(...planNumbers);
48
+ return maxNum + 1;
49
+ }
50
+ /**
51
+ * Check if a plan with the given name already exists.
52
+ */
53
+ function planExists(plansPath, name) {
54
+ if (!existsSync(plansPath)) {
55
+ return false;
56
+ }
57
+ const dirs = readdirSync(plansPath, { withFileTypes: true })
58
+ .filter((dirent) => dirent.isDirectory())
59
+ .map((dirent) => dirent.name);
60
+ // Check if any directory contains the name (case-insensitive)
61
+ const normalizedName = name.toLowerCase();
62
+ return dirs.some((dir) => {
63
+ const dirName = dir.toLowerCase();
64
+ // Extract name part after number prefix
65
+ const nameMatch = dirName.match(/^\d+-(.+)$/);
66
+ if (nameMatch) {
67
+ return nameMatch[1] === normalizedName;
68
+ }
69
+ return false;
70
+ });
71
+ }
72
+ /**
73
+ * Load template file and replace placeholders.
74
+ */
75
+ function loadTemplate(planNumber, name, description) {
76
+ // Try to find template in templates/plan.md
77
+ // Resolve relative to repository root
78
+ const possibleTemplatePaths = [
79
+ join(process.cwd(), 'templates', 'plan.md'),
80
+ join(__dirname, '..', '..', 'templates', 'plan.md'),
81
+ ];
82
+ let templateContent = '';
83
+ for (const templatePath of possibleTemplatePaths) {
84
+ if (existsSync(templatePath)) {
85
+ templateContent = readFileSync(templatePath, 'utf-8');
86
+ break;
87
+ }
88
+ }
89
+ // Default template if none found
90
+ if (!templateContent) {
91
+ templateContent = `# ${name}
92
+
93
+ ## Overview
94
+
95
+ ${description || 'Plan description goes here'}
96
+
97
+ ## Features
98
+
99
+ <!-- Features will be added here -->
100
+
101
+ ## Status
102
+
103
+ Status: Planning
104
+ `;
105
+ }
106
+ // Replace placeholders
107
+ templateContent = templateContent
108
+ .replace(/\{\{PLAN_NAME\}\}/g, name)
109
+ .replace(/\{\{PLAN_NUMBER\}\}/g, planNumber.toString().padStart(4, '0'))
110
+ .replace(/\{\{DESCRIPTION\}\}/g, description || '');
111
+ return templateContent;
112
+ }
113
+ /**
114
+ * Handle create_plan tool request.
115
+ * Creates a new planning document from template with zero-padded ordering.
116
+ *
117
+ * @param input - Tool input
118
+ * @param context - Tool context
119
+ * @returns Tool result
120
+ */
121
+ export async function handleCreatePlan(input, context) {
122
+ const { name, description } = input;
123
+ const { plansPath } = context.config;
124
+ // Check if plan already exists
125
+ if (planExists(plansPath, name)) {
126
+ return {
127
+ content: [
128
+ {
129
+ type: 'text',
130
+ text: `Plan with name "${name}" already exists`,
131
+ },
132
+ ],
133
+ isError: true,
134
+ };
135
+ }
136
+ // Find next plan number
137
+ const planNumber = findNextPlanNumber(plansPath);
138
+ const paddedNumber = planNumber.toString().padStart(4, '0');
139
+ const planDirName = `${paddedNumber}-${name}`;
140
+ const planDir = join(plansPath, planDirName);
141
+ try {
142
+ // Create plan directory atomically (create temp, then rename)
143
+ const tempDir = `${planDir}.tmp`;
144
+ mkdirSync(tempDir, { recursive: true });
145
+ // Create plan.md from template
146
+ const planContent = loadTemplate(planNumber, name, description);
147
+ const tempPlanFilePath = join(tempDir, 'plan.md');
148
+ writeFileSync(tempPlanFilePath, planContent, 'utf-8');
149
+ // Atomic rename
150
+ renameSync(tempDir, planDir);
151
+ // Index the new document (use final path after rename)
152
+ const planFilePath = join(planDir, 'plan.md');
153
+ await indexDocument(context.db, planFilePath);
154
+ return {
155
+ content: [
156
+ {
157
+ type: 'text',
158
+ text: `Plan "${name}" created successfully at ${planDir}`,
159
+ },
160
+ ],
161
+ };
162
+ }
163
+ catch (error) {
164
+ // Clean up on error
165
+ if (existsSync(planDir)) {
166
+ rmSync(planDir, { recursive: true, force: true });
167
+ }
168
+ return {
169
+ content: [
170
+ {
171
+ type: 'text',
172
+ text: `Failed to create plan: ${error instanceof Error ? error.message : String(error)}`,
173
+ },
174
+ ],
175
+ isError: true,
176
+ };
177
+ }
178
+ }
179
+ //# sourceMappingURL=create-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-plan.js","sourceRoot":"","sources":["../../src/tools/create-plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * delete_doc tool - Delete documents with confirmation flow, soft delete to trash, and backup.
3
+ */
4
+ import { z } from 'zod';
5
+ import type { ToolContext, ToolResult } from '../types.js';
6
+ /**
7
+ * Trash directory name (relative to repo root).
8
+ */
9
+ export declare const TRASH_DIR = ".trash";
10
+ /**
11
+ * Protected files that cannot be deleted.
12
+ */
13
+ export declare const PROTECTED_FILES: readonly string[];
14
+ /**
15
+ * Input schema for delete_doc tool.
16
+ */
17
+ export declare const DeleteDocInputSchema: z.ZodObject<{
18
+ path: z.ZodString;
19
+ confirm: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
20
+ permanent: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
21
+ }, "strip", z.ZodTypeAny, {
22
+ path: string;
23
+ confirm: boolean;
24
+ permanent: boolean;
25
+ }, {
26
+ path: string;
27
+ confirm?: boolean | undefined;
28
+ permanent?: boolean | undefined;
29
+ }>;
30
+ export type DeleteDocInput = z.infer<typeof DeleteDocInputSchema>;
31
+ /**
32
+ * Output interface for delete_doc tool.
33
+ */
34
+ export interface DeleteDocOutput {
35
+ path: string;
36
+ deleted?: boolean;
37
+ pending?: boolean;
38
+ preview?: string;
39
+ trash?: string;
40
+ backup?: string;
41
+ }
42
+ /**
43
+ * Handle delete_doc tool request.
44
+ * Deletes documents with confirmation flow, soft delete to trash, and backup.
45
+ *
46
+ * @param input - Tool input
47
+ * @param context - Tool context
48
+ * @returns Tool result
49
+ */
50
+ export declare function handleDeleteDoc(input: DeleteDocInput, context: ToolContext): Promise<ToolResult>;
51
+ //# sourceMappingURL=delete-doc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-doc.d.ts","sourceRoot":"","sources":["../../src/tools/delete-doc.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAM3D;;GAEG;AACH,eAAO,MAAM,SAAS,WAAW,CAAC;AAElC;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,MAAM,EAO5C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;EAI/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAmCD;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CAyIrB"}
@@ -0,0 +1,194 @@
1
+ /**
2
+ * delete_doc tool - Delete documents with confirmation flow, soft delete to trash, and backup.
3
+ */
4
+ import { z } from 'zod';
5
+ import { existsSync, readFileSync, mkdirSync, renameSync, unlinkSync } from 'fs';
6
+ import { join, dirname, basename, relative } from 'path';
7
+ import { validatePath, isWritablePath, isProtectedPlanFile } from '../utils/paths.js';
8
+ import { createBackup, formatTimestamp } from '../utils/backup.js';
9
+ import { notFound, restrictedPath, DocumentError } from '../utils/errors.js';
10
+ import { removeDocument } from '../indexer.js';
11
+ /**
12
+ * Trash directory name (relative to repo root).
13
+ */
14
+ export const TRASH_DIR = '.trash';
15
+ /**
16
+ * Protected files that cannot be deleted.
17
+ */
18
+ export const PROTECTED_FILES = [
19
+ 'VISION.md',
20
+ 'RUNI-DESIGN-VISION.md',
21
+ 'DESIGN_IDEOLOGY.md',
22
+ 'MANIFEST.md',
23
+ 'CLAUDE.md',
24
+ 'README.md',
25
+ ];
26
+ /**
27
+ * Input schema for delete_doc tool.
28
+ */
29
+ export const DeleteDocInputSchema = z.object({
30
+ path: z.string().min(1, 'Path is required'),
31
+ confirm: z.boolean().optional().default(false),
32
+ permanent: z.boolean().optional().default(false),
33
+ });
34
+ /**
35
+ * Get repository root from config.
36
+ */
37
+ function getRepoRoot(config) {
38
+ return dirname(config.plansPath);
39
+ }
40
+ /**
41
+ * Get the trash path for a file.
42
+ */
43
+ function getTrashPath(filePath, repoRoot) {
44
+ const relativePath = relative(repoRoot, filePath);
45
+ const timestamp = formatTimestamp(new Date());
46
+ const trashFilename = `${basename(relativePath)}.deleted-${timestamp}`;
47
+ const trashDir = join(repoRoot, TRASH_DIR, dirname(relativePath));
48
+ return join(trashDir, trashFilename);
49
+ }
50
+ /**
51
+ * Check if a file is protected from deletion.
52
+ * Only protects canonical root-level files, not files with the same name in subdirectories.
53
+ */
54
+ function isProtectedFile(relativePath) {
55
+ const filename = basename(relativePath);
56
+ // Only protect if it's a root-level file (no directory in path)
57
+ const dir = dirname(relativePath);
58
+ if (dir !== '.' && dir !== '') {
59
+ return false;
60
+ }
61
+ return PROTECTED_FILES.includes(filename);
62
+ }
63
+ /**
64
+ * Handle delete_doc tool request.
65
+ * Deletes documents with confirmation flow, soft delete to trash, and backup.
66
+ *
67
+ * @param input - Tool input
68
+ * @param context - Tool context
69
+ * @returns Tool result
70
+ */
71
+ export async function handleDeleteDoc(input, context) {
72
+ const { path: inputPath, confirm, permanent } = input;
73
+ const repoRoot = getRepoRoot(context.config);
74
+ try {
75
+ // Validate the path
76
+ const validated = validatePath(inputPath, repoRoot);
77
+ const absolutePath = validated.absolute;
78
+ const { db } = context;
79
+ // Check if file exists
80
+ if (!existsSync(absolutePath)) {
81
+ throw notFound(inputPath);
82
+ }
83
+ // Check if file is protected (canonical files or protected plan files)
84
+ if (isProtectedFile(validated.relative) || isProtectedPlanFile(validated.relative)) {
85
+ return {
86
+ content: [
87
+ {
88
+ type: 'text',
89
+ text: JSON.stringify({
90
+ error: `Cannot delete protected file: ${inputPath}`,
91
+ code: 'PROTECTED_FILE',
92
+ }),
93
+ },
94
+ ],
95
+ isError: true,
96
+ };
97
+ }
98
+ // Check if path is writable (in allowed directories)
99
+ if (!isWritablePath(validated.relative)) {
100
+ throw restrictedPath(inputPath);
101
+ }
102
+ // If no confirmation, return pending status with preview
103
+ if (!confirm) {
104
+ const content = readFileSync(absolutePath, 'utf-8');
105
+ const preview = content.length > 500 ? content.substring(0, 500) + '...' : content;
106
+ const output = {
107
+ path: inputPath,
108
+ pending: true,
109
+ preview,
110
+ };
111
+ return {
112
+ content: [
113
+ {
114
+ type: 'text',
115
+ text: JSON.stringify(output),
116
+ },
117
+ ],
118
+ };
119
+ }
120
+ // Create backup before deletion
121
+ const backupResult = await createBackup(absolutePath, repoRoot);
122
+ // Remove from search index
123
+ await removeDocument(db, absolutePath);
124
+ // Perform deletion
125
+ if (permanent) {
126
+ // Permanent delete - just unlink the file
127
+ unlinkSync(absolutePath);
128
+ const output = {
129
+ path: inputPath,
130
+ deleted: true,
131
+ backup: backupResult.backupPath,
132
+ };
133
+ return {
134
+ content: [
135
+ {
136
+ type: 'text',
137
+ text: JSON.stringify(output),
138
+ },
139
+ ],
140
+ };
141
+ }
142
+ else {
143
+ // Soft delete - move to trash
144
+ const trashPath = getTrashPath(absolutePath, repoRoot);
145
+ const trashDir = dirname(trashPath);
146
+ // Ensure trash directory exists
147
+ mkdirSync(trashDir, { recursive: true });
148
+ // Move file to trash
149
+ renameSync(absolutePath, trashPath);
150
+ const output = {
151
+ path: inputPath,
152
+ deleted: true,
153
+ trash: trashPath,
154
+ backup: backupResult.backupPath,
155
+ };
156
+ return {
157
+ content: [
158
+ {
159
+ type: 'text',
160
+ text: JSON.stringify(output),
161
+ },
162
+ ],
163
+ };
164
+ }
165
+ }
166
+ catch (error) {
167
+ if (error instanceof DocumentError) {
168
+ return {
169
+ content: [
170
+ {
171
+ type: 'text',
172
+ text: JSON.stringify(error.toJSON()),
173
+ },
174
+ ],
175
+ isError: true,
176
+ };
177
+ }
178
+ // Handle unexpected errors
179
+ const message = error instanceof Error ? error.message : String(error);
180
+ return {
181
+ content: [
182
+ {
183
+ type: 'text',
184
+ text: JSON.stringify({
185
+ error: message,
186
+ code: 'INTERNAL_ERROR',
187
+ }),
188
+ },
189
+ ],
190
+ isError: true,
191
+ };
192
+ }
193
+ }
194
+ //# sourceMappingURL=delete-doc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-doc.js","sourceRoot":"","sources":["../../src/tools/delete-doc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import { z } from 'zod';
2
+ import { type CoordinationState } from '../coordination.js';
3
+ import { type ParsedTask } from '../task-parser.js';
4
+ import type { ToolContext, ToolResult } from '../types.js';
5
+ /**
6
+ * Input schema for get_next_task tool.
7
+ */
8
+ export declare const GetNextTaskInputSchema: z.ZodObject<{
9
+ agentType: z.ZodEnum<["coder", "reviewer", "pm", "customer"]>;
10
+ excludeIds: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
11
+ }, "strip", z.ZodTypeAny, {
12
+ agentType: "coder" | "reviewer" | "pm" | "customer";
13
+ excludeIds?: string[] | undefined;
14
+ }, {
15
+ agentType: "coder" | "reviewer" | "pm" | "customer";
16
+ excludeIds?: string[] | undefined;
17
+ }>;
18
+ /**
19
+ * Task score interface.
20
+ */
21
+ export interface TaskScore {
22
+ taskId: string;
23
+ score: number;
24
+ reasons: string[];
25
+ }
26
+ /**
27
+ * Task interface for internal use (extends ParsedTask for backward compatibility).
28
+ */
29
+ type Task = ParsedTask;
30
+ /**
31
+ * Score a task based on dependencies, agent match, and file conflicts.
32
+ *
33
+ * @param task - Task to score
34
+ * @param agentType - Requested agent persona type
35
+ * @param coordination - Coordination state
36
+ * @returns Task score with reasons
37
+ */
38
+ export declare function scoreTask(task: Task, agentType: 'coder' | 'reviewer' | 'pm' | 'customer', coordination: CoordinationState): TaskScore;
39
+ /**
40
+ * Handle get_next_task tool request.
41
+ * Returns the highest-priority available task based on scoring algorithm.
42
+ *
43
+ * @param input - Tool input
44
+ * @param context - Tool context
45
+ * @returns Tool result
46
+ */
47
+ export declare function handleGetNextTask(input: z.infer<typeof GetNextTaskInputSchema>, context: ToolContext): Promise<ToolResult>;
48
+ export {};
49
+ //# sourceMappingURL=get-next-task.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-next-task.d.ts","sourceRoot":"","sources":["../../src/tools/get-next-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAyC,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE3D;;GAEG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;EAGjC,CAAC;AAEH;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,KAAK,IAAI,GAAG,UAAU,CAAC;AA8DvB;;;;;;;GAOG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,OAAO,GAAG,UAAU,GAAG,IAAI,GAAG,UAAU,EACnD,YAAY,EAAE,iBAAiB,GAC9B,SAAS,CAgDX;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,EAC7C,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CA0GrB"}