opencode-idea 0.0.23 → 0.0.25

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.
@@ -1,7 +1,7 @@
1
1
  # IDE MCP:只有非 IDE 不可的能力才走 IDE
2
2
 
3
- 本会话接入了 {{projectCount}} 个 JetBrains 项目。**每个功能在所有项目下都各有一份工具**,命令名就是
4
- `<项目前缀>_<工具名>`;下面每条功能后面直接列出它在各项目里的命令名。
3
+ 本会话接入了 {{projectCount}} 个 JetBrains 项目。 **每个功能在所有项目下都各有一份工具**,命令名就是
4
+ `<项目前缀>_<工具名>`;下面每条功能后面直接列出它在各项目里的命令名。下文写 `<前缀>` 时,指的就是这一截。
5
5
 
6
6
  ## 本会话接入的项目与各自的 MCP 工具
7
7
 
@@ -17,76 +17,83 @@
17
17
  按需读文件:要了解某个子项目自己的约定,读它的 `<子项目目录>/AGENTS.md`(它不会自动进入本会话的上下文,
18
18
  本会话是 root 打开的那一个)。
19
19
 
20
- ## 总则(所有项目通用)
20
+ ## 总则 (所有项目通用)
21
21
 
22
- - 原生工具(当前工具列表里直接列出的那些)**直接调用**;不需要、也不应该用 Code Mode 的 `search` 去找。
23
- - 下面这些 IDE 工具也是原生工具:直接调用(参数按各工具 schema 传),不要包进 `execute`;它们不在 Code Mode 的工具目录里,`search` 搜不到。
22
+ - 原生工具 (工具列表里直接列出的那些,下面这些 IDE 工具也算)**直接调用** —— 参数按各自 schema 传,不要包进 `execute`,
23
+ 也不要用 Code Mode 的 `search` 去找 (它们不在那份目录里,搜不到)。
24
24
  - **只有 IDE 才有的能力才用它们**:符号级检索、项目模型、检查与构建、重构与格式化、run configuration。
25
- - **读写与搜索用原生工具**(`read` / `write` / `edit` / `grep` / `glob`):不要为读一个文件、写一个文件、搜一段文本去绕 IDE 工具。
26
- - **改完代码自己先查一遍**(`lint_files` / `build_project`,怎么挑见下面「校验」):什么时候查、查几次由你判断,但**别把校验整段省掉** —— 自己查一次,远比让用户替你发现或留到构建 / 测试炸了才暴露要便宜。
27
- - **要看某个类 / 方法 / 字段在哪定义、内部怎么实现的**(见下面「符号」):`<P>_search_symbol`(`include_external: true`)找到位置 → `<P>_read_file` 原样读它给的路径。
25
+ - **读与搜索用原生工具**(`read` / `grep` / `glob`):不要为读一个文件、搜一段文本去绕 IDE 工具。
26
+ - **改项目代码用 IDE 的编辑命令**(`<前缀>_apply_patch`,新建文件用 `<前缀>_create_new_file`),不要用原生 `write` / `edit` ——
27
+ 那两个在进程外写,IDE 手里可能还是旧内容,紧接着的 IDE 侧工具会基于旧代码干活。项目目录之外的文件才用原生那两个。
28
+ - **改完代码自己先查一遍**:用 `lint_files` / `build_project`,怎么挑见下面「校验」。
28
29
  - 某条功能下面没有你正要操作的那个项目的命令,就是那个项目没接上:提示用户执行 `/open-in-ide`,不要重试,也不要去别处找。
29
30
 
