dsh-chef 0.1.0 → 0.2.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.
- package/dist/bridge.d.ts +45 -0
- package/dist/bridge.d.ts.map +1 -1
- package/dist/bridge.js +70 -6
- package/dist/bridge.js.map +1 -1
- package/dist/client.d.ts +10 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +469 -19
- package/dist/client.js.map +1 -1
- package/dist/contract.d.ts +56 -0
- package/dist/contract.d.ts.map +1 -0
- package/dist/contract.js +41 -0
- package/dist/contract.js.map +1 -0
- package/dist/dsh-ctx.d.ts +120 -0
- package/dist/dsh-ctx.d.ts.map +1 -0
- package/dist/dsh-ctx.js +18 -0
- package/dist/dsh-ctx.js.map +1 -0
- package/dist/index.d.ts +9 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +112 -6
- package/dist/index.js.map +1 -1
- package/dist/settings.d.ts +41 -8
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +90 -7
- package/dist/settings.js.map +1 -1
- package/dist/skill-provider.d.ts +22 -0
- package/dist/skill-provider.d.ts.map +1 -0
- package/dist/skill-provider.js +120 -0
- package/dist/skill-provider.js.map +1 -0
- package/package.json +16 -4
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/** dsh-chef 打包技能提供方(#218 大厨线,照 #56 卡路里样板/#150 记账同形)。
|
|
2
|
+
*
|
|
3
|
+
* 形态对照 `dsh-skill-badge`(出处见 `docs/agents/dsh-client-contract.md` §12):
|
|
4
|
+
* cordis 侧 `inject` 加 `skills`(见 index.ts),本文件只提供 provider 对象,
|
|
5
|
+
* 由 `apply` 经 `ctx.skills.registerProvider(() => provider)` 注册。
|
|
6
|
+
*
|
|
7
|
+
* 单份 SKILL.md 按包名解析(`createRequire.resolve('skill-chef/package.json')`
|
|
8
|
+
* 再拼 `SKILL.md`,**不复制**,避免双份腐化;不走 `exports` 子路径,免补 `./SKILL.md` 导出);
|
|
9
|
+
* `name` 用 `skill-chef`(与 SKILL.md frontmatter 同值,描述取文件实测值,不在插件内硬编码第二份);
|
|
10
|
+
* `rank` 内联 600(宿主 `BUNDLED_SKILL_RANK` 同值,不从宿主 import,保持零依赖);
|
|
11
|
+
* `source` 为 `bundled`;`content` 取 frontmatter 后正文(filesystem `parseSkillFile` 同形)。
|
|
12
|
+
*
|
|
13
|
+
* 本文件只读消费技能包的 SKILL.md(文本),从不 import 任何技能实现。
|
|
14
|
+
*/
|
|
15
|
+
import { readFile } from 'node:fs/promises';
|
|
16
|
+
import { createRequire } from 'node:module';
|
|
17
|
+
import { dirname, join } from 'node:path';
|
|
18
|
+
import { SKILL_PACKAGE } from './bridge.js';
|
|
19
|
+
/** 注册表内的提供方名(bundling 插件;candidate.provider 须与此一致,否则校验抛)。 */
|
|
20
|
+
export const PROVIDER_NAME = 'dsh-chef';
|
|
21
|
+
/** 技能名(与 `packages/skill-chef/SKILL.md` frontmatter `name` 同值,由 test 逐字锁)。 */
|
|
22
|
+
export const SKILL_NAME = 'skill-chef';
|
|
23
|
+
/** 打包技能标准优先级(与宿主 `BUNDLED_SKILL_RANK` 同值,内联,零依赖)。 */
|
|
24
|
+
export const BUNDLED_SKILL_RANK = 600;
|
|
25
|
+
export const SKILL_FILE = 'SKILL.md';
|
|
26
|
+
/** 按包名定位技能包根目录(安装态 `node_modules/skill-chef`,单仓 dev 态 workspace 链接)。 */
|
|
27
|
+
export function skillDir() {
|
|
28
|
+
const pkgJson = createRequire(import.meta.url).resolve(SKILL_PACKAGE + '/package.json');
|
|
29
|
+
return dirname(pkgJson);
|
|
30
|
+
}
|
|
31
|
+
/** 最小 frontmatter 解析(宿主零依赖,不引 yaml;缺头/缺字段返回 null,由调用方按缺席记)。
|
|
32
|
+
* name 正则放行连字符(`skill-chef`)。 */
|
|
33
|
+
export function parseSkillText(text) {
|
|
34
|
+
const normalized = text.replace(/\r\n/g, '\n');
|
|
35
|
+
if (!normalized.startsWith('---\n'))
|
|
36
|
+
return null;
|
|
37
|
+
const lines = normalized.split('\n');
|
|
38
|
+
const end = lines.indexOf('---', 1);
|
|
39
|
+
if (end < 2)
|
|
40
|
+
return null;
|
|
41
|
+
const data = {};
|
|
42
|
+
for (const ln of lines.slice(1, end)) {
|
|
43
|
+
const m = /^([A-Za-z0-9_-]+):\s*(.*)$/.exec(ln);
|
|
44
|
+
if (!m)
|
|
45
|
+
return null;
|
|
46
|
+
let v = (m[2] ?? '').trim();
|
|
47
|
+
if (v.length >= 2 && ((v.startsWith('"') && v.endsWith('"')) || (v.startsWith("'") && v.endsWith("'")))) {
|
|
48
|
+
v = v.slice(1, -1);
|
|
49
|
+
}
|
|
50
|
+
data[m[1]] = v;
|
|
51
|
+
}
|
|
52
|
+
const name = data['name'];
|
|
53
|
+
const description = data['description'];
|
|
54
|
+
if (!name || !description)
|
|
55
|
+
return null;
|
|
56
|
+
if (!/^[\p{L}0-9]+(?:-[\p{L}0-9]+)*$/u.test(name))
|
|
57
|
+
return null;
|
|
58
|
+
return { name, description, body: lines.slice(end + 1).join('\n').trim() };
|
|
59
|
+
}
|
|
60
|
+
async function loadSkill() {
|
|
61
|
+
let dir;
|
|
62
|
+
try {
|
|
63
|
+
dir = skillDir();
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
let raw;
|
|
69
|
+
try {
|
|
70
|
+
raw = await readFile(join(dir, SKILL_FILE), 'utf8');
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
const parsed = parseSkillText(raw);
|
|
76
|
+
if (!parsed)
|
|
77
|
+
return null;
|
|
78
|
+
return { dir, parsed };
|
|
79
|
+
}
|
|
80
|
+
async function listSkills() {
|
|
81
|
+
const loaded = await loadSkill();
|
|
82
|
+
if (!loaded)
|
|
83
|
+
return [];
|
|
84
|
+
return [
|
|
85
|
+
{
|
|
86
|
+
name: loaded.parsed.name,
|
|
87
|
+
description: loaded.parsed.description,
|
|
88
|
+
invocation: { modelInvocable: true, userInvocable: true },
|
|
89
|
+
provider: PROVIDER_NAME,
|
|
90
|
+
source: 'bundled',
|
|
91
|
+
resourceBase: { kind: 'directory', path: loaded.dir },
|
|
92
|
+
rank: BUNDLED_SKILL_RANK,
|
|
93
|
+
locator: { path: join(loaded.dir, SKILL_FILE) },
|
|
94
|
+
},
|
|
95
|
+
];
|
|
96
|
+
}
|
|
97
|
+
async function getSkill(candidate) {
|
|
98
|
+
const loaded = await loadSkill();
|
|
99
|
+
if (!loaded)
|
|
100
|
+
return undefined;
|
|
101
|
+
// 候选过期(注册后 SKILL.md 改名)按宿主契约失效,不抛。
|
|
102
|
+
if (!candidate || candidate.name !== loaded.parsed.name)
|
|
103
|
+
return undefined;
|
|
104
|
+
return {
|
|
105
|
+
name: loaded.parsed.name,
|
|
106
|
+
description: loaded.parsed.description,
|
|
107
|
+
invocation: { modelInvocable: true, userInvocable: true },
|
|
108
|
+
provider: PROVIDER_NAME,
|
|
109
|
+
source: 'bundled',
|
|
110
|
+
resourceBase: { kind: 'directory', path: loaded.dir },
|
|
111
|
+
content: loaded.parsed.body,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/** badge 同形 provider(`list` 给摘要,`get` 给全文;`get` 只认名,忽略 locator 外的候选字段)。 */
|
|
115
|
+
export const provider = {
|
|
116
|
+
name: PROVIDER_NAME,
|
|
117
|
+
list: () => listSkills(),
|
|
118
|
+
get: (candidate) => getSkill(candidate),
|
|
119
|
+
};
|
|
120
|
+
//# sourceMappingURL=skill-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-provider.js","sourceRoot":"","sources":["../src/skill-provider.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-chef",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "爱生活单品插件 P10 脚手架:大厨(ilife:chef order 90),硬依赖总管 dsh-life-pack",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -25,7 +25,8 @@
|
|
|
25
25
|
"node": ">=22.13"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"dsh-life-pack": "
|
|
28
|
+
"dsh-life-pack": "^0.2.6",
|
|
29
|
+
"skill-chef": "0.2.1"
|
|
29
30
|
},
|
|
30
31
|
"dsh": {
|
|
31
32
|
"bundle": {
|
|
@@ -33,11 +34,22 @@
|
|
|
33
34
|
},
|
|
34
35
|
"client": {
|
|
35
36
|
"platform": "web",
|
|
36
|
-
"inject": [
|
|
37
|
+
"inject": [
|
|
38
|
+
"@deepseek-ai/dsh-client-ui-slots",
|
|
39
|
+
"@deepseek-ai/dsh-client-connection"
|
|
40
|
+
]
|
|
37
41
|
}
|
|
38
42
|
},
|
|
39
43
|
"scripts": {
|
|
40
|
-
"build": "
|
|
44
|
+
"build": "npm run build:host && npm run build:client",
|
|
45
|
+
"build:host": "tsc -b",
|
|
46
|
+
"build:client": "tsdown",
|
|
47
|
+
"typecheck": "tsc -p tsconfig.client.json",
|
|
41
48
|
"test": "node --test test/smoke.test.mjs"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@types/react": "19.2.18",
|
|
52
|
+
"react": "19.2.8",
|
|
53
|
+
"tsdown": "0.22.14"
|
|
42
54
|
}
|
|
43
55
|
}
|