Skip to content

Commit 7319a61

Browse files
FL4TLiN3claude
andcommitted
refactor: remove 8 redundant base tools and slim down descriptions
Remove healthCheck, appendTextFile, createDirectory, deleteDirectory, deleteFile, getFileInfo, listDirectory, and moveFile — thin wrappers that exec already covers. Reduces tool count from 18 to 10 and cuts token usage by shortening all remaining tool descriptions to one-liners. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent e9952da commit 7319a61

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+56
-2231
lines changed

apps/base/README.md

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,22 +39,12 @@ registerWriteTextFile(server)
3939
### File Operations
4040
- `readTextFile` - Read text files with optional line range
4141
- `writeTextFile` - Create or overwrite text files
42-
- `appendTextFile` - Append content to existing files
4342
- `editTextFile` - Replace text in existing files
44-
- `deleteFile` - Remove files
45-
- `moveFile` - Move or rename files
46-
- `getFileInfo` - Get file metadata
4743
- `readImageFile` - Read image files (PNG, JPEG, GIF, WebP)
4844
- `readPdfFile` - Read PDF files
4945

50-
### Directory Operations
51-
- `listDirectory` - List directory contents
52-
- `createDirectory` - Create directories
53-
- `deleteDirectory` - Remove directories
54-
5546
### Utilities
5647
- `exec` - Execute system commands
57-
- `healthCheck` - Check Perstack runtime health status
5848
- `todo` - Task list management
5949
- `clearTodo` - Clear task list
6050
- `attemptCompletion` - Signal task completion (validates todos first)

apps/base/src/index.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,9 @@ export {
66
createBaseServer,
77
registerAllTools,
88
} from "./server.js"
9-
export * from "./tools/append-text-file.js"
109
export * from "./tools/attempt-completion.js"
11-
export * from "./tools/create-directory.js"
12-
export * from "./tools/delete-directory.js"
13-
export * from "./tools/delete-file.js"
1410
export * from "./tools/edit-text-file.js"
1511
export * from "./tools/exec.js"
16-
export * from "./tools/get-file-info.js"
17-
export * from "./tools/list-directory.js"
18-
export * from "./tools/move-file.js"
1912
export * from "./tools/read-image-file.js"
2013
export * from "./tools/read-pdf-file.js"
2114
export * from "./tools/read-text-file.js"

apps/base/src/lib/safe-file.test.ts

Lines changed: 1 addition & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,6 @@
11
import fs from "node:fs/promises"
22
import { afterEach, describe, expect, it } from "vitest"
3-
import {
4-
isSymlinkProtectionFullySupported,
5-
safeAppendFile,
6-
safeReadFile,
7-
safeWriteFile,
8-
} from "./safe-file.js"
3+
import { isSymlinkProtectionFullySupported, safeReadFile, safeWriteFile } from "./safe-file.js"
94

105
const testFile = "safe-file.test.txt"
116
const testSymlink = "safe-file.test.link"
@@ -67,29 +62,6 @@ describe("safe-file", () => {
6762
})
6863
})
6964

