@siming-org/opencode-plugin 0.0.0-stage → 0.1.1

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 +85 -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 +33 -0
  52. package/dist/tools/simming-cli.d.ts.map +1 -0
  53. package/dist/tools/simming-cli.js +120 -0
  54. package/dist/tools/simming-cli.js.map +1 -0
  55. package/package.json +31 -3
@@ -0,0 +1,362 @@
1
+ /**
2
+ * 运行时资产拉取(技术方案 §4.C3 第 1-3 条)。
3
+ *
4
+ * 目标解析(serverUrl/token)是 CLI 实链的最小镜像子集——契约源锚定:
5
+ * - serverUrl:packages/cli/src/client/http-client.ts resolveServerUrl
6
+ * (env SIMING_SERVER_URL > 工作区 .siming/config.json serverUrl > ~/.siming/config.json serverUrl
7
+ * > http://localhost:{端口推导})
8
+ * - 端口推导:packages/cli/src/config/server-config-loader.ts resolveLocalSimingPort
9
+ * (PORT env > ~/.config/siming/siming.jsonc port > /etc/siming/siming.jsonc port > 7777)
10
+ * - token:packages/cli/src/config/auth-token.ts
11
+ * (工作区 .siming/dev.json authToken > ~/.siming/auth.json(尊重 SIMING_AUTH_FILE 重定向)> SIMING_TOKEN env)
12
+ * CLI 的 index.ts 是 bin 入口不可作库引用(已核实),故镜像实现;不含源码形态免疫等 CLI 专属逻辑。
13
+ * 拉取数据路径与 install 命令一致:列表概要投影(content 随列表下发、references 剥离出
14
+ * referenceCount)+ referenceCount>0 时 by-name 详情取全量 references。
15
+ */
16
+ import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
17
+ import { homedir, tmpdir } from 'node:os';
18
+ import { dirname, isAbsolute, join, resolve } from 'node:path';
19
+ import { parse } from 'jsonc-parser';
20
+ const FETCH_TIMEOUT_MS = 10_000;
21
+ // ── 配置解析(CLI 镜像子集) ──
22
+ /** 向上发现工作区根(含 .siming 目录者)——语义对齐 CLI findWorkspaceDir */
23
+ export function findWorkspaceDir(start) {
24
+ let dir = resolve(start);
25
+ for (;;) {
26
+ const marker = join(dir, '.siming');
27
+ if (existsSync(marker))
28
+ return dir;
29
+ const parent = dirname(dir);
30
+ if (parent === dir)
31
+ return null;
32
+ dir = parent;
33
+ }
34
+ }
35
+ /** 读工作区 .siming/config.json(损坏=console.error + null,不中断) */
36
+ function readWorkspaceConfig(workspaceDir) {
37
+ const file = join(workspaceDir, '.siming', 'config.json');
38
+ if (!existsSync(file))
39
+ return null;
40
+ try {
41
+ return JSON.parse(readFileSync(file, 'utf8'));
42
+ }
43
+ catch (err) {
44
+ console.error(`[siming-plugin] 工作区配置 ${file} 解析失败(忽略该层):${String(err)}`);
45
+ return null;
46
+ }
47
+ }
48
+ /** jsonc 配置文件宽容读取(不存在/损坏/非对象 → null)——镜像 tryLoadJsoncConfigFile 容错语义 */
49
+ function tryLoadJsonc(path) {
50
+ if (!existsSync(path))
51
+ return null;
52
+ try {
53
+ const value = parse(readFileSync(path, 'utf8'));
54
+ if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
55
+ return value;
56
+ }
57
+ return null;
58
+ }
59
+ catch {
60
+ return null;
61
+ }
62
+ }
63
+ /** 同机端口推导(镜像 resolveLocalSimingPort:PORT env > 用户级 > 系统级 > 7777) */
64
+ function resolveLocalPort() {
65
+ const portEnv = process.env['PORT'];
66
+ if (portEnv !== undefined) {
67
+ const n = Number(portEnv);
68
+ if (Number.isInteger(n) && n >= 1 && n <= 65_535)
69
+ return n;
70
+ console.error(`[siming-plugin] 忽略非法 PORT="${portEnv}"(须为 1-65535 整数),回退配置文件/缺省端口`);
71
+ }
72
+ for (const path of [
73
+ join(homedir(), '.config', 'siming', 'siming.jsonc'),
74
+ '/etc/siming/siming.jsonc',
75
+ ]) {
76
+ const values = tryLoadJsonc(path);
77
+ const raw = values?.['port'];
78
+ if (raw === undefined)
79
+ continue;
80
+ const n = typeof raw === 'number' ? raw : Number(raw);
81
+ if (Number.isInteger(n) && n >= 1 && n <= 65_535)
82
+ return n;
83
+ }
84
+ return 7777;
85
+ }
86
+ /** 全局层 ~/.siming/config.json 的 serverUrl(缺失=null) */
87
+ function readGlobalServerUrl() {
88
+ const values = tryLoadJsonc(join(homedir(), '.siming', 'config.json'));
89
+ const url = values?.['serverUrl'];
90
+ return typeof url === 'string' && url !== '' ? url : null;
91
+ }
92
+ /** token 三层链:工作区 dev.json authToken > 全局 auth.json(SIMING_AUTH_FILE 可重定向)> SIMING_TOKEN env */
93
+ function resolveToken(workspaceDir) {
94
+ if (workspaceDir !== null) {
95
+ const file = join(workspaceDir, '.siming', 'dev.json');
96
+ if (existsSync(file)) {
97
+ try {
98
+ const value = JSON.parse(readFileSync(file, 'utf8'));
99
+ if (typeof value.authToken === 'string' && value.authToken !== '')
100
+ return value.authToken;
101
+ }
102
+ catch {
103
+ // 损坏视同缺失,落下一层
104
+ }
105
+ }
106
+ }
107
+ const authFile = process.env['SIMING_AUTH_FILE'];
108
+ // 相对路径重定向对齐 CLI 语义(auth-token.ts resolveGlobalAuthFilePath/globalEffectiveValue):
109
+ // 显式指定时永不回退默认路径——相对路径 = 告警 + 整层视为未配置(落 env 层),不读机器级默认凭据
110
+ const globalPath = authFile === undefined
111
+ ? join(homedir(), '.siming', 'auth.json')
112
+ : isAbsolute(authFile)
113
+ ? authFile
114
+ : null;
115
+ if (globalPath === null) {
116
+ console.error(`[siming-plugin] 忽略相对路径 SIMING_AUTH_FILE="${authFile}"(须为绝对路径)——全局凭据层视为未配置`);
117
+ }
118
+ else if (existsSync(globalPath)) {
119
+ try {
120
+ // 字段名锚定 CLI 契约:auth-token.ts writeGlobalAuthToken 写 { authToken }(读侧同字段)
121
+ const value = JSON.parse(readFileSync(globalPath, 'utf8'));
122
+ if (typeof value.authToken === 'string' && value.authToken !== '')
123
+ return value.authToken;
124
+ }
125
+ catch {
126
+ // 损坏视同缺失,落下一层
127
+ }
128
+ }
129
+ const envToken = process.env['SIMING_TOKEN'];
130
+ return envToken !== undefined && envToken !== '' ? envToken : null;
131
+ }
132
+ export class AssetFetchError extends Error {
133
+ kind;
134
+ status;
135
+ constructor(kind, message, status) {
136
+ super(message);
137
+ this.name = 'AssetFetchError';
138
+ this.kind = kind;
139
+ if (status !== undefined)
140
+ this.status = status;
141
+ }
142
+ }
143
+ async function apiGet(serverUrl, token, path) {
144
+ let response;
145
+ try {
146
+ response = await fetch(`${serverUrl}${path}`, {
147
+ signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
148
+ headers: token !== null ? { Authorization: `Bearer ${token}` } : {},
149
+ });
150
+ }
151
+ catch (err) {
152
+ throw new AssetFetchError('network', `server 不可达(${serverUrl}):${String(err)}——确认 server 已在运行且地址正确(地址解析优先级:env SIMING_SERVER_URL > 工作区 .siming/config.json serverUrl > 全局 ~/.siming/config.json > 端口推导缺省)`);
153
+ }
154
+ if (response.status === 401) {
155
+ throw new AssetFetchError('auth', `鉴权失败(${serverUrl}):请经 Web 管理台生成/重置 Token 并执行 siming auth token set --global 配置`, 401);
156
+ }
157
+ if (!response.ok) {
158
+ throw new AssetFetchError('http', `HTTP ${String(response.status)}(${serverUrl}${path})`, response.status);
159
+ }
160
+ try {
161
+ return await response.json();
162
+ }
163
+ catch (err) {
164
+ throw new AssetFetchError('parse', `响应不是合法 JSON(${serverUrl}${path}):${String(err)}`);
165
+ }
166
+ }
167
+ /** 四层 serverUrl 解析 + 三层 token 解析 + 工作区项目绑定发现(纯本地,无网络请求) */
168
+ export function resolveFetchTarget(startDir) {
169
+ const envUrl = process.env['SIMING_SERVER_URL'];
170
+ const workspaceDir = findWorkspaceDir(startDir);
171
+ const workspaceConfig = workspaceDir !== null ? readWorkspaceConfig(workspaceDir) : null;
172
+ let serverUrl;
173
+ if (envUrl !== undefined && envUrl !== '') {
174
+ serverUrl = envUrl;
175
+ }
176
+ else if (typeof workspaceConfig?.serverUrl === 'string' && workspaceConfig.serverUrl !== '') {
177
+ serverUrl = workspaceConfig.serverUrl;
178
+ }
179
+ else {
180
+ const global = readGlobalServerUrl();
181
+ serverUrl = global ?? `http://localhost:${String(resolveLocalPort())}`;
182
+ }
183
+ // 剥尾斜杠对齐 CLI resolveServerUrl(http-client.ts):否则 <url>//api/skills 与 CLI 行为分歧
184
+ serverUrl = serverUrl.replace(/\/+$/, '');
185
+ const defaultProject = workspaceConfig?.defaultProject;
186
+ return {
187
+ serverUrl,
188
+ token: resolveToken(workspaceDir),
189
+ projectKey: typeof defaultProject === 'string' && defaultProject !== '' ? defaultProject : null,
190
+ };
191
+ }
192
+ /** project key → hex id(GET /api/projects 找 key===input;24-hex 直接作 id)——镜像 CLI resolveProjectId */
193
+ async function resolveProjectId(target, key) {
194
+ if (/^[a-f0-9]{24}$/.test(key))
195
+ return key;
196
+ const raw = await apiGet(target.serverUrl, target.token, '/api/projects');
197
+ const projects = Array.isArray(raw) ? raw : [];
198
+ const hit = projects.find((p) => p.key === key);
199
+ return typeof hit?.id === 'string' ? hit.id : null;
200
+ }
201
+ function requireArray(raw, what) {
202
+ if (!Array.isArray(raw))
203
+ throw new AssetFetchError('parse', `${what} 响应不是数组`);
204
+ return raw;
205
+ }
206
+ async function fetchSkillList(target, query) {
207
+ const raw = await apiGet(target.serverUrl, target.token, `/api/skills${query}`);
208
+ return requireArray(raw, 'GET /api/skills');
209
+ }
210
+ async function fetchAgentList(target, query) {
211
+ const raw = await apiGet(target.serverUrl, target.token, `/api/agents${query}`);
212
+ return requireArray(raw, 'GET /api/agents');
213
+ }
214
+ /** by-name 详情(全量含 references);项目作用域条目必须携带 scope=project&projectId=<hex>(否则拉到 global 版) */
215
+ async function fetchSkillDetail(target, name, scope, projectId) {
216
+ const query = scope === 'project' && projectId !== null
217
+ ? `?scope=project&projectId=${projectId}`
218
+ : '?scope=global';
219
+ const raw = await apiGet(target.serverUrl, target.token, `/api/skills/${encodeURIComponent(name)}${query}`);
220
+ if (typeof raw !== 'object' || raw === null)
221
+ throw new AssetFetchError('parse', `skill ${name} 详情响应不是对象`);
222
+ return raw;
223
+ }
224
+ // ── references 物化(架构评审 H2:正文相对引用改绝对路径;幂等重写) ──
225
+ function referencesRoot() {
226
+ return join(tmpdir(), 'siming-opencode-plugin', 'skills');
227
+ }
228
+ /**
229
+ * 物化某技能的引用文档到 os.tmpdir()/siming-opencode-plugin/skills/<name>/references/<path>,
230
+ * 并把正文中出现的相对 path 文本改写为物化后的绝对路径(主文档以文本引用 path,
231
+ * 引用侧同源可证:server 侧 assertReferencesDeletable 即按「path 文本出现在正文」判定)。
232
+ * 幂等:每次重拉整目录重建(rmSync+重写),同一动作再验证复用。
233
+ */
234
+ function materializeReferences(skillName, content, references) {
235
+ if (references.length === 0)
236
+ return content;
237
+ const assetRoot = join(referencesRoot(), skillName, 'references');
238
+ rmSync(assetRoot, { recursive: true, force: true });
239
+ let rewritten = content;
240
+ for (const doc of references) {
241
+ const abs = join(assetRoot, doc.path);
242
+ mkdirSync(dirname(abs), { recursive: true });
243
+ writeFileSync(abs, doc.content, 'utf8');
244
+ // path 已通过 server 校验(禁绝对/回溯/反斜杠/空段),join 不产生越界
245
+ rewritten = rewritten.split(doc.path).join(abs);
246
+ }
247
+ return rewritten;
248
+ }
249
+ /** 每条 name@scope|version|updatedAt|enabled 排序拼接(§4.C3 第 6 条契约形状) */
250
+ export function buildFingerprint(items) {
251
+ return items
252
+ .map((item) => `${item.name}@${item.scope}|${item.version}|${item.updatedAt ?? ''}|${String(item.enabled ?? true)}`)
253
+ .sort()
254
+ .join('\n');
255
+ }
256
+ /**
257
+ * 指纹检查的列表拉取(零 server 改动的差异检测输入,每域一次请求):
258
+ * 绑定项目 → ?projectId=<hex>(一次返回 global+本项目并集,投影含 scope);
259
+ * 无绑定 → 显式 ?scope=global(列表缺省=全量管理视角,不可用于指纹)。
260
+ */
261
+ export async function fetchSkillCheckFingerprint(plan) {
262
+ const skills = await fetchSkillList(plan.target, fingerprintQuery(plan.projectId));
263
+ return buildFingerprint(skills);
264
+ }
265
+ export async function fetchAgentCheckFingerprint(plan) {
266
+ const agents = await fetchAgentList(plan.target, fingerprintQuery(plan.projectId));
267
+ return buildFingerprint(agents);
268
+ }
269
+ function fingerprintQuery(projectId) {
270
+ return projectId !== null ? `?projectId=${projectId}` : '?scope=global';
271
+ }
272
+ /**
273
+ * 共享前置解析:目标四层/token 三层 + 工作区项目 key→hex id。
274
+ * projectIdOverride:调用方(revalidate)缓存的 key→id 命中时跳过网络解析,稳态检查保持 2 次列表请求。
275
+ */
276
+ export async function resolveFetchPlan(startDir, projectIdOverride) {
277
+ const target = resolveFetchTarget(startDir);
278
+ if (target.projectKey === null)
279
+ return { target, projectId: null };
280
+ if (projectIdOverride !== undefined && projectIdOverride !== null && projectIdOverride.key === target.projectKey) {
281
+ return { target, projectId: projectIdOverride.id };
282
+ }
283
+ const id = await resolveProjectId(target, target.projectKey);
284
+ if (id === null) {
285
+ // 绑定存在但解析失败(项目已删/不可达):按仅全局继续,如实留痕
286
+ console.error(`[siming-plugin] 工作区绑定项目 "${target.projectKey}" 解析失败(GET /api/projects 无此 key)——本次按仅全局拉取`);
287
+ }
288
+ return { target, projectId: id };
289
+ }
290
+ /**
291
+ * 技能域全链拉取:global 列表 +(有绑定时)project 列表 → 同名 project 胜 →
292
+ * referenceCount>0 取 by-name 详情并物化 references。
293
+ * includeDisabled 不携带——停用资产不注册,对齐 install 语义。
294
+ */
295
+ export async function fetchSkillsDomain(plan) {
296
+ const globalItems = await fetchSkillList(plan.target, '?scope=global');
297
+ const projectItems = plan.projectId !== null
298
+ ? await fetchSkillList(plan.target, `?scope=project&projectId=${plan.projectId}`)
299
+ : [];
300
+ const merged = new Map();
301
+ for (const item of globalItems)
302
+ merged.set(item.name, item);
303
+ for (const item of projectItems)
304
+ merged.set(item.name, item);
305
+ const skills = [];
306
+ for (const item of merged.values()) {
307
+ let content = item.content;
308
+ if (item.referenceCount > 0) {
309
+ const detail = await fetchSkillDetail(plan.target, item.name, item.scope, plan.projectId);
310
+ if (detail.references !== undefined && detail.references.length > 0) {
311
+ content = materializeReferences(item.name, content, detail.references);
312
+ }
313
+ }
314
+ skills.push({
315
+ name: item.name,
316
+ description: item.description,
317
+ content,
318
+ scope: item.scope,
319
+ version: item.version,
320
+ ...(item.updatedAt !== undefined ? { updatedAt: item.updatedAt } : {}),
321
+ referenceCount: item.referenceCount,
322
+ });
323
+ }
324
+ return {
325
+ assets: skills,
326
+ fingerprint: buildFingerprint([...globalItems, ...projectItems]),
327
+ serverUrl: plan.target.serverUrl,
328
+ projectId: plan.projectId,
329
+ };
330
+ }
331
+ /** 子代理域全链拉取(同技能域语义;systemPrompt 随列表下发,无详情/物化环节) */
332
+ export async function fetchAgentsDomain(plan) {
333
+ const globalItems = await fetchAgentList(plan.target, '?scope=global');
334
+ const projectItems = plan.projectId !== null
335
+ ? await fetchAgentList(plan.target, `?scope=project&projectId=${plan.projectId}`)
336
+ : [];
337
+ const merged = new Map();
338
+ for (const item of globalItems)
339
+ merged.set(item.name, item);
340
+ for (const item of projectItems)
341
+ merged.set(item.name, item);
342
+ const agents = [];
343
+ for (const item of merged.values()) {
344
+ agents.push({
345
+ name: item.name,
346
+ description: item.description,
347
+ systemPrompt: item.systemPrompt,
348
+ scope: item.scope,
349
+ version: item.version,
350
+ ...(item.updatedAt !== undefined ? { updatedAt: item.updatedAt } : {}),
351
+ function: item.function ?? 'executor',
352
+ boundSkills: item.boundSkills ?? [],
353
+ });
354
+ }
355
+ return {
356
+ assets: agents,
357
+ fingerprint: buildFingerprint([...globalItems, ...projectItems]),
358
+ serverUrl: plan.target.serverUrl,
359
+ projectId: plan.projectId,
360
+ };
361
+ }
362
+ //# sourceMappingURL=fetch-assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-assets.js","sourceRoot":"","sources":["../src/fetch-assets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * 接入引导技能(技术方案 §4.F):激活时内嵌注册 siming-guide。
3
+ *
4
+ * 正文 = 六步主链路插件版(v10 裁定 A):链上无 scaffold 步,引导全程不落任何本地产物文件——
5
+ * 仅两类本地写入均经 CLI 既有路径(工作区 .siming/config.json(init 绑定)与 ~/.siming/auth.json(token));
6
+ * references 物化缓存走 os.tmpdir 不在此限。
7
+ * 内容构建期定稿(随插件版本走,不运行时拉取);语义源 = cli onboarding-text.ts 链路 + 本方案 §4.F 逐轮裁定。
8
+ */
9
+ import type { HostSkillInfo } from './host-api.js';
10
+ export declare const GUIDE_SKILL_NAME = "siming-guide";
11
+ export declare function guideSkillInfo(): HostSkillInfo;
12
+ //# sourceMappingURL=guide-skill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guide-skill.d.ts","sourceRoot":"","sources":["../src/guide-skill.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGnD,eAAO,MAAM,gBAAgB,iBAAiB,CAAC;AAE/C,wBAAgB,cAAc,IAAI,aAAa,CAQ9C"}
@@ -0,0 +1,59 @@
1
+ import { skillDisplayPath } from './host-api.js';
2
+ export const GUIDE_SKILL_NAME = 'siming-guide';
3
+ export function guideSkillInfo() {
4
+ return {
5
+ id: GUIDE_SKILL_NAME,
6
+ name: GUIDE_SKILL_NAME,
7
+ description: 'siming 新项目接入引导:当用户要求接入/初始化 siming 时使用',
8
+ path: skillDisplayPath(GUIDE_SKILL_NAME),
9
+ content: GUIDE_CONTENT,
10
+ };
11
+ }
12
+ const GUIDE_CONTENT = `# siming 新项目接入引导(opencode 插件版)
13
+
14
+ 把当前项目接入 siming 平台。全程经 \`siming_cli\` 工具执行命令——它只用于**接入与诊断**(引导流程、doctor/healthcheck、迁移检测),不承接开发期运维指令(server 运维、project archive 等请用户在终端显式执行)。
15
+
16
+ 执行任何写入类命令前,先向用户复述完整命令并获确认。
17
+
18
+ ## 第 1 步:确认目标 server
19
+
20
+ 目标实例按四层解析链确定:\`SIMING_SERVER_URL\` env > 工作区 \`.siming/config.json\` > \`~/.siming/config.json\` > \`http://localhost:{端口推导}\`。
21
+
22
+ 与用户期望的目标不符时(典型:首次接入生产实例 :8770,而本地缺省解析到 :7777),在 init 写入工作区绑定**之前**,命令链必须**逐命令带 \`--url <目标地址>\`**——此时工作区绑定尚不存在,缺省解析可能指向错误实例。\`project\`/\`flow\`/\`init\`/\`doctor\` 等子命令均支持 \`--url\`(\`auth token set\` 除外,它只有 \`--global\`/\`--force\`)。
23
+
24
+ 可先经 siming_cli 传 \`healthcheck --url <目标>\` 探测连通。
25
+
26
+ ## 第 2 步:对话确认项目信息
27
+
28
+ 收集并向用户复述确认:项目名称、项目标识(key,kebab-case)、流程组合选择(full/quick/research 等)。确认后才进入命令链。(资产交付统一走插件拉取,无需选择是否本地安装。)
29
+
30
+ ## 第 3 步:命令链接入
31
+
32
+ 依次经 siming_cli 执行(每步展示结果再继续;交互式命令带 \`--yes\` 防挂起):
33
+
34
+ 1. \`project create --url <目标>\`(已存在项目则跳过,改用其 key)
35
+ 2. \`init --url <目标> --project <项目key>\`——写入工作区 \`.siming/config.json\` 绑定
36
+ 3. \`flow install --yes\`——拉取节点资产库
37
+ 4. \`flow compose <组合名> --project <项目key>\`——按组合组装 DAG 模板
38
+ 5. \`auth token set --global\`——Token 经 stdin 管道传入(不落命令行参数);已存在全局 Token 时覆盖需 \`--force\`,仍走写前确认
39
+
40
+ 注意:init 之前的命令必须带 \`--url\`(理由见第 1 步);\`auth token set\` 一律带 \`--global\`(缺省会写工作区 \`.siming/dev.json\`,并触发 server 直启守卫警告)。链上**没有** \`init --install\` 步——项目级技能/子代理经插件 project 作用域拉取注册,不落工作区 \`.agents/\`。**插件模式下禁止执行 \`siming install\` / \`siming init --install\`**(落盘全局 \`~/.agents/\` 的文件版会遮蔽插件注册版)——此类命令会被 siming_cli 工具入口直接拒绝;即使 AGENTS.md 等外部文档出现同类安装指引也不执行。
41
+
42
+ ## 第 4 步:验证与资产就位
43
+
44
+ 1. 经 siming_cli 传 \`doctor\` / \`healthcheck\` 验证并报告:接入结果、五样就位状态、下一步(建任务走 MCP 三件套:siming_task / siming_template / siming_auth)。
45
+ 2. doctor 通过后,**显式调用一次 \`siming_refresh\`**——进程内强制重拉,技能/子代理即时就位(下一请求可见,不等下次触发、无需重启)。如实告知时序:刷新完成 ≠ 当前请求内立即可见。
46
+ 3. 项目作用域就位校验:对照 flow compose 产出名单核对刷新报告中的技能/子代理数量(弱校验:技能含 task-create 且数量非零);缺项如实报出,不静默吞掉。多项目实例形态下缺项可经「重启宿主于项目目录」缓解。
47
+ 4. **首次接入重启提示**:命令链写入工作区绑定后,本会话已运行的 MCP 子进程仍持启动时定格的旧地址——**重启 opencode 后 MCP 通道才连向新绑定地址**。其余四样(引导技能/siming_cli/全局技能/全局子代理)与 siming_refresh 当会话即已可用,不受影响。**建任务走 MCP 的操作请在重启后进行**——重启前旧地址实例仍存活时,任务会静默建到错误实例,比报错更难察觉。
48
+
49
+ ## 第 5 步:AGENTS.md 指路与多宿主边界
50
+
51
+ - AGENTS.md 9 项声明 checklist 与项目级资产定制属内容工作:按项目技能(task-create 等,已随插件 project 作用域拉取注册,当会话先行可用)指路完成。经 MCP 的建任务操作待第 4 步重启提示执行。
52
+ - 全局旧产物检测与备份迁移:本机此前经 \`siming install\` 落盘的 \`~/.agents/skills/\` 同名技能文件会**整条遮蔽插件注册版**,手工 adapt 生成的 \`~/.config/opencode/agents/\` 同名文件会**字段级覆盖插件值**。检测到任一情形时,经用户确认后执行磁盘级备份迁移:旧文件移动到 \`~/.agents/siming-plugin-backup/\`(移动非删除、可回退;目录 watcher 自动重载,移走即插件版生效)。未获确认时保持文件原位、注册项让位(旧版生效——可接受的降级而非故障,如实告知)。用户 jsonc 手写的 \`mcp.servers.siming\` 被插件注册遮蔽成为死配置——提示用户自行清理,避免双来源困惑。检测与执行用宿主既有工具(glob/read 检测 + shell 执行 mv)或用户终端手工执行——本插件不为此新增工具。
53
+ - 多宿主边界:工作区 \`.agents/\` 目录属其他宿主(pi 等)的交付面——本插件不创建、不迁移、不清理该目录。若用户此前在本工作区经其他宿主跑过 \`siming install\` 留有同名技能文件,opencode 兼容扫描下**文件版遮蔽插件注册版**(文件是安装时刻快照,插件侧随 server 更新)——检测到该情形时如实告知两版本差异与处理建议(经其他宿主执行 \`siming install update\` 或删除对应文件);此为多宿主用户自选取舍。
54
+
55
+ ## 第 6 步:siming_cli 用途边界声明
56
+
57
+ 向用户明确:siming_cli 的用途 = 接入与诊断(引导流程、doctor/healthcheck、迁移检测);开发期运维指令(server 启停、project archive 等)请用户在终端显式执行。siming_cli 入口对本地资产安装类命令(\`install\`、\`init --install\`)设硬门禁直接拒绝——插件模式下技能/子代理一律由插件注册供给,缺失先 \`siming_refresh\` 强制重拉,**禁止**以本地安装补齐。
58
+ `;
59
+ //# sourceMappingURL=guide-skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guide-skill.js","sourceRoot":"","sources":["../src/guide-skill.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,MAAM,CAAC,MAAM,gBAAgB,GAAG,cAAc,CAAC;AAE/C,MAAM,UAAU,cAAc;IAC5B,OAAO;QACL,EAAE,EAAE,gBAAgB;QACpB,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,uCAAuC;QACpD,IAAI,EAAE,gBAAgB,CAAC,gBAAgB,CAAC;QACxC,OAAO,EAAE,aAAa;KACvB,CAAC;AACJ,CAAC;AAED,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8CrB,CAAC"}
@@ -0,0 +1,141 @@
1
+ import type { ZodType } from 'zod';
2
+ /**
3
+ * 工具执行上下文(v2.0.26 promise ToolContext 实测形态)。
4
+ * 无 directory——工具需要 cwd 基准时经注册闭包持有 setup 捕获的 location directory。
5
+ */
6
+ export interface HostToolContext {
7
+ sessionID?: string;
8
+ agent?: unknown;
9
+ messageID?: string;
10
+ id?: string;
11
+ signal: AbortSignal;
12
+ }
13
+ /**
14
+ * 工具执行结果(v2.0.26 Tool.Result 契约子集,packages/schema/src/tool.ts):
15
+ * content=呈现给模型的文本(string,无需在 Tool.Info 声明 schema——内置 glob 工具
16
+ * content: toModelContent(...) 先例);不使用 output 字段——Result.output 搭配的是
17
+ * Tool.Info 声明的 output schema(结构化数据双轨),未声明而返回即被宿主拒绝
18
+ * ("Tool result declared output without an output schema",本机五样验证实锤);
19
+ * title/error 为 v1 SDK 残留字段,v2 Result 无此二字段——错误态编码进 content 文本。
20
+ */
21
+ export interface HostToolResult {
22
+ content?: string;
23
+ metadata?: Record<string, unknown>;
24
+ }
25
+ /** 本地工具定义(ctx.tool.transform(ed => ed.add(info)) 注册;input 必填=zod schema) */
26
+ export interface HostToolInfo {
27
+ name: string;
28
+ description: string;
29
+ input: ZodType;
30
+ execute: (input: unknown, ctx: HostToolContext) => Promise<HostToolResult>;
31
+ /** 权限锚点:仅声明,供用户自配 deny/allow 规则引用(插件不内置任何 permissions 规则) */
32
+ options?: {
33
+ permission?: string;
34
+ };
35
+ }
36
+ /** MCP 域编辑器:set=upsert,remove=删除 */
37
+ export interface HostMcpEditor {
38
+ set(id: string, info: HostMcpInfo): void;
39
+ remove(id: string): void;
40
+ }
41
+ /** skill 域编辑器:add=注册(path 为合成展示路径,content 内嵌消费) */
42
+ export interface HostSkillEditor {
43
+ add(info: HostSkillInfo): void;
44
+ remove(id: string): void;
45
+ }
46
+ /** agent 域编辑器:update=upsert-create(回调改写种子条目),remove=删除 */
47
+ export interface HostAgentEditor {
48
+ update(id: string, fn: (item: HostAgentItem) => void): void;
49
+ remove(id: string): void;
50
+ }
51
+ /** tool 域编辑器:add=追加本地工具 */
52
+ export interface HostToolEditor {
53
+ add(info: HostToolInfo): void;
54
+ remove?(name: string): void;
55
+ }
56
+ /** local stdio MCP 注册物(LocalConfig:无 enabled 字段,缺省即启用) */
57
+ export interface HostMcpInfo {
58
+ type: 'local';
59
+ command: string[];
60
+ }
61
+ /** 技能注册物:正文内嵌消费;path 必填=合成展示路径(内置技能 /builtin/*.md 先例),不落盘读取 */
62
+ export interface HostSkillInfo {
63
+ id: string;
64
+ name: string;
65
+ description: string;
66
+ path: string;
67
+ content: string;
68
+ }
69
+ /**
70
+ * 子代理 update 回调条目(Agent.Info 消费子集;字段是 system 非 systemPrompt)。
71
+ * model 刻意不设(用户裁定):不设 → 宿主字段级 merge 链
72
+ * (用户 jsonc agents 段 model > 继承主会话当前模型)生效;permissions 不注入
73
+ * (边界描述沿用资产定义文本,随 system 携带)。
74
+ */
75
+ export interface HostAgentItem {
76
+ id: string;
77
+ name: string;
78
+ mode: 'subagent' | 'primary' | 'all';
79
+ hidden: boolean;
80
+ description?: string;
81
+ system?: string;
82
+ }
83
+ /**
84
+ * 技能合成展示路径(内置技能 /builtin/*.md 先例):以 tmpdir 为基避免与真实项目文件混淆;
85
+ * references 已在拉取时物化为绝对路径,不依赖此 path 做相对解析。
86
+ */
87
+ export declare function skillDisplayPath(name: string): string;
88
+ /**
89
+ * 域公共面:list=回查注册表,reload=触发重放。
90
+ * transform 不放基接口——各域编辑器形状不同,交集声明会把回调参数收缩成 never(实测);
91
+ * 由各域接口自行声明(见 HostPluginContext 四域)。
92
+ */
93
+ export interface HostDomain<ListEntry> {
94
+ list(): Promise<readonly ListEntry[]>;
95
+ reload(): Promise<void>;
96
+ }
97
+ /** tool 域:transform 注册本地工具 + execute 钩子(plugin-api.ts:266-281:input={tool,sessionID,callID,args}) */
98
+ export interface HostToolDomain extends HostDomain<unknown> {
99
+ transform(editorFn: (editor: HostToolEditor) => void | Promise<void>): unknown;
100
+ hook(name: 'execute.after', cb: (input: HostToolExecuteAfterInput, output: HostToolExecuteAfterOutput) => Promise<void> | void): unknown;
101
+ }
102
+ /** execute.after 钩子入参——MCP 工具的 tool 字段呈现形态 = V8 实测项,未锚定字段不声明 */
103
+ export interface HostToolExecuteAfterInput {
104
+ tool: unknown;
105
+ sessionID?: string;
106
+ callID?: string;
107
+ args?: unknown;
108
+ }
109
+ export interface HostToolExecuteAfterOutput {
110
+ title?: string;
111
+ output?: unknown;
112
+ metadata?: unknown;
113
+ }
114
+ /** 宿主注入的插件 context(仅声明消费面:location.directory + 四域) */
115
+ export interface HostPluginContext {
116
+ location: {
117
+ directory: string;
118
+ };
119
+ mcp: HostDomain<unknown> & {
120
+ transform(editorFn: (editor: HostMcpEditor) => void | Promise<void>): unknown;
121
+ };
122
+ skill: HostDomain<unknown> & {
123
+ transform(editorFn: (editor: HostSkillEditor) => void | Promise<void>): unknown;
124
+ };
125
+ agent: HostDomain<unknown> & {
126
+ transform(editorFn: (editor: HostAgentEditor) => void | Promise<void>): unknown;
127
+ };
128
+ tool: HostToolDomain;
129
+ }
130
+ /** 插件对象:exports['./server'] 默认导出形状 */
131
+ export interface HostPlugin {
132
+ id: string;
133
+ setup: (ctx: HostPluginContext) => Promise<void> | void;
134
+ }
135
+ /**
136
+ * 域 list() 返回条目的名字归一化(自检用)。
137
+ * 宿主各域 list 的条目形状未逐一锚定(可能是 {name} 对象 / [id, item] 元组 / 字符串 id),
138
+ * 统一提取可辨识名字集合;无法提取的条目静默跳过(自检按“能确认在场的名字”判定)。
139
+ */
140
+ export declare function listEntryNames(entries: readonly unknown[]): Set<string>;
141
+ //# sourceMappingURL=host-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-api.d.ts","sourceRoot":"","sources":["../src/host-api.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAInC;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,WAAW,CAAC;CACrB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,4EAA4E;AAC5E,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAC3E,6DAA6D;IAC7D,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACnC;AAID,oCAAoC;AACpC,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IACzC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,mDAAmD;AACnD,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IAC/B,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,0DAA0D;AAC1D,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,GAAG,IAAI,CAAC;IAC5D,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,2BAA2B;AAC3B,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9B,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAID,0DAA0D;AAC1D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,+DAA+D;AAC/D,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,KAAK,CAAC;IACrC,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AAID;;;;GAIG;AACH,MAAM,WAAW,UAAU,CAAC,SAAS;IACnC,IAAI,IAAI,OAAO,CAAC,SAAS,SAAS,EAAE,CAAC,CAAC;IACtC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAED,qGAAqG;AACrG,MAAM,WAAW,cAAe,SAAQ,UAAU,CAAC,OAAO,CAAC;IACzD,SAAS,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;IAC/E,IAAI,CACF,IAAI,EAAE,eAAe,EACrB,EAAE,EAAE,CAAC,KAAK,EAAE,yBAAyB,EAAE,MAAM,EAAE,0BAA0B,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GACjG,OAAO,CAAC;CACZ;AAED,gEAAgE;AAChE,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAID,sDAAsD;AACtD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC,GAAG,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG;QAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAA;KAAE,CAAC;IAC7G,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG;QAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAA;KAAE,CAAC;IACjH,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG;QAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAA;KAAE,CAAC;IACjH,IAAI,EAAE,cAAc,CAAC;CACtB;AAED,sCAAsC;AACtC,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,CAAC,GAAG,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACzD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,SAAS,OAAO,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAcvE"}