opencode-idea 0.0.18 → 0.0.19
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 +208 -51
- package/package.json +1 -1
- package/skills/idea-run-config-manager/SKILL.md +62 -0
- package/skills/idea-run-config-manager/assets/AGENTS.template.md +46 -0
- package/skills/idea-run-config-manager/assets/types/go-build.md +44 -0
- package/skills/idea-run-config-manager/assets/types/gradle.md +57 -0
- package/skills/idea-run-config-manager/assets/types/maven.md +61 -0
- package/skills/idea-run-config-manager/assets/types/node.md +30 -0
- package/skills/idea-run-config-manager/assets/types/npm.md +58 -0
- package/skills/idea-run-config-manager/assets/types/python.md +59 -0
- package/skills/idea-run-config-manager/assets/types/shell.md +77 -0
- package/skills/idea-standalone/SKILL.md +1 -1
- package/skills/idea-standalone/assets/AGENTS.template.md +12 -7
- package/src/ide-guidance.js +85 -10
- package/src/ide-guidance.template.md +53 -6
- package/src/ide-projects.js +1 -1
- package/src/mcp/enhance.js +82 -12
- package/src/mcp/idea.js +2 -2
- package/src/plugin.js +39 -38
- package/src/skill/loader.js +43 -3
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Go Build(`GoApplicationRunConfiguration`)
|
|
2
|
+
|
|
3
|
+
**用途**:跑一个 Go 程序(`go run` 那条路)。测试是另一个类型(`GoTestRunConfiguration`),**不在本模板范围**。
|
|
4
|
+
|
|
5
|
+
## 模板
|
|
6
|
+
|
|
7
|
+
```xml
|
|
8
|
+
<component name="ProjectRunConfigurationManager">
|
|
9
|
+
<configuration default="false" name="Server" type="GoApplicationRunConfiguration" factoryName="Go Application">
|
|
10
|
+
<module name="my-project" />
|
|
11
|
+
<working_directory value="$PROJECT_DIR$" />
|
|
12
|
+
<parameters value="--config ./_local/server/config.yaml" />
|
|
13
|
+
<envs>
|
|
14
|
+
<env name="ARMADA_LOG_CONFIG" value="config/logging-dev.yaml" />
|
|
15
|
+
</envs>
|
|
16
|
+
<kind value="FILE" />
|
|
17
|
+
<package value="github.com/owner/my-project" />
|
|
18
|
+
<directory value="$PROJECT_DIR$" />
|
|
19
|
+
<filePath value="$PROJECT_DIR$/cmd/server/main.go" />
|
|
20
|
+
<method v="2" />
|
|
21
|
+
</configuration>
|
|
22
|
+
</component>
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## 字段
|
|
26
|
+
|
|
27
|
+
| 字段 | 含义 | 怎么填 |
|
|
28
|
+
| --------------------------- | ------------------- | ----------------------------------------------------------------------- |
|
|
29
|
+
| `module name` | Go 模块 | 本项目真实的模块名 |
|
|
30
|
+
| `kind` | 跑什么 | `FILE`(文件)/ `DIRECTORY`(目录)/ `PACKAGE`(包)—— **和下面三个字段配套** |
|
|
31
|
+
| `filePath` | `kind=FILE` 时 | 入口文件路径 |
|
|
32
|
+
| `directory` | `kind=DIRECTORY` 时 | 目录 |
|
|
33
|
+
| `package` | `kind=PACKAGE` 时 | 包路径(实测样本里同时填了 `package`,可留) |
|
|
34
|
+
| `working_directory` | 工作目录 | `$PROJECT_DIR$` |
|
|
35
|
+
| `parameters` | 传给程序的参数 | 例如 `--config ./_local/server/config.yaml` |
|
|
36
|
+
| `envs` → `<env name value>` | 环境变量 | 没有就整块删掉 |
|
|
37
|
+
|
|
38
|
+
## 坑
|
|
39
|
+
|
|
40
|
+
- **字段写法和其他类型不一样**:这里是 `<working_directory value=…>` 这种**自定义元素名**,不是 `<option name=…>`;照别的类型的写法套会被静默忽略。
|
|
41
|
+
- **`kind` 与 `filePath`/`directory`/`package` 必须一致**:填了 `kind=FILE` 又给 `directory`,行为不可预期 —— 只填对应的那一个。
|
|
42
|
+
- `parameters` 里是**给程序**的参数,不是 `go build` 的参数;构建参数走 IDE 的 Go 配置项,别塞这里。
|
|
43
|
+
- 实测样本的 `envs` 里塞了本机路径(`localhost:6379` 之类)—— 共享出去对别人不一定适用,这类值考虑换成读本地配置文件。
|
|
44
|
+
- Go 服务通常是常驻进程:启停走 `rerun` / `stop`,不要 `pkill`(规则见 `idea-standalone`)。
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Gradle(`GradleRunConfiguration`)
|
|
2
|
+
|
|
3
|
+
**用途**:跑 Gradle 任务(`build`、`test`、`detekt`、`wasmJsBrowserDevelopmentRun` …)。
|
|
4
|
+
|
|
5
|
+
## 模板
|
|
6
|
+
|
|
7
|
+
```xml
|
|
8
|
+
<component name="ProjectRunConfigurationManager">
|
|
9
|
+
<configuration default="false" name="Build" type="GradleRunConfiguration" factoryName="Gradle">
|
|
10
|
+
<ExternalSystemSettings>
|
|
11
|
+
<option name="env">
|
|
12
|
+
<map>
|
|
13
|
+
<entry key="DEVELOPER_DIR" value="/Applications/Xcode.app/Contents/Developer" />
|
|
14
|
+
</map>
|
|
15
|
+
</option>
|
|
16
|
+
<option name="executionName" />
|
|
17
|
+
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
|
18
|
+
<option name="externalSystemIdString" value="GRADLE" />
|
|
19
|
+
<option name="scriptParameters" value="" />
|
|
20
|
+
<option name="taskDescriptions">
|
|
21
|
+
<list />
|
|
22
|
+
</option>
|
|
23
|
+
<option name="taskNames">
|
|
24
|
+
<list>
|
|
25
|
+
<option value="build" />
|
|
26
|
+
</option>
|
|
27
|
+
</option>
|
|
28
|
+
<option name="vmOptions" />
|
|
29
|
+
</ExternalSystemSettings>
|
|
30
|
+
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
|
|
31
|
+
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
|
|
32
|
+
<DebugAllEnabled>false</DebugAllEnabled>
|
|
33
|
+
<RunAsTest>false</RunAsTest>
|
|
34
|
+
<method v="2" />
|
|
35
|
+
</configuration>
|
|
36
|
+
</component>
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## 字段
|
|
40
|
+
|
|
41
|
+
| 字段 | 含义 | 怎么填 |
|
|
42
|
+
| -------------------------------------------------- | --------------- | ------------------------------------------------------------------------------------------- |
|
|
43
|
+
| `taskNames` → `<list>` | 要跑的任务 | 每个任务一个 `<option value="…" />`;`:module:task` 形式可跨模块 |
|
|
44
|
+
| `scriptParameters` | 参数 | 例如 `--stacktrace`;没有就留空 |
|
|
45
|
+
| `externalProjectPath` | Gradle 项目路径 | `$PROJECT_DIR$` |
|
|
46
|
+
| `externalSystemIdString` | 固定 | **`GRADLE`**,别改 |
|
|
47
|
+
| `env` → `<map>` | 环境变量 | `<entry key="K" value="V" />`;没有就整个 `<option name="env" />` 去掉(实测两个文件都有保留) |
|
|
48
|
+
| `executionName` / `taskDescriptions` / `vmOptions` | — | 没有就留空 / `<list />` |
|
|
49
|
+
| `RunAsTest` | 是否当测试跑 | 一般 `false` |
|
|
50
|
+
| `DebugAllEnabled` | — | `false` |
|
|
51
|
+
|
|
52
|
+
## 坑
|
|
53
|
+
|
|
54
|
+
- **`externalSystemIdString` 必须是 `GRADLE`** —— 写别的值文件会被忽略(而且没有报错)。
|
|
55
|
+
- 参数(`--info`、`-Pxxx`)放 `scriptParameters`,**不是** `taskNames`。
|
|
56
|
+
- `env` 里像 `DEVELOPER_DIR` 这种本机特定路径,共享出去对别人无效 —— 换个不带绝对路径的做法(写进 `gradle.properties`)。
|
|
57
|
+
- 多模块里跑别的模块的任务用 `:module:task`;`externalProjectPath` 仍指 Gradle 根。
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Maven(`MavenRunConfiguration`)
|
|
2
|
+
|
|
3
|
+
**用途**:跑 Maven 目标(`clean package`、`test`、`spring-boot:run` …)。
|
|
4
|
+
|
|
5
|
+
## 模板
|
|
6
|
+
|
|
7
|
+
```xml
|
|
8
|
+
<component name="ProjectRunConfigurationManager">
|
|
9
|
+
<configuration default="false" name="maven-package" type="MavenRunConfiguration" factoryName="Maven">
|
|
10
|
+
<MavenSettings>
|
|
11
|
+
<option name="myGeneralSettings" />
|
|
12
|
+
<option name="myRunnerSettings" />
|
|
13
|
+
<option name="myRunnerParameters">
|
|
14
|
+
<MavenRunnerParameters>
|
|
15
|
+
<option name="cmdOptions" />
|
|
16
|
+
<option name="profiles">
|
|
17
|
+
<set />
|
|
18
|
+
</option>
|
|
19
|
+
<option name="goals">
|
|
20
|
+
<list>
|
|
21
|
+
<option value="clean" />
|
|
22
|
+
<option value="package" />
|
|
23
|
+
</option>
|
|
24
|
+
</option>
|
|
25
|
+
<option name="multimoduleDir" />
|
|
26
|
+
<option name="pomFileName" value="pom.xml" />
|
|
27
|
+
<option name="profilesMap">
|
|
28
|
+
<map />
|
|
29
|
+
</option>
|
|
30
|
+
<option name="projectsCmdOptionValues">
|
|
31
|
+
<list />
|
|
32
|
+
</option>
|
|
33
|
+
<option name="resolveToWorkspace" value="false" />
|
|
34
|
+
<option name="workingDirPath" value="$PROJECT_DIR$" />
|
|
35
|
+
</MavenRunnerParameters>
|
|
36
|
+
</option>
|
|
37
|
+
</MavenSettings>
|
|
38
|
+
<method v="2" />
|
|
39
|
+
</configuration>
|
|
40
|
+
</component>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## 字段
|
|
44
|
+
|
|
45
|
+
| 字段 | 含义 | 怎么填 |
|
|
46
|
+
| -------------------------- | -------------- | ------------------------------------------------------ |
|
|
47
|
+
| `goals` → `<list>` | 要跑的目标 | 每个目标一个 `<option value="…" />`,顺序就是命令行顺序 |
|
|
48
|
+
| `pomFileName` | 哪个 pom | 根项目 `pom.xml`;子模块填它自己的 pom 文件名 |
|
|
49
|
+
| `workingDirPath` | 工作目录 | `$PROJECT_DIR$` 或其子目录(实测有直接指向子模块目录的) |
|
|
50
|
+
| `profiles` / `profilesMap` | Maven profile | 不指定就保持 `<set />` / `<map />` |
|
|
51
|
+
| `cmdOptions` | 额外命令行参数 | 例如 `-DskipTests`;没有就留空 |
|
|
52
|
+
| `multimoduleDir` | 多模块根目录 | 单模块留空 |
|
|
53
|
+
| `projectsCmdOptionValues` | 项目级参数列表 | 一般 `<list />` |
|
|
54
|
+
| `resolveToWorkspace` | — | 保持 `false` |
|
|
55
|
+
|
|
56
|
+
## 坑
|
|
57
|
+
|
|
58
|
+
- **嵌套层级别少**:`MavenSettings` → `myRunnerParameters` → `MavenRunnerParameters`,三层都在才认;空的 `<set />` / `<map />` / `<list />` **不要删**(实测文件里都有)。
|
|
59
|
+
- `pomFileName` 只写**文件名**,不要写相对路径。
|
|
60
|
+
- 多模块项目:要么 `pomFileName` 指子模块,要么用 `multimoduleDir` 指根 —— 二选一,别都填。
|
|
61
|
+
- 跑测试类目标(`-Dtest=…`)时 `cmdOptions` 里带 `-D`,不要放进 `goals`。
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Node.js(`NodeJSConfigurationType`)
|
|
2
|
+
|
|
3
|
+
**用途**:直接跑一个 `.js` / `.mjs` 入口。**跑 `package.json` 脚本请用 [npm.md](npm.md)** —— 那是另一回事。
|
|
4
|
+
|
|
5
|
+
⚠️ **本模板验证程度有限**:`type` 与下面三个属性已由实物确认;**环境变量、Node 解释器等字段没有实物样本**,照抄本项目里已有配置的写法,或让用户在 IDE 里补,不要凭名字猜。
|
|
6
|
+
|
|
7
|
+
## 模板(已验证的最小形态)
|
|
8
|
+
|
|
9
|
+
```xml
|
|
10
|
+
<component name="ProjectRunConfigurationManager">
|
|
11
|
+
<configuration default="false" name="Drop metadb" type="NodeJSConfigurationType" path-to-js-file="$PROJECT_DIR$/packages/nocodb-legacy/src/run/deleteMetaDb.js" working-dir="$PROJECT_DIR$/packages/nocodb-legacy/src/run">
|
|
12
|
+
<method v="2" />
|
|
13
|
+
</configuration>
|
|
14
|
+
</component>
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## 字段(已验证)
|
|
18
|
+
|
|
19
|
+
| 字段 | 形态 | 含义 |
|
|
20
|
+
| ------------------------ | -------- | ----------------------------------- |
|
|
21
|
+
| `path-to-js-file` | **属性** | 入口 JS 文件,`$PROJECT_DIR$/…` |
|
|
22
|
+
| `working-dir` | **属性** | 工作目录 |
|
|
23
|
+
| `application-parameters` | **属性** | 传给脚本的参数(实物里是 `dev` 这种) |
|
|
24
|
+
| `factoryName` | 属性 | `Node.js`(实测有写、也有省略) |
|
|
25
|
+
|
|
26
|
+
## 坑
|
|
27
|
+
|
|
28
|
+
- **这个类型用属性写法,不是 `<option>` 子元素** —— 照别的类型套会静默失效。
|
|
29
|
+
- **能不用它就不用**:绝大多数"跑前端/跑服务"的场景,`js.build_tools.npm`(`<command value="run">` + 脚本名)才是团队共享配置的主流写法,也更好懂。
|
|
30
|
+
- 需要环境变量(`dotenv`)或指定 Node 版本时,本模板没有可用字段 —— **照项目里已有的 Node.js 配置抄**,或让用户在 IDE 里配好再让你同步文档。
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# npm / yarn / pnpm(`js.build_tools.npm`)
|
|
2
|
+
|
|
3
|
+
**用途**:跑 `package.json` 里的脚本(dev / build / test)。三种包管理器**共用同一个 `type`**,靠 `<package-manager>` 区分。
|
|
4
|
+
|
|
5
|
+
## 模板
|
|
6
|
+
|
|
7
|
+
```xml
|
|
8
|
+
<component name="ProjectRunConfigurationManager">
|
|
9
|
+
<configuration default="false" name="frontend" type="js.build_tools.npm">
|
|
10
|
+
<package-json value="$PROJECT_DIR$/frontend/package.json" />
|
|
11
|
+
<command value="run" />
|
|
12
|
+
<scripts>
|
|
13
|
+
<script value="dev" />
|
|
14
|
+
</scripts>
|
|
15
|
+
<node-interpreter value="project" />
|
|
16
|
+
<package-manager value="npm" />
|
|
17
|
+
<envs />
|
|
18
|
+
<method v="2" />
|
|
19
|
+
</configuration>
|
|
20
|
+
</component>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## 字段
|
|
24
|
+
|
|
25
|
+
| 字段 | 含义 | 怎么填 |
|
|
26
|
+
| ---------------------------- | ----------------- | ----------------------------------------------------------------- |
|
|
27
|
+
| `package-json` | 哪个 package.json | `$PROJECT_DIR$/子目录/package.json` |
|
|
28
|
+
| `command` | npm 子命令 | 跑脚本用 `run` |
|
|
29
|
+
| `scripts` → `<script value>` | 脚本名 | `package.json` 里 `scripts` 的 key(`dev` / `build` / `test:unit`) |
|
|
30
|
+
| `package-manager` | 用哪个包管理器 | `npm` / `yarn` / `pnpm`(实测值就是这三个) |
|
|
31
|
+
| `node-interpreter` | Node 来源 | `project`(用项目里配的);用系统就填绝对路径 |
|
|
32
|
+
| `envs` | 环境变量 | 空就 `<envs />` |
|
|
33
|
+
| `method` | 前置任务 | 默认空 `<method v="2" />`;需要"先跑别的再跑这个"才填(见下) |
|
|
34
|
+
|
|
35
|
+
## 跑之前先跑别的(build → dev)
|
|
36
|
+
|
|
37
|
+
`<method v="2">` 里可以带前置任务:
|
|
38
|
+
|
|
39
|
+
```xml
|
|
40
|
+
<method v="2">
|
|
41
|
+
<option name="NpmBeforeRunTask" enabled="true">
|
|
42
|
+
<package-json value="$PROJECT_DIR$/package.json" />
|
|
43
|
+
<command value="run" />
|
|
44
|
+
<scripts>
|
|
45
|
+
<script value="build" />
|
|
46
|
+
</scripts>
|
|
47
|
+
<node-interpreter value="project" />
|
|
48
|
+
<envs />
|
|
49
|
+
</option>
|
|
50
|
+
</method>
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## 坑
|
|
54
|
+
|
|
55
|
+
- **`<package-manager>` 决定实际用哪个包管理器跑**:项目用 pnpm 而这里写 `npm`,脚本里 `pnpm xxx` 的调用会跟外层打架。
|
|
56
|
+
- 实测文件里还出现过两个 `<EXTENSION>`(better_direnv、StartBrowser)—— 那是别人本机插件加的,**别抄**,它们依赖本机插件,别人机器上没有。
|
|
57
|
+
- 单仓多包(pnpm workspace / npm workspaces):`package-json` 指到**具体那个包**,不要指根再靠 scripts 转发。
|
|
58
|
+
- `scripts` 里写多个脚本 = 按顺序跑同一个命令,不等于"先 A 后 B";顺序依赖要用上面的前置任务。
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Python(`PythonConfigurationType`)
|
|
2
|
+
|
|
3
|
+
**用途**:跑一个 Python 脚本(通常是服务入口)。**这个类型来自 Python 插件**(PyCharm 一定有,IDEA 装了 Python 插件也有)。
|
|
4
|
+
|
|
5
|
+
## 模板
|
|
6
|
+
|
|
7
|
+
```xml
|
|
8
|
+
<component name="ProjectRunConfigurationManager">
|
|
9
|
+
<configuration default="false" name="backend" type="PythonConfigurationType" factoryName="Python">
|
|
10
|
+
<module name="my-project" />
|
|
11
|
+
<option name="ENV_FILES" value="" />
|
|
12
|
+
<option name="INTERPRETER_OPTIONS" value="" />
|
|
13
|
+
<option name="PARENT_ENVS" value="true" />
|
|
14
|
+
<envs>
|
|
15
|
+
<env name="PYTHONUNBUFFERED" value="1" />
|
|
16
|
+
</envs>
|
|
17
|
+
<option name="SDK_HOME" value="" />
|
|
18
|
+
<option name="SDK_NAME" value="my-project" />
|
|
19
|
+
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/backend/app" />
|
|
20
|
+
<option name="IS_MODULE_SDK" value="false" />
|
|
21
|
+
<option name="ADD_CONTENT_ROOTS" value="true" />
|
|
22
|
+
<option name="ADD_SOURCE_ROOTS" value="true" />
|
|
23
|
+
<option name="DEBUG_JUST_MY_CODE" value="false" />
|
|
24
|
+
<option name="RUN_TOOL" value="" />
|
|
25
|
+
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/backend/app/main.py" />
|
|
26
|
+
<option name="PARAMETERS" value="" />
|
|
27
|
+
<option name="SHOW_COMMAND_LINE" value="false" />
|
|
28
|
+
<option name="EMULATE_TERMINAL" value="false" />
|
|
29
|
+
<option name="MODULE_MODE" value="false" />
|
|
30
|
+
<option name="REDIRECT_INPUT" value="false" />
|
|
31
|
+
<option name="INPUT_FILE" value="" />
|
|
32
|
+
<method v="2" />
|
|
33
|
+
</configuration>
|
|
34
|
+
</component>
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## 字段
|
|
38
|
+
|
|
39
|
+
| 字段 | 含义 | 怎么填 |
|
|
40
|
+
| --------------------------------------------------------------------------------------------------------------- | ---------------------------------- | ------------------------------------------------------------------------------- |
|
|
41
|
+
| `module name` | 用哪个模块 | **必须是这个项目里真实存在的模块名**,拿不准就问用户 |
|
|
42
|
+
| `SCRIPT_NAME` | 入口脚本 | `$PROJECT_DIR$/…/main.py` |
|
|
43
|
+
| `PARAMETERS` | 传给脚本的参数 | 没有就空 |
|
|
44
|
+
| `WORKING_DIRECTORY` | 工作目录 | `$PROJECT_DIR$/…`(实测指向 `backend/app` 这种应用目录) |
|
|
45
|
+
| `SDK_NAME` / `IS_MODULE_SDK` / `SDK_HOME` | 用哪个解释器 | `IS_MODULE_SDK=false` + `SDK_NAME` 填项目里配好的解释器名;本机路径写 `SDK_HOME` |
|
|
46
|
+
| `ENV_FILES` | dotenv 文件 | 没有就空 |
|
|
47
|
+
| `PARENT_ENVS` | 继承父环境变量 | `true` |
|
|
48
|
+
| `envs` → `<env name value>` | 额外环境变量 | 例如 `PYTHONUNBUFFERED=1`(让日志实时) |
|
|
49
|
+
| `ADD_CONTENT_ROOTS` / `ADD_SOURCE_ROOTS` | 把项目根 / 源码根加进 `PYTHONPATH` | `true` |
|
|
50
|
+
| `DEBUG_JUST_MY_CODE` | 只断自己的代码 | `false` |
|
|
51
|
+
| `MODULE_MODE` | 当模块跑(`python -m`) | 一般 `false` |
|
|
52
|
+
| `SHOW_COMMAND_LINE` / `EMULATE_TERMINAL` / `REDIRECT_INPUT` / `INPUT_FILE` / `INTERPRETER_OPTIONS` / `RUN_TOOL` | — | 按实测默认值留空 / `false` |
|
|
53
|
+
|
|
54
|
+
## 坑
|
|
55
|
+
|
|
56
|
+
- **`module name` 与 `SDK_NAME` 必须是本项目真实的模块 / 解释器名** —— 写错 IDE 会用不了,但不一定立刻报错。**先查项目里已有的 Python 配置照抄**,查不到就问用户。
|
|
57
|
+
- 实测样本里带一个 `<EXTENSION ID="PythonCoverageRunConfigurationExtension" …/>`(覆盖率插件加的),**别抄**。
|
|
58
|
+
- 依赖装在哪决定能不能跑:走项目解释器 + `ADD_SOURCE_ROOTS`,不要指向本机某个 venv 的绝对路径。
|
|
59
|
+
- 服务类进程改代码后要重启才生效(没有热重载)—— 这条属于 `idea-standalone` 的纪律。
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Shell Script(`ShConfigurationType`)
|
|
2
|
+
|
|
3
|
+
**用途**:一条固定命令或一个脚本文件 —— 构建、打包、生成代码、跑迁移、同步某个环境的 DDL、起服务。**绝大多数"反复要跑的固定流程"都归它,先别换类型。**
|
|
4
|
+
|
|
5
|
+
## 二选一:脚本文本 / 脚本文件
|
|
6
|
+
|
|
7
|
+
| 形态 | 关键字段 | 用在什么时候 |
|
|
8
|
+
| ------------------ | --------------------------------------------------------------------- | --------------------------------------- |
|
|
9
|
+
| **脚本文本**(默认) | `EXECUTE_SCRIPT_FILE="false"` + `SCRIPT_TEXT` 有值 + `SCRIPT_PATH` 空 | 就一条命令,不需要单独脚本文件 |
|
|
10
|
+
| **脚本文件** | `EXECUTE_SCRIPT_FILE="true"` + `SCRIPT_PATH` 有值 + `SCRIPT_TEXT` 空 | 命令已经写成仓库里的 `.sh`,或脚本比较长 |
|
|
11
|
+
|
|
12
|
+
## 模板:脚本文本形态
|
|
13
|
+
|
|
14
|
+
```xml
|
|
15
|
+
<component name="ProjectRunConfigurationManager">
|
|
16
|
+
<configuration default="false" name="db-migrate" type="ShConfigurationType" factoryName="Shell Script">
|
|
17
|
+
<option name="SCRIPT_TEXT" value="pnpm -C packages/db generate pnpm -C packages/db migrate:deploy" />
|
|
18
|
+
<option name="INDEPENDENT_SCRIPT_PATH" value="true" />
|
|
19
|
+
<option name="SCRIPT_PATH" value="" />
|
|
20
|
+
<option name="SCRIPT_OPTIONS" value="" />
|
|
21
|
+
<option name="INDEPENDENT_SCRIPT_WORKING_DIRECTORY" value="true" />
|
|
22
|
+
<option name="SCRIPT_WORKING_DIRECTORY" value="$PROJECT_DIR$" />
|
|
23
|
+
<option name="INDEPENDENT_INTERPRETER_PATH" value="true" />
|
|
24
|
+
<option name="INTERPRETER_PATH" value="" />
|
|
25
|
+
<option name="INTERPRETER_OPTIONS" value="" />
|
|
26
|
+
<option name="EXECUTE_IN_TERMINAL" value="false" />
|
|
27
|
+
<option name="EXECUTE_SCRIPT_FILE" value="false" />
|
|
28
|
+
<envs />
|
|
29
|
+
<method v="2" />
|
|
30
|
+
</configuration>
|
|
31
|
+
</component>
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## 模板:脚本文件形态
|
|
35
|
+
|
|
36
|
+
```xml
|
|
37
|
+
<component name="ProjectRunConfigurationManager">
|
|
38
|
+
<configuration default="false" name="go-server" type="ShConfigurationType" factoryName="Shell Script">
|
|
39
|
+
<option name="SCRIPT_TEXT" value="" />
|
|
40
|
+
<option name="INDEPENDENT_SCRIPT_PATH" value="true" />
|
|
41
|
+
<option name="SCRIPT_PATH" value="$PROJECT_DIR$/go/run.sh" />
|
|
42
|
+
<option name="SCRIPT_OPTIONS" value="" />
|
|
43
|
+
<option name="INDEPENDENT_SCRIPT_WORKING_DIRECTORY" value="true" />
|
|
44
|
+
<option name="SCRIPT_WORKING_DIRECTORY" value="$PROJECT_DIR$/go" />
|
|
45
|
+
<option name="INDEPENDENT_INTERPRETER_PATH" value="true" />
|
|
46
|
+
<option name="INTERPRETER_PATH" value="/bin/zsh" />
|
|
47
|
+
<option name="INTERPRETER_OPTIONS" value="" />
|
|
48
|
+
<option name="EXECUTE_IN_TERMINAL" value="false" />
|
|
49
|
+
<option name="EXECUTE_SCRIPT_FILE" value="true" />
|
|
50
|
+
<envs />
|
|
51
|
+
<method v="2" />
|
|
52
|
+
</configuration>
|
|
53
|
+
</component>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## 字段
|
|
57
|
+
|
|
58
|
+
| 字段 | 含义 | 怎么填 |
|
|
59
|
+
| --------------------------------------------------------------------------------------------------- | ------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
60
|
+
| `SCRIPT_TEXT` | 要执行的命令 | **多行用 ` ` 分隔**(实测这么存的),不要塞真实换行 |
|
|
61
|
+
| `EXECUTE_SCRIPT_FILE` | `false` 跑文本 / `true` 跑文件 | 决定上面两个字段谁生效 |
|
|
62
|
+
| `SCRIPT_PATH` | 脚本路径 | `$PROJECT_DIR$/...` |
|
|
63
|
+
| `SCRIPT_OPTIONS` | 传给脚本的参数 | 没有就留空 |
|
|
64
|
+
| `SCRIPT_WORKING_DIRECTORY` | 工作目录 | `$PROJECT_DIR$` 或其子目录;留空 = 项目根 |
|
|
65
|
+
| `INDEPENDENT_SCRIPT_PATH` / `INDEPENDENT_SCRIPT_WORKING_DIRECTORY` / `INDEPENDENT_INTERPRETER_PATH` | 三处"各自独立"开关 | **保持实测值 `true`,别改** |
|
|
66
|
+
| `INTERPRETER_PATH` | 解释器 | macOS/Linux:`/bin/zsh`、`/bin/bash`,或**留空用 IDE 默认**(实测留空也能跑);Windows:`C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe` |
|
|
67
|
+
| `INTERPRETER_OPTIONS` | 解释器参数 | 一般空 |
|
|
68
|
+
| `EXECUTE_IN_TERMINAL` | 是否开终端跑 | **`false`** —— 共享出去的配置不要依赖本机终端 |
|
|
69
|
+
| `envs` | 环境变量 | 没有就 `<envs />`;有就 `<env name="K" value="V" />` |
|
|
70
|
+
|
|
71
|
+
## 坑
|
|
72
|
+
|
|
73
|
+
- **`EXECUTE_IN_TERMINAL` 必须是 `false`**:引导文本里"执行 Shell 配置要 `EXECUTE_IN_TERMINAL: false`"说的就是它,开成 true 的配置到了别人机器上行为不一样。
|
|
74
|
+
- **`INDEPENDENT_INTERPRETER_PATH` 实测有两种**:解释器填了绝对路径的用 `true`(老写法),Windows 相对写法的那两个文件是 `false`。**照抄同项目里已有的那个**,别自己换。
|
|
75
|
+
- Windows 解释器两种斜杠都实测出现过,`C:/...` 更稳(反斜杠在 XML 里要转义)。
|
|
76
|
+
- `factoryName` 可以省略(实测有省略也能被认),但同一项目里**跟着已有文件的写法**更一致。
|
|
77
|
+
- 文件里可以有 XML 注释说明这条配置实际跑的是什么(实测项目就这么写的),有助于后来的人看懂。
|
|
@@ -27,7 +27,7 @@ description: "为项目生成/维护 standalone(启动收口只有 IDEA run conf
|
|
|
27
27
|
第二段的 `run configuration` 列、以及端口,**只能来自这里** —— 不需要再去逐个翻 `.run/*.run.xml`,那份列表已经是配置的结果。
|
|
28
28
|
- 项目类型(`package.json` / `pom.xml` / `go.mod` / `pyproject.toml` / `Cargo.toml`)→ 决定第三段的热重载列。
|
|
29
29
|
- 端口:先看上面那份启动细节里有没有;项目自身配置里也读不到就**问用户**,不要编。
|
|
30
|
-
- `run configuration` 列表里缺某个应用:**交给用户** ——
|
|
30
|
+
- `run configuration` 列表里缺某个应用:**交给用户** —— 让他调 `idea-run-config-manager` skill 去建(那个 skill 管这个项目 run configuration 的增 / 删 / 改;工具列表里没有它时,请用户自己建一个),建完**重新查一次**。不要手搓启动命令,也不要自己写 `.run/*.run.xml`。
|
|
31
31
|
- 补齐缺口:哪些应用进 standalone、哪些配置名对不上、端口与热重载不确定 —— **逐条向用户确认**,不猜。
|
|
32
32
|
- 生成或更新前先读 [assets/AGENTS.template.md](assets/AGENTS.template.md),确认三段与各段生成提示。
|
|
33
33
|
|
|
@@ -33,24 +33,29 @@
|
|
|
33
33
|
一行一个应用,**按操作系统分成两张表**:macOS / Linux 一张,Windows 一张。同一份项目在不同平台上的启动方式往往不一样(解释器路径、脚本、
|
|
34
34
|
甚至该用哪个配置都不同 —— 比如某个配置的 `INTERPRETER_PATH` 指向 Windows PowerShell,在 macOS 上根本起不来),
|
|
35
35
|
所以**每张表里的 `run configuration` 必须是该平台上真正存在、真正能跑的那个名字**,不要把 Windows 上能用的配置写进 macOS 那张表。
|
|
36
|
-
某个应用在某平台上起不来,就在该表里注明(或干脆不列),别让 AI
|
|
36
|
+
某个应用在某平台上起不来,就在该表里注明(或干脆不列),别让 AI 在一个平台上去跑另一个平台的配置。哪个平台用哪张表,不要自己猜。
|
|
37
37
|
|
|
38
38
|
`run configuration` 列**必须是 `<前缀>_get_run_configurations` 里真实存在的名字**,不凭印象写;缺配置就**交给用户**:
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
让他调 `idea-run-config-manager` skill 去建(那个 skill 管这个项目 run configuration 的增 / 删 / 改),不要手搓启动命令,也不要自己写 `.run/*.run.xml`。
|
|
40
|
+
**怎么跑**写走哪条工具:常驻 / 服务化的配置一律 `rerun`(在跑就重启、没在跑就启动),**不要**用 `execute` —— 它是 Run 路径,对常驻进程会起出重复实例;细节见「跑应用只用 rerun」那条。
|
|
41
|
+
**端口**写清"固定 / 默认 / 被占用即启动失败";读不到就**问用户**,不要编。**服务化的应用一定有端口**,这一格是它区别于固定流程的地方。
|
|
42
|
+
**何时跑**列写**什么时候起它**(日常开发 / 只在某个流程之前 / 联调时才起 …);多数应用留这一格就够,起不来就写清触发场景。
|
|
43
|
+
**跑前做**列写**跑之前要先做的事**:**多数应用留空**。只有确实"得先做点什么才能起"时才写,而且**按顺序写清第 1 步、第 2 步、第 3 步**(例如 `1. 装依赖 2. 构建 3. 起前置服务`);
|
|
41
44
|
这些事**用文字写出来**(AI 照这段文本自己按序去做)。这类前置事项往往没被写成 run configuration,所以必须在这里说明,否则 AI 直接 rerun 会拿到一个起不来的进程。
|
|
42
45
|
**哪个应用必须先起来**也要写明(例如前端 dev server 的 proxy 指向本机后端)。与本项目无关的应用不写。
|
|
46
|
+
**说明**写剩下的坑与依赖关系(依赖谁、跟别的应用什么先后)。**目录**这类配置里本来就有的字段不要单开一格 —— 会跟配置变旧而对不上。
|
|
47
|
+
**列宽按同一约定**(中文两字 = 四个 dash,英文按字符数),**两个块各自的 macOS / Linux 表、Windows 表,公共列一一对位、宽度一致**(谁 / `run configuration` / `怎么跑` / `何时跑` / `跑前做` / `说明`);**各自特有的列插在自己的语义位置上** —— 应用表多一格 `端口`,因为服务化应用一定有端口,`idea-run-config-manager` 的流程表没有这一格。两个块住在同一份 `AGENTS.md` 里,公共列对上了才看得出哪几行是服务、哪几行是固定流程。**某格不适用就留空,不要写 `-`;填行时别去改表头的空格。**
|
|
43
48
|
<!-- 生成提示:end -->
|
|
44
49
|
|
|
45
50
|
### macOS / Linux
|
|
46
51
|
|
|
47
|
-
| 应用 | run configuration |
|
|
48
|
-
| ---- | ----------------- |
|
|
52
|
+
| 应用 | run configuration | 怎么跑 | 端口 | 何时跑 | 跑前做 | 说明 |
|
|
53
|
+
| ---- | ----------------- | ------ | ---- | ------ | ------ | ---- |
|
|
49
54
|
|
|
50
55
|
### Windows
|
|
51
56
|
|
|
52
|
-
| 应用 | run configuration |
|
|
53
|
-
| ---- | ----------------- |
|
|
57
|
+
| 应用 | run configuration | 怎么跑 | 端口 | 何时跑 | 跑前做 | 说明 |
|
|
58
|
+
| ---- | ----------------- | ------ | ---- | ------ | ------ | ---- |
|
|
54
59
|
|
|
55
60
|
## 三、热重载矩阵:改代码后要不要提醒重启
|
|
56
61
|
|
package/src/ide-guidance.js
CHANGED
|
@@ -14,6 +14,25 @@
|
|
|
14
14
|
// 2. Only IDE-only capability is routed here; reading, writing and searching
|
|
15
15
|
// stay on the native tools.
|
|
16
16
|
//
|
|
17
|
+
// 校验 (lint / build) is one place that also carries a *when*, because the tools
|
|
18
|
+
// are not there to be offered — they are there to be used unprompted, and the
|
|
19
|
+
// model simply skips them (observed: it went and compiled by hand in `shell`
|
|
20
|
+
// instead, then reported success). The rule is a decision, not a mandate: batch
|
|
21
|
+
// edits → one `build_project` at the end, single-file fiddling → `lint_files`
|
|
22
|
+
// once when the round is over, never one check per keystroke and never zero
|
|
23
|
+
// checks. Spelling out both failure modes is the point — "always check" is as
|
|
24
|
+
// wrong as "never check", and only the model knows which round it is in.
|
|
25
|
+
//
|
|
26
|
+
// 符号 carries the same kind of *when*, for the same reason. In the observed
|
|
27
|
+
// session (a JetBrains plugin job on the IntelliJ Platform API) the model ran 398
|
|
28
|
+
// shells and mentioned `javap` 175 times in its own reasoning while mentioning
|
|
29
|
+
// `search_symbol` three times, two of which were after the user insisted. So the
|
|
30
|
+
// text now names the *situation* first ("you want to know how this class or
|
|
31
|
+
// method is implemented"), then bans the route it actually takes (`javap`,
|
|
32
|
+
// `unzip` on a hand-assembled jar path) with the reason that wins that argument:
|
|
33
|
+
// the IDE index holds the copy the project compiles against, and it hands back
|
|
34
|
+
// decompiled source instead of a bytecode listing.
|
|
35
|
+
//
|
|
17
36
|
// ## 一个会话,多个项目,多套前缀
|
|
18
37
|
//
|
|
19
38
|
// 每个接入的项目都用**自己的** MCP server 注册(root = `ide`,子项目 = 目录名),
|
|
@@ -27,12 +46,21 @@
|
|
|
27
46
|
// The `{{#if can…}}` blocks gate the companion plugin's tools (`mcp/enhance.js`),
|
|
28
47
|
// which only exist when the user installed it. Nothing in the document says so:
|
|
29
48
|
// which plugin a tool came from is this plugin's plumbing, not the model's
|
|
30
|
-
// business — it either sees the tool or it does not.
|
|
49
|
+
// business — it either sees the tool or it does not. The deployment section is
|
|
50
|
+
// gated on ONE of those flags (`canListDeploymentServers`) rather than on a flag of
|
|
51
|
+
// its own: the four tools are registered together, so one of them answers for the
|
|
52
|
+
// section — heading included, which is why the gate wraps the `###` line too.
|
|
31
53
|
|
|
32
54
|
import { readFileSync } from 'node:fs';
|
|
33
55
|
|
|
34
56
|
import { IDE_LABELS } from './ide-projects.js';
|
|
35
|
-
import {
|
|
57
|
+
import {
|
|
58
|
+
DEPLOYMENT_SUFFIXES,
|
|
59
|
+
RUN_LIFECYCLE_SUFFIXES,
|
|
60
|
+
deploymentCapabilities,
|
|
61
|
+
runLifecycleCapabilities,
|
|
62
|
+
servesTool,
|
|
63
|
+
} from './mcp/enhance.js';
|
|
36
64
|
import { renderTemplate } from './template.js';
|
|
37
65
|
|
|
38
66
|
/** The prompt document, next to this module so it ships with it. */
|
|
@@ -41,6 +69,17 @@ const TEMPLATE_PATH = new URL('ide-guidance.template.md', import.meta.url);
|
|
|
41
69
|
/** Read once: the file is fixed for the life of the process, and this runs per request. */
|
|
42
70
|
const TEMPLATE = readFileSync(TEMPLATE_PATH, 'utf8');
|
|
43
71
|
|
|
72
|
+
/**
|
|
73
|
+
* 配套插件那两组工具的后缀全集 —— 判据只有一条:**这张表里的工具按项目分别存在**。
|
|
74
|
+
*
|
|
75
|
+
* 表外(内置 MCP Server 自带的那批)是每个项目都有的,列命令名时不需要看快照;表内的必须
|
|
76
|
+
* 逐项目核对(见 {@link commandVariables})。两组都收进来而不是只收部署那组:它们的
|
|
77
|
+
* 存在性本来就按项目、按 IDE 不同 —— 启停工具取决于装没装配套插件,部署工具还多一道
|
|
78
|
+
* "是不是 Ultimate"。把 run-lifecycle 留在表外,等于默认"一个项目装了、别的项目也装了",
|
|
79
|
+
* 而那只是个默认,不是事实。
|
|
80
|
+
*/
|
|
81
|
+
const ENHANCE_SUFFIXES = new Set([...RUN_LIFECYCLE_SUFFIXES, ...DEPLOYMENT_SUFFIXES]);
|
|
82
|
+
|
|
44
83
|
/**
|
|
45
84
|
* 「本会话有哪些项目、各自用哪个 MCP 工具前缀」的清单。
|
|
46
85
|
*
|
|
@@ -71,18 +110,27 @@ function routeTableFor(projects) {
|
|
|
71
110
|
* 每条功能在各项目下的命令名,预渲染成一行。
|
|
72
111
|
*
|
|
73
112
|
* 变量名**直接扫模板得到**:模板里写 `{{cmd_search_symbol}}`,这里就填
|
|
74
|
-
* ``
|
|
113
|
+
* `` `根项目 ide_search_symbol` | `modelserver modelserver_search_symbol` ``。
|
|
75
114
|
* 所以模板增删一条工具不需要动这里的代码,也不会出现"模板里写了、代码忘了给值"的空行。
|
|
76
115
|
*
|
|
77
|
-
*
|
|
116
|
+
* **配套插件那条线要逐项目过滤**(见 {@link ENHANCE_SUFFIXES}):内置工具每个项目都有,列全即可;
|
|
117
|
+
* 而 `idea-mcp-enhance` 的工具是**按项目分别存在**的(装了插件的那个 IDE 有,另一个可能没有;
|
|
118
|
+
* 部署那组还要求 Ultimate)。它常常同进同出,但"通常"不是"总是" —— 一旦不一致,列全就会在
|
|
119
|
+
* 缺工具的那个项目下点名一个模型调不到的命令,而那正是这整个模块要防的失败。
|
|
120
|
+
* 过滤不会产生空行:每条 bullet 的 `{{#if}}` 用的是**并集**判断(任一项目有即渲染),
|
|
121
|
+
* 并集为真 ⇒ 至少一个项目通过过滤。
|
|
122
|
+
*
|
|
123
|
+
* @param {ReadonlyArray<{ label: string, server: string, isRoot: boolean }>} projects
|
|
124
|
+
* @param {Record<string, unknown> | undefined} tools 本次请求的工具快照
|
|
78
125
|
*/
|
|
79
|
-
function commandVariables(projects) {
|
|
126
|
+
function commandVariables(projects, tools) {
|
|
80
127
|
/** @type {Record<string, string>} */
|
|
81
128
|
const variables = {};
|
|
82
129
|
for (const match of TEMPLATE.matchAll(/\{\{\s*(cmd_[A-Za-z0-9_]+)\s*\}\}/g)) {
|
|
83
130
|
const name = match[1];
|
|
84
131
|
const suffix = name.slice('cmd_'.length);
|
|
85
132
|
variables[name] = projects
|
|
133
|
+
.filter((project) => !ENHANCE_SUFFIXES.has(suffix) || servesTool(tools, `${project.server}_`, suffix))
|
|
86
134
|
// 每条都写清"哪个项目 → 哪个命令":根项目直接用它的角色名,子项目用目录名。
|
|
87
135
|
// 不写 `.`/目录名这种需要回看清单才能解读的代号 —— 模型读每条功能时不必回头查表。
|
|
88
136
|
.map((project) => `${project.isRoot ? '根项目' : project.label} \`${project.server}_${suffix}\``)
|
|
@@ -110,6 +158,32 @@ function mergeRunLifecycle(projects, tools) {
|
|
|
110
158
|
};
|
|
111
159
|
}
|
|
112
160
|
|
|
161
|
+
/**
|
|
162
|
+
* 部署工具同理(见 `mergeRunLifecycle`):逐项目判断,任一项目提供即算存在。
|
|
163
|
+
*
|
|
164
|
+
* **整节的锚点就是 `canListDeploymentServers`**(模板里 `{{#if canListDeploymentServers}}` 直接包住标题):
|
|
165
|
+
* 配套插件只要装了,IDE 的 MCP 工具表里就多出这一组(它们由同一道前提注册,同进同出),
|
|
166
|
+
* 所以拿其中一个当判据就够了 —— 不需要再造一个"四个里任一个"的聚合标志。
|
|
167
|
+
*
|
|
168
|
+
* 不锚在那些"必须有工具才算"的地方也不成问题:一个都没有时 `canListDeploymentServers` 为 false,
|
|
169
|
+
* 标题与正文一起消失;而这一节和前一组不同 —— run-lifecycle 那节是内置工具
|
|
170
|
+
* (`get_run_configurations` / `execute_run_configuration`)撑起来的**自己的**标题,缺配套插件时标题仍在。
|
|
171
|
+
* 顺带一提,这一组还额外要求 `com.jetbrains.plugins.webDeployment`(**仅 Ultimate 有**),所以
|
|
172
|
+
* "整节不出现"是常态而非边角。
|
|
173
|
+
*
|
|
174
|
+
* @param {ReadonlyArray<{ server: string }>} projects
|
|
175
|
+
* @param {Record<string, unknown> | undefined} tools
|
|
176
|
+
*/
|
|
177
|
+
function mergeDeployment(projects, tools) {
|
|
178
|
+
const all = projects.map((project) => deploymentCapabilities(tools, `${project.server}_`));
|
|
179
|
+
return {
|
|
180
|
+
canListDeploymentServers: all.some((c) => c.canListDeploymentServers),
|
|
181
|
+
canUploadToDeployment: all.some((c) => c.canUploadToDeployment),
|
|
182
|
+
canDownloadFromDeployment: all.some((c) => c.canDownloadFromDeployment),
|
|
183
|
+
canGetDeploymentTaskStatus: all.some((c) => c.canGetDeploymentTaskStatus),
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
|
|
113
187
|
/**
|
|
114
188
|
* 把本会话接入的全部项目渲染成**一份**引导文本。
|
|
115
189
|
*
|
|
@@ -118,7 +192,7 @@ function mergeRunLifecycle(projects, tools) {
|
|
|
118
192
|
*
|
|
119
193
|
* @param {ReadonlyArray<{ path: string, server: string, app: string, label: string, isRoot: boolean }>} projects
|
|
120
194
|
* @param {{ tools?: Record<string, unknown> }} [options] `tools` 是本次请求的工具快照
|
|
121
|
-
* (`event.tools
|
|
195
|
+
* (`event.tools`),用来判断配套插件(run-lifecycle / deployment)的工具在不在。
|
|
122
196
|
* @returns {string}
|
|
123
197
|
*/
|
|
124
198
|
export function buildIdeGuidanceText(projects, options = {}) {
|
|
@@ -126,13 +200,14 @@ export function buildIdeGuidanceText(projects, options = {}) {
|
|
|
126
200
|
projectCount: projects.length,
|
|
127
201
|
routeTable: routeTableFor(projects),
|
|
128
202
|
...mergeRunLifecycle(projects, options.tools),
|
|
129
|
-
...
|
|
203
|
+
...mergeDeployment(projects, options.tools),
|
|
204
|
+
...commandVariables(projects, options.tools),
|
|
130
205
|
});
|
|
131
206
|
}
|
|
132
207
|
|
|
133
208
|
export const MCP_RECOVERY_GUIDANCE = [
|
|
134
209
|
'### IDE MCP failure recovery',
|
|
135
|
-
'If an IDE MCP tool (the `<prefix>_*` ones) is missing, MCP is disconnected, the connection is refused, or a tool times out: stop retrying immediately; do not run extra probes or wait in tool calls. Tell the user that IDE MCP is unavailable and ask them to run /open-in-
|
|
210
|
+
'If an IDE MCP tool (the `<prefix>_*` ones) is missing, MCP is disconnected, the connection is refused, or a tool times out: stop retrying immediately; do not run extra probes or wait in tool calls. Tell the user that IDE MCP is unavailable and ask them to run /open-in-ide to reconnect.',
|
|
136
211
|
].join('\n');
|
|
137
212
|
|
|
138
213
|
/**
|
|
@@ -142,7 +217,7 @@ export const MCP_RECOVERY_GUIDANCE = [
|
|
|
142
217
|
*/
|
|
143
218
|
export const MCP_RECOVERY_GUIDANCE_MARKED = [
|
|
144
219
|
'### IDE MCP failure recovery',
|
|
145
|
-
'This project is IDE-connected and the plugin reconnects the IDE MCP automatically. When an IDE MCP call fails with a connection error (for example `MCP server "ide" is not available`), do not run extra probes or wait in tool calls: the reconnect is already under way, so retry the operation once. Only if it still fails, tell the user that IDE MCP is unavailable and to run /open-in-
|
|
220
|
+
'This project is IDE-connected and the plugin reconnects the IDE MCP automatically. When an IDE MCP call fails with a connection error (for example `MCP server "ide" is not available`), do not run extra probes or wait in tool calls: the reconnect is already under way, so retry the operation once. Only if it still fails, tell the user that IDE MCP is unavailable and to run /open-in-ide.',
|
|
146
221
|
].join('\n');
|
|
147
222
|
|
|
148
223
|
/**
|
|
@@ -155,7 +230,7 @@ export const MCP_RECOVERY_GUIDANCE_MARKED = [
|
|
|
155
230
|
*/
|
|
156
231
|
export const MCP_RECOVERY_GUIDANCE_RECONNECTING = [
|
|
157
232
|
'### IDE MCP failure recovery',
|
|
158
|
-
'No IDE MCP tool (the `<prefix>_*` ones) is in this request: the IDE connection dropped and the plugin is reconnecting in the background. Do NOT call any of them now — it will fail with `No tool named "..." is currently available` — and do not go looking for them through Code Mode either: they are only ever listed as native tools, so a search finds nothing. Do not fall back to shell/read/write for in-project work. Continue with what you can, or tell the user the IDE is reconnecting; if the tools are still missing on a later message, ask the user to run /open-in-
|
|
233
|
+
'No IDE MCP tool (the `<prefix>_*` ones) is in this request: the IDE connection dropped and the plugin is reconnecting in the background. Do NOT call any of them now — it will fail with `No tool named "..." is currently available` — and do not go looking for them through Code Mode either: they are only ever listed as native tools, so a search finds nothing. Do not fall back to shell/read/write for in-project work. Continue with what you can, or tell the user the IDE is reconnecting; if the tools are still missing on a later message, ask the user to run /open-in-ide.',
|
|
159
234
|
].join('\n');
|
|
160
235
|
|
|
161
236
|
/**
|