@coralai/sps-cli 0.84.0 → 0.85.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.
@@ -30,6 +30,20 @@ export default class CapabilitySeam extends Service {
30
30
  * 🔴 重名**抛错**不是覆盖 —— 静默覆盖会让"我调的是哪一个 art.resize"无从判断
31
31
  * (与 `core/tools/registry` 原本的判据一致)。
32
32
  */
33
+ /**
34
+ * 注册一个能力。
35
+ *
36
+ * 🔴 **`inputSchema` 收两种形状,在这里归一 —— 不让它到执行时才炸。**
37
+ * 契约上 `sps.capabilities.inputSchema` 要 **Zod**(执行器调 `.parse`),
38
+ * 而 `sps.tools.inputSchema` 要 **JSON Schema**。
39
+ * 同一个 API 面上同名字段两种含义 ⇒ 插件作者两种都写时**必然会混**
40
+ * (实测:gameforge 的 5 个能力全传了 JSON Schema,而它写 .mjs,类型拦不住)。
41
+ * 表现是卡片执行时 `cap.inputSchema.parse is not a function` ——
42
+ * 离"我注册时写错了"隔着十万八千里。
43
+ *
44
+ * ⚠️ **能转就转,转不了就在注册时抛**:注册时抛 = 插件挂不上、当场看得见;
45
+ * 执行时抛 = 几周后某张卡莫名失败。
46
+ */
33
47
  register(cap: Capability): () => void;
34
48
  get(id: string): Capability | undefined;
35
49
  list(): Capability[];
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/seams/capabilities/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,KAAK,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE/D,6CAA6C;AAC7C,eAAO,MAAM,QAAQ,iBAAO,CAAC;AAC7B,eAAO,MAAM,WAAW,8JACa,CAAC;AAGtC,eAAO,MAAM,YAAY,qBAAqB,CAAC;AAE/C,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,OAAO;IACjD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiC;gBAE1C,GAAG,EAAE,OAAO;IAIxB;;;;;OAKG;IACH,QAAQ,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,IAAI;IAQrC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIvC,IAAI,IAAI,UAAU,EAAE;CAGrB;AAED,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,OAAO;QACf,kBAAkB,EAAE,cAAc,CAAC;KACpC;CACF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/seams/capabilities/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,KAAK,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAG/D,6CAA6C;AAC7C,eAAO,MAAM,QAAQ,iBAAO,CAAC;AAC7B,eAAO,MAAM,WAAW,8JACa,CAAC;AAGtC,eAAO,MAAM,YAAY,qBAAqB,CAAC;AAE/C,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,OAAO;IACjD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiC;gBAE1C,GAAG,EAAE,OAAO;IAIxB;;;;;OAKG;IACH;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,IAAI;IASrC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIvC,IAAI,IAAI,UAAU,EAAE;CAGrB;AAED,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,OAAO;QACf,kBAAkB,EAAE,cAAc,CAAC;KACpC;CACF"}
@@ -16,6 +16,8 @@
16
16
  * 插件化之后它的载体就是这个注册表 —— 一个模板包插件把自己的脚本能力注册进来。
17
17
  */
18
18
  import { Service } from '@deepseek-ai/cordis';
19
+ import { z } from 'zod';
20
+ import { jsonSchemaToZodShape } from '../tools/jsonSchemaToZod.js';
19
21
  /** 插件页展示用。**由插件自己声明** —— 前端写死的表对第三方永远是空的。 */
20
22
  export const category = '能力';
21
23
  export const description = '工具卡能力注册表。工具卡不占 worker 槽位,由能力直接执行。';
@@ -31,12 +33,27 @@ export default class CapabilitySeam extends Service {
31
33
  * 🔴 重名**抛错**不是覆盖 —— 静默覆盖会让"我调的是哪一个 art.resize"无从判断
32
34
  * (与 `core/tools/registry` 原本的判据一致)。
33
35
  */
36
+ /**
37
+ * 注册一个能力。
38
+ *
39
+ * 🔴 **`inputSchema` 收两种形状,在这里归一 —— 不让它到执行时才炸。**
40
+ * 契约上 `sps.capabilities.inputSchema` 要 **Zod**(执行器调 `.parse`),
41
+ * 而 `sps.tools.inputSchema` 要 **JSON Schema**。
42
+ * 同一个 API 面上同名字段两种含义 ⇒ 插件作者两种都写时**必然会混**
43
+ * (实测:gameforge 的 5 个能力全传了 JSON Schema,而它写 .mjs,类型拦不住)。
44
+ * 表现是卡片执行时 `cap.inputSchema.parse is not a function` ——
45
+ * 离"我注册时写错了"隔着十万八千里。
46
+ *
47
+ * ⚠️ **能转就转,转不了就在注册时抛**:注册时抛 = 插件挂不上、当场看得见;
48
+ * 执行时抛 = 几周后某张卡莫名失败。
49
+ */
34
50
  register(cap) {
35
51
  if (this.byId.has(cap.id))
36
52
  throw new Error(`能力 id 重复:${cap.id}`);
37
- this.byId.set(cap.id, cap);
53
+ const normalized = { ...cap, inputSchema: normalizeSchema(cap) };
54
+ this.byId.set(cap.id, normalized);
38
55
  return () => {
39
- if (this.byId.get(cap.id) === cap)
56
+ if (this.byId.get(cap.id) === normalized)
40
57
  this.byId.delete(cap.id);
41
58
  };
42
59
  }
@@ -47,4 +64,23 @@ export default class CapabilitySeam extends Service {
47
64
  return [...this.byId.values()].sort((a, b) => a.id.localeCompare(b.id));
48
65
  }
49
66
  }
67
+ /**
68
+ * 把 `inputSchema` 归一成 Zod。
69
+ * 已经是 Zod(有 `.parse`)⇒ 原样;是 JSON Schema ⇒ 转;都不是 ⇒ **抛**。
70
+ */
71
+ function normalizeSchema(cap) {
72
+ const s = cap.inputSchema;
73
+ if (typeof s?.parse === 'function')
74
+ return cap.inputSchema;
75
+ if (!s || typeof s !== 'object') {
76
+ throw new Error(`能力 ${cap.id} 的 inputSchema 不是对象 —— 要 Zod schema 或 JSON Schema`);
77
+ }
78
+ try {
79
+ return z.object(jsonSchemaToZodShape(s));
80
+ }
81
+ catch (e) {
82
+ throw new Error(`能力 ${cap.id} 的 inputSchema 既不是 Zod 也转不了 JSON Schema:` +
83
+ (e instanceof Error ? e.message : String(e)));
84
+ }
85
+ }
50
86
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/seams/capabilities/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAgB,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAG5D,6CAA6C;AAC7C,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC;AAC7B,MAAM,CAAC,MAAM,WAAW,GACtB,mCAAmC,CAAC;AAGtC,MAAM,CAAC,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAE/C,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,OAAO;IAChC,IAAI,GAAG,IAAI,GAAG,EAAsB,CAAC;IAEtD,YAAY,GAAY;QACtB,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAC3B,CAAC;IAED;;;;;OAKG;IACH,QAAQ,CAAC,GAAe;QACtB,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAC3B,OAAO,GAAG,EAAE;YACV,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG;gBAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9D,CAAC,CAAC;IACJ,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1E,CAAC;CACF"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/seams/capabilities/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAgB,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEnE,6CAA6C;AAC7C,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC;AAC7B,MAAM,CAAC,MAAM,WAAW,GACtB,mCAAmC,CAAC;AAGtC,MAAM,CAAC,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAE/C,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,OAAO;IAChC,IAAI,GAAG,IAAI,GAAG,EAAsB,CAAC;IAEtD,YAAY,GAAY;QACtB,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAC3B,CAAC;IAED;;;;;OAKG;IACH;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,GAAe;QACtB,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QACjE,MAAM,UAAU,GAAG,EAAE,GAAG,GAAG,EAAE,WAAW,EAAE,eAAe,CAAC,GAAG,CAAC,EAAgB,CAAC;QAC/E,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAClC,OAAO,GAAG,EAAE;YACV,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,UAAU;gBAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrE,CAAC,CAAC;IACJ,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1E,CAAC;CACF;AAQD;;;GAGG;AACH,SAAS,eAAe,CAAC,GAAe;IACtC,MAAM,CAAC,GAAG,GAAG,CAAC,WAA8C,CAAC;IAC7D,IAAI,OAAO,CAAC,EAAE,KAAK,KAAK,UAAU;QAAE,OAAO,GAAG,CAAC,WAAW,CAAC;IAC3D,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,mDAAmD,CAAC,CAAC;IACnF,CAAC;IACD,IAAI,CAAC;QACH,OAAO,CAAC,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,MAAM,GAAG,CAAC,EAAE,0CAA0C;YACpD,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAC/C,CAAC;IACJ,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coralai/sps-cli",
3
- "version": "0.84.0",
3
+ "version": "0.85.0",
4
4
  "description": "SPS CLI — AI-driven development pipeline orchestrator",
5
5
  "type": "module",
6
6
  "main": "dist/main.js",