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
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
# Shell Script(`ShConfigurationType`)
|
|
1
|
+
# Shell Script (`ShConfigurationType`)
|
|
2
2
|
|
|
3
|
-
**用途**:一条固定命令或一个脚本文件 —— 构建、打包、生成代码、跑迁移、同步某个环境的 DDL
|
|
3
|
+
**用途**:一条固定命令或一个脚本文件 —— 构建、打包、生成代码、跑迁移、同步某个环境的 DDL、起服务。 **绝大多数"
|
|
4
|
+
反复要跑的固定流程"都归它,先别换类型。**
|
|
4
5
|
|
|
5
6
|
## 二选一:脚本文本 / 脚本文件
|
|
6
7
|
|
|
@@ -9,69 +10,101 @@
|
|
|
9
10
|
| **脚本文本**(默认) | `EXECUTE_SCRIPT_FILE="false"` + `SCRIPT_TEXT` 有值 + `SCRIPT_PATH` 空 | 就一条命令,不需要单独脚本文件 |
|
|
10
11
|
| **脚本文件** | `EXECUTE_SCRIPT_FILE="true"` + `SCRIPT_PATH` 有值 + `SCRIPT_TEXT` 空 | 命令已经写成仓库里的 `.sh`,或脚本比较长 |
|
|
11
12
|
|
|
12
|
-
##
|
|
13
|
+
## XML 形状:脚本文本形态
|
|
13
14
|
|
|
14
15
|
```xml
|
|
16
|
+
|
|
15
17
|
<component name="ProjectRunConfigurationManager">
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
18
|
+
<configuration default="false" name="db-migrate" type="ShConfigurationType" factoryName="Shell Script">
|
|
19
|
+
<option name="SCRIPT_TEXT" value="pnpm -C packages/db generate pnpm -C packages/db migrate:deploy"/>
|
|
20
|
+
<option name="INDEPENDENT_SCRIPT_PATH" value="true"/>
|
|
21
|
+
<option name="SCRIPT_PATH" value=""/>
|
|
22
|
+
<option name="SCRIPT_OPTIONS" value=""/>
|
|
23
|
+
<option name="INDEPENDENT_SCRIPT_WORKING_DIRECTORY" value="true"/>
|
|
24
|
+
<option name="SCRIPT_WORKING_DIRECTORY" value="$PROJECT_DIR$"/>
|
|
25
|
+
<option name="INDEPENDENT_INTERPRETER_PATH" value="true"/>
|
|
26
|
+
<option name="INTERPRETER_PATH" value=""/>
|
|
27
|
+
<option name="INTERPRETER_OPTIONS" value=""/>
|
|
28
|
+
<option name="EXECUTE_IN_TERMINAL" value="false"/>
|
|
29
|
+
<option name="EXECUTE_SCRIPT_FILE" value="false"/>
|
|
30
|
+
<envs/>
|
|
31
|
+
<method v="2"/>
|
|
32
|
+
</configuration>
|
|
31
33
|
</component>
|
|
32
34
|
```
|
|
33
35
|
|
|
34
|
-
##
|
|
36
|
+
## XML 形状:脚本文件形态
|
|
35
37
|
|
|
36
38
|
```xml
|
|
39
|
+
|
|
37
40
|
<component name="ProjectRunConfigurationManager">
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
41
|
+
<configuration default="false" name="go-server" type="ShConfigurationType" factoryName="Shell Script">
|
|
42
|
+
<option name="SCRIPT_TEXT" value=""/>
|
|
43
|
+
<option name="INDEPENDENT_SCRIPT_PATH" value="true"/>
|
|
44
|
+
<option name="SCRIPT_PATH" value="$PROJECT_DIR$/go/run.sh"/>
|
|
45
|
+
<option name="SCRIPT_OPTIONS" value=""/>
|
|
46
|
+
<option name="INDEPENDENT_SCRIPT_WORKING_DIRECTORY" value="true"/>
|
|
47
|
+
<option name="SCRIPT_WORKING_DIRECTORY" value="$PROJECT_DIR$/go"/>
|
|
48
|
+
<option name="INDEPENDENT_INTERPRETER_PATH" value="true"/>
|
|
49
|
+
<option name="INTERPRETER_PATH" value=""/>
|
|
50
|
+
<option name="INTERPRETER_OPTIONS" value=""/>
|
|
51
|
+
<option name="EXECUTE_IN_TERMINAL" value="false"/>
|
|
52
|
+
<option name="EXECUTE_SCRIPT_FILE" value="true"/>
|
|
53
|
+
<envs/>
|
|
54
|
+
<method v="2"/>
|
|
55
|
+
</configuration>
|
|
53
56
|
</component>
|
|
54
57
|
```
|
|
55
58
|
|
|
56
59
|
## 字段
|
|
57
60
|
|
|
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` | 三处"各自独立"开关 |
|
|
66
|
-
| `INTERPRETER_PATH`
|
|
67
|
-
| `
|
|
68
|
-
| `
|
|
69
|
-
|
|
61
|
+
| 字段 | 含义 | 怎么填 |
|
|
62
|
+
| --------------------------------------------------------------------------------------------------- | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------ |
|
|
63
|
+
| `SCRIPT_TEXT` | 要执行的命令 | **多行用 ` ` 分隔**(实测这么存的),不要塞真实换行 |
|
|
64
|
+
| `EXECUTE_SCRIPT_FILE` | `false` 跑文本 / `true` 跑文件 | 决定上面两个字段谁生效 |
|
|
65
|
+
| `SCRIPT_PATH` | 脚本路径 | `$PROJECT_DIR$/...` |
|
|
66
|
+
| `SCRIPT_OPTIONS` | 传给脚本的参数 | 没有就留空 |
|
|
67
|
+
| `SCRIPT_WORKING_DIRECTORY` | 工作目录 | `$PROJECT_DIR$` 或其子目录;**不要留空** —— 留空会继承 IDE 安装目录(实测 `pwd` 输出 `…/idea-2026.2.3-aarch64`,不是项目根) |
|
|
68
|
+
| `INDEPENDENT_SCRIPT_PATH` / `INDEPENDENT_SCRIPT_WORKING_DIRECTORY` / `INDEPENDENT_INTERPRETER_PATH` | 三处"各自独立"开关 | 照抄上面 XML 形状里的默认写法即可,不用管 |
|
|
69
|
+
| `INTERPRETER_PATH` / `INTERPRETER_OPTIONS` | 解释器 / 解释器参数 | **不碰** —— 用户 / IDE 级配置,留空即默认,不要填具体路径 |
|
|
70
|
+
| `EXECUTE_IN_TERMINAL` | 是否开终端跑 | **`false`** —— 共享出去的配置不要依赖本机终端 |
|
|
71
|
+
| `envs` | 环境变量 | 没有就 `<envs />`;有就 `<env name="K" value="V" />` |
|
|
72
|
+
|
|
73
|
+
## 环境变体 (`base@env`)
|
|
74
|
+
|
|
75
|
+
名字:`base@<环境名>`(mac/Linux)、`win@base@<环境名>`(Windows)。 **base 与变体是同一件事的不同环境**,靠名字里的环境段区分。
|
|
76
|
+
|
|
77
|
+
**这个环境具体怎么接上,不归这份文档管** —— 不同项目、不同语言、不同框架的生效方式都不一样 (启动参数 / 环境变量 /
|
|
78
|
+
配置文件都常见)。
|
|
79
|
+
做法:**照项目里现成的同类环境变体来**(最稳),或者 **问用户**;实在看不出来就问,别自己编一套。
|
|
80
|
+
|
|
81
|
+
建完之后只要确认两件事:
|
|
82
|
+
|
|
83
|
+
- **名字对得上**:环境段与这个变体实际指向的环境一致;
|
|
84
|
+
- **它真的加载了那套配置**(应用启动日志里通常有一行"已加载配置 <名字>"之类)。
|
|
70
85
|
|
|
71
86
|
## 坑
|
|
72
87
|
|
|
73
|
-
- **`EXECUTE_IN_TERMINAL` 必须是 `false`**:引导文本里"执行 Shell 配置要 `EXECUTE_IN_TERMINAL: false`"说的就是它,开成
|
|
74
|
-
|
|
75
|
-
-
|
|
76
|
-
|
|
77
|
-
-
|
|
88
|
+
- **`EXECUTE_IN_TERMINAL` 必须是 `false`**:引导文本里"执行 Shell 配置要 `EXECUTE_IN_TERMINAL: false`"说的就是它,开成
|
|
89
|
+
true 的配置到了别人机器上行为不一样。
|
|
90
|
+
- **解释器是用户 / IDE 级的配置,新建时不要配、不要碰** —— 留空即默认 (实测:这三个字段整个不写,IDE
|
|
91
|
+
一样认、一样跑,文件也不会被它改回去)。它属于每个用户自己那份设置,写进共享的配置只会给别人的机器添麻烦。
|
|
92
|
+
- **别为"解释器不同"去建 win@ 那一份**:要不要分平台,只看 **命令本身**在两个 OS 上能不能跑。
|
|
93
|
+
- `factoryName` 可以省略 (实测有省略也能被认),但同一项目里 **跟着已有文件的写法**更一致。
|
|
94
|
+
- 文件里可以有 XML 注释说明这条配置实际跑的是什么 (实测项目就这么写的),有助于后来的人看懂。
|
|
95
|
+
|
|
96
|
+
## 跨机器共享 (配置进 git 给全组用)
|
|
97
|
+
|
|
98
|
+
按"绑在哪一层"分三档,建配置前对着过一遍:
|
|
99
|
+
|
|
100
|
+
| 档 | 内容 | 跨机器怎么办 |
|
|
101
|
+
| --------------- | -------------------------------------------------------------------- | ---------------------------------------------------------------------------- |
|
|
102
|
+
| **项目级** | 配置名、`SCRIPT_TEXT`、仓库内的路径、工作目录、`EXECUTE_*`、前置任务 | 直接进 git |
|
|
103
|
+
| **OS 级** | 脚本后缀、命令语法差异、平台专属工具 | 每个 OS 一份(macOS/Linux 默认,Windows 用 `win@` 前缀) |
|
|
104
|
+
| **机器 / 人级** | 本机绝对路径、本机 SDK 实例、envs 里的本机值 | **不要写进 run config** —— 挪到 `.env`、仓库里的配置文件,或 IDE 的项目级设置 |
|
|
105
|
+
|
|
106
|
+
- **项目内的路径一律 `$PROJECT_DIR$`**(或它的子目录),不要写本机的绝对路径 —— 写死了别人 clone 下来就指到不存在的目录。
|
|
107
|
+
- **`SCRIPT_OPTIONS` 里传相对路径**,不要传绝对路径。
|
|
108
|
+
- **`envs` 只放不随机器变的东西**(`PYTHONUNBUFFERED=1` 这种);本机路径、端口、主机名、凭据一律不进。
|
|
109
|
+
- **命令本身要两边都跑得通**:`pnpm --filter x build` 两边都行;`./gradlew`、`rm -rf`、`set -a` 这类只在一个平台成立的,才值得分一份
|
|
110
|
+
win@ 版本。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: idea-standalone
|
|
3
|
-
description: "
|
|
3
|
+
description: "为项目固化 standalone(启动收口只有 IDEA run configuration)模式的纪律:写进项目根 `AGENTS.md` 的 `idea-standalone` 标记块,产物两段 —— standalone 是什么、经 run configuration 启动哪些应用(每个应用一条:端口、热重载、改完代码要不要重启)。要定「本机跑哪几个应用」「启停走哪个工具」「哪些应用改了必须重启」这类项目级纪律时使用。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# idea-standalone — standalone 模式纪律
|
|
@@ -9,7 +9,8 @@ description: "为项目生成/维护 standalone(启动收口只有 IDEA run conf
|
|
|
9
9
|
|
|
10
10
|
本 skill 为项目固化它 **standalone 模式**(启动收口只有 IDEA run configuration)下怎么跑、AI 能做什么不能做什么。
|
|
11
11
|
|
|
12
|
-
- **产物位置固定:项目根 `AGENTS.md`**,作为其中一块,用 `<!-- idea-standalone:begin -->` 与 `<!-- idea-standalone:end -->`
|
|
12
|
+
- **产物位置固定:项目根 `AGENTS.md`**,作为其中一块,用 `<!-- idea-standalone:begin -->` 与 `<!-- idea-standalone:end -->`
|
|
13
|
+
包裹。
|
|
13
14
|
项目根 `AGENTS.md` 是 AI 在本项目工作时必读的文件,所以写在这里天然"总是生效",不需要额外的规则文件与开关。
|
|
14
15
|
- **标记之内由本 skill 生成与维护;标记之外的项目内容一律不动。**
|
|
15
16
|
- **目标产物的骨架、各段内容约定与写作规范以 [assets/AGENTS.template.md](assets/AGENTS.template.md) 为准**,本 skill 不另行维护
|
|
@@ -18,25 +19,36 @@ description: "为项目生成/维护 standalone(启动收口只有 IDEA run conf
|
|
|
18
19
|
|
|
19
20
|
## 读取
|
|
20
21
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
- 读 `<项目根>/AGENTS.md
|
|
24
|
-
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
22
|
+
**现状**
|
|
23
|
+
|
|
24
|
+
- 读 `<项目根>/AGENTS.md`:有没有 `idea-standalone` 标记块 (有则更新,没有就在文件末尾追加)。
|
|
25
|
+
- 枚举:该项目的 `<前缀>_get_run_configurations` 直接调用,不传任何参数 —— 它给出 IDE 真正认的配置,连同启动细节 (程序参数、
|
|
26
|
+
工作目录、环境变量、能否启动时覆盖)。 **条目里的 base 名与端口只能来自这里**,不用再去项目目录逐个翻配置文件。
|
|
27
|
+
- 只登记 base:名字是 `[os@]base[@env]` (`@` 分割、最多三段),带 `@` 段的一律 **取 base 部分登记**;平台 / 环境由名字里的
|
|
28
|
+
段决定,不逐个列 —— 文法与选法见模板的「怎么读配置名」与「怎么选变体」。 **一条配置一个条目**:服务化 / 常驻的都算,
|
|
29
|
+
同一个应用有多条就写多条。
|
|
30
|
+
|
|
31
|
+
**缺口** (逐条向用户确认,不猜)
|
|
32
|
+
|
|
33
|
+
- 端口:启动细节里没有、项目自身配置里也读不到 → **问用户**。
|
|
34
|
+
- 热重载:看运行方式 (项目类型 `package.json` / `pom.xml` / `go.mod` / `pyproject.toml` / `Cargo.toml` 决定有没有 HMR),
|
|
35
|
+
不确定就问用户。
|
|
36
|
+
- 缺配置:`run configuration` 列表里没有某个应用 → **先问用户要不要建**,再用 `<前缀>_create_run_configuration` 建 (建配置是
|
|
37
|
+
**项目资产**:把"配置名、干什么、为什么值得留"摊开给用户看,同意才建);工具列表里没有它时,请用户自己在 IDE 里建。建完
|
|
38
|
+
**重新查一次**,再登记。不要手搓启动命令,也不要自己写配置文件。
|
|
39
|
+
- 归属:哪些配置进 standalone、`应用` 那一项填什么 (同一个应用可以有多条配置)、哪些配置名对不上 → 问用户。
|
|
40
|
+
|
|
41
|
+
**写之前**先读 [assets/AGENTS.template.md](assets/AGENTS.template.md)。
|
|
32
42
|
|
|
33
43
|
## 生成与更新
|
|
34
44
|
|
|
35
|
-
1.
|
|
36
|
-
2. 先读 [assets/AGENTS.template.md](assets/AGENTS.template.md)
|
|
37
|
-
|
|
45
|
+
1. 归属判断:属于这两段的内容写进 `idea-standalone` 标记块;不属于的 (项目自己的其它纪律)留在标记外,本 skill 不写。
|
|
46
|
+
2. 先读 [assets/AGENTS.template.md](assets/AGENTS.template.md),按其中的生成提示逐段填充。 **
|
|
47
|
+
`<!-- 生成提示:begin -->…<!-- 生成提示:end -->` 是给生成过程的说明,产物里整块删掉** —— 产物是给 AI 当规则读的,里面不该留指令。
|
|
48
|
+
同时:**未涉及的条目与小节整块删掉**,不留空标题、不留 `{...}`。
|
|
38
49
|
3. **新增**(文件里还没有标记块):在 `AGENTS.md` **末尾追加**标记块,文件既有内容原样保留;文件不存在则创建它。
|
|
39
|
-
只替换标记内内容、不动标记外 ——
|
|
50
|
+
只替换标记内内容、不动标记外 —— 尤其 **不要触碰**其他 skill 的标记块 (例如 `project-scaffold`)。
|
|
40
51
|
4. **更新**(已有标记块):只替换 `<!-- idea-standalone:begin -->` 与 `<!-- idea-standalone:end -->` 之间的内容,块外一字不动。
|
|
41
|
-
5.
|
|
52
|
+
5. 改文件用 **IDE 的编辑命令** `<前缀>_apply_patch`(新建用 `<前缀>_create_new_file`),不要用原生 `write` / `edit`。
|
|
53
|
+
**不要整文件重写**。
|
|
42
54
|
6. 复读并核对:标记块内逐段与模板一致,块外内容与改动前逐字一致,报告产物清单。
|
|
@@ -4,68 +4,121 @@
|
|
|
4
4
|
|
|
5
5
|
<!-- 生成提示:begin -->
|
|
6
6
|
|
|
7
|
-
本块由 `idea-standalone` skill 生成与维护。标记内只写 standalone 模式的纪律;标记之外是项目自己在 `AGENTS.md` 里维护的内容,本
|
|
8
|
-
|
|
9
|
-
**`<!-- 生成提示:… -->`
|
|
7
|
+
本块由 `idea-standalone` skill 生成与维护。标记内只写 standalone 模式的纪律;标记之外是项目自己在 `AGENTS.md` 里维护的内容,本
|
|
8
|
+
skill 一律不动。
|
|
9
|
+
`{...}` 是待替换的元变量,不留进产物。未涉及的条目与小节整块删掉,不留空标题。 **`<!-- 生成提示:… -->`
|
|
10
|
+
是给生成过程的说明,产物里整块删掉** —— 产物是给 AI 当规则读的,里面不该留指令。
|
|
10
11
|
<!-- 生成提示:end -->
|
|
11
12
|
|
|
12
13
|
## 一、什么是 standalone 模式
|
|
13
14
|
|
|
14
|
-
**standalone = 启动收口只有 IDEA run configuration** —— 每个应用的启动入口是 IDEA 的 run configuration(Run / Debug)
|
|
15
|
+
**standalone = 启动收口只有 IDEA run configuration** —— 每个应用的启动入口是 IDEA 的 run configuration (Run / Debug)
|
|
16
|
+
,不是手搓命令行;至于配置内部怎么起 (**本机进程 / 容器 / 部署到远端**)
|
|
17
|
+
,由它自己决定,本段不预设。给"本项目怎么起、起在哪"下定义,至少覆盖:
|
|
15
18
|
|
|
16
|
-
- **入口唯一(唯一绝对的约束)**:每个应用的启动入口就是 IDEA 的 run configuration
|
|
17
|
-
- **形态不限**:配置可以起本机进程,也可以是容器(Compose / K8s)、或部署到远端 ——
|
|
19
|
+
- **入口唯一 (唯一绝对的约束)**:每个应用的启动入口就是 IDEA 的 run configuration, **不是手搓命令行**。
|
|
20
|
+
- **形态不限**:配置可以起本机进程,也可以是容器 (Compose / K8s)、或部署到远端 —— 怎么起是配置的事,
|
|
21
|
+
**不要假设它一定在本机直跑**。相应地,哪些应用 **不在本机跑、或本机起不来**要单独写明 (需要 GPU
|
|
22
|
+
的服务、本机直连的远端数据库、只能部署后验证的服务),别当成"本机直跑"来验证。
|
|
18
23
|
- **只启动其中一部分是常态** —— 不要求所有应用都起来,用户可能只开一两个。
|
|
19
24
|
- **跑应用只用 `<前缀>_rerun_run_configuration`**:在跑就重启、没在跑就启动 —— 不必分辨"这是启动还是重启",直接 rerun 就完事。
|
|
20
25
|
常驻进程化 / 服务化的 run configuration 一律走这一条。
|
|
21
|
-
- **不要用 `<前缀>_execute_run_configuration`
|
|
26
|
+
- **不要用 `<前缀>_execute_run_configuration` 跑这些应用**:它是给 **命令 / Job 类型**的配置跑的,standalone 的配置是
|
|
27
|
+
**常驻型**(起来就不退),
|
|
22
28
|
用它只会起出重复实例。
|
|
23
|
-
- **也不要绕过 IDEA**:不用 `go run` / `pnpm dev` / `uvicorn` / `python -m ...` 这类裸命令起进程,更不要 `kill` / `pkill`
|
|
24
|
-
|
|
29
|
+
- **也不要绕过 IDEA**:不用 `go run` / `pnpm dev` / `uvicorn` / `python -m ...` 这类裸命令起进程,更不要 `kill` / `pkill`
|
|
30
|
+
业务进程 ——
|
|
31
|
+
外部杀掉的进程 IDE 并不知道 (Run 窗口仍显示运行中,下次启动就撞端口)。
|
|
25
32
|
- **重启不必先问**:改完代码要重启哪个应用,直接 `<前缀>_rerun_run_configuration` —— 这条链是无人化的,先征求同意只会把重启卡住。
|
|
26
|
-
- 工具列表里没有 `<前缀>_rerun_run_configuration` 时(没装配套插件):交回用户,请他在 IDEA 里手动跑,AI 不动手。
|
|
27
|
-
- **与部署链纪律互不构成许可**:本段管的是 **standalone
|
|
33
|
+
- 工具列表里没有 `<前缀>_rerun_run_configuration` 时 (没装配套插件):交回用户,请他在 IDEA 里手动跑,AI 不动手。
|
|
34
|
+
- **与部署链纪律互不构成许可**:本段管的是 **standalone 跑应用的方式**
|
|
35
|
+
,不适用于部署流程;反过来,部署链里的步骤也不构成"可以绕开本段、用裸命令在本机起应用"的许可 —— 两阶段纪律互相独立。
|
|
28
36
|
|
|
29
|
-
|
|
37
|
+
**配置、端口、热重载有变化时,本块要跟着改** —— 做法见 `idea-standalone` skill。
|
|
38
|
+
|
|
39
|
+
## 二、standalone 下启动哪些应用 (必须经 IDEA run configuration)
|
|
40
|
+
|
|
41
|
+
**「怎么读配置名」与「怎么选变体」两节是固定文本,照抄,不要改写、不要删条目** —— 它们是读名字与选变体的规则,下面那个列表靠它们才成立。
|
|
30
42
|
|
|
31
43
|
<!-- 生成提示:begin -->
|
|
32
44
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
45
|
+
一条一个 **run configuration**(服务化 / 常驻的那种)—— **应用只是它的一个属性**:同一个应用有多条配置 (前端 dev server +
|
|
46
|
+
后端服务)就写多条,别合并成一条。 **括号里的项目是这条配置的归属**(root 写 `ide`,子项目写它的目录名):配置可能住在子项目
|
|
47
|
+
里,跑它就用 **那个前缀**的工具 —— 拿不准就问用户。 **条目开头的名字填真实 base 名**(不带任何 `@` 段),平台与环境由名字里
|
|
48
|
+
的段决定,见上面「怎么读配置名」。
|
|
49
|
+
**变体不另起一条**:`win@base`(换平台)、`base@env`(换环境)都是同一个 base 的变种,写一条就够,怎么选走「怎么选变体」那节。
|
|
50
|
+
|
|
51
|
+
**下面是两个示例**,照这个形状写 —— 一条把长的地方展开,一条全是短句 (生成产物时把示例删掉):
|
|
52
|
+
|
|
53
|
+
- `console-web`(项目 ide)
|
|
54
|
+
- 应用:console
|
|
55
|
+
- before run:先起 platform-server:`/api` 代理到平台服务端地址
|
|
56
|
+
- run:ide_rerun_run_configuration
|
|
57
|
+
- 端口:5173,被占用时 Vite 自动顺延
|
|
58
|
+
- 热重载:有(Vite HMR) —— 改前端源码自动热更新,无需重启
|
|
59
|
+
- after run:无
|
|
60
|
+
- desc:前端控制台 (React + Vite dev server)
|
|
61
|
+
|
|
62
|
+
- `platform-server`(项目 ide)
|
|
63
|
+
- 应用:platform
|
|
64
|
+
- before run:
|
|
65
|
+
- 确认 Tailscale 已连到 yutao-mac
|
|
66
|
+
- 确认 apps/platform/.env 存在
|
|
67
|
+
- run:ide_rerun_run_configuration
|
|
68
|
+
- 端口:8080,被占用即启动失败
|
|
69
|
+
- 热重载:有(`node --watch` 自动重启);改了 .env 或依赖才需重启
|
|
70
|
+
- after run:无
|
|
71
|
+
- desc:平台服务端 (Node + Fastify);起不来时先查 Tailscale 与 .env
|
|
72
|
+
|
|
73
|
+
`run configuration` **必须是 `<前缀>_get_run_configurations` 里真实存在的 base 名**,不凭印象写;缺配置就
|
|
74
|
+
**先问用户要不要建**,
|
|
75
|
+
再用 `<前缀>_create_run_configuration` 建 (建之前把"配置名、干什么、为什么值得留"摊开给用户看,同意才建);工具列表里没有它时,
|
|
76
|
+
请用户自己在 IDE 里建。不要手搓启动命令,也不要自己写配置文件。 **应用** 写它服务的是哪个应用 (前端 / 后端 / 网关这类用户认得的名字) —— 同一个名字可以出现在多条配置里,这正是本块按配置
|
|
77
|
+
而不按应用列的原因。 **before run** 写 **跑之前要先做的事**:**多数应用写 `无`**
|
|
78
|
+
(这一项始终在,不留空)。只有确实"得先做点什么才能起"时才写,而且 **一条一步、按顺序排**(例如
|
|
79
|
+
`1. 装依赖 2. 构建 3. 起前置服务`);
|
|
80
|
+
这些事 **用文字写出来**(AI 照这段文本自己按序去做)。这类前置事项往往没被写成 run configuration,所以必须在这里说明,否则 AI
|
|
81
|
+
直接 rerun 会拿到一个起不来的进程。 **哪条配置必须先起来**也要写明 (例如前端 dev server 的 proxy 指向本机后端)。
|
|
82
|
+
与本项目无关的配置不写。 **run** 写走哪条工具:常驻 / 服务化的配置一律 `rerun`(在跑就重启、没在跑就启动), **不要**用
|
|
83
|
+
`execute` —— 它是 Run 路径,对常驻进程会起出重复实例;细节见「跑应用只用 rerun」那条。 **端口** 写清"固定 / 默认 /
|
|
84
|
+
被占用即启动失败";读不到就 **问用户**,不要编。 **服务化的应用一定有端口**,这一项是它区别于固定流程的地方。 **after run** 写
|
|
85
|
+
**起来之后才知道的结果**:日志落在哪 / 什么时候才算 ready / 起来之后要接着做什么 (要跑迁移、要把地址交给谁); **多数写
|
|
86
|
+
`无`**。 **热重载** 写**有没有、以及 AI 改代码后要不要重启**:有(Vite HMR / `node --watch` 这类)写清机制、改完自动生效;
|
|
87
|
+
无(`go run .` 这类)写明 **必须重启**。判定要有依据(运行方式 → 有没有 HMR), **不确定就问用户,不猜**。
|
|
88
|
+
**没有热重载的应用改完之后,不得在没有提示的情况下宣称"改动完成 / 可以去验证了"** —— 重启动作由用户做。
|
|
89
|
+
**desc** 写剩下的坑与依赖关系 (依赖谁、跟别的应用什么先后),以及例外 (**只在联调 / 某个流程之前才需要起**之类)。
|
|
90
|
+
**目录**这类配置里本来就有的字段不要单开一项 —— 会跟配置变旧而对不上。 **有 `@` 变体就在这里补一句**:有哪些变体 (如
|
|
91
|
+
`console-web@yutao`)。 **项名与顺序**与 `idea-run-config-manager` 那个块 **同名同序**(`before run` / `run` /
|
|
92
|
+
`after run` / `desc`);
|
|
93
|
+
本块多 `应用` / `端口` / `热重载`,少一项 `when` —— 服务化配置就是"改完代码要起它来测"的时候起,没有别的时机可写。两个块住在同一份
|
|
94
|
+
`AGENTS.md` 里,名字与顺序对上了才看得出哪些是服务、哪些是固定流程。 **某项确实没有内容就写 `无`**(不省略、也不写 `-`)。
|
|
48
95
|
<!-- 生成提示:end -->
|
|
49
96
|
|
|
50
|
-
###
|
|
97
|
+
### 怎么读配置名
|
|
51
98
|
|
|
52
|
-
|
|
53
|
-
|
|
99
|
+
run configuration 的名字是 `[os@]base[@env]`,`@` 分割、最多三段:`os` = `win`(缺省表示:macOS / Linux)、`base` = 配置本体
|
|
100
|
+
(必填)、`env` = 环境名(缺省表示:所有环境通用)。`win@base`(换平台)与 `base@env`(换环境)都是 `base` 的 **变种**:
|
|
101
|
+
同一件事,平台 / 环境不同。 **只登记 base**,变体不另起条目 —— 有哪些变体写进 base 的 `desc`。
|
|
54
102
|
|
|
55
|
-
###
|
|
103
|
+
### 怎么选变体
|
|
56
104
|
|
|
57
|
-
|
|
58
|
-
|
|
105
|
+
- **平台**:macOS / Linux 用 `base`,Windows 用 `win@base` —— `win@base` 不存在就 **交回用户**,别拿 base 顶替。
|
|
106
|
+
- **环境**:`base` 与 `base@<env>` 同时存在 → **启动前问一次用户走哪套**,选定后本会话默认走这套,别反复问 ——
|
|
107
|
+
改代码 → 自己重启 → 同一套变体。
|
|
108
|
+
- 一个环境怎么接上 (启动参数 / 环境变量 / 配置文件) 是项目自己的事:照现成的同类变体来,或问用户。
|
|
59
109
|
|
|
60
|
-
|
|
110
|
+
### 服务化配置
|
|
61
111
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
逐应用判定。热重载列必须有依据(运行方式 → 有没有 HMR),不确定就问用户,不猜。非热重载的应用改动后,**不得**在没有提示的情况下宣称
|
|
65
|
-
"改动完成 / 可以去验证了";重启动作由用户手动做。`go run .` 这类**没有热重载**的写法要写进来,别让 AI 以为改了代码就自动生效。
|
|
66
|
-
<!-- 生成提示:end -->
|
|
112
|
+
一条一个 run configuration;`应用` 是它的属性 —— 同一个应用可以有多条配置。括号里的项目是它的归属:跑这条配置,用那个项目
|
|
113
|
+
前缀的工具。
|
|
67
114
|
|
|
68
|
-
|
|
69
|
-
|
|
115
|
+
- {base 名} (项目 {前缀})
|
|
116
|
+
- 应用:{应用名}
|
|
117
|
+
- before run:{第 1 步 / 第 2 步 / 无}
|
|
118
|
+
- run:{<前缀>_rerun_run_configuration}
|
|
119
|
+
- 端口:{固定 / 默认 / 被占用即启动失败}
|
|
120
|
+
- 热重载:{有(什么机制) / 无};AI 改代码后:{自动生效 / 必须重启}
|
|
121
|
+
- after run:{日志落在哪 / ready 判据 / 无}
|
|
122
|
+
- desc:{它是什么 + 有什么坑 + 有哪些 @ 变体}
|
|
70
123
|
|
|
71
124
|
<!-- idea-standalone:end -->
|
package/src/ide-guidance.js
CHANGED
|
@@ -152,6 +152,9 @@ function mergeRunLifecycle(projects, tools) {
|
|
|
152
152
|
const all = projects.map((project) => runLifecycleCapabilities(tools, `${project.server}_`));
|
|
153
153
|
return {
|
|
154
154
|
canCreateRunConfiguration: all.some((c) => c.canCreateRunConfiguration),
|
|
155
|
+
canInspectRunConfiguration: all.some((c) => c.canInspectRunConfiguration),
|
|
156
|
+
canUpdateRunConfiguration: all.some((c) => c.canUpdateRunConfiguration),
|
|
157
|
+
canDeleteRunConfiguration: all.some((c) => c.canDeleteRunConfiguration),
|
|
155
158
|
canListRunningConfigurations: all.some((c) => c.canListRunningConfigurations),
|
|
156
159
|
canStopRunConfiguration: all.some((c) => c.canStopRunConfiguration),
|
|
157
160
|
canRerunRunConfiguration: all.some((c) => c.canRerunRunConfiguration),
|