opencode-idea 0.0.20 → 0.0.22
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
CHANGED
|
@@ -364,21 +364,24 @@ loader 读的是 OpenCode 文档里的那个嵌套写法(它自己的读取器
|
|
|
364
364
|
1. **建 / 改 / 删**(直接动手):Shell 类型走 `ide_create_shell_run_configuration`,其余类型直接写 / 改 / 删 `.run/<名字>.run.xml`,
|
|
365
365
|
**每种类型照自己的模板写**,写完用 `get_run_configurations` 复查;
|
|
366
366
|
2. **建档**:过滤之后剩下的每个 run configuration 在**项目根 `AGENTS.md`** 的标记块(`<!-- idea-run-config-manager:begin -->` /
|
|
367
|
-
`<!-- idea-run-config-manager:end -->`)里占**一个条目** —— 标题是配置名(括号里写它属于哪个项目)
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
367
|
+
`<!-- idea-run-config-manager:end -->`)里占**一个条目** —— 标题是配置名(括号里写它属于哪个项目),下面五项固定:
|
|
368
|
+
`when` / `before run` / `run` / `after run` / `desc`;
|
|
369
|
+
`when` 回答的是**谁能起它**,而这件事只有三种:`用户授权触发`(用户开口 / 在本会话里一次性授权之后 AI 才跑,后面写用户通常在什么情况下要它跑)、
|
|
370
|
+
`AI 自己触发`(AI 判断到场景就自己跑,**必须把场景写具体**)、`用户手动触发` ——
|
|
371
|
+
最后这一种**不进条目**,只登记在块末尾「用户手动触发(线下,AI 不跑)」一节,**只有名字**,五项一律不写(没人会照它跑);
|
|
372
|
+
判断不了就问用户,有副作用(改远端 / 动数据 / 出产物)又说不清场景的,归"用户授权触发";
|
|
373
|
+
`after run` 写跑完的结果(产物落在哪、接下来要不要发布 / 拷贝 / 通知,没有就写 `无`),`desc` 写它是什么、有什么坑 —— **五项始终都在**,不省略;
|
|
372
374
|
**按操作系统分成两节**(macOS / Linux、Windows,与 `idea-standalone` 的两张应用表同一种拆法:同一条流程在两个平台上常常不是同一条命令);
|
|
373
|
-
**与 `idea-standalone`
|
|
374
|
-
|
|
375
|
+
**与 `idea-standalone` 应用表的列同名同序** —— `before run` / `run` / `after run` / `desc` 四项两边一致;
|
|
376
|
+
本块多 `when`(服务化应用就是改完代码起它来测,没有别的时机),那边多 `app` / `run configuration` / `port`;
|
|
375
377
|
**热重载矩阵只有 3 列,不参与这套对应** —— 它答的是"改动后要不要重启";
|
|
376
|
-
**目录 / 端口 / 干什么都不单开一项**(standalone 的端口除外):前两个配置里本来就有,抄进来只会过时,第三个与
|
|
378
|
+
**目录 / 端口 / 干什么都不单开一项**(standalone 的端口除外):前两个配置里本来就有,抄进来只会过时,第三个与 `desc` 重复;
|
|
377
379
|
3. **过滤**:服务化(长驻应用)的配置归 `idea-standalone` 的块,这里先读那个块把它排除,**两个块永不重叠**。
|
|
378
380
|
|
|
379
|
-
> **两个块的形态刻意不同**:档案块是**条目式**(
|
|
381
|
+
> **两个块的形态刻意不同**:档案块是**条目式**(一条配置一个条目,五项各占一行 —— `desc` 常是一段话,塞进表格格子里既难读、
|
|
380
382
|
> 又要靠补空格维持对齐),`idea-standalone` 的应用表**保持表格**(列短、还有 `端口` 这种一格一个值的列)。
|
|
381
|
-
>
|
|
383
|
+
> 所以两边靠的是**同名同序的四项**(`before run` / `run` / `after run` / `desc`)加各自独有的列,而不是宽度;
|
|
384
|
+
> `AGENTS.md` 里一眼能看出哪几条是服务、哪几条是固定流程,靠的就是它。
|
|
382
385
|
|
|
383
386
|
**SKILL.md 只有一份五步流程**(读 → 枚举 → 建 / 删 / 改 → 同步 → 核对),外加**支持矩阵**与**硬性契约**(落地位置、固定信封、复查、
|
|
384
387
|
路径宏、不要写模板外的字段)——**它自己就带着规矩**;两类内容另放在两个地方,各管一段:
|
|
@@ -386,7 +389,7 @@ loader 读的是 OpenCode 文档里的那个嵌套写法(它自己的读取器
|
|
|
386
389
|
| 模板 | 装什么 |
|
|
387
390
|
| ---------------------------------------------------------- | ------------------------------------------------------------------------------------- |
|
|
388
391
|
| `skills/idea-run-config-manager/assets/types/<类型>.md` | **一个类型一份**:那个类型的实测样本 + 字段表 + 坑(索引就是 SKILL.md 里的**支持矩阵**) |
|
|
389
|
-
| `skills/idea-run-config-manager/assets/AGENTS.template.md` | 产物(档案)
|
|
392
|
+
| `skills/idea-run-config-manager/assets/AGENTS.template.md` | 产物(档案)的骨架:条目怎么写、五项分别写什么、枚举与过滤的要求,都在它的生成提示里 |
|
|
390
393
|
|
|
391
394
|
**支持矩阵(7 份已落、2 份待实物)**:
|
|
392
395
|
|
package/package.json
CHANGED
|
@@ -21,7 +21,7 @@ metadata:
|
|
|
21
21
|
- **没有模板**(⏳ 或矩阵之外)→ **交给用户**:讲清要配什么(配置名、干什么、什么时候跑),请他在 IDE 里配好,你只负责把档案补上。
|
|
22
22
|
3. **写完必须复查**:`<前缀>_get_run_configurations` 里要能看到它。**看不到就是文件没被 IDE 认** —— `type` 写错会被静默忽略且不报错,回去查 `type` / 文件位置 / 信封。
|
|
23
23
|
4. **不要手搓启动命令**代替配置,也**不要写模板里没有的字段**(多余字段被忽略、名字写错静默用默认值,都不会报错)。
|
|
24
|
-
4. **同步文档**:按 [assets/AGENTS.template.md](assets/AGENTS.template.md) 逐段填,写在标记块内 ——
|
|
24
|
+
4. **同步文档**:按 [assets/AGENTS.template.md](assets/AGENTS.template.md) 逐段填,写在标记块内 —— **条目怎么写、五项分别写什么、枚举与过滤的要求,都在那份模板的生成提示里**,动手前先读它;生成提示是给生成过程的说明,**产物里整块删掉**,块外一字不动(尤其**不要触碰**其他 skill 的标记块)。
|
|
25
25
|
5. **核对**:块里每个名字项目里都还在,项目里每个配置块里都有。
|
|
26
26
|
|
|
27
27
|
## 支持矩阵(一个类型一份模板)
|
|
@@ -11,7 +11,11 @@
|
|
|
11
11
|
|
|
12
12
|
本项目里**除服务化应用之外**的 run configuration:每个配置**是什么、怎么跑、什么时候跑**;服务化(长驻应用)的配置登记在 `idea-standalone` 块里,不在这里。
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
**谁能起它,只有三种** —— 读这个块的人照它决定动不动手:
|
|
15
|
+
|
|
16
|
+
- **用户手动触发**:用户自己在 IDE 里跑,AI **完全不碰**。这类只登记在末尾「用户手动触发」一节,**只有名字**,没有别的说明。
|
|
17
|
+
- **用户授权触发**:用户开口之后 AI 才跑(用户也可以在这个会话里一次性授权);**AI 不自己挑时机**。
|
|
18
|
+
- **AI 自己触发**:AI 判断到场景就自己跑;这类条目的 `when` **必须把那个场景写具体**。
|
|
15
19
|
|
|
16
20
|
## run configuration 一览
|
|
17
21
|
|
|
@@ -23,36 +27,51 @@
|
|
|
23
27
|
标题里的配置名必须是该前缀下**真实存在的名字**,不凭印象写;块里有、项目里已经没有的**整个条目删掉**。
|
|
24
28
|
**按操作系统分成两节**:macOS / Linux 一节,Windows 一节。同一份流程在两个平台上常常不是同一条命令(解释器不同、脚本后缀不同、路径写法不同),所以**按这个配置真正能跑的那个平台归节**,不要把 Windows 上才成立的命令写进 macOS 那一节。判断依据看配置里的解释器路径与脚本内容(例如 `INTERPRETER_PATH` 指向 PowerShell、命令里有 `\` 路径的,就是 Windows);**判断不了就问用户**,不猜。只在一个平台成立的流程就只写那一节。
|
|
25
29
|
|
|
26
|
-
|
|
27
|
-
**何时跑**写**谁能起它、什么场景起它** —— 二选一,必须写明:
|
|
30
|
+
**when** 写**谁能起它、什么场景起它** —— 会进这份列表的只有两种,写明是哪一种:
|
|
28
31
|
|
|
29
|
-
-
|
|
30
|
-
- **AI
|
|
32
|
+
- **用户授权触发**:用户开口(或在本会话里授权)之后 AI 才跑;后面写用户通常在什么情况下会要它跑(发版前 / 出安装包 / 回归)。
|
|
33
|
+
- **AI 自己触发**:AI 判断到这个场景就自己跑;后面**必须把场景写具体**(改完某类代码要生成代码 / 改了依赖要装依赖 / 改了 schema 要同步某个环境的 DDL),不写"需要时""合适时"。
|
|
31
34
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
**说明**是这个条目唯一的自由文本项:**它是什么、干什么的**(同步某个环境的 DDL / 生成代码 / 跑迁移 …),以及有什么坑(必须先备份 / 只对某个环境生效 / 幂等与否 …)。
|
|
35
|
-
分两件事都往这里写,**不要再开新项**。写清它到底跑什么命令,就读它所在项目的落地文件 `.run/<name>.run.xml` 看里面的内容,拿不准就**问用户**,不猜。
|
|
36
|
-
本块的**主要价值**就在**说明**与**跑前做**:下次要办同类事情先在这里搜关键词,找得到就直接用,**不要再建一个重复的**。
|
|
37
|
-
**目录、端口这类"配置里本来就有"的字段不要抄进来** —— 它们会跟配置变旧而对不上;确实要交代依赖关系,就写进 `说明` 或 `跑前做`。
|
|
38
|
-
**四项的项名与顺序不要改**(`怎么跑` / `何时跑` / `跑前做` / `说明`),并且**与 `idea-standalone` 应用表的列对得上**:三项同名同序(`怎么跑` / `跑前做` / `说明`),本块**多一项 `何时跑`**、那边**多一列 `端口`**(服务化应用就是"改完代码要起它来测"的时候起,不用单列时机)—— 两个块住在同一份 `AGENTS.md` 里,名字与顺序对上了,才看得出哪几条是服务、哪几条是固定流程。某一项确实没有内容就**整项不写**,不要写 `-` / `无` / `N/A`。
|
|
35
|
+
第三种 —— **用户手动触发**(用户自己在 IDE 里跑、AI 完全不碰)**不要写进上面的条目**,登记到末尾「用户手动触发」一节,只写名字。
|
|
36
|
+
判断不了就问用户。**有副作用的流程(改远端、动数据、出产物)说不清场景就别标成 AI 自己触发** —— 归"用户授权触发"。
|
|
39
37
|
|
|
38
|
+
**before run** 写**跑之前要先做的事**(先装依赖 / 先构建 / 先起某个服务):**多数没有 —— 写 `无`**(这一项始终在,别省略)。确实得先做点什么才写,而且**按顺序写清第 1 步、第 2 步**。前置事项往往**不是**一个 run configuration(没有对应配置),所以只能写在这里 —— 漏了它,照着本块跑的人会直接跑出一个起不来的流程。
|
|
39
|
+
**run** 写走哪条工具:跑完即退的用 `<前缀>_execute_run_configuration`;长驻进程用 `<前缀>_rerun_run_configuration`(在跑就重启、没在跑就启动)。**不要**用 `execute` 跑长驻进程 —— 它是 Run 路径,对常驻进程**它会起出重复实例**。
|
|
40
|
+
**after run** 写**跑完之后的结果**:产物落在哪(路径 / 文件名 / 被谁读走),以及**接下来要不要做什么**(要发布 / 要拷贝到某处 / 要通知谁 / 什么都不用做)。**没有产物、跑完就完的,写 `无`。**
|
|
41
|
+
**desc** 是这个条目唯一的自由文本项:**它是什么、干什么的**(同步某个环境的 DDL / 生成代码 / 跑迁移 …),以及有什么坑(必须先备份 / 只对某个环境生效 / 幂等与否 …)。
|
|
42
|
+
分两件事都往这里写,**不要再开新项**。写清它到底跑什么命令,就读它所在项目的落地文件 `.run/<name>.run.xml` 看里面的内容,拿不准就**问用户**,不猜。
|
|
43
|
+
本块的**主要价值**就在 **desc** 与 **before run**:下次要办同类事情先在这里搜关键词,找得到就直接用,**不要再建一个重复的**。
|
|
44
|
+
**目录、端口这类"配置里本来就有"的字段不要抄进来** —— 它们会跟配置变旧而对不上;确实要交代依赖关系,就写进 `desc` 或 `before run`。
|
|
45
|
+
**五项的名字与顺序不要改**(`when` / `before run` / `run` / `after run` / `desc`),并且**与 `idea-standalone` 应用表的列同名同序**(`before run` / `run` / `after run` / `desc` 这四项两边一致);本块多 `when`,那边多 `app` / `run configuration` / `port`(服务化应用就是"改完代码要起它来测"的时候起,没有别的时机可写)。**五项始终都在**:`before run` / `after run` 真没有内容就写 **`无`** —— 不省略,也不写 `-` / `N/A`。
|
|
40
46
|
<!-- 生成提示:end -->
|
|
41
47
|
|
|
42
48
|
### macOS / Linux
|
|
43
49
|
|
|
44
50
|
- {配置名}(项目 {前缀})
|
|
45
|
-
-
|
|
46
|
-
-
|
|
47
|
-
-
|
|
48
|
-
-
|
|
51
|
+
- when:{用户授权触发 / AI 自己触发} —— {什么场景}
|
|
52
|
+
- before run:{第 1 步 / 第 2 步 / 无}
|
|
53
|
+
- run:{<前缀>_execute_run_configuration}
|
|
54
|
+
- after run:{产物落在哪 / 接下来要做什么 / 无}
|
|
55
|
+
- desc:{它是什么 + 有什么坑}
|
|
49
56
|
|
|
50
57
|
### Windows
|
|
51
58
|
|
|
52
59
|
- {配置名}(项目 {前缀})
|
|
53
|
-
-
|
|
54
|
-
-
|
|
55
|
-
-
|
|
56
|
-
-
|
|
60
|
+
- when:{用户授权触发 / AI 自己触发} —— {什么场景}
|
|
61
|
+
- before run:{第 1 步 / 第 2 步 / 无}
|
|
62
|
+
- run:{<前缀>_execute_run_configuration}
|
|
63
|
+
- after run:{产物落在哪 / 接下来要做什么 / 无}
|
|
64
|
+
- desc:{它是什么 + 有什么坑}
|
|
65
|
+
|
|
66
|
+
## 用户手动触发(线下,AI 不跑)
|
|
67
|
+
|
|
68
|
+
用户自己在 IDE 里跑的那种配置 —— AI 不碰,这里只登记名字。
|
|
69
|
+
|
|
70
|
+
<!-- 生成提示:begin -->
|
|
71
|
+
|
|
72
|
+
只写名字(带项目),**不要**写 run / when / before run / after run / desc:没人会照它跑,写了只是噪音。判断不了某一项是"授权"还是"手动"就**问用户**。
|
|
73
|
+
<!-- 生成提示:end -->
|
|
74
|
+
|
|
75
|
+
- {配置名}(项目 {前缀})
|
|
57
76
|
|
|
58
77
|
<!-- idea-run-config-manager:end -->
|
|
@@ -37,24 +37,25 @@
|
|
|
37
37
|
|
|
38
38
|
`run configuration` 列**必须是 `<前缀>_get_run_configurations` 里真实存在的名字**,不凭印象写;缺配置就**交给用户**:
|
|
39
39
|
让他调 `idea-run-config-manager` skill 去建(那个 skill 管这个项目 run configuration 的增 / 删 / 改),不要手搓启动命令,也不要自己写 `.run/*.run.xml`。
|
|
40
|
-
|
|
41
|
-
**端口**写清"固定 / 默认 / 被占用即启动失败";读不到就**问用户**,不要编。**服务化的应用一定有端口**,这一格是它区别于固定流程的地方。
|
|
42
|
-
**跑前做**列写**跑之前要先做的事**:**多数应用留空**。只有确实"得先做点什么才能起"时才写,而且**按顺序写清第 1 步、第 2 步、第 3 步**(例如 `1. 装依赖 2. 构建 3. 起前置服务`);
|
|
40
|
+
**before run** 写**跑之前要先做的事**:**多数应用写 `无`**(这一格始终填,不留空)。只有确实"得先做点什么才能起"时才写,而且**按顺序写清第 1 步、第 2 步、第 3 步**(例如 `1. 装依赖 2. 构建 3. 起前置服务`);
|
|
43
41
|
这些事**用文字写出来**(AI 照这段文本自己按序去做)。这类前置事项往往没被写成 run configuration,所以必须在这里说明,否则 AI 直接 rerun 会拿到一个起不来的进程。
|
|
44
42
|
**哪个应用必须先起来**也要写明(例如前端 dev server 的 proxy 指向本机后端)。与本项目无关的应用不写。
|
|
45
|
-
|
|
46
|
-
|
|
43
|
+
**run** 写走哪条工具:常驻 / 服务化的配置一律 `rerun`(在跑就重启、没在跑就启动),**不要**用 `execute` —— 它是 Run 路径,对常驻进程会起出重复实例;细节见「跑应用只用 rerun」那条。
|
|
44
|
+
**port** 写清"固定 / 默认 / 被占用即启动失败";读不到就**问用户**,不要编。**服务化的应用一定有端口**,这一格是它区别于固定流程的地方。
|
|
45
|
+
**after run** 写**起来之后才知道的结果**:日志落在哪 / 什么时候才算 ready / 起来之后要接着做什么(要跑迁移、要把地址交给谁);**多数写 `无`**。
|
|
46
|
+
**desc** 写剩下的坑与依赖关系(依赖谁、跟别的应用什么先后),以及例外(**只在联调 / 某个流程之前才需要起**之类)。**目录**这类配置里本来就有的字段不要单开一格 —— 会跟配置变旧而对不上。
|
|
47
|
+
**列宽按同一约定**(英文按字符数),**两张应用表的公共列一一对位、宽度一致**(同一份 `AGENTS.md` 里两张表才像一家人)。**列名与 `idea-run-config-manager` 的条目项同名同序**(`before run` / `run` / `after run` / `desc` 四项);**本表多 `app` / `run configuration` / `port`**(服务化应用一定有端口),**少一项 `when`** —— 服务化应用就是"改完代码要起它来测"的时候起,没有别的时机可写。两个块住在同一份 `AGENTS.md` 里,名字与顺序对上了才看得出哪些是服务、哪些是固定流程。**本块保持表格形式**(那边是条目式:应用有端口这样的短列,表格更好扫)。**某格确实没有内容就写 `无`**(不省略、也不写 `-`);填行时别去改表头的空格。
|
|
47
48
|
<!-- 生成提示:end -->
|
|
48
49
|
|
|
49
50
|
### macOS / Linux
|
|
50
51
|
|
|
51
|
-
|
|
|
52
|
-
|
|
|
52
|
+
| app | run configuration | before run | run | port | after run | desc |
|
|
53
|
+
| --- | ----------------- | ---------- | --- | ---- | --------- | ---- |
|
|
53
54
|
|
|
54
55
|
### Windows
|
|
55
56
|
|
|
56
|
-
|
|
|
57
|
-
|
|
|
57
|
+
| app | run configuration | before run | run | port | after run | desc |
|
|
58
|
+
| --- | ----------------- | ---------- | --- | ---- | --------- | ---- |
|
|
58
59
|
|
|
59
60
|
## 三、热重载矩阵:改代码后要不要提醒重启
|
|
60
61
|
|
|
@@ -64,7 +65,7 @@
|
|
|
64
65
|
"改动完成 / 可以去验证了";重启动作由用户手动做。`go run .` 这类**没有热重载**的写法要写进来,别让 AI 以为改了代码就自动生效。
|
|
65
66
|
<!-- 生成提示:end -->
|
|
66
67
|
|
|
67
|
-
|
|
|
68
|
-
|
|
|
68
|
+
| app | 热重载 | AI 改代码后 |
|
|
69
|
+
| --- | ------ | ----------- |
|
|
69
70
|
|
|
70
71
|
<!-- idea-standalone:end -->
|
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.
|
|
130
|
+
clientInfo: { name: 'opencode-idea', version: '0.0.22' },
|
|
131
131
|
},
|
|
132
132
|
});
|
|
133
133
|
// The IDE's Streamable-HTTP endpoint binds follow-up requests to the session
|