30
- ## 工具(每条第一行是各项目的命令,接着是它的用法)
31
-
32
- ### 符号(只有 IDE 的语义索引能给)
33
-
34
- **要读任何类 / 方法 / 字段的源码,就两步**:`<P>_search_symbol`(`q` 传名字,**带 `include_external: true`**)找到位置 → `<P>_read_file` 原样读它给的路径。**依赖库 / 三方包 / 平台 jar 里的实现,正是它最该用的场合**,也是 `javap` / `unzip` / 解包 jar / 按 jar 路径 `grep` 唯一的正解:**IDE 索引里那份就是项目编译时真正用的依赖**(自己拼的 jar 路径常常是另一份副本,版本对不上),读出来还是反编译源码 —— 字节码清单要来回十几次才能拼出逻辑,这边一次到位。
35
-
36
- - {{cmd_search_symbol}}
37
- **`q` 传查询文本,固定带上 `include_external: true`。** 本插件最不可替代的能力 —— 它搜的是**符号**(类 / 接口 / 方法 / 函数 / 字段 / 类型 / 常量这类**有名字的定义**)的**声明位置**,不是"哪段文本提到过它"(那是 `grep` 的事);带上 `include_external` 才会连**依赖库和标准库**一起搜,于是你能直接定位第三方库里的实现 —— 这是原生 `grep` / `glob` 够不着的地方(IDE 自己的 `search_text` / `search_file` 也只搜项目内)。
38
- - **典型用法 ①:代码里引用了某个库的 API(最常见)** —— 读代码时看到 `from fastapi import FastAPI`、`import org.apache.poi...FormulaParser`、`gorm.DeletedAt`、`from 'vue'` 这类引用时,**包名就在代码里**,直接**用「包名+符号名」当 `q` 搜**,一次定位到它的实现:
39
- - **Java**:全限定名 —— `com.nimbusds.jose.util.Base64`(实测 1 条命中 `~/.m2/.../poi-5.3.0-sources.jar!/...`)
40
- - **Go**:包名.符号 —— `gorm.DeletedAt`(实测 2 条,全在 `go/pkg/mod/gorm.io/gorm@...`)
41
- - **Python**:模块路径给得越全越准 —— `torch.nn.modules.module.Module`(目标全在最前);`torch.nn.Module` 也能把目标排进前 2
42
- - **Node/TS**:用 **import 的那层包名**(不是子模块路径)—— `vue.Teleport` 有效,`@vue/runtime-core.TeleportProps` 搜不到
43
- - **典型用法 ②:调研一个库有哪些 API** —— 包名从依赖清单里拿(pom.xml / package.json / go.mod / requirements.txt),**直接拿包名当 `q` 搜**,结果基本就落在这个库里,再读入口:
44
- - **Python**:`fastapi` → `fastapi/applications.py`、`fastapi/__init__.py`(**入口就是导出清单**:直接看到 `FastAPI`、`HTTPException` 这些公开名字)
45
- - **Java**:`poi` → `~/.m2/.../poi-5.3.0-sources.jar!/org/apache/poi/...`;读该库的入口类
46
- - **Go**:`gorm` → `go/pkg/mod/gorm.io/gorm@v1.31.0/...`
47
- - **Node/TS 例外**:包名当 `q` 搜不到(实测 `element-plus` → 0 条)。要用**代码里 import 的符号名**;包名是简单标识符时可以「包名.符号」(`vue.Teleport` 有效),但**带 `-` 或 `@scope/` 的这么拼是 0 条**(`element-plus.ElMessage`、`@vue/runtime-core.TeleportProps` 都搜不到)。而裸符号名会跨多个子项目(`ElMessage` 命中 user / admin / vcop 三处),这时用 `paths` 圈到那个 `node_modules` —— `paths: ['frontend/user/**']` 就收敛到一处。
48
- - **它只覆盖「项目已经引入」的依赖**:搜不到某个库,基本就是这个库还没进依赖 —— 别反复试:要么先把它加进依赖(pom / requirements / package.json),要么改用 web 搜索 / GitHub 看它的源码。
49
- - **同名符号往往有多处定义**(标准库一份、几个依赖各一份,还有测试和示例),所以**按代码上下文选**:看调用处 import 的是哪个包、传参是什么类型、返回路径属于哪个库 —— 别把第一行当答案。
50
- - **它返回的路径,原样交给同一个项目的 `<P>_read_file` 就是源码**:两者同属一个项目、相对路径的基准一致,所以不用拼绝对路径、不用管是什么语言 —— 压缩包里的条目它也照样读(`.class` 还会反编译)。
51
- 例:`<P>_search_symbol({ q: "UvicornWorker", include_external: true })` 给出 `../../../Library/.../uvicorn/workers.py` → `<P>_read_file({ file_path: "那个字符串" })`。
52
- - **依赖索引是按项目的**:任何依赖都用**它所在项目**的那个 MCP 工具去搜 —— 根项目的依赖用根项目的命令,子项目的依赖用子项目的命令。拿一个项目的工具去搜另一个项目的依赖,只会在那个项目自己的文件里找,**拿不到库**。
53
- - **别把这条路径交给原生 `read`**:原生 read 的基准是本会话的工作目录(根项目),拿子项目的相对路径去读会落到错误的位置。
54
- - {{cmd_get_symbol_info}}
55
- **一个符号的签名 / 文档 / 声明位置**:`filePath` + `line` + `column`。
56
- - {{cmd_analyze_calls}}
57
- **调用关系**:`symbolFqn` 传符号名,`analysisKind` 取 `INCOMING_CALLS` / `OUTGOING_CALLS`;`depth` 控层数,`childOffset` 翻页。
31
+ ## 命令执行 (所有项目通用)
32
+
33
+ - **`<前缀>` 是 IDE 项目的名字**:根项目是 `ide`,子项目是它的目录名 (如 `modelserver`) —— 一套工具属于一个项目,
34
+ 操作哪个项目就用哪个前缀的工具。
35
+ - **需要项目环境才跑得起来的命令**(依赖 IDE 里配好的 JDK / Node / Python 版本等):先看有没有现成的 run configuration ——
36
+ 有就跑它 (常驻用 `rerun`,跑完即退用 `execute`);没有、又只是一次性的命令,用原生 `shell` 并显式指定解释器,
37
+ **不要为它新建配置**。
38
+ - 其余命令:用原生 `shell`。
39
+ {{#if canCreateRunConfiguration}}
40
+ - **建 / 改 / 删运行配置,走 `idea-run-config-manager` skill**(服务化应用的配置归 `idea-standalone`):要不要建、建什么、
41
+ 怎么建、建完档案怎么记,全由它管;它落手用的就是「运行配置」里的那组工具。 **不要自己写文件、也不要自己删文件**。
42
+ {{else}}
43
+ - **建 / 改 / 删运行配置,走 `idea-run-config-manager` skill**(服务化应用的配置归 `idea-standalone`):要不要建 / 建什么 /
44
+ 档案怎么记由它管;本会话没有新建工具,"建"这一步它只能讲清配置名、实际执行的命令、工作目录、为什么值得留,
45
+ **请用户在 IDE 里创建**
46
+ {{/if}}
47
+
48
+ ## 工具 (每条第一行是各项目的命令,接着是它的用法)
49
+
50
+ ### 符号 (只有 IDE 的语义索引能给)
51
+
52
+ **要读任何类 / 方法 / 字段的源码,就两步**:`<前缀>_search_symbol`(`q` 传名字, **带 `include_external: true`**)找到位置 →
53
+ `<前缀>_read_file` 原样读它给的路径。 **依赖库 / 三方包 / 平台 jar 里的实现**正是它最该用的场合 —— IDE 索引里那份就是项目
54
+ 编译时真正用的依赖 (`javap` / 解包 jar / 按 jar 路径 `grep` 拼出来的往往是另一份,版本对不上),读出来还是反编译源码。
55
+
56
+ - {{cmd_search_symbol}} **`q` 传查询文本,固定带上 `include_external: true`。** **本插件最不可替代的能力**在于它搜的是
57
+ **符号**(类 / 接口 / 方法 / 函数 / 字段 / 类型 / 常量这类 **有名字的定义**)的 **声明位置**,不是"哪段文本提到过它"(那是
58
+ `grep` 的事);带上 `include_external` 才会连依赖库和标准库一起搜 —— 这是原生 `grep` / `glob` 够不着的地方。
59
+ - **查某个库的 API**:代码里 import 的包名就是线索,直接「包名 + 符号名」当 `q` —— Java 用全限定名
60
+ (`com.nimbusds.jose.util.Base64`)、Go 用 `pkg.Symbol`(`gorm.DeletedAt`)、Python 给全模块路径
61
+ (`torch.nn.Module`)、Node/TS 用 import 的那层包名(`vue.Teleport`)。
62
+ - **调研一个库有哪些 API**:拿包名当 `q`(`fastapi` → 入口文件就是导出清单),再读它的入口。
63
+ - **Node/TS 例外**:带 `-` 或 `@scope/` 的包名这么拼是 0 条(`element-plus`);改用 import 的符号名,并用 `paths` 圈到
64
+ 那个 `node_modules`(`paths: ['frontend/user/**']` 就收敛到一处)。
65
+ - **搜不到 = 依赖没进来**:先把它加进依赖,或改用 web 搜索 / GitHub 看源码;别反复换写法试。
66
+ - **同名符号往往有多处定义**(标准库 / 依赖 / 测试各一份):按调用处的 import 与参数类型选,别拿第一行当答案。
67
+ - **它返回的路径原样交给同一个项目的 `<前缀>_read_file`** 就是源码(压缩包里的条目也行,`.class` 会反编译)——
68
+ 别交给原生 `read`:它的基准是会话工作目录,子项目的相对路径会落到错的位置。
69
+ - **依赖索引是按项目的**:用 **它所在项目** 前缀的工具搜,拿别的项目的工具搜不到库。
70
+ - {{cmd_get_symbol_info}} **一个符号的签名 / 文档 / 声明位置**:`filePath` + `line` + `column`。
71
+ - {{cmd_analyze_calls}} **调用关系**:`symbolFqn` 传符号名,`analysisKind` 取 `INCOMING_CALLS` / `OUTGOING_CALLS`;`depth`
72
+ 控层数,`childOffset` 翻页。
58
73
 
59
74
  ### 项目与编辑器
60
75
 
61
- - {{cmd_list_directory_tree}}
62
- **项目视角的目录树**(尊重内容根与排除项):`maxDepth` 控深度。
63
- - {{cmd_get_project_modules}}
64
- **项目模块及类型**。
65
- - {{cmd_get_project_dependencies}}
66
- **项目直接声明的依赖**。
67
- - {{cmd_get_all_open_file_paths}}
68
- **用户在 IDE 里打开了哪些文件**(含当前激活的那个)。
69
- - {{cmd_open_file_in_editor}}
70
- **把文件在 IDE 里打开并激活**,给用户看。
71
-
72
- ### 重构与格式化
73
-
74
- - {{cmd_rename_refactoring}}
75
- **按符号改名**,项目内的引用一并更新。
76
- - {{cmd_reformat_file}}
77
- **按 IDE 的代码风格重排**。
78
-
79
- ### 校验
80
-
81
- - {{cmd_lint_files}}
82
- **批量检查**:`files` 传数组;只列有问题的文件。
83
- - {{cmd_get_file_problems}}
84
- **单文件检查**:`filePath`;结果在 `errors`。
85
- - {{cmd_build_project}}
86
- **构建校验**:`filesToRebuild` 可只构建指定文件;有问题返回在 `problems`,没返回即没问题。
76
+ - {{cmd_list_directory_tree}} **项目视角的目录树**(尊重内容根与排除项):`maxDepth` 控深度。
77
+ - {{cmd_get_project_modules}} **项目模块及类型**。
78
+ - {{cmd_get_project_dependencies}} **项目直接声明的依赖**。
79
+ - {{cmd_get_all_open_file_paths}} **用户在 IDE 里打开了哪些文件**(含当前激活的那个)。
80
+ - {{cmd_open_file_in_editor}} **把文件在 IDE 里打开并激活**,给用户看。
81
+
82
+ ### 改代码 (编辑 · 重构 · 校验)
83
+
84
+ - {{cmd_apply_patch}} **走 IDE 改文件**:`input` 传补丁 (两种格式都行 —— Codex 的 `*** Begin Patch` /
85
+ `*** Update File: <路径>` / `@@` / `*** End Patch`,或 unified git diff)。一个补丁里可混着 **Add / Update / Delete**
86
+ 多个操作,`Update` 还能带 `*** Move to: <新路径>` 改名; **按上下文匹配**,`@@` 不用写行号。返回
87
+ `N out of M operations applied`,对不上的 hunk 会报 `Hunk context not found`。路径必须在项目内。
88
+ - {{cmd_create_new_file}} **新建文件**:`pathInProject` + `text`;父目录自动建,`overwrite` 默认关 (文件已存在会报错)。
89
+ - {{cmd_rename_refactoring}} **按符号改名**,项目内的引用一并更新。
90
+ - {{cmd_reformat_file}} **按 IDE 的代码风格重排**。
91
+ - {{cmd_lint_files}} **批量检查**:`files` 传数组;只列有问题的文件。
92
+ - {{cmd_get_file_problems}} **单文件检查**:`filePath`;结果在 `errors`。
93
+ - {{cmd_build_project}} **构建校验**:`filesToRebuild` 可只构建指定文件;有问题返回在 `problems`,没返回即没问题。
87
94
 
88
95
  **改完代码,自己先查一遍再收尾。** 这不是流程要求,是你自己的判断 —— 查一次很便宜,而问题一旦漏到用户
89
- 看见、或留到构建 / 测试炸了才暴露,回头纠正的代价就高一个量级了。
96
+ 看见、或留到构建 / 测试炸了才暴露,回头纠正的代价就高一个量级了。 **别把校验整段省掉。**
90
97
 
91
98
  - **这次要改一大片**(多文件、跨模块、"顺手把这几处一起对齐")→ 全部改完再 `build_project` 一次。中途不查:
92
99
  半成品状态下的检查结果只会误导你。
@@ -94,72 +101,85 @@
94
101
  文件的细节再上 `get_file_problems`。
95
102
  - **改了签名 / 接口 / import / 依赖**这类"别处会跟着坏"的地方 → 走 `build_project`;只动了文件内部的实现 →
96
103
  lint 就够。
97
- - 查出来的问题**改掉,或说清为什么不改**,别把没处理的问题原样交给用户。
98
- - 校验走上面这些工具,**不要改用 `shell` 里临时自己编一遍代替**。
104
+ - 查出来的问题 **改掉,或说清为什么不改**,别把没处理的问题原样交给用户。
105
+ - 校验走上面这些工具, **不要改用 `shell` 里临时自己编一遍代替**。
99
106
  - 也别先猜"索引还没同步 / 那个环境是另一个进程"就绕开 —— 先调一次,它真看不到会明说。
100
107
 
101
108
  ### 读压缩包内的东西
102
109
 
103
- - {{cmd_read_file}}
104
- **压缩包内的条目**(路径形如 `libs/foo.jar!/com/x/Bar.class` 或 `jar://` URL)只有它能读 —— 原生 `read` 打不开压缩包,而它还能把 `.class` **反编译成源码**;「符号」那条搜出来的路径也用它(原样传即可)。
110
+ - {{cmd_read_file}} **压缩包内的条目**只有它能读 —— 原生 `read` 打不开压缩包,而它还能把 `.class` **反编译成源码**
111
+ 。两种路径写法:
112
+ `<路径>.jar!/<条目>`(相对或绝对都行)或 `jar://<**绝对**路径>.jar!/<条目>`(`jar://` 只认绝对路径);「符号」那条搜出来的路径原样传即可。
105
113
 
106
114
  ### 运行配置
107
115
 
108
- - {{cmd_get_run_configurations}}
109
- **项目里有哪些运行配置**:传 `filePath` 可列该文件的运行入口。**不要翻 `.run/` 目录** —— 存在 `.idea/` 里的那些看不到。
110
- - {{cmd_execute_run_configuration}}
111
- **跑已有配置**:Shell Script 要 `EXECUTE_IN_TERMINAL: false`;覆盖参数(`programArguments` / `workingDirectory` / `envs`)需配置支持 `supportsDynamicLaunchOverrides`。
112
- {{#if canCreateRunConfiguration}}
113
- - {{cmd_create_shell_run_configuration}}
114
- **新建项目级 Shell 配置**(`configurationName` + `scriptPath` / `scriptText` / `cloneFrom` 三选一;写 `.run/<name>.run.xml`):只支持 Shell 类型。它是**项目资产**,不是"跑命令"的手段 —— 只是要跑一条命令就用原生 `shell`。判据只有一条:**这件事以后会不会以同样的形态再发生?**
115
- - **这里只是"建"的一个入口,不是全部**:非 Shell 类型,以及**删 / 改**,都走 `idea-run-config-manager` skill —— 让用户调它(它有逐类型模板;没有模板的类型,它会让用户在 IDE 里配)。
116
- - **会 → 该建,而且你要主动提**。典型信号:用户让你做的是**重复性动作**,还会对别的环境 / 别的分支 / 下一次改表再做一遍 —— 例如改完表结构要**同步某个环境的 DDL**、跑数据库迁移或回滚、生成代码、打包、起 dev server、往某个环境部署、按固定步骤清洗数据。这时**别默默每次手搓命令**(下次还得从头猜一遍),也**别自己动手建**:**先问用户**"这个流程以后要反复跑,要不要固化成一个 Shell run configuration?",并把方案摊开:配置名、实际执行的命令(`scriptText`,或它指向的 `scriptPath`)、工作目录、为什么值得留。**同意才建**;用户说这次先这样,就照办,别再追着问。
117
- - **不会 → 用原生 `shell` 直接跑,别建**。这就是两者的分界线:原生 `shell` 是**就地执行、用完不留痕**(命令只存在于会话里);`create_shell_run_configuration` 是**把命令落盘成 `.run/<name>.run.xml`、往后反复用**(它产出的是项目文件,IDE 的 Run 窗口里也会多一项)。所以一次性的、探索性的、调试性的、参数每次都不一样的操作(查条数据、看个日志、试一条命令、临时换个路径跑一下)一律走 `shell` 跑完算 —— 这类东西建配置只是给项目留垃圾。确需项目环境的解释器时,在 `shell` 命令里显式指定、或在已有配置上单次覆盖参数,也别为这一次性的事新建配置。
118
- - **建之前先查,防泛滥**:先 `get_run_configurations` 看有没有已在做同一件事的配置 —— 有就**复用**(必要时让用户改它),别新建一个几乎一样的;同一件事**不要按参数 / 按文件 / 按环境拆成一堆配置**,变化的入参用 `programArguments` / `envs` 单次覆盖。一个项目通常就那么**几个**(构建、装依赖、起服务、迁移这类固定流程);配置数量明显长起来就是滥用信号 —— 动手前先问自己:这是项目固定流程,还是我只是想省一条 shell 命令?
119
- {{/if}}
120
- {{#if canListRunningConfigurations}}
121
- - {{cmd_list_running_configurations}}
122
- **当前真正在跑的配置**(几个实例 / 各自 pid / 退出码):停 / 重启前后都先用它看状态。
123
- {{/if}}
124
- {{#if canStopRunConfiguration}}
125
- - {{cmd_stop_run_configuration}}
126
- **停掉该配置的全部实例并等它们退出**:没在跑也返回成功。
127
- {{/if}}
128
- {{#if canRerunRunConfiguration}}
129
- - {{cmd_rerun_run_configuration}}
130
- **改完代码重启无热重载的进程**:在跑就重启、没在跑就启动;读 `started` 判断新进程是否真的起来了。不要用 `pkill` / `kill` / `shell` 代替。
131
- {{/if}}
132
- {{#if canListDeploymentServers}}
116
+ - {{cmd_get_run_configurations}} **项目里有哪些运行配置**:传 `filePath` 可列该文件的运行入口。
117
+ **别去项目目录里翻配置** ——
118
+ 存在 IDE 自己存储里 (不在项目目录)的那些,翻文件是看不到的。
119
+ - {{cmd_execute_run_configuration}} **跑已有配置**:配置里的 `EXECUTE_IN_TERMINAL` 要是 `false`(共享出去的配置都这样)
120
+ ;覆盖参数 (`programArguments` / `workingDirectory` / `envs`)需配置支持 `supportsDynamicLaunchOverrides`,否则会直接报错。
121
+ {{#if canCreateRunConfiguration}}
122
+ - {{cmd_create_run_configuration}} **新建任意类型的项目级配置**:内容来源三选一 —— `cloneFrom`(复制一个现成的,最稳;
123
+ 字段名不确定时只走它)、`configurationXml`(模板里的 XML 片段)、平台模板 + `options` / `attributes` / `envs` 补丁。
124
+ 它是 **项目资产**,不是"跑命令"的手段 —— 只是要跑一条命令就用原生 `shell`。
125
+ **要不要建、建什么、怎么建、档案怎么记,全按 `idea-run-config-manager` skill 走**。判据只有一条: **这件事以后会不会以
126
+ 同样的形态再发生?** 会 (改表后同步 DDL、跑迁移、生成代码、打包、起 dev server、往某个环境部署这类)就 **主动提**一次
127
+ "要不要固化成 run configuration",并把配置名 / 类型 / 命令 / 工作目录 / 为什么值得留摊开;不会 (查条数据、看个日志、
128
+ 试一条命令)就用原生 `shell` 跑完算,别给项目留垃圾。
129
+ - **改 / 改名 / 删**走同一组工具 (`update_run_configuration` / `delete_run_configuration`), **不要自己写文件、
130
+ 也不要自己删文件**。
131
+ - **建之前先查重**:先在 `get_run_configurations` 里找做同一件事的配置,有就复用,别新建一个几乎一样的。
132
+ - **改完别忘了同步档案**:新增 / 删除 / 改名之后,用 `idea-run-config-manager` skill 更新 `AGENTS.md` 里的档案块 ——
133
+ 档案和项目里的配置对不上,比没有档案更糟。
134
+ {{/if}}
135
+ {{#if canInspectRunConfiguration}}
136
+ - {{cmd_inspect_run_configuration}} **看一个配置的全貌**:定义 (options / envs / before-launch)、命名解析 (`win` /
137
+ mac-linux、base、env)、当前活实例、历史运行及各自的日志文件路径。 **改之前先用它拿当前值**;服务起没起来想看日志,先用
138
+ `list_running_configurations` 的 `logFile`,要翻"上一次为什么挂了"再走这里。
139
+ {{/if}}
140
+
141
+ {{#if canUpdateRunConfiguration}}
142
+
143
+ - {{cmd_update_run_configuration}} **改字段或改名**:`options` / `envs` / `attributes` 是补丁 (`null` = 删),`newName` 改名并
144
+ **连带更新别人对它的引用**、迁移历史日志。改之前先 `inspect` 拿 `configurationXml` 与当前值。
145
+ {{/if}}
146
+ {{#if canDeleteRunConfiguration}}
147
+ - {{cmd_delete_run_configuration}} **删配置**:在跑或被人引用时拒绝;`force = true` 才会连引用一起清掉。
148
+ {{/if}}
149
+ {{#if canListRunningConfigurations}}
150
+ - {{cmd_list_running_configurations}} **当前真正在跑的配置**(几个实例 / 各自 pid / 退出码,每个实例还带自己的日志文件路径
151
+ `logFile`):停 / 重启前后都先用它看状态。
152
+ {{/if}}
153
+ {{#if canStopRunConfiguration}}
154
+ - {{cmd_stop_run_configuration}} **停掉该配置的全部实例并等它们退出**:没在跑也返回成功。
155
+ {{/if}}
156
+ {{#if canRerunRunConfiguration}}
157
+ - {{cmd_rerun_run_configuration}} **启动 / 重启常驻进程**:在跑就重启、没在跑就启动 —— 改完代码要重启就直接用它,
158
+ 有没有热重载都一样;读 `started` 判断新进程是否真的起来了。这次运行的输出在 `output`,完整日志文件路径在
159
+ `fullOutputPath`。不要用 `pkill` / `kill` / `shell` 代替。
160
+ {{/if}}
161
+ {{#if canListDeploymentServers}}
133
162
 
134
163
  ### 服务器文件同步
135
164
 
136
- 往服务器传文件 / 从服务器取文件,走这一组 —— **别用 `ssh` / `rsync` / `scp` 自己拼一份**:IDE 的连接、路径映射、排除规则都在它们后面,自己拼的不是 IDE 在管的那一份。
137
-
138
- - {{cmd_list_deployment_servers}}
139
- **本项目能用的部署服务器**:名称(后面几条用它当 `serverName`)、项目级还是应用级、协议、host / port、在本项目里的路径映射,以及**项目级**的部署选项与危险组合告警。**只读 IDE 配置、不联网**;动手前先看 `warnings[]`。
140
- {{#if canUploadToDeployment}}
141
- - {{cmd_upload_to_deployment}}
142
- **把映射到的本地目录传到服务器**(等同 IDE 的 Upload to …)。`mode` 默认 `mirror` —— **会删掉服务器上多出来的文件**,使两边一致;要留住它们就传 `upload`。**破坏性操作**。
143
- {{/if}}
144
- {{#if canDownloadFromDeployment}}
145
- - {{cmd_download_from_deployment}}
146
- **把服务器上映射目录的内容拉回本地**(等同 IDE 的 Download from …),**以服务器为准**:两边都有的文件会被远端覆盖(内容相同则不写)。**没有"保留我的版本"这个选项**。
147
- {{/if}}
148
- {{#if canGetDeploymentTaskStatus}}
149
- - {{cmd_get_deployment_task_status}}
150
- **查一次传输的状态**:`handle` 用上传 / 下载返回的那个 —— **它自己不启动任何传输**。
151
- {{/if}}
152
-
153
- 上传 / 下载都在 IDE 后台跑,单次调用只等到 `waitMs`(默认 10 秒)为止;返回 `in_progress` 是**正常**的,不是失败 —— 拿 `handle` 去查进度,**别用重复调上传 / 下载代替**(那样拿不到进度)。
154
- {{/if}}
155
-
156
- ## 命令执行(所有项目通用)
157
-
158
- - 需要项目环境的命令(依赖 IDE 里配好的 JDK / Node / Python 版本等):用该项目前缀的 run configuration 工具,不要用原生 `shell`。
159
- - 写 `.run/*.run.xml` **只走 `idea-run-config-manager` skill**:它有逐类型模板(`assets/types/`),写完还要复查。**平时不要自己手写配置,也不要用一条裸命令代替配置。**
160
- {{#if canCreateRunConfiguration}}
161
- - 要固化的固定流程(判据见上:会不会以同样形态重复发生):Shell 类型用上面那个「新建项目级 Shell 配置」建;非 Shell 类型与删 / 改,交给用户调 `idea-run-config-manager` skill。
162
- {{else}}
163
- - 要固化的固定流程:把配置名、实际执行的命令、工作目录、为什么值得留讲清楚,**请用户在 IDE 里自己建** —— 当前没有能建它的工具(`idea-run-config-manager` skill 仍可加载,但缺这件工具时它也做不了新建),不要手写文件凑。
165
+ 往服务器传文件 / 从服务器取文件,走这一组 —— **别用 `ssh` / `rsync` / `scp` 自己拼一份**:IDE 的连接、路径映射、排除规则都在它们后面,自己拼的不是
166
+ IDE 在管的那一份。
167
+
168
+ - {{cmd_list_deployment_servers}} **本项目能用的部署服务器**:名称 (后面几条用它当 `serverName`)
169
+ 、项目级还是应用级、协议、host / port、在本项目里的路径映射,以及 **项目级**的部署选项与危险组合告警。 **只读 IDE
170
+ 配置、不联网**;动手前先看 `warnings[]`。
171
+ {{#if canUploadToDeployment}}
172
+ - {{cmd_upload_to_deployment}} **把映射到的本地目录传到服务器**(等同 IDE 的 Upload to …)。`mode` 默认 `mirror` ——
173
+ **会删掉服务器上多出来的文件**,使两边一致;要留住它们就传 `upload`。 **破坏性操作**。
174
+ {{/if}}
175
+ {{#if canDownloadFromDeployment}}
176
+ - {{cmd_download_from_deployment}} **把服务器上映射目录的内容拉回本地**(等同 IDE 的 Download from …), **以服务器为准**:
177
+ 两边都有的文件会被远端覆盖 (内容相同则不写)。 **没有"保留我的版本"这个选项**。
178
+ {{/if}}
179
+ {{#if canGetDeploymentTaskStatus}}
180
+ - {{cmd_get_deployment_task_status}} **查一次传输的状态**:`handle` 用上传 / 下载返回的那个 —— **它自己不启动任何传输**。
181
+ {{/if}}
182
+
183
+ 上传 / 下载都在 IDE 后台跑,单次调用只等到 `waitMs`(默认 10 秒)为止;返回 `in_progress` 是 **正常**的,不是失败 —— 拿
184
+ `handle` 去查进度, **别用重复调上传 / 下载代替**(那样拿不到进度)。
164
185
  {{/if}}
165
- - 不需要项目环境的命令:用原生 `shell`。
@@ -42,14 +42,20 @@
42
42
  * suffixes are its contract, and there is no runtime way to discover "which
43
43
  * plugin provided this tool": MCP carries no such marker.
44
44
  */
45
- export const CREATE_SHELL_RUN_CONFIGURATION_SUFFIX = 'create_shell_run_configuration';
45
+ export const CREATE_RUN_CONFIGURATION_SUFFIX = 'create_run_configuration';
46
+ export const INSPECT_RUN_CONFIGURATION_SUFFIX = 'inspect_run_configuration';
47
+ export const UPDATE_RUN_CONFIGURATION_SUFFIX = 'update_run_configuration';
48
+ export const DELETE_RUN_CONFIGURATION_SUFFIX = 'delete_run_configuration';
46
49
  export const LIST_RUNNING_CONFIGURATIONS_SUFFIX = 'list_running_configurations';
47
50
  export const STOP_RUN_CONFIGURATION_SUFFIX = 'stop_run_configuration';
48
51
  export const RERUN_RUN_CONFIGURATION_SUFFIX = 'rerun_run_configuration';
49
52
 
50
53
  /** All of them, in the order the guidance lists them: create, see, stop, restart. */
51
54
  export const RUN_LIFECYCLE_SUFFIXES = [
52
- CREATE_SHELL_RUN_CONFIGURATION_SUFFIX,
55
+ CREATE_RUN_CONFIGURATION_SUFFIX,
56
+ INSPECT_RUN_CONFIGURATION_SUFFIX,
57
+ UPDATE_RUN_CONFIGURATION_SUFFIX,
58
+ DELETE_RUN_CONFIGURATION_SUFFIX,
53
59
  LIST_RUNNING_CONFIGURATIONS_SUFFIX,
54
60
  STOP_RUN_CONFIGURATION_SUFFIX,
55
61
  RERUN_RUN_CONFIGURATION_SUFFIX,
@@ -71,6 +77,7 @@ export const UPLOAD_TO_DEPLOYMENT_SUFFIX = 'upload_to_deployment';
71
77
  export const DOWNLOAD_FROM_DEPLOYMENT_SUFFIX = 'download_from_deployment';
72
78
  export const GET_DEPLOYMENT_TASK_STATUS_SUFFIX = 'get_deployment_task_status';
73
79
 
80
+
74
81
  /** All of them: look at the servers, upload, download, then poll a transfer. */
75
82
  export const DEPLOYMENT_SUFFIXES = [
76
83
  LIST_DEPLOYMENT_SERVERS_SUFFIX,
@@ -113,7 +120,10 @@ export const servesTool = (tools, prefix, suffix) =>
113
120
  */
114
121
  export function runLifecycleCapabilities(tools, prefix) {
115
122
  return {
116
- canCreateRunConfiguration: servesTool(tools, prefix, CREATE_SHELL_RUN_CONFIGURATION_SUFFIX),
123
+ canCreateRunConfiguration: servesTool(tools, prefix, CREATE_RUN_CONFIGURATION_SUFFIX),
124
+ canInspectRunConfiguration: servesTool(tools, prefix, INSPECT_RUN_CONFIGURATION_SUFFIX),
125
+ canUpdateRunConfiguration: servesTool(tools, prefix, UPDATE_RUN_CONFIGURATION_SUFFIX),
126
+ canDeleteRunConfiguration: servesTool(tools, prefix, DELETE_RUN_CONFIGURATION_SUFFIX),
117
127
  canListRunningConfigurations: servesTool(tools, prefix, LIST_RUNNING_CONFIGURATIONS_SUFFIX),
118
128
  canStopRunConfiguration: servesTool(tools, prefix, STOP_RUN_CONFIGURATION_SUFFIX),
119
129
  canRerunRunConfiguration: servesTool(tools, prefix, RERUN_RUN_CONFIGURATION_SUFFIX),
package/src/mcp/idea.js CHANGED
@@ -127,7 +127,7 @@ export async function callTool(port, projectPath, name, args = {}, options = {})
127
127
  params: {
128
128
  protocolVersion: PROTOCOL_VERSION,
129
129
  capabilities: {},
130
- clientInfo: { name: 'opencode-idea', version: '0.0.23' },
130
+ clientInfo: { name: 'opencode-idea', version: '0.0.25' },
131
131
  },
132
132
  });
133
133
  // The IDE's Streamable-HTTP endpoint binds follow-up requests to the session