@siming-org/opencode-plugin 0.0.0-stage → 0.1.0
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/LICENSE +21 -0
- package/README.md +84 -2
- package/dist/assets-store.d.ts +63 -0
- package/dist/assets-store.d.ts.map +1 -0
- package/dist/assets-store.js +68 -0
- package/dist/assets-store.js.map +1 -0
- package/dist/cli-locator.d.ts +11 -0
- package/dist/cli-locator.d.ts.map +1 -0
- package/dist/cli-locator.js +100 -0
- package/dist/cli-locator.js.map +1 -0
- package/dist/fetch-assets.d.ts +64 -0
- package/dist/fetch-assets.d.ts.map +1 -0
- package/dist/fetch-assets.js +362 -0
- package/dist/fetch-assets.js.map +1 -0
- package/dist/guide-skill.d.ts +12 -0
- package/dist/guide-skill.d.ts.map +1 -0
- package/dist/guide-skill.js +59 -0
- package/dist/guide-skill.js.map +1 -0
- package/dist/host-api.d.ts +141 -0
- package/dist/host-api.d.ts.map +1 -0
- package/dist/host-api.js +49 -0
- package/dist/host-api.js.map +1 -0
- package/dist/register/agents.d.ts +17 -0
- package/dist/register/agents.d.ts.map +1 -0
- package/dist/register/agents.js +32 -0
- package/dist/register/agents.js.map +1 -0
- package/dist/register/mcp.d.ts +16 -0
- package/dist/register/mcp.d.ts.map +1 -0
- package/dist/register/mcp.js +10 -0
- package/dist/register/mcp.js.map +1 -0
- package/dist/register/refresh-tool.d.ts +12 -0
- package/dist/register/refresh-tool.d.ts.map +1 -0
- package/dist/register/refresh-tool.js +45 -0
- package/dist/register/refresh-tool.js.map +1 -0
- package/dist/register/skills.d.ts +13 -0
- package/dist/register/skills.d.ts.map +1 -0
- package/dist/register/skills.js +27 -0
- package/dist/register/skills.js.map +1 -0
- package/dist/register/tools.d.ts +11 -0
- package/dist/register/tools.d.ts.map +1 -0
- package/dist/register/tools.js +8 -0
- package/dist/register/tools.js.map +1 -0
- package/dist/revalidate.d.ts +68 -0
- package/dist/revalidate.d.ts.map +1 -0
- package/dist/revalidate.js +190 -0
- package/dist/revalidate.js.map +1 -0
- package/dist/server/index.d.ts +7 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +113 -0
- package/dist/server/index.js.map +1 -0
- package/dist/tools/simming-cli.d.ts +23 -0
- package/dist/tools/simming-cli.d.ts.map +1 -0
- package/dist/tools/simming-cli.js +91 -0
- package/dist/tools/simming-cli.js.map +1 -0
- package/package.json +31 -3
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Wuchao
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,85 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @siming-org/opencode-plugin
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[opencode v2](https://opencode.ai) 的 siming 接入插件:安装即自动注册 siming 的全部会话资产,无需手工配置 MCP/技能/子代理。
|
|
4
|
+
|
|
5
|
+
## 安装与升级
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
opencode plugin add @siming-org/opencode-plugin@latest # 安装
|
|
9
|
+
opencode plugin update # 升级
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
要求:opencode ≥ 2.0.26(过低仅提示不阻断);Node.js ≥ 22(随 @siming-org/cli 依赖自检,不满足时 MCP 与 siming_cli 降级不注册,其余三样不受影响)。
|
|
13
|
+
|
|
14
|
+
## 注册的五样
|
|
15
|
+
|
|
16
|
+
| 资产 | 说明 |
|
|
17
|
+
|---|---|
|
|
18
|
+
| MCP server `siming` | 本地 stdio 拉起 `siming mcp-serve`,暴露 `siming_task` / `siming_template` / `siming_auth` 三件工具 |
|
|
19
|
+
| 工具 `siming_refresh` | 手动强制刷新资产(server 地址与绑定项目就绪度随摘要返回) |
|
|
20
|
+
| 工具 `siming_cli` | 以子进程执行任意 siming CLI 命令(接入与诊断用;日常运维请走终端) |
|
|
21
|
+
| 技能 | `siming-guide` 接入引导(固定常驻)+ server 侧全局/项目技能自动同步 |
|
|
22
|
+
| 子代理 | server 侧 agent 自动同步为 subagent(模型置空继承主会话当前模型;任务依据限于项目代码,过程产物读取与命令执行由主会话完成) |
|
|
23
|
+
|
|
24
|
+
## server 连接与凭证
|
|
25
|
+
|
|
26
|
+
- 地址解析链:`SIMING_SERVER_URL` 环境变量 > 工作区 `.siming/config.json` 的 `serverUrl` > `~/.siming/config.json` 的 `serverUrl` > `http://localhost:7777`
|
|
27
|
+
- Token 三层:工作区 `.siming/dev.json` 的 `authToken` > `~/.siming/auth.json` > `SIMING_TOKEN` 环境变量
|
|
28
|
+
- 401 时按提示执行 `siming auth token set --global`(或工作区形态 `siming auth token set`)后触发刷新
|
|
29
|
+
|
|
30
|
+
**首次接入重启提示**:MCP 子进程的 server 地址在 opencode 启动时定格。若引导流程中途才写入 `.siming/config.json`(绑定 server),其余四样当会话即刻生效,但建任务走的 MCP 通道需重启 opencode 一次以读取新地址。
|
|
31
|
+
|
|
32
|
+
## 资产新鲜度
|
|
33
|
+
|
|
34
|
+
- 插件激活时初始化拉取(10s 预算,超时/失败按空集注册继续激活,不阻断)
|
|
35
|
+
- 每次 `siming_task` 建任务后自动指纹比对(技能/子代理域各 1 次列表请求,零 server 改动);指纹差异才全链重拉并 reload
|
|
36
|
+
- server 故障期:已注册旧资产保留可用,恢复后任意触发自动补齐;失败日志限频,前缀 `[siming-plugin]`
|
|
37
|
+
- 停用(enabled=false)资产不注册,对齐 install 语义
|
|
38
|
+
|
|
39
|
+
## 常驻与上下文占用
|
|
40
|
+
|
|
41
|
+
全部注册物常驻会话,合计约 2-3K token(窗口占比 1-1.5%)。插件不内置任何 permissions 规则;如需收窄 `siming_cli` 可达面,可自配 deny 规则引用其锚点 `siming-setup`(options.permission 声明值),例如在 opencode 权限配置中 deny `siming-setup`。
|
|
42
|
+
|
|
43
|
+
## 旧产物同名处理
|
|
44
|
+
|
|
45
|
+
历史 `.agents` 手工链路产物与插件注册物同名时会遮蔽/覆盖插件版本:
|
|
46
|
+
|
|
47
|
+
- `~/.agents/skills/` 同名技能:整条遮蔽 → 经 `siming-guide` 引导确认后备份迁移到 `~/.agents/siming-plugin-backup/`(移动非删除,可随时还原)
|
|
48
|
+
- `~/.config/opencode/` agents jsonc 同名条目:字段级覆盖 → 确认后自行清理,`mcp.servers.siming` 死配置一并提示自清
|
|
49
|
+
- 工作区 `.agents/` 目录:插件不创建、不迁移、不清理(多宿主共用时由用户取舍)
|
|
50
|
+
|
|
51
|
+
## 故障排查
|
|
52
|
+
|
|
53
|
+
| 形态 | 处置 |
|
|
54
|
+
|---|---|
|
|
55
|
+
| 长会话中技能引用文件 not-found | 系统清理了 tmpdir 引用缓存 → 触发 `siming_refresh` 重新物化(重启会话亦可自愈) |
|
|
56
|
+
| 无 MCP 工具 / 无 `siming_cli` | Node ≥ 22 解释器缺失降级注册 → 安装 Node 22+ 或设 `SIMING_NODE_BIN` 指向合法解释器后重启 |
|
|
57
|
+
| 激活日志「初始化拉取超时」 | server 不可达/鉴权失败 → 确认地址与 token(上方解析链),任意建任务或 `siming_refresh` 触发补齐 |
|
|
58
|
+
| 诊断 | 激活/变更/失败日志统一 `[siming-plugin]` 前缀,位置为 opencode 日志输出 |
|
|
59
|
+
|
|
60
|
+
## 版本策略
|
|
61
|
+
|
|
62
|
+
siming 插件家族共用统一版本线(0.1.0 起):任一插件变更即全家族统一 bump 并一起发布;CLI 依赖版本随本包 package.json 独立声明。
|
|
63
|
+
|
|
64
|
+
## 开发
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
pnpm --filter @siming-org/opencode-plugin build # tsc
|
|
68
|
+
pnpm --filter @siming-org/opencode-plugin test # vitest(97 用例)
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
本机免发布验证(opencode ≥ v2.0.26):
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
bash scripts/install-cli.sh --plugin-dev # 构建插件 + 写入 opencode 全局插件目录 loader(写入前强制互斥检测)
|
|
75
|
+
bash scripts/install-cli.sh --plugin-dev-remove # 移除 loader(切回 npm 通道 / 停用验证)
|
|
76
|
+
bash scripts/install-cli.sh --plugin-npm-install [@siming-org/opencode-plugin[@版本]]
|
|
77
|
+
# 切 npm 正式通道:自动先移除 dev loader 再 opencode plugin add
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
- loader 是生成文件(`<config>/opencode/plugins/simming-plugin-dev.ts`,转发 import 到本仓 `dist/server/index.js`)——换机器或仓库迁移后重跑 `--plugin-dev` 重新生成绝对路径。
|
|
81
|
+
- 装入后任意 opencode 会话即加载本仓构建产物;改动代码后重跑 `--plugin-dev` + 重启 opencode(或触发宿主 location 重建)生效。
|
|
82
|
+
- **单通道互斥为脚本强制**(非提示):与 npm 安装的同 id 插件会各自加载(v2 宿主行为,五样会重复注册)。`--plugin-dev` 写入前检测 `opencode plugin list`,发现同 id 其他通道实例(npm/git spec 或手工副本)即拒绝;`--plugin-npm-install` 自动先移除 loader。`plugin list` 不可用时同样拒绝写入(无法确认即不写)。
|
|
83
|
+
- 默认安装(`bash scripts/install-cli.sh` 无参)尾部会顺带执行同一激活(检测到 opencode 宿主时);无 opencode 的机器自动跳过;互斥检测失败时降级为警示+跳过,不影响 CLI 生产安装结果。
|
|
84
|
+
|
|
85
|
+
设计文档:`ProjectHub/docs/技术方案/平台/T202610090002-opencode插件-技术方案.md`
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 内存资产 store(技术方案 §4.C3)。
|
|
3
|
+
*
|
|
4
|
+
* 插件是 siming server 实例状态的零副本消费者:本 store 持有「最近一次成功拉取」
|
|
5
|
+
* 的快照,transform 重放时消费。刷新 = 新数组原子替换引用(重放期间读者要么全旧
|
|
6
|
+
* 要么全新,无中间态);零磁盘状态(references 物化缓存走 os.tmpdir,见 fetch-assets)。
|
|
7
|
+
*
|
|
8
|
+
* 指纹(revalidate 差异检测用)仅在对应域重拉成功后写入(失败不前移)。
|
|
9
|
+
* registeredNames 记录上一轮 transform 实际注册过的名字——重放为「全量对账」语义:
|
|
10
|
+
* 上轮注册过但 store 快照中已不存在的名字须显式 ed.remove(停用/删除消失不依赖
|
|
11
|
+
* 宿主 reload 实现形态)。
|
|
12
|
+
*/
|
|
13
|
+
/** server 列表概要投影 + by-name 详情补全后的技能资产(消费面字段) */
|
|
14
|
+
export interface SkillAsset {
|
|
15
|
+
name: string;
|
|
16
|
+
description: string;
|
|
17
|
+
/** 正文:references 物化后相对引用已改写为绝对路径(写入 store 前完成) */
|
|
18
|
+
content: string;
|
|
19
|
+
scope: 'global' | 'project';
|
|
20
|
+
version: string;
|
|
21
|
+
updatedAt?: string;
|
|
22
|
+
referenceCount: number;
|
|
23
|
+
}
|
|
24
|
+
/** 子代理资产(消费面字段;model 字段注册时不消费——用户裁定) */
|
|
25
|
+
export interface AgentAsset {
|
|
26
|
+
name: string;
|
|
27
|
+
description: string;
|
|
28
|
+
systemPrompt: string;
|
|
29
|
+
scope: 'global' | 'project';
|
|
30
|
+
version: string;
|
|
31
|
+
updatedAt?: string;
|
|
32
|
+
/** reviewer 信息边界注入判定用 */
|
|
33
|
+
function: 'reviewer' | 'executor';
|
|
34
|
+
/** 引导语「先加载 SKILL」注入判定用 */
|
|
35
|
+
boundSkills: string[];
|
|
36
|
+
}
|
|
37
|
+
export interface AssetsSnapshot {
|
|
38
|
+
skills: readonly SkillAsset[];
|
|
39
|
+
agents: readonly AgentAsset[];
|
|
40
|
+
/** 最近一次成功拉取时刻(诊断输出用;不做节流判定——v9 无时间戳节流) */
|
|
41
|
+
fetchedAt: number;
|
|
42
|
+
}
|
|
43
|
+
export declare function getSnapshot(): AssetsSnapshot;
|
|
44
|
+
/** 单域原子替换(技能或子代理),另一域保持不变;fetchedAt 由本函数统一推进 */
|
|
45
|
+
export declare function replaceSkills(skills: readonly SkillAsset[]): void;
|
|
46
|
+
export declare function replaceAgents(agents: readonly AgentAsset[]): void;
|
|
47
|
+
export declare function getSkillFingerprint(): string | null;
|
|
48
|
+
export declare function getAgentFingerprint(): string | null;
|
|
49
|
+
/** 仅对应域重拉成功后调用(失败不前移——下次触发重新检出差异重试) */
|
|
50
|
+
export declare function setSkillFingerprint(fp: string): void;
|
|
51
|
+
export declare function setAgentFingerprint(fp: string): void;
|
|
52
|
+
export declare function getRegisteredSkillNames(): Set<string>;
|
|
53
|
+
export declare function getRegisteredAgentNames(): Set<string>;
|
|
54
|
+
/** transform 重放完成时以本轮实际注册名集合整体替换 */
|
|
55
|
+
export declare function setRegisteredSkillNames(names: Iterable<string>): void;
|
|
56
|
+
export declare function setRegisteredAgentNames(names: Iterable<string>): void;
|
|
57
|
+
/** 诊断/自检输出用摘要 */
|
|
58
|
+
export declare function snapshotSummary(): {
|
|
59
|
+
skills: number;
|
|
60
|
+
agents: number;
|
|
61
|
+
fetchedAt: number;
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=assets-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assets-store.d.ts","sourceRoot":"","sources":["../src/assets-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,gDAAgD;AAChD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,wCAAwC;AACxC,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yBAAyB;IACzB,QAAQ,EAAE,UAAU,GAAG,UAAU,CAAC;IAClC,0BAA0B;IAC1B,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC;IAC9B,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC;IAC9B,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;CACnB;AAaD,wBAAgB,WAAW,IAAI,cAAc,CAE5C;AAED,gDAAgD;AAChD,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,GAAG,IAAI,CAGjE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,GAAG,IAAI,CAEjE;AAED,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAEnD;AAED,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAEnD;AAED,uCAAuC;AACvC,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAEpD;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAEpD;AAID,wBAAgB,uBAAuB,IAAI,GAAG,CAAC,MAAM,CAAC,CAErD;AAED,wBAAgB,uBAAuB,IAAI,GAAG,CAAC,MAAM,CAAC,CAErD;AAED,oCAAoC;AACpC,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,CAErE;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,CAErE;AAED,iBAAiB;AACjB,wBAAgB,eAAe,IAAI;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAMvF"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 内存资产 store(技术方案 §4.C3)。
|
|
3
|
+
*
|
|
4
|
+
* 插件是 siming server 实例状态的零副本消费者:本 store 持有「最近一次成功拉取」
|
|
5
|
+
* 的快照,transform 重放时消费。刷新 = 新数组原子替换引用(重放期间读者要么全旧
|
|
6
|
+
* 要么全新,无中间态);零磁盘状态(references 物化缓存走 os.tmpdir,见 fetch-assets)。
|
|
7
|
+
*
|
|
8
|
+
* 指纹(revalidate 差异检测用)仅在对应域重拉成功后写入(失败不前移)。
|
|
9
|
+
* registeredNames 记录上一轮 transform 实际注册过的名字——重放为「全量对账」语义:
|
|
10
|
+
* 上轮注册过但 store 快照中已不存在的名字须显式 ed.remove(停用/删除消失不依赖
|
|
11
|
+
* 宿主 reload 实现形态)。
|
|
12
|
+
*/
|
|
13
|
+
const EMPTY_SNAPSHOT = { skills: [], agents: [], fetchedAt: 0 };
|
|
14
|
+
/** 模块级单例(无 DI 函数式:激活链与三触发点共享同一实例) */
|
|
15
|
+
const state = {
|
|
16
|
+
snapshot: EMPTY_SNAPSHOT,
|
|
17
|
+
skillFingerprint: null,
|
|
18
|
+
agentFingerprint: null,
|
|
19
|
+
registeredSkillNames: new Set(),
|
|
20
|
+
registeredAgentNames: new Set(),
|
|
21
|
+
};
|
|
22
|
+
export function getSnapshot() {
|
|
23
|
+
return state.snapshot;
|
|
24
|
+
}
|
|
25
|
+
/** 单域原子替换(技能或子代理),另一域保持不变;fetchedAt 由本函数统一推进 */
|
|
26
|
+
export function replaceSkills(skills) {
|
|
27
|
+
// 原子性:先构造新快照对象再一次赋值引用——并发的读者不会看到半更新状态
|
|
28
|
+
state.snapshot = { ...state.snapshot, skills, fetchedAt: Date.now() };
|
|
29
|
+
}
|
|
30
|
+
export function replaceAgents(agents) {
|
|
31
|
+
state.snapshot = { ...state.snapshot, agents, fetchedAt: Date.now() };
|
|
32
|
+
}
|
|
33
|
+
export function getSkillFingerprint() {
|
|
34
|
+
return state.skillFingerprint;
|
|
35
|
+
}
|
|
36
|
+
export function getAgentFingerprint() {
|
|
37
|
+
return state.agentFingerprint;
|
|
38
|
+
}
|
|
39
|
+
/** 仅对应域重拉成功后调用(失败不前移——下次触发重新检出差异重试) */
|
|
40
|
+
export function setSkillFingerprint(fp) {
|
|
41
|
+
state.skillFingerprint = fp;
|
|
42
|
+
}
|
|
43
|
+
export function setAgentFingerprint(fp) {
|
|
44
|
+
state.agentFingerprint = fp;
|
|
45
|
+
}
|
|
46
|
+
// ── 注册名对账簿(transform 重放时维护与消费) ──
|
|
47
|
+
export function getRegisteredSkillNames() {
|
|
48
|
+
return state.registeredSkillNames;
|
|
49
|
+
}
|
|
50
|
+
export function getRegisteredAgentNames() {
|
|
51
|
+
return state.registeredAgentNames;
|
|
52
|
+
}
|
|
53
|
+
/** transform 重放完成时以本轮实际注册名集合整体替换 */
|
|
54
|
+
export function setRegisteredSkillNames(names) {
|
|
55
|
+
state.registeredSkillNames = new Set(names);
|
|
56
|
+
}
|
|
57
|
+
export function setRegisteredAgentNames(names) {
|
|
58
|
+
state.registeredAgentNames = new Set(names);
|
|
59
|
+
}
|
|
60
|
+
/** 诊断/自检输出用摘要 */
|
|
61
|
+
export function snapshotSummary() {
|
|
62
|
+
return {
|
|
63
|
+
skills: state.snapshot.skills.length,
|
|
64
|
+
agents: state.snapshot.agents.length,
|
|
65
|
+
fetchedAt: state.snapshot.fetchedAt,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=assets-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assets-store.js","sourceRoot":"","sources":["../src/assets-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAmCH,MAAM,cAAc,GAAmB,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;AAEhF,qCAAqC;AACrC,MAAM,KAAK,GAAG;IACZ,QAAQ,EAAE,cAAgC;IAC1C,gBAAgB,EAAE,IAAqB;IACvC,gBAAgB,EAAE,IAAqB;IACvC,oBAAoB,EAAE,IAAI,GAAG,EAAU;IACvC,oBAAoB,EAAE,IAAI,GAAG,EAAU;CACxC,CAAC;AAEF,MAAM,UAAU,WAAW;IACzB,OAAO,KAAK,CAAC,QAAQ,CAAC;AACxB,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,aAAa,CAAC,MAA6B;IACzD,sCAAsC;IACtC,KAAK,CAAC,QAAQ,GAAG,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAA6B;IACzD,KAAK,CAAC,QAAQ,GAAG,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,KAAK,CAAC,gBAAgB,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,KAAK,CAAC,gBAAgB,CAAC;AAChC,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,mBAAmB,CAAC,EAAU;IAC5C,KAAK,CAAC,gBAAgB,GAAG,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,EAAU;IAC5C,KAAK,CAAC,gBAAgB,GAAG,EAAE,CAAC;AAC9B,CAAC;AAED,mCAAmC;AAEnC,MAAM,UAAU,uBAAuB;IACrC,OAAO,KAAK,CAAC,oBAAoB,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO,KAAK,CAAC,oBAAoB,CAAC;AACpC,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,uBAAuB,CAAC,KAAuB;IAC7D,KAAK,CAAC,oBAAoB,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAuB;IAC7D,KAAK,CAAC,oBAAoB,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;AAC9C,CAAC;AAED,iBAAiB;AACjB,MAAM,UAAU,eAAe;IAC7B,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM;QACpC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM;QACpC,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,SAAS;KACpC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface CliLocation {
|
|
2
|
+
/** node 解释器绝对路径(MCP 与 siming_cli 子进程共用);null=发现失败(降级注册) */
|
|
3
|
+
nodeBin: string | null;
|
|
4
|
+
/** siming CLI bin 入口绝对路径;null=解析失败(安装损坏,setup 须抛错) */
|
|
5
|
+
cliJs: string | null;
|
|
6
|
+
}
|
|
7
|
+
/** 激活时调用一次:定位 CLI 与解释器(§4.C1 降级语义由调用方承接) */
|
|
8
|
+
export declare function locateCli(): CliLocation;
|
|
9
|
+
/** 宿主版本检测(§4.G):spawn 宿主二进制 --version,低于 v2.0.26 时 console.error 提示不兼容 */
|
|
10
|
+
export declare function checkHostVersion(): void;
|
|
11
|
+
//# sourceMappingURL=cli-locator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-locator.d.ts","sourceRoot":"","sources":["../src/cli-locator.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,WAAW;IAC1B,2DAA2D;IAC3D,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,sDAAsD;IACtD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAgDD,4CAA4C;AAC5C,wBAAgB,SAAS,IAAI,WAAW,CAkBvC;AAED,0EAA0E;AAC1E,wBAAgB,gBAAgB,IAAI,IAAI,CAwBvC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI 定位与解释器发现(技术方案 §4.C1)。
|
|
3
|
+
*
|
|
4
|
+
* - CLI 路径激活时现算(createRequire.resolve → bin/siming.js),每次激活重算不缓存
|
|
5
|
+
* ——升级换 generation 后新路径自动生效。
|
|
6
|
+
* - 解释器发现:插件可能运行于 Bun 编译的 opencode 二进制内(process.execPath 指向
|
|
7
|
+
* opencode 自身而非 node),不能直接用作 nodeBin。发现顺序:
|
|
8
|
+
* SIMING_NODE_BIN env(用户显式覆盖)→ PATH 上 node(激活时 spawnSync 探测,须 ≥22)
|
|
9
|
+
* → 失败 console.error + 降级注册(MCP/siming_cli 跳过,其余照常)。
|
|
10
|
+
*/
|
|
11
|
+
import { spawnSync } from 'node:child_process';
|
|
12
|
+
import { createRequire } from 'node:module';
|
|
13
|
+
import { dirname, join } from 'node:path';
|
|
14
|
+
const NODE_MAJOR_MIN = 22;
|
|
15
|
+
/** 解析插件自带依赖中的 CLI bin 入口(@siming-org/cli/package.json → bin/siming.js) */
|
|
16
|
+
function resolveCliJs() {
|
|
17
|
+
try {
|
|
18
|
+
// createRequire 相对本模块解析:插件依赖树内的 @siming-org/cli
|
|
19
|
+
// (opencode generation 缓存安装后位于本插件 node_modules,随 generation 更新)
|
|
20
|
+
const require = createRequire(import.meta.url);
|
|
21
|
+
const pkgJsonPath = require.resolve('@siming-org/cli/package.json');
|
|
22
|
+
return join(dirname(pkgJsonPath), 'bin', 'siming.js');
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/** 提取 node 主版本号;非 node 输出(或无法判定)返回 null */
|
|
29
|
+
function parseNodeMajor(versionOutput) {
|
|
30
|
+
const match = /v(\d+)\./.exec(versionOutput);
|
|
31
|
+
if (!match)
|
|
32
|
+
return null;
|
|
33
|
+
const major = Number(match[1]);
|
|
34
|
+
return Number.isFinite(major) ? major : null;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 探测 PATH 上可用的 node ≥22。
|
|
38
|
+
* spawnSync 而非 fetch/spawn——版本探测是一次性同步动作,且须捕获非零退出/缺二进制形态。
|
|
39
|
+
*/
|
|
40
|
+
function discoverNodeBin() {
|
|
41
|
+
const fromEnv = process.env['SIMING_NODE_BIN'];
|
|
42
|
+
if (fromEnv && fromEnv.trim() !== '') {
|
|
43
|
+
const probe = spawnSync(fromEnv, ['--version'], { encoding: 'utf8', timeout: 5_000 });
|
|
44
|
+
const major = probe.status === 0 ? parseNodeMajor(probe.stdout ?? '') : null;
|
|
45
|
+
if (major !== null && major >= NODE_MAJOR_MIN)
|
|
46
|
+
return fromEnv;
|
|
47
|
+
console.error(`[siming-plugin] SIMING_NODE_BIN=${fromEnv} 不可用(探测输出无 node ≥${NODE_MAJOR_MIN} 版本号),` +
|
|
48
|
+
`回退 PATH 探测`);
|
|
49
|
+
}
|
|
50
|
+
const probe = spawnSync('node', ['--version'], { encoding: 'utf8', timeout: 5_000 });
|
|
51
|
+
if (probe.status === 0) {
|
|
52
|
+
const major = parseNodeMajor(probe.stdout ?? '');
|
|
53
|
+
if (major !== null && major >= NODE_MAJOR_MIN)
|
|
54
|
+
return 'node';
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
/** 激活时调用一次:定位 CLI 与解释器(§4.C1 降级语义由调用方承接) */
|
|
59
|
+
export function locateCli() {
|
|
60
|
+
const cliJs = resolveCliJs();
|
|
61
|
+
if (cliJs === null) {
|
|
62
|
+
// 安装损坏:setup 层抛结构化错误(重装指引),此处仅报告事实
|
|
63
|
+
console.error('[siming-plugin] @siming-org/cli 依赖解析失败——插件安装可能损坏(执行 opencode plugin remove @siming-org/opencode-plugin && opencode plugin add @siming-org/opencode-plugin 重装)');
|
|
64
|
+
return { nodeBin: null, cliJs: null };
|
|
65
|
+
}
|
|
66
|
+
const nodeBin = discoverNodeBin();
|
|
67
|
+
if (nodeBin === null) {
|
|
68
|
+
console.error(`[siming-plugin] 未发现 Node.js ≥${NODE_MAJOR_MIN}(探测顺序:SIMING_NODE_BIN 环境变量 > PATH 上的 node)——` +
|
|
69
|
+
`MCP 与 siming_cli 工具本次不注册(降级);安装 Node.js ≥${NODE_MAJOR_MIN}(https://nodejs.org)后重启 opencode 恢复完整功能。` +
|
|
70
|
+
`技能/子代理/引导技能不受影响(其依赖是 server 拉取可达,与解释器无关)。`);
|
|
71
|
+
}
|
|
72
|
+
return { nodeBin, cliJs };
|
|
73
|
+
}
|
|
74
|
+
/** 宿主版本检测(§4.G):spawn 宿主二进制 --version,低于 v2.0.26 时 console.error 提示不兼容 */
|
|
75
|
+
export function checkHostVersion() {
|
|
76
|
+
const execPath = process.execPath;
|
|
77
|
+
let stdout = '';
|
|
78
|
+
try {
|
|
79
|
+
const probe = spawnSync(execPath, ['--version'], { encoding: 'utf8', timeout: 5_000 });
|
|
80
|
+
if (probe.status !== 0)
|
|
81
|
+
return;
|
|
82
|
+
stdout = probe.stdout ?? '';
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
// 形如 "opencode 2.0.26" / "2.0.26";非 opencode 宿主(测试/直跑)不匹配即跳过
|
|
88
|
+
const match = /(\d+)\.(\d+)\.(\d+)/.exec(stdout);
|
|
89
|
+
if (!match)
|
|
90
|
+
return;
|
|
91
|
+
const [major, minor, patch] = [Number(match[1]), Number(match[2]), Number(match[3])];
|
|
92
|
+
const MIN = [2, 0, 26];
|
|
93
|
+
const below = major < MIN[0] ||
|
|
94
|
+
(major === MIN[0] && (minor < MIN[1] || (minor === MIN[1] && patch < MIN[2])));
|
|
95
|
+
if (below) {
|
|
96
|
+
console.error(`[siming-plugin] 当前 opencode v${major}.${minor}.${patch} 低于支持范围(≥ v2.0.26),` +
|
|
97
|
+
`插件可能工作异常——请升级 opencode 后重试;问题排查见插件 README。`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=cli-locator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-locator.js","sourceRoot":"","sources":["../src/cli-locator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { AgentAsset, SkillAsset } from './assets-store.js';
|
|
2
|
+
/** 向上发现工作区根(含 .siming 目录者)——语义对齐 CLI findWorkspaceDir */
|
|
3
|
+
export declare function findWorkspaceDir(start: string): string | null;
|
|
4
|
+
export type FetchFailureKind = 'network' | 'auth' | 'http' | 'parse';
|
|
5
|
+
export declare class AssetFetchError extends Error {
|
|
6
|
+
readonly kind: FetchFailureKind;
|
|
7
|
+
readonly status?: number;
|
|
8
|
+
constructor(kind: FetchFailureKind, message: string, status?: number);
|
|
9
|
+
}
|
|
10
|
+
export interface FetchTarget {
|
|
11
|
+
serverUrl: string;
|
|
12
|
+
token: string | null;
|
|
13
|
+
/** 工作区绑定项目 key(.siming/config.json defaultProject;无绑定=null) */
|
|
14
|
+
projectKey: string | null;
|
|
15
|
+
}
|
|
16
|
+
/** 四层 serverUrl 解析 + 三层 token 解析 + 工作区项目绑定发现(纯本地,无网络请求) */
|
|
17
|
+
export declare function resolveFetchTarget(startDir: string): FetchTarget;
|
|
18
|
+
interface FingerprintItem {
|
|
19
|
+
name: string;
|
|
20
|
+
scope: 'global' | 'project';
|
|
21
|
+
version: string;
|
|
22
|
+
updatedAt?: string;
|
|
23
|
+
enabled?: boolean;
|
|
24
|
+
}
|
|
25
|
+
/** 每条 name@scope|version|updatedAt|enabled 排序拼接(§4.C3 第 6 条契约形状) */
|
|
26
|
+
export declare function buildFingerprint(items: ReadonlyArray<FingerprintItem>): string;
|
|
27
|
+
/**
|
|
28
|
+
* 指纹检查的列表拉取(零 server 改动的差异检测输入,每域一次请求):
|
|
29
|
+
* 绑定项目 → ?projectId=<hex>(一次返回 global+本项目并集,投影含 scope);
|
|
30
|
+
* 无绑定 → 显式 ?scope=global(列表缺省=全量管理视角,不可用于指纹)。
|
|
31
|
+
*/
|
|
32
|
+
export declare function fetchSkillCheckFingerprint(plan: FetchPlan): Promise<string>;
|
|
33
|
+
export declare function fetchAgentCheckFingerprint(plan: FetchPlan): Promise<string>;
|
|
34
|
+
/** 解析后的拉取计划(目标 + 项目 hex id;域名独立拉取共用同一计划) */
|
|
35
|
+
export interface FetchPlan {
|
|
36
|
+
target: FetchTarget;
|
|
37
|
+
/** 绑定项目成功解析为 hex id 时非 null;无绑定/解析失败=null(失败按仅全局继续) */
|
|
38
|
+
projectId: string | null;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* 共享前置解析:目标四层/token 三层 + 工作区项目 key→hex id。
|
|
42
|
+
* projectIdOverride:调用方(revalidate)缓存的 key→id 命中时跳过网络解析,稳态检查保持 2 次列表请求。
|
|
43
|
+
*/
|
|
44
|
+
export declare function resolveFetchPlan(startDir: string, projectIdOverride?: {
|
|
45
|
+
key: string;
|
|
46
|
+
id: string;
|
|
47
|
+
} | null): Promise<FetchPlan>;
|
|
48
|
+
export interface DomainFetchResult<T> {
|
|
49
|
+
assets: T[];
|
|
50
|
+
/** 从本次原始列表行(分作用域形,与检查的并集形枚举一致)构造的域指纹 */
|
|
51
|
+
fingerprint: string;
|
|
52
|
+
serverUrl: string;
|
|
53
|
+
projectId: string | null;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 技能域全链拉取:global 列表 +(有绑定时)project 列表 → 同名 project 胜 →
|
|
57
|
+
* referenceCount>0 取 by-name 详情并物化 references。
|
|
58
|
+
* includeDisabled 不携带——停用资产不注册,对齐 install 语义。
|
|
59
|
+
*/
|
|
60
|
+
export declare function fetchSkillsDomain(plan: FetchPlan): Promise<DomainFetchResult<SkillAsset>>;
|
|
61
|
+
/** 子代理域全链拉取(同技能域语义;systemPrompt 随列表下发,无详情/物化环节) */
|
|
62
|
+
export declare function fetchAgentsDomain(plan: FetchPlan): Promise<DomainFetchResult<AgentAsset>>;
|
|
63
|
+
export {};
|
|
64
|
+
//# sourceMappingURL=fetch-assets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-assets.d.ts","sourceRoot":"","sources":["../src/fetch-assets.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAMhE,yDAAyD;AACzD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS7D;AAoGD,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAErE,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;gBACb,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAMrE;AAkCD,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,+DAA+D;IAC/D,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,2DAA2D;AAC3D,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAuBhE;AA2GD,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,oEAAoE;AACpE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,CAAC,eAAe,CAAC,GAAG,MAAM,CAK9E;AAED;;;;GAIG;AACH,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAGjF;AAED,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAGjF;AAQD,4CAA4C;AAC5C,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,WAAW,CAAC;IACpB,uDAAuD;IACvD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,iBAAiB,CAAC,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,GACrD,OAAO,CAAC,SAAS,CAAC,CAcpB;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,MAAM,EAAE,CAAC,EAAE,CAAC;IACZ,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAmC/F;AAED,mDAAmD;AACnD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CA6B/F"}
|