@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,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"}
|