staff-mcp 1.0.0 → 1.0.2
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/README.md +86 -43
- package/README_zh.md +84 -43
- package/dist/src/index.js +0 -0
- package/dist/src/lsp/manager.d.ts +33 -0
- package/dist/src/lsp/manager.js +286 -0
- package/dist/src/lsp/manager.js.map +1 -0
- package/dist/src/policies/workspace-artifact-policy.d.ts +1 -0
- package/dist/src/policies/workspace-artifact-policy.js +21 -0
- package/dist/src/policies/workspace-artifact-policy.js.map +1 -0
- package/dist/src/security.d.ts +1 -0
- package/dist/src/security.js +3 -0
- package/dist/src/security.js.map +1 -1
- package/dist/src/tools/file-tools.js +13 -13
- package/dist/src/tools/file-tools.js.map +1 -1
- package/dist/src/tools/lsp-tools.d.ts +0 -4
- package/dist/src/tools/lsp-tools.js +70 -38
- package/dist/src/tools/lsp-tools.js.map +1 -1
- package/dist/src/tools/system-tools.js +3 -0
- package/dist/src/tools/system-tools.js.map +1 -1
- package/dist/tests/system-tools.test.d.ts +1 -0
- package/dist/tests/system-tools.test.js +26 -0
- package/dist/tests/system-tools.test.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,44 +2,42 @@
|
|
|
2
2
|
|
|
3
3
|
[English](./README.md) | [简体中文](./README_zh.md)
|
|
4
4
|
|
|
5
|
-
A
|
|
5
|
+
A robust Model Context Protocol (MCP) server that provides AI assistants with a secure, cross-platform environment for file management, shell execution, and LSP-powered code intelligence.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
---
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
## 🚀 Usage
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
npm install
|
|
13
|
-
npm run build
|
|
14
|
-
```
|
|
11
|
+
Use this section if you want to run the published package.
|
|
15
12
|
|
|
16
|
-
###
|
|
13
|
+
### Run with npx
|
|
17
14
|
|
|
18
|
-
|
|
15
|
+
Recommended command:
|
|
19
16
|
|
|
20
17
|
```bash
|
|
21
|
-
|
|
22
|
-
npx . --working-dir /path/to/your/project
|
|
23
|
-
|
|
24
|
-
# If published to npm (e.g., @your-org/staff-mcp)
|
|
25
|
-
# npx -y @your-org/staff-mcp --working-dir /path/to/your/project
|
|
18
|
+
npx -y staff-mcp@latest --working-dir /path/to/your/project
|
|
26
19
|
```
|
|
27
20
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
21
|
+
Using `@latest` is the safest option for a published CLI package and avoids resolution issues such as `could not determine executable to run`.
|
|
22
|
+
|
|
23
|
+
### Configure for Claude Desktop
|
|
24
|
+
|
|
25
|
+
Add the following to your `claude_desktop_config.json`:
|
|
26
|
+
|
|
27
|
+
```json
|
|
28
|
+
{
|
|
29
|
+
"mcpServers": {
|
|
30
|
+
"staff-mcp": {
|
|
31
|
+
"command": "npx",
|
|
32
|
+
"args": [
|
|
33
|
+
"-y",
|
|
34
|
+
"staff-mcp@latest",
|
|
35
|
+
"--working-dir",
|
|
36
|
+
"/path/to/your/project"
|
|
37
|
+
]
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
43
41
|
```
|
|
44
42
|
|
|
45
43
|
### CLI Arguments
|
|
@@ -49,41 +47,86 @@ node dist/src/index.js --transport http --port 3000
|
|
|
49
47
|
| `--working-dir` | Root directory for the sandbox | `process.cwd()` |
|
|
50
48
|
| `--allowed-dir` | Extra directories allowed for access | `[]` |
|
|
51
49
|
| `--transport` | Transport type (`stdio` or `http`) | `stdio` |
|
|
52
|
-
| `--port` | Port for HTTP server | `3000` |
|
|
50
|
+
| `--port` | Port for HTTP server (if using http) | `3000` |
|
|
51
|
+
|
|
52
|
+
### Skill Loading
|
|
53
|
+
|
|
54
|
+
`staff-mcp` can work with skill directories if they already exist in your workspace or home directory. To use them, place skill files in any supported location such as:
|
|
55
|
+
|
|
56
|
+
- `.staff/skills/<skill-name>/SKILL.md`
|
|
57
|
+
- `.claude/skills/<skill-name>/SKILL.md`
|
|
58
|
+
- `.agents/skills/<skill-name>/SKILL.md`
|
|
59
|
+
- `.opencode/skills/<skill-name>/SKILL.md`
|
|
60
|
+
|
|
61
|
+
The server discovers them automatically at startup.
|
|
53
62
|
|
|
54
63
|
---
|
|
55
64
|
|
|
56
|
-
## 🛠️
|
|
65
|
+
## 🛠️ Core Features
|
|
66
|
+
|
|
67
|
+
- **File Operations**: Secure read, write, delete, and list operations within the sandbox.
|
|
68
|
+
- **Shell Integration**: Execute non-interactive commands or start background tasks (e.g., dev servers).
|
|
69
|
+
- **Code Intelligence**: LSP-based symbol extraction and diagnostics for better code understanding.
|
|
70
|
+
- **Skill System**: Automatically detects and loads domain-specific instructions from `.staff/skills/`, `.claude/skills/`, and `.agents/skills/`.
|
|
71
|
+
- **Environment Awareness**: Native support for Windows (CMD/PowerShell) and Unix-like (Bash/Sh) systems.
|
|
57
72
|
|
|
58
|
-
|
|
59
|
-
- **Skills & Prompts**: Compatible with the `SKILL.md` format. Automatically detects skills in `.staff/skills/`, `.claude/skills/`, etc.
|
|
60
|
-
- **MCP Native Support**: Implements the `instructions` mechanism to provide model context for environment awareness (OS, shell, etc.) and tool relationships.
|
|
73
|
+
### Adding Skills
|
|
61
74
|
|
|
62
|
-
|
|
75
|
+
Create a `SKILL.md` file in `.staff/skills/your-skill/`:
|
|
63
76
|
|
|
64
77
|
```markdown
|
|
65
78
|
---
|
|
66
79
|
name: my-skill
|
|
67
|
-
description:
|
|
80
|
+
description: Custom logic for my project
|
|
68
81
|
---
|
|
69
|
-
|
|
82
|
+
Add your domain-specific instructions or workflows here.
|
|
70
83
|
```
|
|
71
84
|
|
|
72
85
|
---
|
|
73
86
|
|
|
74
|
-
##
|
|
87
|
+
## 🧪 Development
|
|
75
88
|
|
|
76
|
-
|
|
77
|
-
- **Paths**: Resolves `\` (Windows) and `/` (Unix) based on host OS.
|
|
78
|
-
- **Shell**: Uses `cmd.exe` on Windows and `sh` on Linux/macOS.
|
|
79
|
-
- **Line Endings**: Supports both `CRLF` and `LF` for file operations.
|
|
89
|
+
Use this section only if you want to work on the repository itself.
|
|
80
90
|
|
|
81
|
-
|
|
91
|
+
### Local setup
|
|
82
92
|
|
|
83
93
|
```bash
|
|
94
|
+
git clone https://github.com/your-username/staff-mcp.git
|
|
95
|
+
cd staff-mcp
|
|
96
|
+
npm install
|
|
97
|
+
npm run build
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Run the local build
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
node dist/src/index.js --working-dir ./test-workspace
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Run with npm scripts
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
npm start -- --working-dir ./test-workspace
|
|
84
110
|
npm run dev -- --working-dir ./test-workspace
|
|
85
111
|
```
|
|
86
112
|
|
|
113
|
+
## ✅ Testing
|
|
114
|
+
|
|
115
|
+
Examples for verifying the package behavior separately from normal usage:
|
|
116
|
+
|
|
117
|
+
### Verify the published package
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
npx -y staff-mcp@latest --working-dir /tmp
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Verify the local build
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
npm run build
|
|
127
|
+
node dist/src/index.js --working-dir /tmp
|
|
128
|
+
```
|
|
129
|
+
|
|
87
130
|
## 📄 License
|
|
88
131
|
|
|
89
132
|
MIT
|
package/README_zh.md
CHANGED
|
@@ -2,44 +2,42 @@
|
|
|
2
2
|
|
|
3
3
|
[English](./README.md) | [简体中文](./README_zh.md)
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
一个稳健的 Model Context Protocol (MCP) 服务端,为 AI 助手提供安全、跨平台的文件管理、Shell 执行和基于 LSP 的代码智能环境。
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
### 安装
|
|
10
|
-
|
|
11
|
-
```bash
|
|
12
|
-
npm install
|
|
13
|
-
npm run build
|
|
14
|
-
```
|
|
7
|
+
---
|
|
15
8
|
|
|
16
|
-
|
|
9
|
+
## 🚀 使用
|
|
17
10
|
|
|
18
|
-
|
|
11
|
+
这一节用于说明如何直接使用已发布的包,而不是如何开发或测试这个仓库。
|
|
19
12
|
|
|
20
|
-
|
|
21
|
-
# 在项目本地运行
|
|
22
|
-
npx . --working-dir /你的项目/路径
|
|
23
|
-
|
|
24
|
-
# 如果已发布到 npm (例如 @your-org/staff-mcp)
|
|
25
|
-
# npx -y @your-org/staff-mcp --working-dir /你的项目/路径
|
|
26
|
-
```
|
|
13
|
+
### 使用 npx 运行
|
|
27
14
|
|
|
28
|
-
|
|
15
|
+
推荐命令:
|
|
29
16
|
|
|
30
17
|
```bash
|
|
31
|
-
|
|
32
|
-
npm start -- --working-dir /你的项目/路径
|
|
18
|
+
npx -y staff-mcp@latest --working-dir /你的项目/路径
|
|
33
19
|
```
|
|
34
20
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
21
|
+
对于已发布的 CLI 包,显式使用 `@latest` 更稳妥,也可以避免类似 `could not determine executable to run` 的解析问题。
|
|
22
|
+
|
|
23
|
+
### 在 Claude Desktop 中配置
|
|
24
|
+
|
|
25
|
+
将以下内容添加到你的 `claude_desktop_config.json` 文件中:
|
|
26
|
+
|
|
27
|
+
```json
|
|
28
|
+
{
|
|
29
|
+
"mcpServers": {
|
|
30
|
+
"staff-mcp": {
|
|
31
|
+
"command": "npx",
|
|
32
|
+
"args": [
|
|
33
|
+
"-y",
|
|
34
|
+
"staff-mcp@latest",
|
|
35
|
+
"--working-dir",
|
|
36
|
+
"/你的项目/路径"
|
|
37
|
+
]
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
43
41
|
```
|
|
44
42
|
|
|
45
43
|
### 命令行参数
|
|
@@ -49,41 +47,84 @@ node dist/src/index.js --transport http --port 3000
|
|
|
49
47
|
| `--working-dir` | 沙箱根目录 | `process.cwd()` |
|
|
50
48
|
| `--allowed-dir` | 额外允许访问的目录 | `[]` |
|
|
51
49
|
| `--transport` | 传输方式 (`stdio` 或 `http`) | `stdio` |
|
|
52
|
-
| `--port` | HTTP 服务端口 | `3000` |
|
|
50
|
+
| `--port` | HTTP 服务端口 (如果使用 http 模式) | `3000` |
|
|
51
|
+
|
|
52
|
+
### Skill 加载方式
|
|
53
|
+
|
|
54
|
+
如果你的工作区或用户目录里已经存在 skill 目录,`staff-mcp` 会在启动时自动发现并加载。可用目录示例:
|
|
55
|
+
|
|
56
|
+
- `.staff/skills/<skill-name>/SKILL.md`
|
|
57
|
+
- `.claude/skills/<skill-name>/SKILL.md`
|
|
58
|
+
- `.agents/skills/<skill-name>/SKILL.md`
|
|
59
|
+
- `.opencode/skills/<skill-name>/SKILL.md`
|
|
53
60
|
|
|
54
61
|
---
|
|
55
62
|
|
|
56
|
-
## 🛠️
|
|
63
|
+
## 🛠️ 核心特性
|
|
64
|
+
|
|
65
|
+
- **文件操作**: 在沙箱范围内提供安全的读、写、删除和列表操作。
|
|
66
|
+
- **Shell 集成**: 执行非交互式命令或启动后台任务(如开发服务器)。
|
|
67
|
+
- **代码智能**: 基于 LSP 的符号提取和诊断,帮助 AI 更好地理解代码结构。
|
|
68
|
+
- **技能系统 (Skills)**: 自动检测并加载 `.staff/skills/`、`.claude/skills/` 和 `.agents/skills/` 目录下的领域特定指令。
|
|
69
|
+
- **环境感知**: 原生支持 Windows (CMD/PowerShell) 和 Unix-like (Bash/Sh) 系统。
|
|
57
70
|
|
|
58
|
-
|
|
59
|
-
- **Skills (技能)**: 兼容 `SKILL.md` 格式。自动检测并注册 `.staff/skills/`、`.claude/skills/` 等目录下的技能及 Prompts。
|
|
60
|
-
- **MCP 原生支持**: 实现了 `instructions` 机制,为模型自动提供环境感知(OS、Shell、路径规则)及工具调用建议。
|
|
71
|
+
### 如何添加技能
|
|
61
72
|
|
|
62
|
-
|
|
73
|
+
在 `.staff/skills/your-skill/` 目录下创建一个 `SKILL.md` 文件:
|
|
63
74
|
|
|
64
75
|
```markdown
|
|
65
76
|
---
|
|
66
77
|
name: my-skill
|
|
67
|
-
description:
|
|
78
|
+
description: 我的项目专属逻辑
|
|
68
79
|
---
|
|
69
|
-
|
|
80
|
+
在此处添加你的领域特定指令或工作流。
|
|
70
81
|
```
|
|
71
82
|
|
|
72
83
|
---
|
|
73
84
|
|
|
74
|
-
##
|
|
85
|
+
## 🧪 开发
|
|
75
86
|
|
|
76
|
-
|
|
77
|
-
- **路径**: 根据宿主系统解析 `\` (Windows) 或 `/` (Unix)。
|
|
78
|
-
- **Shell**: Windows 使用 `cmd.exe`,Linux/macOS 使用 `sh`。
|
|
79
|
-
- **换行符**: 文件操作支持 `CRLF` 和 `LF`。
|
|
87
|
+
这一节只面向要修改仓库源码的开发者。
|
|
80
88
|
|
|
81
|
-
|
|
89
|
+
### 本地准备
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
git clone https://github.com/your-username/staff-mcp.git
|
|
93
|
+
cd staff-mcp
|
|
94
|
+
npm install
|
|
95
|
+
npm run build
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### 运行本地构建产物
|
|
82
99
|
|
|
83
100
|
```bash
|
|
101
|
+
node dist/src/index.js --working-dir ./test-workspace
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### 使用 npm 脚本运行
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
npm start -- --working-dir ./test-workspace
|
|
84
108
|
npm run dev -- --working-dir ./test-workspace
|
|
85
109
|
```
|
|
86
110
|
|
|
111
|
+
## ✅ 测试
|
|
112
|
+
|
|
113
|
+
这一节单独用于说明如何验证包是否可用,而不是日常使用方式。
|
|
114
|
+
|
|
115
|
+
### 验证已发布包
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
npx -y staff-mcp@latest --working-dir /tmp
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### 验证本地构建
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
npm run build
|
|
125
|
+
node dist/src/index.js --working-dir /tmp
|
|
126
|
+
```
|
|
127
|
+
|
|
87
128
|
## 📄 开源协议
|
|
88
129
|
|
|
89
130
|
MIT
|
package/dist/src/index.js
CHANGED
|
File without changes
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export interface LSPConfig {
|
|
2
|
+
command: string[];
|
|
3
|
+
installCommand?: string;
|
|
4
|
+
extensions: string[];
|
|
5
|
+
}
|
|
6
|
+
export declare class LSPClient {
|
|
7
|
+
private config;
|
|
8
|
+
private rootPath;
|
|
9
|
+
private process;
|
|
10
|
+
private idCounter;
|
|
11
|
+
private handlers;
|
|
12
|
+
private buffer;
|
|
13
|
+
constructor(config: LSPConfig, rootPath: string);
|
|
14
|
+
start(): Promise<void>;
|
|
15
|
+
private notificationHandlers;
|
|
16
|
+
private handleData;
|
|
17
|
+
onNotification(method: string, handler: (params: any) => void): void;
|
|
18
|
+
request(method: string, params: any): Promise<any>;
|
|
19
|
+
notification(method: string, params: any): Promise<void>;
|
|
20
|
+
stop(): void;
|
|
21
|
+
}
|
|
22
|
+
export declare class LSPManager {
|
|
23
|
+
readonly DEFAULT_CONFIGS: Record<string, LSPConfig>;
|
|
24
|
+
private clients;
|
|
25
|
+
private lspDir;
|
|
26
|
+
constructor();
|
|
27
|
+
ensureServer(language: string): Promise<void>;
|
|
28
|
+
getClient(language: string, rootPath: string): Promise<LSPClient>;
|
|
29
|
+
getDiagnostics(filePath: string, rootPath: string): Promise<any[]>;
|
|
30
|
+
hover(filePath: string, line: number, character: number, rootPath: string): Promise<string>;
|
|
31
|
+
go_to_definition_internal(filePath: string, line: number, character: number, rootPath: string): Promise<string>;
|
|
32
|
+
}
|
|
33
|
+
export declare const lspManager: LSPManager;
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import { spawn } from "child_process";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
import * as os from "os";
|
|
4
|
+
import * as fs from "fs";
|
|
5
|
+
const DEFAULT_CONFIGS = {
|
|
6
|
+
typescript: {
|
|
7
|
+
command: ["node", path.join(os.homedir(), ".staff/lsp/node_modules/typescript-language-server/lib/cli.mjs"), "--stdio"],
|
|
8
|
+
installCommand: "npm install --prefix " + path.join(os.homedir(), ".staff/lsp") + " typescript-language-server typescript",
|
|
9
|
+
extensions: [".ts", ".tsx", ".js", ".jsx"]
|
|
10
|
+
},
|
|
11
|
+
python: {
|
|
12
|
+
command: ["node", path.join(os.homedir(), ".staff/lsp/node_modules/pyright/dist/pyright-langserver.js"), "--stdio"],
|
|
13
|
+
installCommand: "npm install --prefix " + path.join(os.homedir(), ".staff/lsp") + " pyright",
|
|
14
|
+
extensions: [".py"]
|
|
15
|
+
},
|
|
16
|
+
go: {
|
|
17
|
+
command: ["gopls"],
|
|
18
|
+
installCommand: "go install golang.org/x/tools/gopls@latest",
|
|
19
|
+
extensions: [".go"]
|
|
20
|
+
},
|
|
21
|
+
cpp: {
|
|
22
|
+
command: ["clangd"],
|
|
23
|
+
installCommand: "echo 'Please install clangd (e.g., sudo apt install clangd)'",
|
|
24
|
+
extensions: [".c", ".cpp", ".h", ".hpp"]
|
|
25
|
+
},
|
|
26
|
+
java: {
|
|
27
|
+
command: ["jdtls"],
|
|
28
|
+
installCommand: "echo 'Please install jdtls and ensure it is in your PATH'",
|
|
29
|
+
extensions: [".java"]
|
|
30
|
+
},
|
|
31
|
+
kotlin: {
|
|
32
|
+
command: ["kotlin-language-server"],
|
|
33
|
+
installCommand: "echo 'Please install kotlin-language-server and ensure it is in your PATH'",
|
|
34
|
+
extensions: [".kt", ".kts"]
|
|
35
|
+
},
|
|
36
|
+
rust: {
|
|
37
|
+
command: ["rust-analyzer"],
|
|
38
|
+
installCommand: "rustup component add rust-analyzer",
|
|
39
|
+
extensions: [".rs"]
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
export class LSPClient {
|
|
43
|
+
config;
|
|
44
|
+
rootPath;
|
|
45
|
+
process = null;
|
|
46
|
+
idCounter = 0;
|
|
47
|
+
handlers = new Map();
|
|
48
|
+
buffer = "";
|
|
49
|
+
constructor(config, rootPath) {
|
|
50
|
+
this.config = config;
|
|
51
|
+
this.rootPath = rootPath;
|
|
52
|
+
}
|
|
53
|
+
async start() {
|
|
54
|
+
this.process = spawn(this.config.command[0], this.config.command.slice(1), {
|
|
55
|
+
cwd: this.rootPath,
|
|
56
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
57
|
+
});
|
|
58
|
+
this.process.stdout?.on("data", (data) => {
|
|
59
|
+
this.handleData(data.toString());
|
|
60
|
+
});
|
|
61
|
+
this.process.stderr?.on("data", (data) => {
|
|
62
|
+
console.error(`[LSP Error]: ${data.toString()}`);
|
|
63
|
+
});
|
|
64
|
+
// Initialize
|
|
65
|
+
await this.request("initialize", {
|
|
66
|
+
processId: process.pid,
|
|
67
|
+
rootUri: `file://${this.rootPath}`,
|
|
68
|
+
capabilities: {},
|
|
69
|
+
workspaceFolders: [{ uri: `file://${this.rootPath}`, name: "workspace" }]
|
|
70
|
+
});
|
|
71
|
+
await this.notification("initialized", {});
|
|
72
|
+
}
|
|
73
|
+
notificationHandlers = new Map();
|
|
74
|
+
handleData(data) {
|
|
75
|
+
this.buffer += data;
|
|
76
|
+
while (true) {
|
|
77
|
+
const match = this.buffer.match(/Content-Length: (\d+)\r\n\r\n/);
|
|
78
|
+
if (!match)
|
|
79
|
+
break;
|
|
80
|
+
const contentLength = parseInt(match[1]);
|
|
81
|
+
const headerLength = match[0].length;
|
|
82
|
+
const totalLength = headerLength + contentLength;
|
|
83
|
+
if (this.buffer.length < totalLength)
|
|
84
|
+
break;
|
|
85
|
+
const body = this.buffer.slice(headerLength, totalLength);
|
|
86
|
+
this.buffer = this.buffer.slice(totalLength);
|
|
87
|
+
try {
|
|
88
|
+
const response = JSON.parse(body);
|
|
89
|
+
if (response.id !== undefined) {
|
|
90
|
+
const handler = this.handlers.get(response.id);
|
|
91
|
+
if (handler) {
|
|
92
|
+
handler(response);
|
|
93
|
+
this.handlers.delete(response.id);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
else if (response.method) {
|
|
97
|
+
const handler = this.notificationHandlers.get(response.method);
|
|
98
|
+
if (handler) {
|
|
99
|
+
handler(response.params);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch (e) {
|
|
104
|
+
console.error("Failed to parse LSP response", e);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
onNotification(method, handler) {
|
|
109
|
+
this.notificationHandlers.set(method, handler);
|
|
110
|
+
}
|
|
111
|
+
async request(method, params) {
|
|
112
|
+
const id = this.idCounter++;
|
|
113
|
+
const message = {
|
|
114
|
+
jsonrpc: "2.0",
|
|
115
|
+
id,
|
|
116
|
+
method,
|
|
117
|
+
params
|
|
118
|
+
};
|
|
119
|
+
const json = JSON.stringify(message);
|
|
120
|
+
const header = `Content-Length: ${Buffer.byteLength(json, "utf8")}\r\n\r\n`;
|
|
121
|
+
return new Promise((resolve) => {
|
|
122
|
+
this.handlers.set(id, (res) => resolve(res.result));
|
|
123
|
+
this.process?.stdin?.write(header + json);
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
async notification(method, params) {
|
|
127
|
+
const message = {
|
|
128
|
+
jsonrpc: "2.0",
|
|
129
|
+
method,
|
|
130
|
+
params
|
|
131
|
+
};
|
|
132
|
+
const json = JSON.stringify(message);
|
|
133
|
+
const header = `Content-Length: ${Buffer.byteLength(json, "utf8")}\r\n\r\n`;
|
|
134
|
+
this.process?.stdin?.write(header + json);
|
|
135
|
+
}
|
|
136
|
+
stop() {
|
|
137
|
+
this.process?.kill();
|
|
138
|
+
this.process = null;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
export class LSPManager {
|
|
142
|
+
DEFAULT_CONFIGS = DEFAULT_CONFIGS;
|
|
143
|
+
clients = new Map();
|
|
144
|
+
lspDir = path.join(os.homedir(), ".staff/lsp");
|
|
145
|
+
constructor() {
|
|
146
|
+
if (!fs.existsSync(this.lspDir)) {
|
|
147
|
+
fs.mkdirSync(this.lspDir, { recursive: true });
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
async ensureServer(language) {
|
|
151
|
+
const config = DEFAULT_CONFIGS[language];
|
|
152
|
+
if (!config || !config.installCommand)
|
|
153
|
+
return;
|
|
154
|
+
// Check if the command exists in PATH
|
|
155
|
+
const cmd = config.command[0];
|
|
156
|
+
const { execSync } = await import("child_process");
|
|
157
|
+
try {
|
|
158
|
+
const checkCmd = process.platform === 'win32' ? `where ${cmd}` : `which ${cmd}`;
|
|
159
|
+
execSync(checkCmd, { stdio: 'ignore' });
|
|
160
|
+
return; // Found in PATH
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
// Not in PATH, check if it's a specific node_module path we manage
|
|
164
|
+
if (path.isAbsolute(cmd) && fs.existsSync(cmd)) {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
// Check common user bin path for go
|
|
168
|
+
if (language === 'go') {
|
|
169
|
+
const goBin = path.join(os.homedir(), 'go', 'bin', 'gopls');
|
|
170
|
+
if (fs.existsSync(goBin)) {
|
|
171
|
+
config.command[0] = goBin;
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
console.log(`LSP server '${cmd}' not found. Attempting install for ${language}...`);
|
|
176
|
+
try {
|
|
177
|
+
// Use inherit only for major installs to avoid blocking
|
|
178
|
+
execSync(config.installCommand, { stdio: 'pipe' });
|
|
179
|
+
}
|
|
180
|
+
catch (e) {
|
|
181
|
+
console.error(`Failed to install LSP for ${language}:`, e);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
async getClient(language, rootPath) {
|
|
186
|
+
const key = `${language}:${rootPath}`;
|
|
187
|
+
if (this.clients.has(key))
|
|
188
|
+
return this.clients.get(key);
|
|
189
|
+
await this.ensureServer(language);
|
|
190
|
+
const config = DEFAULT_CONFIGS[language];
|
|
191
|
+
if (!config)
|
|
192
|
+
throw new Error(`Unsupported language: ${language}`);
|
|
193
|
+
// Verify binary exists before spawning
|
|
194
|
+
const cmd = config.command[0];
|
|
195
|
+
const { execSync } = await import("child_process");
|
|
196
|
+
try {
|
|
197
|
+
const checkCmd = process.platform === 'win32' ? `where ${cmd}` : `which ${cmd}`;
|
|
198
|
+
execSync(checkCmd, { stdio: 'ignore' });
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
if (!path.isAbsolute(cmd) || !fs.existsSync(cmd)) {
|
|
202
|
+
throw new Error(`LSP server binary '${cmd}' not found for ${language}`);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
const client = new LSPClient(config, rootPath);
|
|
206
|
+
await client.start();
|
|
207
|
+
this.clients.set(key, client);
|
|
208
|
+
return client;
|
|
209
|
+
}
|
|
210
|
+
async getDiagnostics(filePath, rootPath) {
|
|
211
|
+
const ext = path.extname(filePath);
|
|
212
|
+
const lang = Object.keys(DEFAULT_CONFIGS).find(l => DEFAULT_CONFIGS[l].extensions.includes(ext));
|
|
213
|
+
if (!lang)
|
|
214
|
+
return [];
|
|
215
|
+
const client = await this.getClient(lang, rootPath);
|
|
216
|
+
const uri = `file://${filePath}`;
|
|
217
|
+
// Ensure file is opened and notified to server
|
|
218
|
+
const content = fs.readFileSync(filePath, "utf-8");
|
|
219
|
+
await client.notification("textDocument/didOpen", {
|
|
220
|
+
textDocument: {
|
|
221
|
+
uri,
|
|
222
|
+
languageId: lang,
|
|
223
|
+
version: 1,
|
|
224
|
+
text: content
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
return new Promise(async (resolve) => {
|
|
228
|
+
let resolved = false;
|
|
229
|
+
const timeout = setTimeout(() => {
|
|
230
|
+
if (!resolved) {
|
|
231
|
+
resolved = true;
|
|
232
|
+
resolve([]);
|
|
233
|
+
}
|
|
234
|
+
}, 3000); // Wait for async diagnostics
|
|
235
|
+
client.onNotification("textDocument/publishDiagnostics", (params) => {
|
|
236
|
+
// Normalize path for comparison
|
|
237
|
+
const paramPath = params.uri.replace("file://", "");
|
|
238
|
+
const checkPath = filePath.startsWith("/") ? filePath : `/${filePath}`;
|
|
239
|
+
if (paramPath.endsWith(filePath) && !resolved) {
|
|
240
|
+
resolved = true;
|
|
241
|
+
clearTimeout(timeout);
|
|
242
|
+
resolve(params.diagnostics);
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
async hover(filePath, line, character, rootPath) {
|
|
248
|
+
const ext = path.extname(filePath);
|
|
249
|
+
const lang = Object.keys(DEFAULT_CONFIGS).find(l => DEFAULT_CONFIGS[l].extensions.includes(ext));
|
|
250
|
+
if (!lang)
|
|
251
|
+
return "Unsupported language";
|
|
252
|
+
const client = await this.getClient(lang, rootPath);
|
|
253
|
+
const result = await client.request("textDocument/hover", {
|
|
254
|
+
textDocument: { uri: `file://${filePath}` },
|
|
255
|
+
position: { line, character }
|
|
256
|
+
});
|
|
257
|
+
if (!result || !result.contents)
|
|
258
|
+
return "No hover information found";
|
|
259
|
+
if (typeof result.contents === "string")
|
|
260
|
+
return result.contents;
|
|
261
|
+
if (Array.isArray(result.contents))
|
|
262
|
+
return result.contents.map((c) => typeof c === "string" ? c : c.value).join("\n");
|
|
263
|
+
return result.contents.value || "No hover information found";
|
|
264
|
+
}
|
|
265
|
+
async go_to_definition_internal(filePath, line, character, rootPath) {
|
|
266
|
+
const ext = path.extname(filePath);
|
|
267
|
+
const lang = Object.keys(DEFAULT_CONFIGS).find(l => DEFAULT_CONFIGS[l].extensions.includes(ext));
|
|
268
|
+
if (!lang)
|
|
269
|
+
throw new Error(`Unsupported language for extension ${ext}`);
|
|
270
|
+
const client = await this.getClient(lang, rootPath);
|
|
271
|
+
const result = await client.request("textDocument/definition", {
|
|
272
|
+
textDocument: { uri: `file://${filePath}` },
|
|
273
|
+
position: { line: line - 1, character: character - 1 }
|
|
274
|
+
});
|
|
275
|
+
if (!result)
|
|
276
|
+
return "Definition not found";
|
|
277
|
+
const locations = Array.isArray(result) ? result : [result];
|
|
278
|
+
return locations.map((loc) => {
|
|
279
|
+
const uri = loc.uri || loc.targetUri;
|
|
280
|
+
const range = loc.range || loc.targetSelectionRange;
|
|
281
|
+
return `${uri.replace('file://', '')}:${range.start.line + 1}`;
|
|
282
|
+
}).join("\n");
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
export const lspManager = new LSPManager();
|
|
286
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/lsp/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function getWorkspaceArtifactPolicy(): string;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export function getWorkspaceArtifactPolicy() {
|
|
2
|
+
return `
|
|
3
|
+
Workspace Artifact Policy:
|
|
4
|
+
Before creating any file, classify it as either a user-facing deliverable or an assistant-only working artifact.
|
|
5
|
+
|
|
6
|
+
Rules:
|
|
7
|
+
- User-facing deliverables should be placed according to the current task and the workspace's own conventions.
|
|
8
|
+
- Assistant-only working artifacts should be kept in a hidden assistant work area, defaulting to '.staff/', unless the workspace already defines another scratch location.
|
|
9
|
+
- Assistant-only working artifacts include temporary experiments, reproduction scripts, disposable test files, logs, progress notes, planning documents, checkpoints, derived metadata, and caches.
|
|
10
|
+
- Recommended default layout under '.staff/':
|
|
11
|
+
- '.staff/tmp/' for temporary experiments and one-off outputs
|
|
12
|
+
- '.staff/notes/' for plans, findings, and progress summaries
|
|
13
|
+
- '.staff/logs/' for command output, traces, and runtime logs
|
|
14
|
+
- '.staff/state/' for session or task state and checkpoints
|
|
15
|
+
- '.staff/cache/' for reusable derived data that is not part of the deliverable
|
|
16
|
+
- Do not mix assistant-only working artifacts with user deliverables unless explicitly requested.
|
|
17
|
+
- If unsure whether a file is a deliverable, treat it as an assistant-only working artifact first.
|
|
18
|
+
- If the target workspace already has explicit conventions for generated or scratch material, follow those conventions instead of the default hidden layout.
|
|
19
|
+
`.trim();
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=workspace-artifact-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-artifact-policy.js","sourceRoot":"","sources":["../../../src/policies/workspace-artifact-policy.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,0BAA0B;IACxC,OAAO;;;;;;;;;;;;;;;;;CAiBR,CAAC,IAAI,EAAE,CAAC;AACT,CAAC"}
|
package/dist/src/security.d.ts
CHANGED
package/dist/src/security.js
CHANGED
package/dist/src/security.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/security.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,OAAO,eAAe;IAClB,WAAW,CAAW;IACtB,UAAU,CAAS;IAE3B,YAAY,UAAkB,EAAE,cAAwB,EAAE;QACxD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3C,sCAAsC;QACtC,MAAM,mBAAmB,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;IACpF,CAAC;IAED;;;;;;OAMG;IACI,sBAAsB,CAAC,UAAkB,EAAE,GAAY;QAC5D,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;QAEvD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAEpD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;YACzD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,yBAAyB,YAAY,uCAAuC,CAAC,CAAC;QAChG,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;OAEG;IACH;;OAEG;IACI,iBAAiB,CAAC,OAAe;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YACrD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,QAAQ,+BAA+B,CAAC,CAAC;QACzF,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEM,cAAc;QACnB,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/security.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,OAAO,eAAe;IAClB,WAAW,CAAW;IACtB,UAAU,CAAS;IAE3B,YAAY,UAAkB,EAAE,cAAwB,EAAE;QACxD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3C,sCAAsC;QACtC,MAAM,mBAAmB,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;IACpF,CAAC;IAED;;;;;;OAMG;IACI,sBAAsB,CAAC,UAAkB,EAAE,GAAY;QAC5D,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;QAEvD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAEpD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;YACzD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,yBAAyB,YAAY,uCAAuC,CAAC,CAAC;QAChG,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;OAEG;IACH;;OAEG;IACI,iBAAiB,CAAC,OAAe;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YACrD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,QAAQ,+BAA+B,CAAC,CAAC;QACzF,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEM,cAAc;QACnB,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;IAEM,aAAa;QAClB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;CACF"}
|
|
@@ -2,7 +2,7 @@ import * as fs from "fs/promises";
|
|
|
2
2
|
import * as path from "path";
|
|
3
3
|
import { z } from "zod";
|
|
4
4
|
import { CHARACTER_LIMIT } from "../constants.js";
|
|
5
|
-
import {
|
|
5
|
+
import { lspManager } from "../lsp/manager.js";
|
|
6
6
|
/**
|
|
7
7
|
* Registers file-related tools using the latest registerTool API.
|
|
8
8
|
*/
|
|
@@ -78,12 +78,12 @@ export function registerFileTools(server, security) {
|
|
|
78
78
|
const updatedContent = content.slice(0, index) + newText + content.slice(index + oldText.length);
|
|
79
79
|
await fs.writeFile(validatedPath, updatedContent, "utf-8");
|
|
80
80
|
let response = `Successfully updated ${filePath}`;
|
|
81
|
-
// Add diagnostics feedback
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
}
|
|
81
|
+
// Add diagnostics feedback
|
|
82
|
+
const rootPath = security.getWorkingDir();
|
|
83
|
+
const diagnostics = await lspManager.getDiagnostics(validatedPath, rootPath);
|
|
84
|
+
if (diagnostics && diagnostics.length > 0) {
|
|
85
|
+
const formatted = diagnostics.map((d) => `[Line ${d.range.start.line + 1}] ${d.message}`).join("\n");
|
|
86
|
+
response += `\n\nWarning: LSP diagnostics found after editing:\n${formatted}`;
|
|
87
87
|
}
|
|
88
88
|
return {
|
|
89
89
|
content: [{ type: "text", text: response }],
|
|
@@ -109,12 +109,12 @@ export function registerFileTools(server, security) {
|
|
|
109
109
|
await fs.mkdir(path.dirname(validatedPath), { recursive: true });
|
|
110
110
|
await fs.writeFile(validatedPath, content, "utf-8");
|
|
111
111
|
let response = `Successfully wrote file: ${filePath}`;
|
|
112
|
-
// Add diagnostics feedback
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
}
|
|
112
|
+
// Add diagnostics feedback
|
|
113
|
+
const rootPath = security.getWorkingDir();
|
|
114
|
+
const diagnostics = await lspManager.getDiagnostics(validatedPath, rootPath);
|
|
115
|
+
if (diagnostics && diagnostics.length > 0) {
|
|
116
|
+
const formatted = diagnostics.map((d) => `[Line ${d.range.start.line + 1}] ${d.message}`).join("\n");
|
|
117
|
+
response += `\n\nWarning: LSP diagnostics found after writing:\n${formatted}`;
|
|
118
118
|
}
|
|
119
119
|
return {
|
|
120
120
|
content: [{ type: "text", text: response }],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-tools.js","sourceRoot":"","sources":["../../../src/tools/file-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"file-tools.js","sourceRoot":"","sources":["../../../src/tools/file-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import { SecurityManager } from "../security.js";
|
|
3
|
-
/**
|
|
4
|
-
* Internal helper to get diagnostics for a specific path.
|
|
5
|
-
*/
|
|
6
|
-
export declare function getPathDiagnostics(checkPath: string, security: SecurityManager): Promise<string>;
|
|
7
3
|
/**
|
|
8
4
|
* Registers LSP-related tools using the latest registerTool API.
|
|
9
5
|
*/
|
|
@@ -1,48 +1,25 @@
|
|
|
1
1
|
import { Project } from "ts-morph";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
-
|
|
4
|
-
* Internal helper to get diagnostics for a specific path.
|
|
5
|
-
*/
|
|
6
|
-
export async function getPathDiagnostics(checkPath, security) {
|
|
7
|
-
const validatedPath = security.resolveAndValidatePath(checkPath);
|
|
8
|
-
const project = new Project();
|
|
9
|
-
project.addSourceFilesAtPaths([
|
|
10
|
-
validatedPath.endsWith(".ts") || validatedPath.endsWith(".js")
|
|
11
|
-
? validatedPath
|
|
12
|
-
: `${validatedPath}/**/*.{ts,js,tsx,jsx}`
|
|
13
|
-
]);
|
|
14
|
-
const diagnostics = project.getPreEmitDiagnostics();
|
|
15
|
-
return diagnostics.map(diag => {
|
|
16
|
-
const messageText = diag.getMessageText();
|
|
17
|
-
const line = diag.getLineNumber();
|
|
18
|
-
const file = diag.getSourceFile()?.getFilePath() || "Unknown file";
|
|
19
|
-
const formattedMessage = typeof messageText === "string" ? messageText : messageText.getMessageText();
|
|
20
|
-
return `[${file}:${line}] ${formattedMessage}`;
|
|
21
|
-
}).join("\n");
|
|
22
|
-
}
|
|
3
|
+
import { lspManager } from "../lsp/manager.js";
|
|
23
4
|
/**
|
|
24
5
|
* Registers LSP-related tools using the latest registerTool API.
|
|
25
6
|
*/
|
|
26
7
|
export function registerLspTools(server, security) {
|
|
27
|
-
//
|
|
28
|
-
server.registerTool("
|
|
29
|
-
description: "
|
|
8
|
+
// hover
|
|
9
|
+
server.registerTool("hover", {
|
|
10
|
+
description: "Get hover information (type, documentation) at a specific position.",
|
|
30
11
|
inputSchema: z.object({
|
|
31
|
-
path: z.string().describe("
|
|
12
|
+
path: z.string().describe("File path to inspect."),
|
|
13
|
+
line: z.number().describe("1-based line number."),
|
|
14
|
+
character: z.number().describe("1-based character position."),
|
|
32
15
|
}).strict(),
|
|
33
|
-
}, async ({ path: filePath }) => {
|
|
16
|
+
}, async ({ path: filePath, line, character }) => {
|
|
34
17
|
try {
|
|
35
18
|
const validatedPath = security.resolveAndValidatePath(filePath);
|
|
36
|
-
const
|
|
37
|
-
const
|
|
38
|
-
const symbols = [];
|
|
39
|
-
sourceFile.getClasses().forEach(c => symbols.push(`[Class] ${c.getName()} (Line ${c.getStartLineNumber()})`));
|
|
40
|
-
sourceFile.getInterfaces().forEach(i => symbols.push(`[Interface] ${i.getName()} (Line ${i.getStartLineNumber()})`));
|
|
41
|
-
sourceFile.getFunctions().forEach(f => symbols.push(`[Function] ${f.getName()} (Line ${f.getStartLineNumber()})`));
|
|
42
|
-
sourceFile.getEnums().forEach(e => symbols.push(`[Enum] ${e.getName()} (Line ${e.getStartLineNumber()})`));
|
|
43
|
-
sourceFile.getTypeAliases().forEach(t => symbols.push(`[TypeAlias] ${t.getName()} (Line ${t.getStartLineNumber()})`));
|
|
19
|
+
const rootPath = security.getWorkingDir();
|
|
20
|
+
const result = await lspManager.hover(validatedPath, line - 1, character - 1, rootPath);
|
|
44
21
|
return {
|
|
45
|
-
content: [{ type: "text", text:
|
|
22
|
+
content: [{ type: "text", text: result }],
|
|
46
23
|
};
|
|
47
24
|
}
|
|
48
25
|
catch (error) {
|
|
@@ -54,15 +31,70 @@ export function registerLspTools(server, security) {
|
|
|
54
31
|
});
|
|
55
32
|
// get_diagnostics
|
|
56
33
|
server.registerTool("get_diagnostics", {
|
|
57
|
-
description: "Get
|
|
34
|
+
description: "Get diagnostics/errors for a file (supports TS, JS, Python).",
|
|
58
35
|
inputSchema: z.object({
|
|
59
|
-
path: z.string().describe("File
|
|
36
|
+
path: z.string().describe("File path to check for diagnostics."),
|
|
60
37
|
}).strict(),
|
|
61
38
|
}, async ({ path: checkPath }) => {
|
|
62
39
|
try {
|
|
63
|
-
const
|
|
40
|
+
const validatedPath = security.resolveAndValidatePath(checkPath);
|
|
41
|
+
const rootPath = security.workingDir;
|
|
42
|
+
const diagnostics = await lspManager.getDiagnostics(validatedPath, rootPath);
|
|
43
|
+
const formatted = diagnostics.map((d) => `[Line ${d.range.start.line + 1}] ${d.message} (${d.severity === 1 ? 'Error' : 'Warning'})`).join("\n");
|
|
44
|
+
return {
|
|
45
|
+
content: [{ type: "text", text: formatted || "No diagnostics found." }],
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
64
49
|
return {
|
|
65
|
-
content: [{ type: "text", text:
|
|
50
|
+
content: [{ type: "text", text: `LSP Error: ${error.message}` }],
|
|
51
|
+
isError: true,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
// go_to_definition
|
|
56
|
+
server.registerTool("go_to_definition", {
|
|
57
|
+
description: "Find the definition of a symbol at a specific position.",
|
|
58
|
+
inputSchema: z.object({
|
|
59
|
+
path: z.string().describe("File path to inspect."),
|
|
60
|
+
line: z.number().describe("1-based line number."),
|
|
61
|
+
character: z.number().describe("1-based character position."),
|
|
62
|
+
}).strict(),
|
|
63
|
+
}, async ({ path: filePath, line, character }) => {
|
|
64
|
+
try {
|
|
65
|
+
const validatedPath = security.resolveAndValidatePath(filePath);
|
|
66
|
+
const rootPath = security.getWorkingDir();
|
|
67
|
+
const result = await lspManager.go_to_definition_internal(validatedPath, line, character, rootPath);
|
|
68
|
+
return {
|
|
69
|
+
content: [{ type: "text", text: result }],
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
return {
|
|
74
|
+
content: [{ type: "text", text: `LSP Error: ${error.message}` }],
|
|
75
|
+
isError: true,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
// get_document_symbols
|
|
80
|
+
server.registerTool("get_document_symbols", {
|
|
81
|
+
description: "Extract high-level symbols (classes, functions, interfaces) from a TypeScript file.",
|
|
82
|
+
inputSchema: z.object({
|
|
83
|
+
path: z.string().describe("TypeScript/JavaScript file path to analyze."),
|
|
84
|
+
}).strict(),
|
|
85
|
+
}, async ({ path: filePath }) => {
|
|
86
|
+
try {
|
|
87
|
+
const validatedPath = security.resolveAndValidatePath(filePath);
|
|
88
|
+
const project = new Project();
|
|
89
|
+
const sourceFile = project.addSourceFileAtPath(validatedPath);
|
|
90
|
+
const symbols = [];
|
|
91
|
+
sourceFile.getClasses().forEach(c => symbols.push(`[Class] ${c.getName()} (Line ${c.getStartLineNumber()})`));
|
|
92
|
+
sourceFile.getInterfaces().forEach(i => symbols.push(`[Interface] ${i.getName()} (Line ${i.getStartLineNumber()})`));
|
|
93
|
+
sourceFile.getFunctions().forEach(f => symbols.push(`[Function] ${f.getName()} (Line ${f.getStartLineNumber()})`));
|
|
94
|
+
sourceFile.getEnums().forEach(e => symbols.push(`[Enum] ${e.getName()} (Line ${e.getStartLineNumber()})`));
|
|
95
|
+
sourceFile.getTypeAliases().forEach(t => symbols.push(`[TypeAlias] ${t.getName()} (Line ${t.getStartLineNumber()})`));
|
|
96
|
+
return {
|
|
97
|
+
content: [{ type: "text", text: symbols.join("\n") || "(No significant symbols found)" }],
|
|
66
98
|
};
|
|
67
99
|
}
|
|
68
100
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lsp-tools.js","sourceRoot":"","sources":["../../../src/tools/lsp-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEnC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"lsp-tools.js","sourceRoot":"","sources":["../../../src/tools/lsp-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as os from "os";
|
|
2
2
|
import * as path from "path";
|
|
3
|
+
import { getWorkspaceArtifactPolicy } from "../policies/workspace-artifact-policy.js";
|
|
3
4
|
/**
|
|
4
5
|
* Returns a concise instruction string for the MCP server to guide tool usage.
|
|
5
6
|
* Focuses on environment context and tool relationships rather than defining identity.
|
|
@@ -31,6 +32,8 @@ Tool Usage Guidance:
|
|
|
31
32
|
4. Specialized Skills: If a '.staff/skills' or '.claude/skills' directory exists, use the 'skill' tool to load domain-specific workflows which will augment your current context.
|
|
32
33
|
5. Search & Replace: When refactoring, use 'search_file_content' to find all occurrences, then 'edit_file_by_replace' for precise, line-based replacements.
|
|
33
34
|
6. Verification: Use 'get_diagnostics' after editing code to ensure no errors were introduced.
|
|
35
|
+
|
|
36
|
+
${getWorkspaceArtifactPolicy()}
|
|
34
37
|
`.trim();
|
|
35
38
|
}
|
|
36
39
|
//# sourceMappingURL=system-tools.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-tools.js","sourceRoot":"","sources":["../../../src/tools/system-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"system-tools.js","sourceRoot":"","sources":["../../../src/tools/system-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,0BAA0B,EAAE,MAAM,0CAA0C,CAAC;AAEtF;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAAkB,EAAE,QAAyB;IAC9E,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,QAAQ,KAAK,OAAO,CAAC;IACnC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC;IACjF,MAAM,WAAW,GAAG,QAAQ,CAAC,cAAc,EAAE,CAAC;IAE9C,OAAO;;;QAGD,QAAQ;mBACG,KAAK;uBACD,UAAU;2CACU,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;qBAC5C,IAAI,CAAC,GAAG;;;;;;;;;;;OAWtB,KAAK,CAAC,CAAC,CAAC,6HAA6H,CAAC,CAAC,CAAC,6GAA6G;;;;;EAK1P,0BAA0B,EAAE;CAC7B,CAAC,IAAI,EAAE,CAAC;AACT,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { test } from "node:test";
|
|
2
|
+
import assert from "node:assert";
|
|
3
|
+
import { SecurityManager } from "../src/security.js";
|
|
4
|
+
import { getMcpInstructions } from "../src/tools/system-tools.js";
|
|
5
|
+
test("getMcpInstructions - should describe a default hidden work area for assistant-only artifacts", () => {
|
|
6
|
+
const workingDir = "/tmp/workspace";
|
|
7
|
+
const security = new SecurityManager(workingDir);
|
|
8
|
+
const instructions = getMcpInstructions(workingDir, security);
|
|
9
|
+
assert.match(instructions, /Workspace Artifact Policy/);
|
|
10
|
+
assert.match(instructions, /assistant-only working artifacts/i);
|
|
11
|
+
assert.match(instructions, /hidden assistant work area, defaulting to '\.staff\/'/i);
|
|
12
|
+
assert.match(instructions, /\.staff\/tmp\//);
|
|
13
|
+
assert.match(instructions, /\.staff\/notes\//);
|
|
14
|
+
assert.match(instructions, /\.staff\/logs\//);
|
|
15
|
+
assert.match(instructions, /\.staff\/state\//);
|
|
16
|
+
assert.match(instructions, /\.staff\/cache\//);
|
|
17
|
+
});
|
|
18
|
+
test("getMcpInstructions - should prefer workspace conventions for deliverables and scratch material", () => {
|
|
19
|
+
const workingDir = "/tmp/workspace";
|
|
20
|
+
const security = new SecurityManager(workingDir);
|
|
21
|
+
const instructions = getMcpInstructions(workingDir, security);
|
|
22
|
+
assert.match(instructions, /User-facing deliverables should be placed according to the current task and the workspace's own conventions\./);
|
|
23
|
+
assert.match(instructions, /If the target workspace already has explicit conventions for generated or scratch material, follow those conventions instead of the default hidden layout\./);
|
|
24
|
+
assert.match(instructions, /Do not mix assistant-only working artifacts with user deliverables unless explicitly requested\./);
|
|
25
|
+
});
|
|
26
|
+
//# sourceMappingURL=system-tools.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-tools.test.js","sourceRoot":"","sources":["../../tests/system-tools.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAElE,IAAI,CAAC,8FAA8F,EAAE,GAAG,EAAE;IACxG,MAAM,UAAU,GAAG,gBAAgB,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC;IAEjD,MAAM,YAAY,GAAG,kBAAkB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAE9D,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,2BAA2B,CAAC,CAAC;IACxD,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,mCAAmC,CAAC,CAAC;IAChE,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,wDAAwD,CAAC,CAAC;IACrF,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC;IAC/C,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC;IAC/C,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gGAAgG,EAAE,GAAG,EAAE;IAC1G,MAAM,UAAU,GAAG,gBAAgB,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC;IAEjD,MAAM,YAAY,GAAG,kBAAkB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAE9D,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,+GAA+G,CAAC,CAAC;IAC5I,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,6JAA6J,CAAC,CAAC;IAC1L,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,kGAAkG,CAAC,CAAC;AACjI,CAAC,CAAC,CAAC"}
|