@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.
Files changed (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +84 -2
  3. package/dist/assets-store.d.ts +63 -0
  4. package/dist/assets-store.d.ts.map +1 -0
  5. package/dist/assets-store.js +68 -0
  6. package/dist/assets-store.js.map +1 -0
  7. package/dist/cli-locator.d.ts +11 -0
  8. package/dist/cli-locator.d.ts.map +1 -0
  9. package/dist/cli-locator.js +100 -0
  10. package/dist/cli-locator.js.map +1 -0
  11. package/dist/fetch-assets.d.ts +64 -0
  12. package/dist/fetch-assets.d.ts.map +1 -0
  13. package/dist/fetch-assets.js +362 -0
  14. package/dist/fetch-assets.js.map +1 -0
  15. package/dist/guide-skill.d.ts +12 -0
  16. package/dist/guide-skill.d.ts.map +1 -0
  17. package/dist/guide-skill.js +59 -0
  18. package/dist/guide-skill.js.map +1 -0
  19. package/dist/host-api.d.ts +141 -0
  20. package/dist/host-api.d.ts.map +1 -0
  21. package/dist/host-api.js +49 -0
  22. package/dist/host-api.js.map +1 -0
  23. package/dist/register/agents.d.ts +17 -0
  24. package/dist/register/agents.d.ts.map +1 -0
  25. package/dist/register/agents.js +32 -0
  26. package/dist/register/agents.js.map +1 -0
  27. package/dist/register/mcp.d.ts +16 -0
  28. package/dist/register/mcp.d.ts.map +1 -0
  29. package/dist/register/mcp.js +10 -0
  30. package/dist/register/mcp.js.map +1 -0
  31. package/dist/register/refresh-tool.d.ts +12 -0
  32. package/dist/register/refresh-tool.d.ts.map +1 -0
  33. package/dist/register/refresh-tool.js +45 -0
  34. package/dist/register/refresh-tool.js.map +1 -0
  35. package/dist/register/skills.d.ts +13 -0
  36. package/dist/register/skills.d.ts.map +1 -0
  37. package/dist/register/skills.js +27 -0
  38. package/dist/register/skills.js.map +1 -0
  39. package/dist/register/tools.d.ts +11 -0
  40. package/dist/register/tools.d.ts.map +1 -0
  41. package/dist/register/tools.js +8 -0
  42. package/dist/register/tools.js.map +1 -0
  43. package/dist/revalidate.d.ts +68 -0
  44. package/dist/revalidate.d.ts.map +1 -0
  45. package/dist/revalidate.js +190 -0
  46. package/dist/revalidate.js.map +1 -0
  47. package/dist/server/index.d.ts +7 -0
  48. package/dist/server/index.d.ts.map +1 -0
  49. package/dist/server/index.js +113 -0
  50. package/dist/server/index.js.map +1 -0
  51. package/dist/tools/simming-cli.d.ts +23 -0
  52. package/dist/tools/simming-cli.d.ts.map +1 -0
  53. package/dist/tools/simming-cli.js +91 -0
  54. package/dist/tools/simming-cli.js.map +1 -0
  55. package/package.json +31 -3
@@ -0,0 +1,113 @@
1
+ /**
2
+ * 插件入口(opencode 加载点:package.json exports["./server"] → dist/server/index.js)。
3
+ *
4
+ * setup 序列(技术方案 §4.C1/§4.C3/§4.G):
5
+ * 1. 宿主版本检测(< v2.0.26 console.error 提示,不中断);
6
+ * 2. CLI 定位:cliJs 解析失败=安装损坏 → setup 抛结构化错误(plugin remove + add 重装指引);
7
+ * 解释器缺失=预期降级(MCP/siming_cli 跳过,其余照常——固定项基准 4→2);
8
+ * 3. 注册五样(降级面按解释器轴裁定)+ reload 通道注入 + 任务创建观测;
9
+ * 4. 初始化拉取:同步阻塞有界 10s,失败/超时空集注册不中断激活(迟到成功仍写入 store);
10
+ * 5. 激活自检:list() 回查固定项与动态项,区分「拉取失败(预期降级)」与「拉取成功但注册缺项」,
11
+ * 仅激活时刻执行一次(此后动态增减由三触发点承接,正确性归 §6 刷新链单测)。
12
+ */
13
+ import { checkHostVersion, locateCli } from '../cli-locator.js';
14
+ import { getSnapshot } from '../assets-store.js';
15
+ import { initFetch, observeTaskCreate, setReloader, setLocationDirectory } from '../revalidate.js';
16
+ import { MCP_SERVER_NAME, registerMcp } from '../register/mcp.js';
17
+ import { SIMING_CLI_TOOL_NAME, registerSimingCli } from '../register/tools.js';
18
+ import { SIMING_REFRESH_TOOL_NAME, registerRefreshTool } from '../register/refresh-tool.js';
19
+ import { registerSkills } from '../register/skills.js';
20
+ import { registerAgents } from '../register/agents.js';
21
+ import { GUIDE_SKILL_NAME } from '../guide-skill.js';
22
+ import { getLastResolvedTarget } from '../revalidate.js';
23
+ import { listEntryNames } from '../host-api.js';
24
+ /** 激活自检(§4.G:固定项按双轴基准;动态项区分拉取失败与注册缺项;异常 console.error) */
25
+ async function selfCheck(ctx, opts) {
26
+ const problems = [];
27
+ let skillCount = 0;
28
+ let agentCount = 0;
29
+ try {
30
+ const [mcpEntries, skillEntries, agentEntries, toolEntries] = await Promise.all([
31
+ ctx.mcp.list(),
32
+ ctx.skill.list(),
33
+ ctx.agent.list(),
34
+ ctx.tool.list(),
35
+ ]);
36
+ const mcpNames = listEntryNames(mcpEntries);
37
+ const skillNames = listEntryNames(skillEntries);
38
+ const agentNames = listEntryNames(agentEntries);
39
+ const toolNames = listEntryNames(toolEntries);
40
+ // 固定项:解释器轴成功基准 4,轴降级基准 2(MCP/siming_cli 缺=预期不告警)
41
+ if (opts.interpreterOk && !mcpNames.has(MCP_SERVER_NAME)) {
42
+ problems.push(`MCP "${MCP_SERVER_NAME}" 未出现在 mcp 域注册表`);
43
+ }
44
+ if (opts.interpreterOk && !toolNames.has(SIMING_CLI_TOOL_NAME)) {
45
+ problems.push(`工具 ${SIMING_CLI_TOOL_NAME} 未出现在 tool 域注册表`);
46
+ }
47
+ // siming_refresh / 引导技能不依赖解释器发现链——缺=真缺项
48
+ if (!toolNames.has(SIMING_REFRESH_TOOL_NAME)) {
49
+ problems.push(`工具 ${SIMING_REFRESH_TOOL_NAME} 未出现在 tool 域注册表`);
50
+ }
51
+ if (!skillNames.has(GUIDE_SKILL_NAME)) {
52
+ problems.push(`引导技能 ${GUIDE_SKILL_NAME} 未出现在 skill 域注册表`);
53
+ }
54
+ // 动态项:拉取成功但注册缺项(拉取失败时 store 为空、此处自然无比对项=预期降级不告警)
55
+ const snapshot = getSnapshot();
56
+ for (const skill of snapshot.skills) {
57
+ if (!skillNames.has(skill.name))
58
+ problems.push(`技能 ${skill.name} 已拉取但未出现在 skill 域注册表`);
59
+ }
60
+ for (const agent of snapshot.agents) {
61
+ if (!agentNames.has(agent.name))
62
+ problems.push(`子代理 ${agent.name} 已拉取但未出现在 agent 域注册表`);
63
+ }
64
+ skillCount = snapshot.skills.length;
65
+ agentCount = snapshot.agents.length;
66
+ }
67
+ catch (err) {
68
+ problems.push(`注册表回查失败:${String(err)}`);
69
+ }
70
+ if (problems.length > 0) {
71
+ console.error(`[siming-plugin] 激活自检发现异常(${String(problems.length)} 项,doctor 会话内可二次查证):\n- ${problems.join('\n- ')}`);
72
+ return;
73
+ }
74
+ const target = getLastResolvedTarget();
75
+ console.log(`[siming-plugin] 激活完成:固定 ${opts.interpreterOk ? '4' : '2'} 项(解释器${opts.interpreterOk ? '正常' : '缺失降级'})` +
76
+ ` + 技能 ${String(skillCount)} + 子代理 ${String(agentCount)}` +
77
+ `${target !== null ? `(server:${target.serverUrl}${target.projectId !== null ? ',项目已绑定' : ''})` : ''}` +
78
+ `${skillCount === 0 && agentCount === 0 ? '——资产拉取未成功(空集注册,首次建任务/手动刷新时自动重试)' : ''}`);
79
+ }
80
+ const plugin = {
81
+ id: '@siming-org/opencode-plugin',
82
+ setup: async (ctx) => {
83
+ checkHostVersion();
84
+ const { nodeBin, cliJs } = locateCli();
85
+ if (cliJs === null) {
86
+ // 安装损坏:抛结构化错误中断激活(宿主按加载失败处理并透出,重装即恢复)
87
+ throw new Error('[siming-plugin] 安装损坏:@siming-org/cli 依赖解析失败——' +
88
+ '请执行 opencode plugin remove @siming-org/opencode-plugin && opencode plugin add @siming-org/opencode-plugin 重装');
89
+ }
90
+ // 目录基准:捕获本 location 的 directory(v2.0.26 实测:ToolContext 无 directory 字段,
91
+ // ctx.location.directory 于 setup 时可得——三触发与工具 cwd 统一取此值)
92
+ const directory = ctx.location.directory;
93
+ setLocationDirectory(directory);
94
+ // 注册五样(解释器轴降级:MCP 与 siming_cli 跳过,其余照常)
95
+ if (nodeBin !== null)
96
+ registerMcp(ctx, { nodeBin, cliJs });
97
+ registerRefreshTool(ctx, directory);
98
+ registerSkills(ctx);
99
+ registerAgents(ctx);
100
+ if (nodeBin !== null)
101
+ registerSimingCli(ctx, { nodeBin, cliJs }, directory);
102
+ // 变更生效通道 + 任务创建观测(fire-and-forget)
103
+ setReloader('skill', () => ctx.skill.reload());
104
+ setReloader('agent', () => ctx.agent.reload());
105
+ observeTaskCreate(ctx.tool);
106
+ // 初始化拉取(setup 期会话未建立 → location directory 基准,§4.C3-3)
107
+ await initFetch(directory);
108
+ // 激活自检(仅此刻一次)
109
+ await selfCheck(ctx, { interpreterOk: nodeBin !== null });
110
+ },
111
+ };
112
+ export default plugin;
113
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { z } from 'zod';
2
+ import type { HostToolContext, HostToolInfo, HostToolResult } from '../host-api.js';
3
+ export declare const SIMING_CLI_TOOL_NAME = "siming_cli";
4
+ export declare const simingCliArgs: z.ZodObject<{
5
+ args: z.ZodArray<z.ZodString>;
6
+ stdin: z.ZodOptional<z.ZodString>;
7
+ }, z.core.$strip>;
8
+ /** CLI 子进程超时上限(§4.C2a 超时保护):flow install 等含 npm 网络拉取的命令可达分钟级,取 180s 防挂起 */
9
+ export declare const CLI_TIMEOUT_MS = 180000;
10
+ /** spawn 包装:经解释器拉起 CLI bin,stdout/stderr 原文收集。
11
+ * cwd=setup 捕获的 location directory(§4.C2a:多项目形态下 init/doctor 等命令的工作区发现落点
12
+ * ——v2.0.26 ToolContext 无 directory 字段,经注册闭包传入);
13
+ * 生命周期随请求 signal(取消即终止)+ 超时保护(AbortSignal.any 组合,挂起命令有界中止)。 */
14
+ export declare function runCli(cli: {
15
+ nodeBin: string;
16
+ cliJs: string;
17
+ }, userArgs: string[], stdin: string | undefined, ctx: HostToolContext, cwd: string, timeoutMs?: number): Promise<HostToolResult>;
18
+ /** siming_cli 工具定义(注册动作见 register/tools.ts,职责拆分对齐 §4.B 文件树) */
19
+ export declare function simingCliToolInfo(cli: {
20
+ nodeBin: string;
21
+ cliJs: string;
22
+ }, directory: string): HostToolInfo;
23
+ //# sourceMappingURL=simming-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simming-cli.d.ts","sourceRoot":"","sources":["../../src/tools/simming-cli.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEpF,eAAO,MAAM,oBAAoB,eAAe,CAAC;AAEjD,eAAO,MAAM,aAAa;;;iBAGxB,CAAC;AAEH,2EAA2E;AAC3E,eAAO,MAAM,cAAc,SAAU,CAAC;AAEtC;;;gEAGgE;AAChE,wBAAgB,MAAM,CACpB,GAAG,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EACvC,QAAQ,EAAE,MAAM,EAAE,EAClB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,MAAM,EACX,SAAS,GAAE,MAAuB,GACjC,OAAO,CAAC,cAAc,CAAC,CAgDzB;AAED,+DAA+D;AAC/D,wBAAgB,iBAAiB,CAAC,GAAG,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,SAAS,EAAE,MAAM,GAAG,YAAY,CAa1G"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * siming_cli 本地工具:definition + spawn 包装(技术方案 §4.C2a / §4.B tools/ 目录)。
3
+ *
4
+ * 用途边界(§4.F 第 6 步,随技能正文声明):接入与诊断(引导流程、doctor/healthcheck、迁移检测),
5
+ * 不承接开发期运维指令。
6
+ * 入参面刻意最小:args(CLI 参数数组)+ 可选 stdin(Token 管道直传——§7:token 不落命令行参数,
7
+ * `auth token set` 已支持 stdin 读取)。CLI 输出原文透传,不二次解释(§7)。
8
+ * options.permission 仅声明锚点(v6:插件不内置任何 permissions 规则,供用户自配 deny/allow 引用)。
9
+ */
10
+ import { spawn } from 'node:child_process';
11
+ import { z } from 'zod';
12
+ export const SIMING_CLI_TOOL_NAME = 'siming_cli';
13
+ export const simingCliArgs = z.object({
14
+ args: z.array(z.string()).min(1).describe('siming CLI 参数数组,如 ["task","list","--format","json"]'),
15
+ stdin: z.string().optional().describe('可选:传入命令 stdin 的文本(如 auth token set 的 Token 管道直传)'),
16
+ });
17
+ /** CLI 子进程超时上限(§4.C2a 超时保护):flow install 等含 npm 网络拉取的命令可达分钟级,取 180s 防挂起 */
18
+ export const CLI_TIMEOUT_MS = 180_000;
19
+ /** spawn 包装:经解释器拉起 CLI bin,stdout/stderr 原文收集。
20
+ * cwd=setup 捕获的 location directory(§4.C2a:多项目形态下 init/doctor 等命令的工作区发现落点
21
+ * ——v2.0.26 ToolContext 无 directory 字段,经注册闭包传入);
22
+ * 生命周期随请求 signal(取消即终止)+ 超时保护(AbortSignal.any 组合,挂起命令有界中止)。 */
23
+ export function runCli(cli, userArgs, stdin, ctx, cwd, timeoutMs = CLI_TIMEOUT_MS) {
24
+ return new Promise((resolve) => {
25
+ const timeoutSignal = AbortSignal.timeout(timeoutMs);
26
+ const child = spawn(cli.nodeBin, [cli.cliJs, ...userArgs], {
27
+ stdio: ['pipe', 'pipe', 'pipe'],
28
+ cwd,
29
+ signal: AbortSignal.any([ctx.signal, timeoutSignal]),
30
+ });
31
+ let stdout = '';
32
+ let stderr = '';
33
+ child.stdout.on('data', (chunk) => {
34
+ stdout += chunk.toString('utf8');
35
+ });
36
+ child.stderr.on('data', (chunk) => {
37
+ stderr += chunk.toString('utf8');
38
+ });
39
+ const describeAbort = () => {
40
+ if (timeoutSignal.aborted)
41
+ return `CLI 执行超时(${String(timeoutMs)}ms)已中止——长耗时命令(如 flow install 含 npm 拉取)可在终端直跑同命令确认进度后分步重试`;
42
+ if (ctx.signal.aborted)
43
+ return 'CLI 执行已被用户取消';
44
+ return null;
45
+ };
46
+ child.on('error', (err) => {
47
+ // spawn 层失败(解释器消失/超时/取消中止):如实报出(CLI 业务错误走 stderr 正常透传,不在此路径)
48
+ const abort = describeAbort();
49
+ // 自修复指引(错误信息可自诊断原则):spawn 失败=插件依赖损坏或 Node 解释器缺失,给出两通道修复命令
50
+ const reason = abort ??
51
+ `CLI 进程启动失败:${String(err)}——疑似插件依赖损坏或 Node 解释器缺失;修复:npm 通道=opencode plugin remove @siming-org/opencode-plugin && opencode plugin add @siming-org/opencode-plugin,dev 通道=重跑 bash scripts/install-cli.sh --plugin-dev;修复后重试本命令`;
52
+ // 中止场景附带已收集的部分输出(stdout/stderr 可能含中断前上下文,如 npm 拉取报错——复验 N2)
53
+ const partial = [stdout.trimEnd(), stderr.trimEnd()].filter((part) => part !== '');
54
+ if (abort !== null && partial.length > 0) {
55
+ resolve({ content: `${partial.join('\n\n')}\n\n(${abort})` });
56
+ return;
57
+ }
58
+ resolve({ content: reason });
59
+ });
60
+ child.on('close', (code) => {
61
+ const abort = describeAbort();
62
+ const parts = [`$ siming ${userArgs.join(' ')}`];
63
+ if (stdout !== '')
64
+ parts.push(stdout.trimEnd());
65
+ if (stderr !== '')
66
+ parts.push(`[stderr]\n${stderr.trimEnd()}`);
67
+ if (abort !== null)
68
+ parts.push(`(${abort})`);
69
+ else if (code !== 0)
70
+ parts.push(`(退出码 ${String(code)})`);
71
+ resolve({ content: parts.join('\n\n') });
72
+ });
73
+ // stdin 管道:写入后关闭(无 stdin 也须 end,否则交互式命令挂起等待输入)
74
+ child.stdin.end(stdin ?? '');
75
+ });
76
+ }
77
+ /** siming_cli 工具定义(注册动作见 register/tools.ts,职责拆分对齐 §4.B 文件树) */
78
+ export function simingCliToolInfo(cli, directory) {
79
+ return {
80
+ name: SIMING_CLI_TOOL_NAME,
81
+ description: 'siming 平台 CLI 通道(用途=接入与诊断:接入引导流程、doctor/healthcheck、迁移检测)。' +
82
+ 'args=命令参数数组;stdin 可选传入 stdin 文本(如 auth token set 的 Token)。',
83
+ input: simingCliArgs,
84
+ execute: async (input, toolCtx) => {
85
+ const parsed = simingCliArgs.parse(input);
86
+ return runCli(cli, parsed.args, parsed.stdin, toolCtx, directory);
87
+ },
88
+ options: { permission: 'siming-setup' },
89
+ };
90
+ }
91
+ //# sourceMappingURL=simming-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simming-cli.js","sourceRoot":"","sources":["../../src/tools/simming-cli.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,34 @@
1
1
  {
2
2
  "name": "@siming-org/opencode-plugin",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.0",
4
+ "description": "opencode v2 plugin for siming: registers MCP task tools (siming_*), onboarding guide skill, siming_cli/siming_refresh tools, and global+project skills/subagents pulled live from the siming server",
5
+ "type": "module",
6
+ "keywords": [
7
+ "opencode-plugin"
8
+ ],
9
+ "exports": {
10
+ "./server": "./dist/server/index.js"
11
+ },
12
+ "files": [
13
+ "dist"
14
+ ],
15
+ "dependencies": {
16
+ "jsonc-parser": "^3.3.1",
17
+ "zod": "^4.4.3",
18
+ "@siming-org/cli": "0.8.4"
19
+ },
20
+ "devDependencies": {
21
+ "@opencode-ai/plugin": "^1.18.35",
22
+ "@types/node": "^26.0.0",
23
+ "@typescript/native-preview": "^7.0.0-dev.20260518.1",
24
+ "tsx": "^4.20.0",
25
+ "typescript": "^5.8.0",
26
+ "vitest": "^2.1.9"
27
+ },
28
+ "scripts": {
29
+ "build": "tsc -p tsconfig.json",
30
+ "typecheck": "tsgo --noEmit",
31
+ "test": "vitest run",
32
+ "clean": "rm -rf dist"
33
+ }
6
34
  }