@coralai/sps-cli 0.80.0 → 0.81.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/assembly/base.yml +8 -0
- package/dist/seams/cards/index.d.ts +73 -0
- package/dist/seams/cards/index.d.ts.map +1 -0
- package/dist/seams/cards/index.js +39 -0
- package/dist/seams/cards/index.js.map +1 -0
- package/dist/seams/cards-builtin/index.d.ts +8 -0
- package/dist/seams/cards-builtin/index.d.ts.map +1 -0
- package/dist/seams/cards-builtin/index.js +30 -0
- package/dist/seams/cards-builtin/index.js.map +1 -0
- package/package.json +1 -1
package/assembly/base.yml
CHANGED
|
@@ -99,6 +99,14 @@
|
|
|
99
99
|
# 🔴 真源是装配档那一行的 config,**不另起一份** —— 两个真源最难查。
|
|
100
100
|
name: '@coralai/sps-cli/seams/settings'
|
|
101
101
|
|
|
102
|
+
- id: cards
|
|
103
|
+
# 卡片(建/列):插件按自己的规则建卡,sps 不必认识那些规则。
|
|
104
|
+
# 🔴 起因是「manifest → 建几张卡」那段知识该住哪:住 sps 就要认识 gameforge 的概念,
|
|
105
|
+
# 住插件则 sps 零知识,而插件在进程内、连读口都不需要。
|
|
106
|
+
# ⚠️ 只有 create / list,不开 move/delete —— 那些是流水线在做的事,
|
|
107
|
+
# 掺进来就有两个写入方,"这张卡为什么动了"要翻两处。
|
|
108
|
+
name: '@coralai/sps-cli/seams/cards-builtin'
|
|
109
|
+
|
|
102
110
|
- id: projects
|
|
103
111
|
# 项目注册表(只读):插件能问"有哪些项目、这个项目在哪"。
|
|
104
112
|
# 🔴 v1 不开"建项目" —— 那牵着注册边界那一摊(建项目会改写被认领的树)。
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module seams/cards
|
|
3
|
+
* @description **卡片 seam** —— 插件能建卡、能看现在有哪些卡。
|
|
4
|
+
*
|
|
5
|
+
* @layer seam
|
|
6
|
+
*
|
|
7
|
+
* 类型:**甲 · 工厂型**(进程里一个实现)。
|
|
8
|
+
*
|
|
9
|
+
* 🔴 **它解决的是"知识住哪"的问题,不是"文件怎么传"。**
|
|
10
|
+
* 起因:studio 要按设计师写的 manifest 建卡(tier→1/2/4 张、资产清单→生图卡)。
|
|
11
|
+
* 四个位置摆过一遍:
|
|
12
|
+
* ```
|
|
13
|
+
* studio 后端 要读工作区文件 ⇒ sps 得开读口 + 白名单,而白名单只会变长
|
|
14
|
+
* sps-cli sps 得认识 manifest / tier / 生图卡 —— **破北极星**,否决
|
|
15
|
+
* 插件 gameforge 自己的代码装进 sps:进程内直接读文件,sps 零知识 ← 选它
|
|
16
|
+
* agent 的 prompt 最便宜,但把"S=1/M=2/L=4"这种**确定性规则**交给 LLM
|
|
17
|
+
* ```
|
|
18
|
+
* 选了插件,于是插件必须能建卡 —— `createContainer` 不在包导出里,它够不着。
|
|
19
|
+
*
|
|
20
|
+
* 🔴 **不需要新的 HTTP 读口。** 插件在进程内,有 fs;
|
|
21
|
+
* "哪些文件、什么格式、建几张卡"全在插件代码里。
|
|
22
|
+
* sps 既不认识 manifest,也不用维护一张会越长越长的文件白名单。
|
|
23
|
+
*
|
|
24
|
+
* ⚠️ **v1 只有 create / list。** 不开 move / delete / label ——
|
|
25
|
+
* 那些是流水线在做的事,插件掺进去会出现两个写入方,而"这张卡为什么动了"
|
|
26
|
+
* 要翻两处才算得出来。真有需求再按同样的方式反推着加。
|
|
27
|
+
*
|
|
28
|
+
* ⚠️ **幂等由插件负责。** 建卡这件事天然不幂等(建两次就是两张),
|
|
29
|
+
* 而"什么算重复"只有插件知道(同一个 manifest 重跑?同一个资产?)——
|
|
30
|
+
* 所以给 `list`,让它自己判,而不是我们编一个 dedup 规则。
|
|
31
|
+
*/
|
|
32
|
+
import { type Context, Service } from '@deepseek-ai/cordis';
|
|
33
|
+
export declare const CARDS = "sps.cards";
|
|
34
|
+
/** 建一张卡。形状照 `add_card`(MCP 面上跑了很久的那个),不另发明。 */
|
|
35
|
+
export interface NewCard {
|
|
36
|
+
title: string;
|
|
37
|
+
description?: string;
|
|
38
|
+
skills?: string[];
|
|
39
|
+
/** 初始 labels —— `['AI-PIPELINE']` 让它走流水线;缺省不走。 */
|
|
40
|
+
labels?: string[];
|
|
41
|
+
/** 执行波次(正整数)。缺省 = seq(串行)。 */
|
|
42
|
+
order?: number;
|
|
43
|
+
/** 只接受 `'tool' | 'join'`;缺省(不传)即 worker。 */
|
|
44
|
+
kind?: 'tool' | 'join';
|
|
45
|
+
/** `kind:'tool'`:能力 id。 */
|
|
46
|
+
tool?: string;
|
|
47
|
+
/** `kind:'tool'`:结构化参数。 */
|
|
48
|
+
input?: Record<string, unknown>;
|
|
49
|
+
/** 验收清单。 */
|
|
50
|
+
checklist?: string[];
|
|
51
|
+
}
|
|
52
|
+
/** 卡片的身份 + 状态。**不带 checklist 统计**(那要扫盘)。 */
|
|
53
|
+
export interface CardRef {
|
|
54
|
+
seq: number;
|
|
55
|
+
title: string;
|
|
56
|
+
state: string;
|
|
57
|
+
order: number;
|
|
58
|
+
labels: string[];
|
|
59
|
+
skills: string[];
|
|
60
|
+
}
|
|
61
|
+
export default abstract class CardsSeam extends Service {
|
|
62
|
+
constructor(ctx: Context);
|
|
63
|
+
/** 建一张卡,返回它的 seq。**失败抛** —— 建卡没成功而静默返回,插件会以为建好了。 */
|
|
64
|
+
abstract create(project: string, card: NewCard): Promise<CardRef>;
|
|
65
|
+
/** 这个项目现在有哪些卡。幂等判断靠它。 */
|
|
66
|
+
abstract list(project: string): Promise<CardRef[]>;
|
|
67
|
+
}
|
|
68
|
+
declare module '@deepseek-ai/cordis' {
|
|
69
|
+
interface Context {
|
|
70
|
+
'sps.cards': CardsSeam;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/seams/cards/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,OAAO,EAAE,KAAK,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE5D,eAAO,MAAM,KAAK,cAAc,CAAC;AAEjC,+CAA+C;AAC/C,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,kDAAkD;IAClD,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,2BAA2B;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,YAAY;IACZ,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,4CAA4C;AAC5C,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,SAAU,SAAQ,OAAO;gBACzC,GAAG,EAAE,OAAO;IAIxB,oDAAoD;IACpD,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAEjE,yBAAyB;IACzB,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CACnD;AAED,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,OAAO;QACf,WAAW,EAAE,SAAS,CAAC;KACxB;CACF"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module seams/cards
|
|
3
|
+
* @description **卡片 seam** —— 插件能建卡、能看现在有哪些卡。
|
|
4
|
+
*
|
|
5
|
+
* @layer seam
|
|
6
|
+
*
|
|
7
|
+
* 类型:**甲 · 工厂型**(进程里一个实现)。
|
|
8
|
+
*
|
|
9
|
+
* 🔴 **它解决的是"知识住哪"的问题,不是"文件怎么传"。**
|
|
10
|
+
* 起因:studio 要按设计师写的 manifest 建卡(tier→1/2/4 张、资产清单→生图卡)。
|
|
11
|
+
* 四个位置摆过一遍:
|
|
12
|
+
* ```
|
|
13
|
+
* studio 后端 要读工作区文件 ⇒ sps 得开读口 + 白名单,而白名单只会变长
|
|
14
|
+
* sps-cli sps 得认识 manifest / tier / 生图卡 —— **破北极星**,否决
|
|
15
|
+
* 插件 gameforge 自己的代码装进 sps:进程内直接读文件,sps 零知识 ← 选它
|
|
16
|
+
* agent 的 prompt 最便宜,但把"S=1/M=2/L=4"这种**确定性规则**交给 LLM
|
|
17
|
+
* ```
|
|
18
|
+
* 选了插件,于是插件必须能建卡 —— `createContainer` 不在包导出里,它够不着。
|
|
19
|
+
*
|
|
20
|
+
* 🔴 **不需要新的 HTTP 读口。** 插件在进程内,有 fs;
|
|
21
|
+
* "哪些文件、什么格式、建几张卡"全在插件代码里。
|
|
22
|
+
* sps 既不认识 manifest,也不用维护一张会越长越长的文件白名单。
|
|
23
|
+
*
|
|
24
|
+
* ⚠️ **v1 只有 create / list。** 不开 move / delete / label ——
|
|
25
|
+
* 那些是流水线在做的事,插件掺进去会出现两个写入方,而"这张卡为什么动了"
|
|
26
|
+
* 要翻两处才算得出来。真有需求再按同样的方式反推着加。
|
|
27
|
+
*
|
|
28
|
+
* ⚠️ **幂等由插件负责。** 建卡这件事天然不幂等(建两次就是两张),
|
|
29
|
+
* 而"什么算重复"只有插件知道(同一个 manifest 重跑?同一个资产?)——
|
|
30
|
+
* 所以给 `list`,让它自己判,而不是我们编一个 dedup 规则。
|
|
31
|
+
*/
|
|
32
|
+
import { Service } from '@deepseek-ai/cordis';
|
|
33
|
+
export const CARDS = 'sps.cards';
|
|
34
|
+
export default class CardsSeam extends Service {
|
|
35
|
+
constructor(ctx) {
|
|
36
|
+
super(ctx, CARDS);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/seams/cards/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,OAAO,EAAgB,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE5D,MAAM,CAAC,MAAM,KAAK,GAAG,WAAW,CAAC;AA+BjC,MAAM,CAAC,OAAO,OAAgB,SAAU,SAAQ,OAAO;IACrD,YAAY,GAAY;QACtB,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACpB,CAAC;CAOF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import CardsSeam, { type CardRef, type NewCard } from '../cards/index.js';
|
|
2
|
+
export declare const category = "\u5361\u7247";
|
|
3
|
+
export declare const description = "\u5361\u7247(\u5EFA/\u5217):\u63D2\u4EF6\u6309\u81EA\u5DF1\u7684\u89C4\u5219\u5EFA\u5361,sps \u4E0D\u5FC5\u8BA4\u8BC6\u90A3\u4E9B\u89C4\u5219\u3002";
|
|
4
|
+
export default class BuiltinCards extends CardsSeam {
|
|
5
|
+
create(project: string, card: NewCard): Promise<CardRef>;
|
|
6
|
+
list(project: string): Promise<CardRef[]>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/seams/cards-builtin/index.ts"],"names":[],"mappings":"AAaA,OAAO,SAAS,EAAE,EAAE,KAAK,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE1E,eAAO,MAAM,QAAQ,iBAAO,CAAC;AAC7B,eAAO,MAAM,WAAW,wJAAqC,CAAC;AAoB9D,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,SAAS;IAClC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAUxD,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CAIzD"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { createContainer } from '../../services/container.js';
|
|
2
|
+
import CardsSeam from '../cards/index.js';
|
|
3
|
+
export const category = '卡片';
|
|
4
|
+
export const description = '卡片(建/列):插件按自己的规则建卡,sps 不必认识那些规则。';
|
|
5
|
+
function toRef(c) {
|
|
6
|
+
return {
|
|
7
|
+
seq: c.seq,
|
|
8
|
+
title: c.title,
|
|
9
|
+
state: c.state,
|
|
10
|
+
order: c.order,
|
|
11
|
+
labels: c.labels,
|
|
12
|
+
skills: c.skills,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export default class BuiltinCards extends CardsSeam {
|
|
16
|
+
async create(project, card) {
|
|
17
|
+
const r = await createContainer(this.ctx).cards.create(project, card);
|
|
18
|
+
if (!r.ok) {
|
|
19
|
+
// 🔴 **抛,不静默** —— 建卡没成功而返回一个空壳,插件会以为建好了,
|
|
20
|
+
// 而"少了一张卡"没人会发现。
|
|
21
|
+
throw new Error(`建卡失败(${project}):${r.error.code ?? r.error.kind}`);
|
|
22
|
+
}
|
|
23
|
+
return toRef(r.value);
|
|
24
|
+
}
|
|
25
|
+
async list(project) {
|
|
26
|
+
const r = await createContainer(this.ctx).cards.list(project);
|
|
27
|
+
return r.ok ? r.value.map(toRef) : [];
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/seams/cards-builtin/index.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,SAAyC,MAAM,mBAAmB,CAAC;AAE1E,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC;AAC7B,MAAM,CAAC,MAAM,WAAW,GAAG,kCAAkC,CAAC;AAE9D,SAAS,KAAK,CAAC,CAOd;IACC,OAAO;QACL,GAAG,EAAE,CAAC,CAAC,GAAG;QACV,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,MAAM,EAAE,CAAC,CAAC,MAAM;KACjB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,SAAS;IACxC,KAAK,CAAC,MAAM,CAAC,OAAe,EAAE,IAAa;QAClD,MAAM,CAAC,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACtE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACV,yCAAyC;YACzC,oBAAoB;YACpB,MAAM,IAAI,KAAK,CAAC,QAAQ,OAAO,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IAEQ,KAAK,CAAC,IAAI,CAAC,OAAe;QACjC,MAAM,CAAC,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9D,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACxC,CAAC;CACF"}
|