opencode-idea 0.0.23 → 0.0.24
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 +325 -285
- package/package.json +1 -1
- package/skills/idea-run-config-manager/SKILL.md +68 -44
- package/skills/idea-run-config-manager/assets/AGENTS.template.md +52 -63
- package/skills/idea-run-config-manager/assets/types/go-build.md +7 -6
- package/skills/idea-run-config-manager/assets/types/gradle.md +6 -6
- package/skills/idea-run-config-manager/assets/types/maven.md +7 -6
- package/skills/idea-run-config-manager/assets/types/node.md +10 -7
- package/skills/idea-run-config-manager/assets/types/npm.md +29 -27
- package/skills/idea-run-config-manager/assets/types/python.md +39 -31
- package/skills/idea-run-config-manager/assets/types/shell.md +84 -51
- package/skills/idea-standalone/SKILL.md +30 -18
- package/skills/idea-standalone/assets/AGENTS.template.md +94 -41
- package/src/ide-guidance.js +3 -0
- package/src/ide-guidance.template.md +141 -121
- package/src/mcp/enhance.js +13 -3
- package/src/mcp/idea.js +1 -1
- package/src/plugin.js +1214 -1195
package/package.json
CHANGED
|
@@ -1,63 +1,87 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: idea-run-config-manager
|
|
3
|
-
description: "管理本项目的 run configuration
|
|
4
|
-
metadata:
|
|
5
|
-
opencode/autoinvoke: false
|
|
3
|
+
description: "管理本项目的 run configuration:增 / 删 / 改 / 改名走这几个工具(`create_run_configuration` / `update_run_configuration` / `delete_run_configuration` / `inspect_run_configuration`,不写文件;字段照 `assets/types/` 的实测模板),并把配置档案同步进项目根 `AGENTS.md` 的 `idea-run-config-manager` 标记块(一条配置一个条目:干什么、怎么跑、什么时候跑;服务化的归 `idea-standalone`)。要建 / 删 / 改 run configuration、要判断一条固定流程该不该固化成配置,或要一份「这个项目有哪些配置」的说明时使用。"
|
|
6
4
|
---
|
|
7
5
|
|
|
8
6
|
# idea-run-config-manager — 增删改 run configuration + 维护配置档案
|
|
9
7
|
|
|
10
|
-
|
|
8
|
+
**联动是硬要求**:配置被 **新建 / 删除 / 修改**,文档就跟着 **加条目 / 删条目 / 改条目** —— 无论那次改动是谁做的
|
|
9
|
+
(你做的、用户自己做的、用户删掉的,都算)。改了配置却忘了同步这个档案块,等于它在骗下一个读者。
|
|
11
10
|
|
|
12
|
-
**工具不在时**:先看工具表里有没有 `<前缀>_get_run_configurations` / `<前缀>
|
|
11
|
+
**工具不在时**:先看工具表里有没有 `<前缀>_get_run_configurations` / `<前缀>_create_run_configuration`。没有,就是项目还没接入
|
|
12
|
+
IDE (或那个 IDE 没装 `idea-mcp-enhance`)—— 让用户执行 `/open-in-ide`,接入之前 **不要手写配置文件假装做完**(IDE
|
|
13
|
+
不认,复查也过不了)。
|
|
13
14
|
|
|
14
15
|
## 流程
|
|
15
16
|
|
|
16
|
-
1. **读**:项目根 `AGENTS.md` —— 有没有 `<!-- idea-run-config-manager:begin -->` … `<!-- idea-run-config-manager:end -->`
|
|
17
|
-
|
|
17
|
+
1. **读**:项目根 `AGENTS.md` —— 有没有 `<!-- idea-run-config-manager:begin -->` … `<!-- idea-run-config-manager:end -->`
|
|
18
|
+
标记块 (有则更新,没有就在文件末尾追加);同时读同文件里 `idea-standalone` 的标记块。 **服务化 / 常驻应用的配置一律不进
|
|
19
|
+
本块**(不管那边有没有块);有那个块时,把它登记过的名字一并排除。
|
|
20
|
+
2. **枚举**:逐个项目用 **它自己那个前缀**的 `<前缀>_get_run_configurations` 直接调用,不传参数 —— 本项目的工具前缀跟着接入时的名字走
|
|
21
|
+
(root 是 `ide`,子项目是它的目录名)。
|
|
18
22
|
3. **建 / 删 / 改**(**直接动手**):
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
1. **先查重**:已经在做同一件事的配置直接复用,不要新建一个几乎一样的。 **查重按 (base, 平台, 职责) 三个维度比** —— 同一个
|
|
24
|
+
base 在同一个平台上做同一件事才算重复;`base` 与 `base@<env>` 是同一 base 的两套环境,`base` 与 `win@base` 是同一
|
|
25
|
+
base 的两个平台,都 **不算重复**,要各建各的。
|
|
26
|
+
2. **走工具,不要自己写文件**:
|
|
27
|
+
- **新建**:`<前缀>_create_run_configuration` —— 任意类型,内容来源三选一:`cloneFrom`(复制一个现成的,
|
|
28
|
+
最稳)/ `configurationXml`(模板里的 XML 片段)/ 平台模板 + `options` / `attributes` / `envs` 补丁。
|
|
29
|
+
- **修改 / 改名**:`<前缀>_update_run_configuration`。改字段用 `options` / `envs` 补丁;
|
|
30
|
+
改名用 `newName`,它会 **连带更新别人对它的引用**并把历史日志的键一起迁移。
|
|
31
|
+
- **删除**:`<前缀>_delete_run_configuration` —— 在跑或被人引用时会拒绝,`force = true` 才会连引用一起清掉。
|
|
32
|
+
- **看一眼**:`<前缀>_inspect_run_configuration` —— 定义、命名解析、活实例、历史日志路径全在里面;
|
|
33
|
+
构建 patch 之前先用它拿到当前值 (尤其 `configurationXml`)。
|
|
34
|
+
- **模板是字段参考**:`assets/types/*.md` 用来查类型 id、看这个类型有哪些字段、`configurationXml` 该长什么样。
|
|
35
|
+
- **建带平台 / 环境变体的配置** → 名字按第 5 条的文法拼 (`win@base` / `base@env`)。**这个环境具体怎么接上,
|
|
36
|
+
问用户或照项目里现成的同类配置来**。
|
|
37
|
+
- **没有模板**(矩阵之外)→ **走 `cloneFrom`**:复制一个同类型的现成配置再 patch 它的字段。
|
|
38
|
+
字段名不确定时,这是 **唯一可靠**的路子 (照猜字段名 = 静默用默认值)。连一个同类型的现成配置都没有,
|
|
39
|
+
才 **交给用户**:讲清要配什么 (配置名、干什么、什么时候跑),请他在 IDE 里配好,你只负责把档案补上。
|
|
40
|
+
3. **写完必须复查**:工具的返回值就是结论 —— `canRun` 能不能跑、`unknownOptions` 有没有字段名被平台丢弃 (非空 =
|
|
41
|
+
字段名拼错了)、`storagePath` 文件落在哪。再用 `<前缀>_get_run_configurations` 二次确认它已被 IDE 认到 —— **看不到就是没被
|
|
42
|
+
IDE 认**。
|
|
43
|
+
4. **不要手搓启动命令**代替配置,也 **不要写模板里没有的字段**(多余字段被忽略、名字写错静默用默认值,都不会报错)。
|
|
44
|
+
4. **同步文档**:按 [assets/AGENTS.template.md](assets/AGENTS.template.md) 逐段填,写在标记块内 ——
|
|
45
|
+
**条目怎么写、五项分别写什么、枚举与过滤的要求,都在那份模板的生成提示里**,动手前先读它;生成提示是给生成过程的说明,
|
|
46
|
+
**产物里整块删掉**,块外一字不动 (尤其 **不要触碰**其他 skill 的标记块)。
|
|
26
47
|
5. **核对**:块里每个名字项目里都还在,项目里每个配置块里都有。
|
|
27
48
|
|
|
28
|
-
## 支持矩阵(一个类型一份模板)
|
|
49
|
+
## 支持矩阵 (一个类型一份模板)
|
|
29
50
|
|
|
30
|
-
| 类型 | `type` id | 模板 | 验证程度
|
|
31
|
-
| ----------------- | ------------------------------- | ------------------------------------ |
|
|
32
|
-
| Shell Script | `ShConfigurationType` | [shell](assets/types/shell.md) | ✅ 实物(本机 6 例,含 Windows)
|
|
33
|
-
| Maven | `MavenRunConfiguration` | [maven](assets/types/maven.md) | ✅ 实物
|
|
34
|
-
| Gradle | `GradleRunConfiguration` | [gradle](assets/types/gradle.md) | ✅ 实物
|
|
35
|
-
| npm / yarn / pnpm | `js.build_tools.npm` | [npm](assets/types/npm.md) | ✅ 实物
|
|
36
|
-
| Python | `PythonConfigurationType` | [python](assets/types/python.md) | ✅ 实物
|
|
37
|
-
| Go Build | `GoApplicationRunConfiguration` | [go-build](assets/types/go-build.md) | ✅ 实物
|
|
51
|
+
| 类型 | `type` id | 模板 | 验证程度 |
|
|
52
|
+
| ----------------- | ------------------------------- | ------------------------------------ | ------------------------------------------ |
|
|
53
|
+
| Shell Script | `ShConfigurationType` | [shell](assets/types/shell.md) | ✅ 实物(本机 6 例,含 Windows) |
|
|
54
|
+
| Maven | `MavenRunConfiguration` | [maven](assets/types/maven.md) | ✅ 实物 |
|
|
55
|
+
| Gradle | `GradleRunConfiguration` | [gradle](assets/types/gradle.md) | ✅ 实物 |
|
|
56
|
+
| npm / yarn / pnpm | `js.build_tools.npm` | [npm](assets/types/npm.md) | ✅ 实物 |
|
|
57
|
+
| Python | `PythonConfigurationType` | [python](assets/types/python.md) | ✅ 实物 |
|
|
58
|
+
| Go Build | `GoApplicationRunConfiguration` | [go-build](assets/types/go-build.md) | ✅ 实物 |
|
|
38
59
|
| Node.js | `NodeJSConfigurationType` | [node](assets/types/node.md) | ⚠️ `type` 与三个属性已验证,其余字段未验证 |
|
|
39
|
-
| Application | `Application` | — | ⏳ `type` 已验证,**字段层无实物**
|
|
40
|
-
| JAR | `JarApplication` | — | ⏳ 同上
|
|
60
|
+
| Application | `Application` | — | ⏳ `type` 已验证,**字段层无实物** |
|
|
61
|
+
| JAR | `JarApplication` | — | ⏳ 同上 |
|
|
41
62
|
|
|
42
|
-
**矩阵之外一律没有模板** —— JUnit / TestNG / Kotlin / Docker / Spring Boot / Tomcat / Flyway / Liquibase / HTTP Request
|
|
63
|
+
**矩阵之外一律没有模板** —— JUnit / TestNG / Kotlin / Docker / Spring Boot / Tomcat / Flyway / Liquibase / HTTP Request
|
|
64
|
+
等等。 **没有模板不等于建不了**:`cloneFrom` 复制一个同类型的现成配置再 patch 就能建,`assets/types/*.md` 只是 **字段参考**
|
|
65
|
+
(查类型 id、看这个类型有哪些字段),不是建配置的前置条件。模板由我们后续按需补上。
|
|
43
66
|
|
|
44
|
-
## 硬性契约(所有类型都一样)
|
|
67
|
+
## 硬性契约 (所有类型都一样)
|
|
45
68
|
|
|
46
|
-
1.
|
|
47
|
-
2.
|
|
69
|
+
1. **落地位置不用管**:配置落在哪由工具决定 (项目级配置随项目共享);子项目的配置用 **子项目前缀**的工具建与查。
|
|
70
|
+
2. **`configurationXml` 的信封照类型模板抄**(`assets/types/*.md` 每份都是完整的):外层
|
|
71
|
+
`<component name="ProjectRunConfigurationManager">`,里面一个
|
|
72
|
+
`<configuration default="false" name="<配置名>" type="<类型ID>">` + 该类型自己的字段 + `<method v="2" />`。
|
|
73
|
+
`factoryName` 可写可不写 —— IDE 认的是 `type`。
|
|
48
74
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
5. **路径宏**:`$PROJECT_DIR$` = 该项目根。同一台机器上的多个项目靠它区分,别写绝对路径。
|
|
63
|
-
6. **不要加本类型没有的字段**:多余的字段被忽略,名字写错则静默用默认值 —— 两种都不会报错,但会得到一个"看起来配好了其实没生效"的配置。
|
|
75
|
+
3. **`type` 写错 = 整个文件被静默忽略,日志里也不报任何东西。** 有模板就照模板的 `type` 抄,没有模板就 `cloneFrom`
|
|
76
|
+
复制一个同类型的现成配置 —— 别照猜;工具的 `typeKnown` / `typeDisplayName` 会告诉你这台 IDE 认不认这个类型 (缺插件时是
|
|
77
|
+
`Unknown`)。
|
|
78
|
+
4. **路径宏**:`$PROJECT_DIR$` = 该项目根。 **项目内的路径一律用它**(`$PROJECT_DIR$/子目录/...`),不要写本机绝对路径 ——
|
|
79
|
+
写死了别人 clone 下来就指到不存在的目录。
|
|
80
|
+
5. **命名文法:`[os@]base[@env]`,`@` 分割、最多三段** —— `os` 段(`win` = Windows,缺省 = macOS / Linux)、`base` 段(配置本体,必填)、
|
|
81
|
+
`env` 段(环境名,缺省 = 所有环境通用这一套)。`win@base`(换平台)与 `base@env`(换环境)都是**同一个 base 的变体**;
|
|
82
|
+
**档案只登记 base**,变体写进 base 的 `desc`。
|
|
83
|
+
- 名字怎么解析**交给工具**(`<前缀>_inspect_run_configuration` 的 `naming`),别自己猜。
|
|
84
|
+
- **一个环境具体怎么接上,是项目自己的事**(启动参数 / 环境变量 / 配置文件都常见):照项目里现成的同类变体来,或问用户。
|
|
85
|
+
6. **选环境问一次,别反复打扰**:`base` 与 `base@<env>` 同时存在 = 两套环境 → **启动前问一次用户走哪套**(问的是"走哪个环境",
|
|
86
|
+
不是"要不要启动");**用户选定后本会话内默认走这一套**,用户不说改就不改 —— 改代码 → 自己重启 → 同一套变体,AI 干活的链路上
|
|
87
|
+
不打扰用户。
|
|
@@ -10,7 +10,8 @@
|
|
|
10
10
|
<!-- 生成提示:end -->
|
|
11
11
|
|
|
12
12
|
本项目里 **除服务化应用之外**的 run configuration:每个配置 **是什么、怎么跑、什么时候跑**;服务化 (长驻应用)的配置登记在
|
|
13
|
-
`idea-standalone` 块里,不在这里。
|
|
13
|
+
`idea-standalone` 块里,不在这里。 **配置增删改之后,本块要跟着加 / 删 / 改条目** —— 做法见 `idea-run-config-manager` skill;
|
|
14
|
+
块里和项目对不上,比没有块更糟。
|
|
14
15
|
|
|
15
16
|
**谁能起它,只有三种** —— 读这个块的人照它决定动不动手:
|
|
16
17
|
|
|
@@ -20,46 +21,34 @@
|
|
|
20
21
|
|
|
21
22
|
## run configuration 一览
|
|
22
23
|
|
|
24
|
+
**「怎么读配置名」与「怎么选变体」两节是固定文本,照抄,不要改写、不要删条目** —— 它们是读名字与选变体的规则,下面那个列表靠它们才成立。
|
|
25
|
+
|
|
23
26
|
<!-- 生成提示:begin -->
|
|
24
27
|
|
|
25
|
-
|
|
26
|
-
|
|
28
|
+
**先过滤**:服务化 / 常驻应用的配置 **一律不进本块**(它们归 `idea-standalone`,端口与热重载写在那边)。有
|
|
29
|
+
`idea-standalone` 的标记块时,再把它登记过的名字一并排除;没有那个块也照样按性质过滤。
|
|
27
30
|
**枚举以工具为准**:各项目各有自己的工具前缀 (root 是 `ide`,子项目是它的目录名),看哪个项目就用 **它自己那个前缀**
|
|
28
|
-
的工具 —— `<前缀>_get_run_configurations` 直接调用,不传参数,它给出 IDE 真正认的配置 (含存在
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
- **行内形态** —— 这一项只有一句话:写在项名同一行,`when:用户授权触发 —— 改了 x 后 y`。
|
|
50
|
-
- **子列表形态** —— 这一项有好几条 (多个触发条件 / 多个步骤 / 多个结果 / 多个事实):项名冒号后留空,缩进两个空格各起一条
|
|
51
|
-
`-`。
|
|
52
|
-
|
|
53
|
-
所以同一个条目里 **混着两种写法是常态**,下面三种都可以:
|
|
54
|
-
|
|
55
|
-
| 情况 | 长什么样 | 典型配置 |
|
|
56
|
-
|----------|------------------------------------------------|------------------------------------------------|
|
|
57
|
-
| 全行内 | 五项各一句,没有任何子项 | 跑完即退、一句话能说清的命令(推迁移、跑生成器) |
|
|
58
|
-
| 全子列表 | 五项里多数各有多条 | 带产物、要同步、要重启的构建 / 部署类 |
|
|
59
|
-
| 混合 | 例如 `when` 一句行内、`after run` 三件事拆三条 | 最常见 —— 只看**那一项自己**有几句 |
|
|
60
|
-
|
|
61
|
-
判断只看"这一项有几句话",与配置本身复杂不复杂无关;别为了整齐把一句硬拆成几条,也别把五六条压成一行。也可以只对少数项例外:
|
|
62
|
-
`before run:无(脚本自己跑 mvn package)` 这种一句带解释,就留在行内。
|
|
31
|
+
的工具 —— `<前缀>_get_run_configurations` 直接调用,不传参数,它给出 IDE 真正认的配置 (含存在 IDE 自己存储里、不在项目
|
|
32
|
+
目录的那些 —— 翻文件看不到)。 **项目与各子项目里真正存在的、过滤后剩下的都要有。**
|
|
33
|
+
**项目写在条目开头的括号里**(那套工具的前缀:root 写 `ide`,子项目写它的目录名):一条配置属于谁、该用哪套工具去看和跑,
|
|
34
|
+
由它决定。条目里的配置名必须是该前缀下 **真实存在的名字**,不凭印象写;块里有、项目里已经没有的 **整个条目删掉**。 **只登记
|
|
35
|
+
base,变体不另起条目**:run configuration 的名字是 `[os@]base[@env]`,`@` 分割、最多三段 —— os 段 (`win` = Windows,缺省 =
|
|
36
|
+
macOS/Linux)、
|
|
37
|
+
base 段 (配置本体)、env 段 (环境名,缺省 = 所有环境通用这一套)。`win@base` 与 `base@env` 都是 **同一个 base 的变体**:
|
|
38
|
+
平台不同 / 环境不同,事情是同一件。 **本块只登记 base**(`{配置名}` 不带任何 `@` 段),变体不另起条目 ——
|
|
39
|
+
把"有哪些变体"写进 base 的 `desc` 一条即可;判断某个变体在哪个平台成立 **看命令与脚本内容本身**(有 `\` 路径、调用
|
|
40
|
+
`.bat`、依赖 Windows 专属工具的,就是 Windows), **判断不了就问用户**,不猜。
|
|
41
|
+
|
|
42
|
+
**when** 只写两种,先把是哪一种写明:**用户授权触发** → 用户开口 (或在本会话里授权) 之后 AI 才跑,后面写用户通常在
|
|
43
|
+
什么情况下会要它跑 (发版前 / 出安装包 / 回归);**AI 自己触发** → AI 判断到场景就自己跑, **必须把场景写具体**(改完某类代码要
|
|
44
|
+
生成代码 / 改了依赖要装依赖 / 改了 schema 要同步某个环境的 DDL),不写"需要时""合适时",有副作用又说不清场景的一律归
|
|
45
|
+
"用户授权触发"。第三种 **用户手动触发**(用户自己在 IDE 里跑、AI 完全不碰) **不写进条目**,登记到末尾「用户手动触发」
|
|
46
|
+
一节,只写名字;判断不了就问用户。
|
|
47
|
+
|
|
48
|
+
**每一项都有两种写法,逐项判断**(别给整条定一个"简单 / 复杂"模式):只有一句话 → 写在项名同一行 (`when:用户授权触发 ——
|
|
49
|
+
改了 x 后 y`);有好几条 (多个触发条件 / 多个步骤 / 多个结果) → 项名冒号后留空,缩进两个空格各起一条 `-`。同一个条目里
|
|
50
|
+
**混着两种写法是常态** —— 只看 **那一项自己** 有几句,与配置复杂不复杂无关;别为了整齐把一句拆成几条,也别把五六条压成一行
|
|
51
|
+
(`before run:无 (脚本自己跑 mvn package)` 这种一句带解释的,就留在行内)。
|
|
63
52
|
|
|
64
53
|
示例 (混合形态):
|
|
65
54
|
|
|
@@ -91,41 +80,41 @@ Windows); **判断不了就问用户**,不猜。只在一个平台成立的流
|
|
|
91
80
|
- desc:先 `pnpm -C packages/db generate` 再 `migrate:deploy`;动远端数据,不由 AI 自行触发
|
|
92
81
|
```
|
|
93
82
|
|
|
94
|
-
**before run** 写 **跑之前要先做的事**(先装依赖 / 先构建 / 先起某个服务)
|
|
95
|
-
(
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
`desc` 或 `before run`。 **五项的名字与顺序不要改**(`when` / `before run` / `run` / `after run` / `desc`),并且 **与
|
|
107
|
-
`idea-standalone` 应用表的列同名同序**(`before run` / `run` / `after run` / `desc` 这四项两边一致);本块多 `when`,那边多
|
|
108
|
-
`app` / `run configuration` / `port`(服务化应用就是"改完代码要起它来测"的时候起,没有别的时机可写)。 **五项始终都在**:
|
|
109
|
-
`before run` / `after run` 真没有内容就写 **`无`** —— 不省略,也不写 `-` / `N/A`。
|
|
83
|
+
**before run** 写 **跑之前要先做的事**(先装依赖 / 先构建 / 先起某个服务), **一条一步、按顺序排**;多数没有 —— 写 `无`
|
|
84
|
+
(这一项始终在)。这些事往往 **不是** run configuration,只能写在这里;漏了它,照本块跑的人会直接跑出一个起不来的流程。
|
|
85
|
+
**run** 写走哪条工具:跑完即退的用 `<前缀>_execute_run_configuration`;长驻进程用 `<前缀>_rerun_run_configuration`
|
|
86
|
+
(在跑就重启、没在跑就启动)。 **不要**用 `execute` 跑长驻进程 —— 它是 Run 路径,对常驻进程它会起出重复实例。
|
|
87
|
+
**after run** 写 **跑完之后的结果**:产物落在哪 (路径 / 文件名 / 被谁读走),接下来要不要做什么 (发布 / 同步 / 重启);
|
|
88
|
+
**没有就写 `无`**。 **desc** 是唯一的自由文本项:它是什么、干什么的一条,坑 (要先备份 / 只对某个环境生效 / 幂等与否) 一条,
|
|
89
|
+
**有 `@` 变体也补一条**, **不要再开新项**。写不清它到底跑什么命令,就用 `<前缀>_inspect_run_configuration` 看它的内容,
|
|
90
|
+
拿不准 **问用户**。 **desc 与 before run 是本块的主要价值**:下次办同类事情先在这里搜关键词,找得到就直接用,
|
|
91
|
+
**别再建一个重复的**。 **目录、端口这类配置里本来就有的字段不抄进来** —— 会跟配置变旧而对不上;要交代依赖关系就写进
|
|
92
|
+
`desc` / `before run`。 **五项的名字与顺序不要改**(`when` / `before run` / `run` / `after run` / `desc`),并与
|
|
93
|
+
`idea-standalone` 那个块 **同名同序**(`before run` / `run` / `after run` / `desc` 四项一致);本块多 `when`,那边多
|
|
94
|
+
`应用` / `端口` / `热重载`。 **五项始终都在**:真没有内容就写 **`无`** —— 不省略,也不写 `-` / `N/A`。
|
|
110
95
|
<!-- 生成提示:end -->
|
|
111
96
|
|
|
112
|
-
###
|
|
97
|
+
### 怎么读配置名
|
|
113
98
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
99
|
+
run configuration 的名字是 `[os@]base[@env]`,`@` 分割、最多三段:`os` = `win`(缺省表示:macOS / Linux)、`base` = 配置本体
|
|
100
|
+
(必填)、`env` = 环境名(缺省表示:所有环境通用)。`win@base`(换平台)与 `base@env`(换环境)都是 `base` 的 **变种**:
|
|
101
|
+
同一件事,平台 / 环境不同。 **只登记 base**,变体不另起条目 —— 有哪些变体写进 base 的 `desc`。
|
|
102
|
+
|
|
103
|
+
### 怎么选变体
|
|
104
|
+
|
|
105
|
+
- **平台**:macOS / Linux 用 `base`,Windows 用 `win@base` —— `win@base` 不存在就 **交回用户**,别拿 base 顶替。
|
|
106
|
+
- **环境**:`base` 与 `base@<env>` 同时存在 → **启动前问一次用户走哪套**,选定后本会话默认走这套,别反复问 ——
|
|
107
|
+
改代码 → 自己重启 → 同一套变体。
|
|
108
|
+
- 一个环境怎么接上 (启动参数 / 环境变量 / 配置文件) 是项目自己的事:照现成的同类变体来,或问用户。
|
|
120
109
|
|
|
121
|
-
###
|
|
110
|
+
### base 登记
|
|
122
111
|
|
|
123
112
|
- {配置名} (项目 {前缀})
|
|
124
113
|
- when:{用户授权触发 / AI 自己触发} —— {什么场景}
|
|
125
114
|
- before run:{第 1 步 / 第 2 步 / 无}
|
|
126
115
|
- run:{<前缀>_execute_run_configuration}
|
|
127
116
|
- after run:{产物落在哪 / 接下来要做什么 / 无}
|
|
128
|
-
- desc:{它是什么 + 有什么坑}
|
|
117
|
+
- desc:{它是什么 + 有什么坑 + 有哪些 @ 变体}
|
|
129
118
|
|
|
130
119
|
## 用户手动触发 (线下,AI 不跑)
|
|
131
120
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
# Go Build(`GoApplicationRunConfiguration`)
|
|
1
|
+
# Go Build (`GoApplicationRunConfiguration`)
|
|
2
2
|
|
|
3
|
-
**用途**:跑一个 Go 程序(`go run` 那条路)。测试是另一个类型(`GoTestRunConfiguration`)
|
|
3
|
+
**用途**:跑一个 Go 程序 (`go run` 那条路)。测试是另一个类型 (`GoTestRunConfiguration`), **不在本模板范围**。
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## XML 形状
|
|
6
6
|
|
|
7
7
|
```xml
|
|
8
8
|
<component name="ProjectRunConfigurationManager">
|
|
@@ -37,8 +37,9 @@
|
|
|
37
37
|
|
|
38
38
|
## 坑
|
|
39
39
|
|
|
40
|
-
- **字段写法和其他类型不一样**:这里是 `<working_directory value=…>`
|
|
40
|
+
- **字段写法和其他类型不一样**:这里是 `<working_directory value=…>` 这种 **自定义元素名**,不是 `<option name=…>`
|
|
41
|
+
;照别的类型的写法套会被静默忽略。
|
|
41
42
|
- **`kind` 与 `filePath`/`directory`/`package` 必须一致**:填了 `kind=FILE` 又给 `directory`,行为不可预期 —— 只填对应的那一个。
|
|
42
|
-
- `parameters`
|
|
43
|
-
- 实测样本的 `envs` 里塞了本机路径(`localhost:6379` 之类)—— 共享出去对别人不一定适用,这类值考虑换成读本地配置文件。
|
|
43
|
+
- `parameters` 里是 **给程序**的参数,不是 `go build` 的参数;构建参数走 IDE 的 Go 配置项,别塞这里。
|
|
44
|
+
- 实测样本的 `envs` 里塞了本机路径 (`localhost:6379` 之类)—— 共享出去对别人不一定适用,这类值考虑换成读本地配置文件。
|
|
44
45
|
- Go 服务通常是常驻进程:启停走 `rerun` / `stop`,不要 `pkill`(规则见 `idea-standalone`)。
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
# Gradle(`GradleRunConfiguration`)
|
|
1
|
+
# Gradle (`GradleRunConfiguration`)
|
|
2
2
|
|
|
3
|
-
**用途**:跑 Gradle 任务(`build`、`test`、`detekt`、`wasmJsBrowserDevelopmentRun` …)。
|
|
3
|
+
**用途**:跑 Gradle 任务 (`build`、`test`、`detekt`、`wasmJsBrowserDevelopmentRun` …)。
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## XML 形状
|
|
6
6
|
|
|
7
7
|
```xml
|
|
8
8
|
<component name="ProjectRunConfigurationManager">
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
|
|
52
52
|
## 坑
|
|
53
53
|
|
|
54
|
-
- **`externalSystemIdString` 必须是 `GRADLE`** —— 写别的值文件会被忽略(而且没有报错)。
|
|
55
|
-
- 参数(`--info`、`-Pxxx`)放 `scriptParameters
|
|
56
|
-
- `env` 里像 `DEVELOPER_DIR` 这种本机特定路径,共享出去对别人无效 —— 换个不带绝对路径的做法(写进 `gradle.properties`)。
|
|
54
|
+
- **`externalSystemIdString` 必须是 `GRADLE`** —— 写别的值文件会被忽略 (而且没有报错)。
|
|
55
|
+
- 参数 (`--info`、`-Pxxx`)放 `scriptParameters`, **不是** `taskNames`。
|
|
56
|
+
- `env` 里像 `DEVELOPER_DIR` 这种本机特定路径,共享出去对别人无效 —— 换个不带绝对路径的做法 (写进 `gradle.properties`)。
|
|
57
57
|
- 多模块里跑别的模块的任务用 `:module:task`;`externalProjectPath` 仍指 Gradle 根。
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
# Maven(`MavenRunConfiguration`)
|
|
1
|
+
# Maven (`MavenRunConfiguration`)
|
|
2
2
|
|
|
3
|
-
**用途**:跑 Maven 目标(`clean package`、`test`、`spring-boot:run` …)。
|
|
3
|
+
**用途**:跑 Maven 目标 (`clean package`、`test`、`spring-boot:run` …)。
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## XML 形状
|
|
6
6
|
|
|
7
7
|
```xml
|
|
8
8
|
<component name="ProjectRunConfigurationManager">
|
|
@@ -55,7 +55,8 @@
|
|
|
55
55
|
|
|
56
56
|
## 坑
|
|
57
57
|
|
|
58
|
-
- **嵌套层级别少**:`MavenSettings` → `myRunnerParameters` → `MavenRunnerParameters`,三层都在才认;空的 `<set />` /
|
|
59
|
-
|
|
58
|
+
- **嵌套层级别少**:`MavenSettings` → `myRunnerParameters` → `MavenRunnerParameters`,三层都在才认;空的 `<set />` /
|
|
59
|
+
`<map />` / `<list />` **不要删**(实测文件里都有)。
|
|
60
|
+
- `pomFileName` 只写 **文件名**,不要写相对路径。
|
|
60
61
|
- 多模块项目:要么 `pomFileName` 指子模块,要么用 `multimoduleDir` 指根 —— 二选一,别都填。
|
|
61
|
-
- 跑测试类目标(`-Dtest=…`)时 `cmdOptions` 里带 `-D`,不要放进 `goals`。
|
|
62
|
+
- 跑测试类目标 (`-Dtest=…`)时 `cmdOptions` 里带 `-D`,不要放进 `goals`。
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
# Node.js(`NodeJSConfigurationType`)
|
|
1
|
+
# Node.js (`NodeJSConfigurationType`)
|
|
2
2
|
|
|
3
|
-
**用途**:直接跑一个 `.js` / `.mjs`
|
|
3
|
+
**用途**:直接跑一个 `.js` / `.mjs` 入口。 **跑 `package.json` 脚本请用 [npm.md](npm.md)** —— 那是另一回事。
|
|
4
4
|
|
|
5
|
-
⚠️ **本模板验证程度有限**:`type`
|
|
5
|
+
⚠️ **本模板验证程度有限**:`type` 与下面三个属性已由实物确认; **环境变量、Node 解释器等字段没有实物样本**
|
|
6
|
+
,照抄本项目里已有配置的写法,或让用户在 IDE 里补,不要凭名字猜。
|
|
6
7
|
|
|
7
|
-
##
|
|
8
|
+
## XML 形状 (已验证的最小形态)
|
|
8
9
|
|
|
9
10
|
```xml
|
|
10
11
|
<component name="ProjectRunConfigurationManager">
|
|
@@ -14,7 +15,7 @@
|
|
|
14
15
|
</component>
|
|
15
16
|
```
|
|
16
17
|
|
|
17
|
-
## 字段(已验证)
|
|
18
|
+
## 字段 (已验证)
|
|
18
19
|
|
|
19
20
|
| 字段 | 形态 | 含义 |
|
|
20
21
|
| ------------------------ | -------- | ----------------------------------- |
|
|
@@ -26,5 +27,7 @@
|
|
|
26
27
|
## 坑
|
|
27
28
|
|
|
28
29
|
- **这个类型用属性写法,不是 `<option>` 子元素** —— 照别的类型套会静默失效。
|
|
29
|
-
- **能不用它就不用**:绝大多数"跑前端/跑服务"的场景,`js.build_tools.npm`(`<command value="run">` + 脚本名)
|
|
30
|
-
|
|
30
|
+
- **能不用它就不用**:绝大多数"跑前端/跑服务"的场景,`js.build_tools.npm`(`<command value="run">` + 脚本名)
|
|
31
|
+
才是团队共享配置的主流写法,也更好懂。
|
|
32
|
+
- 需要环境变量 (`dotenv`)或指定 Node 版本时,本模板没有可用字段 —— **照项目里已有的 Node.js 配置抄**,或让用户在 IDE
|
|
33
|
+
里配好再让你同步文档。
|
|
@@ -1,22 +1,23 @@
|
|
|
1
|
-
# npm / yarn / pnpm(`js.build_tools.npm`)
|
|
1
|
+
# npm / yarn / pnpm (`js.build_tools.npm`)
|
|
2
2
|
|
|
3
|
-
**用途**:跑 `package.json` 里的脚本(dev / build / test)
|
|
3
|
+
**用途**:跑 `package.json` 里的脚本 (dev / build / test)。三种包管理器 **共用同一个 `type`**,靠 `<package-manager>` 区分。
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## XML 形状
|
|
6
6
|
|
|
7
7
|
```xml
|
|
8
|
+
|
|
8
9
|
<component name="ProjectRunConfigurationManager">
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
10
|
+
<configuration default="false" name="frontend" type="js.build_tools.npm">
|
|
11
|
+
<package-json value="$PROJECT_DIR$/frontend/package.json"/>
|
|
12
|
+
<command value="run"/>
|
|
13
|
+
<scripts>
|
|
14
|
+
<script value="dev"/>
|
|
15
|
+
</scripts>
|
|
16
|
+
<node-interpreter value="project"/>
|
|
17
|
+
<package-manager value="npm"/>
|
|
18
|
+
<envs/>
|
|
19
|
+
<method v="2"/>
|
|
20
|
+
</configuration>
|
|
20
21
|
</component>
|
|
21
22
|
```
|
|
22
23
|
|
|
@@ -28,31 +29,32 @@
|
|
|
28
29
|
| `command` | npm 子命令 | 跑脚本用 `run` |
|
|
29
30
|
| `scripts` → `<script value>` | 脚本名 | `package.json` 里 `scripts` 的 key(`dev` / `build` / `test:unit`) |
|
|
30
31
|
| `package-manager` | 用哪个包管理器 | `npm` / `yarn` / `pnpm`(实测值就是这三个) |
|
|
31
|
-
| `node-interpreter` | Node 来源 | `project`(用项目里配的)
|
|
32
|
+
| `node-interpreter` | Node 来源 | `project`(用项目里配的);**不要填系统绝对路径**(机器级) |
|
|
32
33
|
| `envs` | 环境变量 | 空就 `<envs />` |
|
|
33
34
|
| `method` | 前置任务 | 默认空 `<method v="2" />`;需要"先跑别的再跑这个"才填(见下) |
|
|
34
35
|
|
|
35
|
-
## 跑之前先跑别的(build → dev)
|
|
36
|
+
## 跑之前先跑别的 (build → dev)
|
|
36
37
|
|
|
37
38
|
`<method v="2">` 里可以带前置任务:
|
|
38
39
|
|
|
39
40
|
```xml
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
<
|
|
41
|
+
|
|
42
|
+
<method v="2">
|
|
43
|
+
<option name="NpmBeforeRunTask" enabled="true">
|
|
44
|
+
<package-json value="$PROJECT_DIR$/package.json"/>
|
|
45
|
+
<command value="run"/>
|
|
44
46
|
<scripts>
|
|
45
|
-
|
|
47
|
+
<script value="build"/>
|
|
46
48
|
</scripts>
|
|
47
|
-
<node-interpreter value="project"
|
|
48
|
-
<envs
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
<node-interpreter value="project"/>
|
|
50
|
+
<envs/>
|
|
51
|
+
</option>
|
|
52
|
+
</method>
|
|
51
53
|
```
|
|
52
54
|
|
|
53
55
|
## 坑
|
|
54
56
|
|
|
55
57
|
- **`<package-manager>` 决定实际用哪个包管理器跑**:项目用 pnpm 而这里写 `npm`,脚本里 `pnpm xxx` 的调用会跟外层打架。
|
|
56
|
-
- 实测文件里还出现过两个 `<EXTENSION>`(better_direnv、StartBrowser)——
|
|
57
|
-
- 单仓多包(pnpm workspace / npm workspaces):`package-json`
|
|
58
|
+
- 实测文件里还出现过两个 `<EXTENSION>`(better_direnv、StartBrowser)—— 那是别人本机插件加的, **别抄**,它们依赖本机插件,别人机器上没有。
|
|
59
|
+
- 单仓多包 (pnpm workspace / npm workspaces):`package-json` 指到 **具体那个包**,不要指根再靠 scripts 转发。
|
|
58
60
|
- `scripts` 里写多个脚本 = 按顺序跑同一个命令,不等于"先 A 后 B";顺序依赖要用上面的前置任务。
|
|
@@ -1,36 +1,37 @@
|
|
|
1
|
-
# Python(`PythonConfigurationType`)
|
|
1
|
+
# Python (`PythonConfigurationType`)
|
|
2
2
|
|
|
3
|
-
**用途**:跑一个 Python 脚本(通常是服务入口)
|
|
3
|
+
**用途**:跑一个 Python 脚本 (通常是服务入口)。 **这个类型来自 Python 插件**(PyCharm 一定有,IDEA 装了 Python 插件也有)。
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## XML 形状
|
|
6
6
|
|
|
7
7
|
```xml
|
|
8
|
+
|
|
8
9
|
<component name="ProjectRunConfigurationManager">
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
10
|
+
<configuration default="false" name="backend" type="PythonConfigurationType" factoryName="Python">
|
|
11
|
+
<module name="my-project"/>
|
|
12
|
+
<option name="ENV_FILES" value=""/>
|
|
13
|
+
<option name="INTERPRETER_OPTIONS" value=""/>
|
|
14
|
+
<option name="PARENT_ENVS" value="true"/>
|
|
15
|
+
<envs>
|
|
16
|
+
<env name="PYTHONUNBUFFERED" value="1"/>
|
|
17
|
+
</envs>
|
|
18
|
+
<option name="SDK_HOME" value=""/>
|
|
19
|
+
<option name="SDK_NAME" value="my-project"/>
|
|
20
|
+
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/backend/app"/>
|
|
21
|
+
<option name="IS_MODULE_SDK" value="false"/>
|
|
22
|
+
<option name="ADD_CONTENT_ROOTS" value="true"/>
|
|
23
|
+
<option name="ADD_SOURCE_ROOTS" value="true"/>
|
|
24
|
+
<option name="DEBUG_JUST_MY_CODE" value="false"/>
|
|
25
|
+
<option name="RUN_TOOL" value=""/>
|
|
26
|
+
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/backend/app/main.py"/>
|
|
27
|
+
<option name="PARAMETERS" value=""/>
|
|
28
|
+
<option name="SHOW_COMMAND_LINE" value="false"/>
|
|
29
|
+
<option name="EMULATE_TERMINAL" value="false"/>
|
|
30
|
+
<option name="MODULE_MODE" value="false"/>
|
|
31
|
+
<option name="REDIRECT_INPUT" value="false"/>
|
|
32
|
+
<option name="INPUT_FILE" value=""/>
|
|
33
|
+
<method v="2"/>
|
|
34
|
+
</configuration>
|
|
34
35
|
</component>
|
|
35
36
|
```
|
|
36
37
|
|
|
@@ -53,7 +54,14 @@
|
|
|
53
54
|
|
|
54
55
|
## 坑
|
|
55
56
|
|
|
56
|
-
- **`
|
|
57
|
-
-
|
|
57
|
+
- **`SDK_NAME` 必须是 IDE 里那个解释器的"名字"原文** —— 实测:venv 解释器在 IDE 里登记的名字是
|
|
58
|
+
`~/WebstormProjects/origin-seed-vc/.venv`(jdk.table.xml 的 `<name value>`),写成 `$HOME$/...`
|
|
59
|
+
会报 `Please select a valid Python interpreter`。拿不准就写 `IS_MODULE_SDK=true` 用模块 SDK,或先
|
|
60
|
+
`inspect` 一个已有的 Python 配置照抄 `SDK_NAME`。
|
|
61
|
+
- **`module name` 与 `SDK_NAME` 必须是本项目真实的模块 / 解释器名** —— 写错 IDE 会用不了,但不一定立刻报错。 **先查项目里已有的
|
|
62
|
+
Python 配置照抄**,查不到就问用户。
|
|
63
|
+
- 实测样本里带一个 `<EXTENSION ID="PythonCoverageRunConfigurationExtension" …/>`(覆盖率插件加的), **别抄**。
|
|
58
64
|
- 依赖装在哪决定能不能跑:走项目解释器 + `ADD_SOURCE_ROOTS`,不要指向本机某个 venv 的绝对路径。
|
|
59
|
-
-
|
|
65
|
+
- `SDK_HOME` 是 **机器级**的 (本机 venv / 解释器安装路径),别写进要共享的配置;`SDK_NAME` 只是个 **名字**,得是本项目里真实存在、
|
|
66
|
+
且 **别人机器上也配了同名**的解释器 —— 对方没配这个名字时,这个配置在别人机器上是红的。
|
|
67
|
+
- 服务类进程改代码后要重启才生效 (没有热重载)—— 这条属于 `idea-standalone` 的纪律。
|