70-
describe("safeAppendFile", () => {
71-
it("appends content to file", async () => {
72-
await fs.writeFile(testFile, "hello")
73-
await safeAppendFile(testFile, " world")
74-
const content = await fs.readFile(testFile, "utf-8")
75-
expect(content).toBe("hello world")
76-
})
77-
78-
it("rejects symbolic links", async () => {
79-
await fs.writeFile(testFile, "content")
80-
try {
81-
await fs.symlink(testFile, testSymlink)
82-
await expect(safeAppendFile(testSymlink, "malicious")).rejects.toThrow("symbolic link")
83-
} catch (error) {
84-
const err = error as { code?: string }
85-
if (err.code === "EPERM" || err.code === "ENOTSUP") {
86-
return
87-
}
88-
throw error
89-
}
90-
})
91-
})
92-
9365
describe("isSymlinkProtectionFullySupported", () => {
9466
it("returns boolean indicating O_NOFOLLOW support", () => {
9567
const result = isSymlinkProtectionFullySupported()

apps/base/src/lib/safe-file.ts

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,3 @@ export async function safeReadFile(path: string): Promise<string> {
3939
await handle?.close()
4040
}
4141
}
42-
43-
export async function safeAppendFile(path: string, data: string): Promise<void> {
44-
let handle: FileHandle | undefined
45-
try {
46-
await checkNotSymlink(path)
47-
const flags = constants.O_WRONLY | constants.O_APPEND | O_NOFOLLOW
48-
handle = await open(path, flags)
49-
await handle.writeFile(data, "utf-8")
50-
} finally {
51-
await handle?.close()
52-
}
53-
}

apps/base/src/server.ts

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,8 @@
11
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"
22
import packageJson from "../package.json" with { type: "json" }
3-
import { registerAppendTextFile } from "./tools/append-text-file.js"
43
import { registerAttemptCompletion } from "./tools/attempt-completion.js"
5-
import { registerCreateDirectory } from "./tools/create-directory.js"
6-
import { registerDeleteDirectory } from "./tools/delete-directory.js"
7-
import { registerDeleteFile } from "./tools/delete-file.js"
84
import { registerEditTextFile } from "./tools/edit-text-file.js"
95
import { registerExec } from "./tools/exec.js"
10-
import { registerGetFileInfo } from "./tools/get-file-info.js"
11-
import { registerHealthCheck } from "./tools/health-check.js"
12-
import { registerListDirectory } from "./tools/list-directory.js"
13-
import { registerMoveFile } from "./tools/move-file.js"
146
import { registerReadImageFile } from "./tools/read-image-file.js"
157
import { registerReadPdfFile } from "./tools/read-pdf-file.js"
168
import { registerReadTextFile } from "./tools/read-text-file.js"
@@ -32,19 +24,11 @@ export function registerAllTools(server: McpServer): void {
3224
registerTodo(server)
3325
registerClearTodo(server)
3426
registerExec(server)
35-
registerGetFileInfo(server)
36-
registerHealthCheck(server)
3727
registerReadTextFile(server)
3828
registerReadImageFile(server)
3929
registerReadPdfFile(server)
4030
registerWriteTextFile(server)
41-
registerAppendTextFile(server)
4231
registerEditTextFile(server)
43-
registerMoveFile(server)
44-
registerDeleteFile(server)
45-
registerListDirectory(server)
46-
registerCreateDirectory(server)
47-
registerDeleteDirectory(server)
4832
}
4933

5034
/**

apps/base/src/tools/append-text-file.test.ts

Lines changed: 0 additions & 62 deletions
This file was deleted.

apps/base/src/tools/append-text-file.ts

Lines changed: 0 additions & 61 deletions
This file was deleted.

apps/base/src/tools/attempt-completion.ts

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"
2-
import { dedent } from "ts-dedent"
32
import { errorToolResult, successToolResult } from "../lib/tool-result.js"
43
import { getRemainingTodos } from "./todo.js"
54

@@ -20,21 +19,7 @@ export function registerAttemptCompletion(server: McpServer) {
2019
"attemptCompletion",
2120
{
2221
title: "Attempt completion",
23-
description: dedent`
24-
Task completion signal with automatic todo validation.
25-
Use cases:
26-
- Signaling task completion to Perstack runtime
27-
- Validating all todos are complete before ending
28-
- Ending the current expert's work cycle
29-
How it works:
30-
- Checks the current todo list for incomplete items
31-
- If incomplete todos exist: returns them and continues the agent loop
32-
- If no incomplete todos: returns empty object and ends the agent loop
33-
Notes:
34-
- Mark all todos as complete before calling
35-
- Use clearTodo if you want to reset and start fresh
36-
- Prevents premature completion by surfacing forgotten tasks
37-
`,
22+
description: "Signal task completion. Validates all todos are complete before ending.",
3823
inputSchema: {},
3924
},
4025
async () => {

apps/base/src/tools/create-directory.test.ts

Lines changed: 0 additions & 36 deletions
This file was deleted.

apps/base/src/tools/create-directory.ts

Lines changed: 0 additions & 65 deletions
This file was deleted.

0 commit comments

Comments
 (0)