@yottameta/yotta-skills 0.1.2 → 0.2.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/CHANGELOG.md +22 -0
- package/README.md +8 -1
- package/README.zh-CN.md +8 -1
- package/SKILL.md +192 -119
- package/bin/yotta-skills.js +41 -2
- package/lib/skills-scan.js +318 -0
- package/package.json +3 -1
- package/references/install-flow.md +68 -68
- package/references/orchestration.md +72 -0
- package/references/skill-list.md +40 -40
- package/references/tutorial.md +106 -106
- package/scripts/yotta-skills-mcp.py +245 -0
- package/skills.json +9 -9
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
/**
|
|
3
|
+
* yotta-skills 技能扫描核心(零依赖 Node.js 18+)
|
|
4
|
+
*
|
|
5
|
+
* 技能生态盘点:扫描各智能体技能目录,解析 SKILL.md frontmatter,
|
|
6
|
+
* 建立本地技能注册表(~/.yottaskills/registry.json)。
|
|
7
|
+
*
|
|
8
|
+
* 自包含原则:本模块只依赖 Node.js 标准库,不依赖任何元技能
|
|
9
|
+
* (不调用元信扫描、不调用元呈渲染、不调用元忆存储);输出为
|
|
10
|
+
* 结构化 JSON / 简单文本,由调用方(CLI / MCP)自行呈现。
|
|
11
|
+
*
|
|
12
|
+
* 用法(由 bin/yotta-skills.js 与 scripts/yotta-skills-mcp.py 复用):
|
|
13
|
+
* const scan = require('../lib/skills-scan');
|
|
14
|
+
* const result = scan.scanRoots(scan.defaultRoots({ extraDirs, project }));
|
|
15
|
+
* scan.saveRegistry(result); // 增量合并写 ~/.yottaskills/registry.json
|
|
16
|
+
*/
|
|
17
|
+
const fs = require('fs');
|
|
18
|
+
const os = require('os');
|
|
19
|
+
const path = require('path');
|
|
20
|
+
|
|
21
|
+
const REGISTRY_DIR_NAME = '.yottaskills';
|
|
22
|
+
const REGISTRY_FILE_NAME = 'registry.json';
|
|
23
|
+
const SKILL_FILE = 'SKILL.md';
|
|
24
|
+
|
|
25
|
+
// 智能体 -> 用户级默认技能目录(与 bin/yotta-skills.js AGENT_DIRS 同源;
|
|
26
|
+
// 依据 agent-skill-dir-map 权威映射,2026-08-23 核实)
|
|
27
|
+
const AGENT_DIRS = {
|
|
28
|
+
claude: { label: 'Claude Code', dirs: ['.claude/skills'] },
|
|
29
|
+
cursor: { label: 'Cursor', dirs: ['.cursor/skills', '.agents/skills'] },
|
|
30
|
+
codex: { label: 'Codex', dirs: [] }, // 特判:$CODEX_HOME/skills
|
|
31
|
+
gemini: { label: 'Gemini CLI', dirs: ['.gemini/skills', '.agents/skills'] },
|
|
32
|
+
goose: { label: 'Goose', dirs: ['.config/goose/skills', '.agents/skills'] },
|
|
33
|
+
amp: { label: 'Amp', dirs: ['.config/agents/skills', '.agents/skills'] },
|
|
34
|
+
opencode: { label: 'OpenCode', dirs: [] }, // 特判:$XDG_CONFIG_HOME
|
|
35
|
+
windsurf: { label: 'Windsurf', dirs: ['.codeium/windsurf/skills'] },
|
|
36
|
+
workbuddy: { label: 'WorkBuddy', dirs: ['.workbuddy/skills'] },
|
|
37
|
+
kiro: { label: 'Kiro', dirs: ['.kiro/skills'] },
|
|
38
|
+
trae: { label: 'Trae Code CLI', dirs: ['.traecli/skills'] },
|
|
39
|
+
'trae-cn': { label: 'Trae IDE(国内)', dirs: ['.trae-cn/skills'] },
|
|
40
|
+
qwen: { label: 'Qwen Code', dirs: ['.qwen/skills'] },
|
|
41
|
+
comate: { label: 'Comate 文心快码', dirs: ['.comate/skills'] },
|
|
42
|
+
codebuddy: { label: 'CodeBuddy Code', dirs: ['.codebuddy/skills'] },
|
|
43
|
+
kimi: { label: 'Kimi Code CLI', dirs: ['.kimi/skills'] },
|
|
44
|
+
agents: { label: '通用 AGENTS.md', dirs: ['.agents/skills'] },
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
/** 解析 SKILL.md 前部 YAML frontmatter(name/version/description 单行值)。 */
|
|
48
|
+
function parseFrontmatter(text) {
|
|
49
|
+
const m = text.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
50
|
+
if (!m) return null;
|
|
51
|
+
const fm = {};
|
|
52
|
+
const lines = m[1].split(/\r?\n/);
|
|
53
|
+
let blockKey = null;
|
|
54
|
+
let blockChunks = [];
|
|
55
|
+
for (const raw of lines) {
|
|
56
|
+
if (blockKey) {
|
|
57
|
+
if (!raw.trim()) continue; // 空行:跳过并继续 block
|
|
58
|
+
if (/^\s/.test(raw)) { blockChunks.push(raw.trim()); continue; }
|
|
59
|
+
fm[blockKey] = blockChunks.join(' ');
|
|
60
|
+
blockKey = null;
|
|
61
|
+
blockChunks = [];
|
|
62
|
+
}
|
|
63
|
+
const t = raw.trim();
|
|
64
|
+
if (!t || t.startsWith('#') || t.startsWith('-')) continue;
|
|
65
|
+
const idx = t.indexOf(':');
|
|
66
|
+
if (idx <= 0) continue;
|
|
67
|
+
const key = t.slice(0, idx).trim();
|
|
68
|
+
let val = t.slice(idx + 1).trim();
|
|
69
|
+
if (!val) continue;
|
|
70
|
+
if (/^[>|][-+]?$/.test(val)) {
|
|
71
|
+
blockKey = key; // YAML block scalar(多行 description)
|
|
72
|
+
blockChunks = [];
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if ((val.startsWith('"') && val.endsWith('"')) || (val.startsWith("'") && val.endsWith("'"))) {
|
|
76
|
+
val = val.slice(1, -1);
|
|
77
|
+
}
|
|
78
|
+
fm[key] = val;
|
|
79
|
+
}
|
|
80
|
+
if (blockKey) fm[blockKey] = blockChunks.join(' ');
|
|
81
|
+
return fm;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** 扫描单个技能目录:子目录含 SKILL.md 且 frontmatter 有 name 即视为技能。 */
|
|
85
|
+
function scanSkillDir(dir) {
|
|
86
|
+
const results = [];
|
|
87
|
+
let entries;
|
|
88
|
+
try {
|
|
89
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
90
|
+
} catch (_) {
|
|
91
|
+
return results;
|
|
92
|
+
}
|
|
93
|
+
for (const e of entries) {
|
|
94
|
+
if (!e.isDirectory()) continue;
|
|
95
|
+
const skillDir = path.join(dir, e.name);
|
|
96
|
+
let text;
|
|
97
|
+
try {
|
|
98
|
+
text = fs.readFileSync(path.join(skillDir, SKILL_FILE), 'utf8');
|
|
99
|
+
} catch (_) {
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
const fm = parseFrontmatter(text);
|
|
103
|
+
if (!fm || !fm.name) continue;
|
|
104
|
+
results.push({
|
|
105
|
+
slug: String(fm.name).trim(),
|
|
106
|
+
version: fm.version ? String(fm.version).trim() : '',
|
|
107
|
+
description: fm.description ? String(fm.description).trim() : '',
|
|
108
|
+
source_dir: skillDir,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
return results;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** Codex 用户级技能目录:$CODEX_HOME/skills(默认 ~/.codex/skills)。 */
|
|
115
|
+
function codexUserDir() {
|
|
116
|
+
const base = process.env.CODEX_HOME || path.join(os.homedir(), '.codex');
|
|
117
|
+
return path.join(base, 'skills');
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/** OpenCode 用户级技能目录:$XDG_CONFIG_HOME/opencode/skills。 */
|
|
121
|
+
function opencodeUserDir() {
|
|
122
|
+
const base = process.env.XDG_CONFIG_HOME || path.join(os.homedir(), '.config');
|
|
123
|
+
return path.join(base, 'opencode', 'skills');
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function resolveUserDir(rel) {
|
|
127
|
+
if (rel === '.codex/skills') return codexUserDir();
|
|
128
|
+
if (rel === '.config/opencode/skills') return opencodeUserDir();
|
|
129
|
+
return path.join(os.homedir(), rel);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* 默认扫描根(agent-skill-dir-map 用户级目录)。
|
|
134
|
+
* opts: { extraDirs: string[], project: boolean }
|
|
135
|
+
* extraDirs 为任意额外技能目录;project 开启时附加当前项目
|
|
136
|
+
* .agents/skills / .codex/skills。
|
|
137
|
+
*/
|
|
138
|
+
function defaultRoots(opts) {
|
|
139
|
+
opts = opts || {};
|
|
140
|
+
const roots = [];
|
|
141
|
+
const seen = new Set();
|
|
142
|
+
const add = (dir, label) => {
|
|
143
|
+
if (!dir) return;
|
|
144
|
+
const norm = path.resolve(dir);
|
|
145
|
+
if (seen.has(norm)) return;
|
|
146
|
+
seen.add(norm);
|
|
147
|
+
roots.push({ dir: norm, label });
|
|
148
|
+
};
|
|
149
|
+
const home = os.homedir();
|
|
150
|
+
for (const key of Object.keys(AGENT_DIRS)) {
|
|
151
|
+
const info = AGENT_DIRS[key];
|
|
152
|
+
for (const rel of info.dirs) add(resolveUserDir(rel), info.label);
|
|
153
|
+
}
|
|
154
|
+
add(codexUserDir(), 'Codex');
|
|
155
|
+
add(opencodeUserDir(), 'OpenCode');
|
|
156
|
+
if (Array.isArray(opts.extraDirs)) {
|
|
157
|
+
for (const d of opts.extraDirs) add(d, '指定目录');
|
|
158
|
+
}
|
|
159
|
+
if (opts.project) {
|
|
160
|
+
add(path.join(process.cwd(), '.agents', 'skills'), '项目 .agents/skills');
|
|
161
|
+
add(path.join(process.cwd(), '.codex', 'skills'), '项目 .codex/skills');
|
|
162
|
+
}
|
|
163
|
+
return roots;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* 扫描多根目录并去重合并。
|
|
168
|
+
* 同名技能(slug)合并:记录多个来源;版本不一致时记录 conflicts。
|
|
169
|
+
*/
|
|
170
|
+
function scanRoots(roots) {
|
|
171
|
+
const map = new Map();
|
|
172
|
+
const scanned = [];
|
|
173
|
+
const errors = [];
|
|
174
|
+
for (const r of roots) {
|
|
175
|
+
if (!fs.existsSync(r.dir)) {
|
|
176
|
+
errors.push({ dir: r.dir, label: r.label, reason: 'missing' });
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
scanned.push({ dir: r.dir, label: r.label });
|
|
180
|
+
for (const s of scanSkillDir(r.dir)) {
|
|
181
|
+
const key = s.slug;
|
|
182
|
+
const item = map.get(key);
|
|
183
|
+
if (item) {
|
|
184
|
+
if (!item.sources.includes(r.label)) item.sources.push(r.label);
|
|
185
|
+
if (!item.source_dirs.includes(s.source_dir)) item.source_dirs.push(s.source_dir);
|
|
186
|
+
if (item.version && s.version && item.version !== s.version) {
|
|
187
|
+
item.conflicts = item.conflicts || [];
|
|
188
|
+
item.conflicts.push({ dir: s.source_dir, version: s.version });
|
|
189
|
+
}
|
|
190
|
+
} else {
|
|
191
|
+
s.sources = [r.label];
|
|
192
|
+
s.source_dirs = [s.source_dir];
|
|
193
|
+
map.set(key, s);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return {
|
|
198
|
+
generated_at: new Date().toISOString(),
|
|
199
|
+
skills: Array.from(map.values()).sort((a, b) => a.slug.localeCompare(b.slug)),
|
|
200
|
+
scanned,
|
|
201
|
+
errors,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/** 注册表文件路径:~/.yottaskills/registry.json。 */
|
|
206
|
+
function registryPath() {
|
|
207
|
+
return path.join(os.homedir(), REGISTRY_DIR_NAME, REGISTRY_FILE_NAME);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/** 读取注册表(不存在返回 null)。 */
|
|
211
|
+
function readRegistry(filePath) {
|
|
212
|
+
const p = filePath || registryPath();
|
|
213
|
+
try {
|
|
214
|
+
return JSON.parse(fs.readFileSync(p, 'utf8'));
|
|
215
|
+
} catch (_) {
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* 增量合并:把扫描结果合并进注册表。
|
|
222
|
+
* 新增(added) / 更新(updated,版本或来源变化) / 消失(gone,上次有本次无)。
|
|
223
|
+
* 幂等:技能仍存在且版本来源一致则保持原记录不动。
|
|
224
|
+
*/
|
|
225
|
+
function mergeRegistry(scanResult, previous) {
|
|
226
|
+
const prev = (previous && previous.skills) ? previous.skills : {};
|
|
227
|
+
const next = {};
|
|
228
|
+
const changes = { added: [], updated: [], gone: [] };
|
|
229
|
+
const now = new Date().toISOString();
|
|
230
|
+
const seen = new Set();
|
|
231
|
+
for (const s of scanResult.skills) {
|
|
232
|
+
seen.add(s.slug);
|
|
233
|
+
const old = prev[s.slug];
|
|
234
|
+
if (!old) {
|
|
235
|
+
next[s.slug] = {
|
|
236
|
+
slug: s.slug,
|
|
237
|
+
version: s.version,
|
|
238
|
+
description: s.description,
|
|
239
|
+
sources: s.sources,
|
|
240
|
+
source_dirs: s.source_dirs,
|
|
241
|
+
first_seen: now,
|
|
242
|
+
last_seen: now,
|
|
243
|
+
status: 'known',
|
|
244
|
+
};
|
|
245
|
+
changes.added.push(s.slug);
|
|
246
|
+
} else {
|
|
247
|
+
const changed = old.version !== s.version
|
|
248
|
+
|| old.description !== s.description
|
|
249
|
+
|| JSON.stringify(old.sources || []) !== JSON.stringify(s.sources);
|
|
250
|
+
next[s.slug] = {
|
|
251
|
+
...old,
|
|
252
|
+
version: s.version,
|
|
253
|
+
description: s.description,
|
|
254
|
+
sources: s.sources,
|
|
255
|
+
source_dirs: s.source_dirs,
|
|
256
|
+
last_seen: now,
|
|
257
|
+
};
|
|
258
|
+
if (changed) changes.updated.push(s.slug);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
for (const key of Object.keys(prev)) {
|
|
262
|
+
if (!seen.has(key)) {
|
|
263
|
+
const was = prev[key];
|
|
264
|
+
next[key] = { ...was, last_seen: now, status: 'gone' };
|
|
265
|
+
if (was.status !== 'gone') changes.gone.push(key);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
const registry = {
|
|
269
|
+
updated: now,
|
|
270
|
+
note: '本地技能注册表(yotta-skills --inventory 生成)。数据不出本机。',
|
|
271
|
+
skills: next,
|
|
272
|
+
};
|
|
273
|
+
return { registry, changes };
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/** 原子写注册表(tmp + rename,防写一半损坏)。 */
|
|
277
|
+
function saveRegistry(registry, filePath) {
|
|
278
|
+
const p = filePath || registryPath();
|
|
279
|
+
const dir = path.dirname(p);
|
|
280
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
281
|
+
const tmp = p + '.tmp';
|
|
282
|
+
fs.writeFileSync(tmp, JSON.stringify(registry, null, 2) + '\n', 'utf8');
|
|
283
|
+
fs.renameSync(tmp, p);
|
|
284
|
+
return p;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/** 把注册表渲染为自包含文本表格(不依赖元呈)。 */
|
|
288
|
+
function formatInventory(registry, filePath) {
|
|
289
|
+
const skills = Object.values(registry.skills || {})
|
|
290
|
+
.filter((s) => s.status !== 'gone')
|
|
291
|
+
.sort((a, b) => a.slug.localeCompare(b.slug));
|
|
292
|
+
const lines = [];
|
|
293
|
+
lines.push('已装技能盘点(yotta-skills --inventory)');
|
|
294
|
+
lines.push('技能名/版本/功能/来源');
|
|
295
|
+
for (const s of skills) {
|
|
296
|
+
const ver = s.version ? 'v' + s.version : '-';
|
|
297
|
+
const src = (s.sources || []).join(',');
|
|
298
|
+
lines.push(`${s.slug} ${ver} ${s.description || ''} [${src}]`);
|
|
299
|
+
}
|
|
300
|
+
const rp = filePath || registryPath();
|
|
301
|
+
lines.push(`共 ${skills.length} 个技能;注册表:${rp}`);
|
|
302
|
+
return lines.join('\n');
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
module.exports = {
|
|
306
|
+
AGENT_DIRS,
|
|
307
|
+
parseFrontmatter,
|
|
308
|
+
scanSkillDir,
|
|
309
|
+
defaultRoots,
|
|
310
|
+
scanRoots,
|
|
311
|
+
registryPath,
|
|
312
|
+
readRegistry,
|
|
313
|
+
mergeRegistry,
|
|
314
|
+
saveRegistry,
|
|
315
|
+
formatInventory,
|
|
316
|
+
REGISTRY_DIR_NAME,
|
|
317
|
+
REGISTRY_FILE_NAME,
|
|
318
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yottameta/yotta-skills",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "YuanGe (元阁) — one-command installer for the whole YottaMeta skill family: list, install, and update all published yotta-* skills into any agent (npx one-shot, zero dependencies, Node.js only).",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"keywords": [
|
|
@@ -22,6 +22,8 @@
|
|
|
22
22
|
"references",
|
|
23
23
|
"assets",
|
|
24
24
|
"bin",
|
|
25
|
+
"lib",
|
|
26
|
+
"scripts",
|
|
25
27
|
"skills.json",
|
|
26
28
|
"!**/__pycache__",
|
|
27
29
|
"!**/*.pyc"
|
|
@@ -1,68 +1,68 @@
|
|
|
1
|
-
# 安装器工作原理(install-flow)
|
|
2
|
-
|
|
3
|
-
> 面向想了解 yotta-skills 内部机制的开发者;日常使用请读 `SKILL.md` 或中文教程
|
|
4
|
-
> (`references/tutorial.md`)。
|
|
5
|
-
|
|
6
|
-
## 总体流程
|
|
7
|
-
|
|
8
|
-
对每个待装技能:
|
|
9
|
-
|
|
10
|
-
1. 读清单(`skills.json`,默认随包;`YOTTA_SKILLS_MANIFEST` 可覆盖);
|
|
11
|
-
2. `npm pack <pkg>@<spec> --pack-destination <临时目录>`;
|
|
12
|
-
3. 系统 `tar -xzf` 解压到临时目录(产物应有 `SKILL.md`);
|
|
13
|
-
4. 元信装前摘要(若引擎可用;`--skip-scan` 关闭);
|
|
14
|
-
5. 删除目标 `<dest>/<slug>` 后重新复制(跳过规则见下);
|
|
15
|
-
6. 汇总报告:✔ 成功 / - 跳过(已是最新)/ ✘ 失败;有失败项时退出码 1。
|
|
16
|
-
|
|
17
|
-
## 复制跳过规则
|
|
18
|
-
|
|
19
|
-
- 顶层跳过:`package.json` / `bin` / `node_modules` / `.git` / `__pycache__`;
|
|
20
|
-
- 任意层级跳过:`.pytest_cache` / `.mypy_cache` 目录、`*.pyc` / `*.pyo` 文件。
|
|
21
|
-
|
|
22
|
-
因此装进技能目录的是「技能本体」(SKILL.md / references / scripts 等),不含 npm
|
|
23
|
-
安装器自身、测试夹具与 Python 字节码缓存。
|
|
24
|
-
|
|
25
|
-
## 幂等与版本判断
|
|
26
|
-
|
|
27
|
-
- 读取目标 `<dest>/<slug>/SKILL.md` 的 frontmatter `version`;
|
|
28
|
-
- 与清单 `version` 一致 → 跳过(幂等:第二次安装 22 个全部跳过);
|
|
29
|
-
- `--force` 强制重装;`update` 对「缺失 / 版本不一致」的技能重装。
|
|
30
|
-
|
|
31
|
-
## 版本策略
|
|
32
|
-
|
|
33
|
-
- 默认 range:spec = `<pkg>@<major>.x`(如 `0.x`),`npm pack` 取同 major 最新 patch;
|
|
34
|
-
- `--pin`:spec = `<pkg>@<清单精确版本>`。
|
|
35
|
-
|
|
36
|
-
## npm 解析(Windows)
|
|
37
|
-
|
|
38
|
-
- 优先:`where.exe npm.cmd` → 读同目录 `node_modules/npm/bin/npm-cli.js` → 用 node 直接执行
|
|
39
|
-
(npm.cmd 直跑在 Windows 有 EINVAL,`cmd /c` 引号脆弱;npm-cli.js 直跑无 shell 变量坑);
|
|
40
|
-
- `--npm` / `YOTTA_SKILLS_NPM`:`.js` → node 执行;`.cmd/.bat` → 同样解析 npm-cli.js;
|
|
41
|
-
其它 → 直接执行;
|
|
42
|
-
- `YOTTA_SKILLS_NPM_FLAGS` 追加到 `npm pack` 参数。
|
|
43
|
-
|
|
44
|
-
## 元信装前摘要
|
|
45
|
-
|
|
46
|
-
- 引擎查找:`--verify` → `YOTTA_SKILLS_VERIFY` → `<dest>/yotta-verify/scripts/yotta_verify.py`;
|
|
47
|
-
- python 查找:`--python` → `YOTTA_SKILLS_PYTHON` → `python3` / `python` / `py`(win32);
|
|
48
|
-
- 执行:`python -B <engine> scan <解压目录> --json`(`-B` 禁止写 `__pycache__`,防止污染
|
|
49
|
-
引擎所在目录);
|
|
50
|
-
- 输出 verdict + counts(critical / high / medium / low / info);DO NOT INSTALL 额外提示
|
|
51
|
-
人工复核;仅摘要、不拦截。
|
|
52
|
-
|
|
53
|
-
## 退出码
|
|
54
|
-
|
|
55
|
-
| 退出码 | 含义 |
|
|
56
|
-
|---|---|
|
|
57
|
-
| 0 | 成功(含全部跳过) |
|
|
58
|
-
| 1 | 安装 / 更新存在失败项 |
|
|
59
|
-
| 2 | 用法错误(未知参数 / 未知技能 / 未收录智能体) |
|
|
60
|
-
| 4 | 未指定目标且当前目录未检测到项目级技能目录 |
|
|
61
|
-
|
|
62
|
-
## 目标目录解析
|
|
63
|
-
|
|
64
|
-
- `--dir`:直接使用(技能落在 `<dir>/<slug>`);
|
|
65
|
-
- `--agent`:查内置 17 智能体表(codex 特判 `$CODEX_HOME/skills`;opencode 特判
|
|
66
|
-
`$XDG_CONFIG_HOME/opencode/skills`;其余 `~/.<agent>/skills` 或 `~/.config/...`);
|
|
67
|
-
- 都未指定:检测当前目录是否存在项目级技能目录(`.claude/skills`、`.codex/skills`、
|
|
68
|
-
`.agents/skills` 等 17 个),存在则用之;否则退出码 4。
|
|
1
|
+
# 安装器工作原理(install-flow)
|
|
2
|
+
|
|
3
|
+
> 面向想了解 yotta-skills 内部机制的开发者;日常使用请读 `SKILL.md` 或中文教程
|
|
4
|
+
> (`references/tutorial.md`)。
|
|
5
|
+
|
|
6
|
+
## 总体流程
|
|
7
|
+
|
|
8
|
+
对每个待装技能:
|
|
9
|
+
|
|
10
|
+
1. 读清单(`skills.json`,默认随包;`YOTTA_SKILLS_MANIFEST` 可覆盖);
|
|
11
|
+
2. `npm pack <pkg>@<spec> --pack-destination <临时目录>`;
|
|
12
|
+
3. 系统 `tar -xzf` 解压到临时目录(产物应有 `SKILL.md`);
|
|
13
|
+
4. 元信装前摘要(若引擎可用;`--skip-scan` 关闭);
|
|
14
|
+
5. 删除目标 `<dest>/<slug>` 后重新复制(跳过规则见下);
|
|
15
|
+
6. 汇总报告:✔ 成功 / - 跳过(已是最新)/ ✘ 失败;有失败项时退出码 1。
|
|
16
|
+
|
|
17
|
+
## 复制跳过规则
|
|
18
|
+
|
|
19
|
+
- 顶层跳过:`package.json` / `bin` / `node_modules` / `.git` / `__pycache__`;
|
|
20
|
+
- 任意层级跳过:`.pytest_cache` / `.mypy_cache` 目录、`*.pyc` / `*.pyo` 文件。
|
|
21
|
+
|
|
22
|
+
因此装进技能目录的是「技能本体」(SKILL.md / references / scripts 等),不含 npm
|
|
23
|
+
安装器自身、测试夹具与 Python 字节码缓存。
|
|
24
|
+
|
|
25
|
+
## 幂等与版本判断
|
|
26
|
+
|
|
27
|
+
- 读取目标 `<dest>/<slug>/SKILL.md` 的 frontmatter `version`;
|
|
28
|
+
- 与清单 `version` 一致 → 跳过(幂等:第二次安装 22 个全部跳过);
|
|
29
|
+
- `--force` 强制重装;`update` 对「缺失 / 版本不一致」的技能重装。
|
|
30
|
+
|
|
31
|
+
## 版本策略
|
|
32
|
+
|
|
33
|
+
- 默认 range:spec = `<pkg>@<major>.x`(如 `0.x`),`npm pack` 取同 major 最新 patch;
|
|
34
|
+
- `--pin`:spec = `<pkg>@<清单精确版本>`。
|
|
35
|
+
|
|
36
|
+
## npm 解析(Windows)
|
|
37
|
+
|
|
38
|
+
- 优先:`where.exe npm.cmd` → 读同目录 `node_modules/npm/bin/npm-cli.js` → 用 node 直接执行
|
|
39
|
+
(npm.cmd 直跑在 Windows 有 EINVAL,`cmd /c` 引号脆弱;npm-cli.js 直跑无 shell 变量坑);
|
|
40
|
+
- `--npm` / `YOTTA_SKILLS_NPM`:`.js` → node 执行;`.cmd/.bat` → 同样解析 npm-cli.js;
|
|
41
|
+
其它 → 直接执行;
|
|
42
|
+
- `YOTTA_SKILLS_NPM_FLAGS` 追加到 `npm pack` 参数。
|
|
43
|
+
|
|
44
|
+
## 元信装前摘要
|
|
45
|
+
|
|
46
|
+
- 引擎查找:`--verify` → `YOTTA_SKILLS_VERIFY` → `<dest>/yotta-verify/scripts/yotta_verify.py`;
|
|
47
|
+
- python 查找:`--python` → `YOTTA_SKILLS_PYTHON` → `python3` / `python` / `py`(win32);
|
|
48
|
+
- 执行:`python -B <engine> scan <解压目录> --json`(`-B` 禁止写 `__pycache__`,防止污染
|
|
49
|
+
引擎所在目录);
|
|
50
|
+
- 输出 verdict + counts(critical / high / medium / low / info);DO NOT INSTALL 额外提示
|
|
51
|
+
人工复核;仅摘要、不拦截。
|
|
52
|
+
|
|
53
|
+
## 退出码
|
|
54
|
+
|
|
55
|
+
| 退出码 | 含义 |
|
|
56
|
+
|---|---|
|
|
57
|
+
| 0 | 成功(含全部跳过) |
|
|
58
|
+
| 1 | 安装 / 更新存在失败项 |
|
|
59
|
+
| 2 | 用法错误(未知参数 / 未知技能 / 未收录智能体) |
|
|
60
|
+
| 4 | 未指定目标且当前目录未检测到项目级技能目录 |
|
|
61
|
+
|
|
62
|
+
## 目标目录解析
|
|
63
|
+
|
|
64
|
+
- `--dir`:直接使用(技能落在 `<dir>/<slug>`);
|
|
65
|
+
- `--agent`:查内置 17 智能体表(codex 特判 `$CODEX_HOME/skills`;opencode 特判
|
|
66
|
+
`$XDG_CONFIG_HOME/opencode/skills`;其余 `~/.<agent>/skills` 或 `~/.config/...`);
|
|
67
|
+
- 都未指定:检测当前目录是否存在项目级技能目录(`.claude/skills`、`.codex/skills`、
|
|
68
|
+
`.agents/skills` 等 17 个),存在则用之;否则退出码 4。
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# 元阁编排策划(orchestration)
|
|
2
|
+
|
|
3
|
+
> 元阁(yotta-skills)的**编排层**:告诉 AI 智能体「什么时候该组合哪几个元技能、组合起来比单用强在哪、怎么自动安装并按组合契约用起来」。
|
|
4
|
+
> 本页是「每个场景 → 选哪几个技能 → 为什么 → 怎么自动装 + 自动用」的决策表,供 AI 智能体在接到需求时查表执行。
|
|
5
|
+
> 配套:全家清单见 `skill-list.md`;安装用法见 SKILL.md「快速使用」。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 一、技能家族全景(24 技能 / 8 家族)
|
|
10
|
+
|
|
11
|
+
| 家族 | 技能(中文名 / slug) | 一句话能力 |
|
|
12
|
+
|---|---|---|
|
|
13
|
+
| 入口与引导 | 元引 yotta-prompt | 意图澄清,串联到对应的元阁技能 |
|
|
14
|
+
| 覆盖与安装 | 元阁 yotta-skills | 全家 / 按需一键安装与更新 |
|
|
15
|
+
| 呈现与表达 | 元呈 yotta-present、元真 yotta-humanize | 输出判型渲染成可复制 Markdown/纯文本;去 AI 味 |
|
|
16
|
+
| 记忆与上下文 | 元忆 yotta-memory、元习 yotta-learn、元史 yotta-logs | 权限记忆、学习沉淀、历史检索 |
|
|
17
|
+
| 工作流与跨会话 | 元序 yotta-workflow | 开工读状态 / 状态就近存 / 会话结束留记录 |
|
|
18
|
+
| 质量与工程 | 元谨 yotta-anti-shallow、元质 yotta-code-quality、元造 yotta-skill-creator、元守 yotta-publish-guard | 防敷衍、代码评审、造技能、发布守门 |
|
|
19
|
+
| 安全与信任 | 元信 yotta-verify(+元信MCP)、元审 yotta-vetter、元安 yotta-security-audit、元链 yotta-chain、元钥 yotta-secret、元鉴 yotta-triage、元察 yotta-logwatch、元情 yotta-intel、元析 yotta-recon、元测 yotta-security-testing、元盾 yotta-guardian、元安全 yotta-agent-hardening | 装前扫描、审查协议、静态检测、供应链、密钥、样本、日志、IOC、侦察、测试、拦截、加固 |
|
|
20
|
+
| 分发与汇总 | 元引(串联)、元阁(安装) | —— |
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 二、组合矩阵(哪些和哪些组合,强在哪)
|
|
25
|
+
|
|
26
|
+
> 原则:**单技能是零件,组合才是系统**。下面每个组合给出「一起用效果、单用差在哪、典型场景」。
|
|
27
|
+
|
|
28
|
+
| 组合 | 成员(slug) | 一起用强在哪 | 单用缺什么 |
|
|
29
|
+
|---|---|---|---|
|
|
30
|
+
| **① 输出呈现标准** | yotta-present + yotta-humanize | 先判型渲染成规范、可复制、可复用的输出,再检测 AI 味改写,交付统一且读感自然 | 只有 yotta-present:规范但不祛 AI 味;只有 yotta-humanize:祛 AI 味但输出形态不规整 |
|
|
31
|
+
| **② 长生命周期智能体** | yotta-workflow + yotta-memory + yotta-learn + yotta-logs | 开工恢复上下文、权限记忆、沉淀学习、检索历史,智能体活过会话、越用越懂你 | 缺 yotta-workflow:状态无处放;缺 yotta-memory:记忆无权限边界;缺 yotta-learn:错不沉淀;缺 yotta-logs:历史查不到 |
|
|
32
|
+
| **③ 交付质量门** | yotta-anti-shallow + yotta-code-quality + yotta-publish-guard | 防敷衍、结对评审、发布前守门,交付前多层把关 | 缺 yotta-anti-shallow:容易停留表面;缺 yotta-code-quality:代码质量无人审;缺 yotta-publish-guard:发版无守门 |
|
|
33
|
+
| **④ 装前安全门** | yotta-verify(或元信MCP)+ yotta-vetter + yotta-security-audit | 确定性扫描 + 协议审查 + 深检,装其他来源技能/插件/MCP 前给出可信判定 | 缺 yotta-verify:无确定性扫描;缺 yotta-vetter:无协议审查;缺 yotta-security-audit:无深检兜底 |
|
|
34
|
+
| **⑤ 造技能 / 发版** | yotta-skill-creator + yotta-publish-guard | 脚手架生成合规技能目录,发布前守门 | 缺 yotta-skill-creator:造技能无模板;缺 yotta-publish-guard:造完不知能否发 |
|
|
35
|
+
| **⑥ 安全事件响应** | yotta-logwatch + yotta-intel + yotta-triage + yotta-secret + yotta-chain + yotta-recon | 日志检测攻击链、提取 IOC、初筛样本、扫密钥、校验供应链、侦察资产 | 每项只管一环,单用看不到全链路 |
|
|
36
|
+
| **⑦ 入口 + 安装** | yotta-prompt + yotta-skills | 元引澄清需求串联到对应技能,元阁按场景把组合一口气装好 | 缺 yotta-prompt:需求模糊时不知该用哪个;缺 yotta-skills:要一个个装 |
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## 三、场景 → 组合映射(AI 接到需求时查表)
|
|
41
|
+
|
|
42
|
+
| 用户场景(触发词) | 该组合 | 自动装 / 自动用动作 |
|
|
43
|
+
|---|---|---|
|
|
44
|
+
| 「让 AI 长期帮我做项目 / 别忘了我 / 跨会话」 | ② 长生命周期 | 装 yotta-workflow yotta-memory yotta-learn yotta-logs;开工恢复上下文、状态就近存、会话结束留记录 |
|
|
45
|
+
| 「帮我写/润色,让输出规范、别 AI 味」 | ① 输出呈现标准 | 装 yotta-present yotta-humanize;默认先判型渲染,检测 AI 味再改写 |
|
|
46
|
+
| 「检查这段代码/报告质量,别糊弄」 | ③ 交付质量门 | 装 yotta-anti-shallow yotta-code-quality yotta-publish-guard;按对应协议执行 |
|
|
47
|
+
| 「我要装一个其他来源技能/插件/MCP」 | ④ 装前安全门 | 装 yotta-verify(+MCP) yotta-vetter yotta-security-audit;装前必扫 |
|
|
48
|
+
| 「我要造一个新 skill 并发布」 | ⑤ 造技能/发版 | 装 yotta-skill-creator yotta-publish-guard;生成 + 守门 |
|
|
49
|
+
| 「我怀疑日志/资产有问题」 | ⑥ 安全事件响应 | 装 yotta-logwatch yotta-intel yotta-triage yotta-secret yotta-chain yotta-recon;按需调用 |
|
|
50
|
+
| 「不知道怎么说 / 一堆技能该用哪个」 | ⑦ 入口+安装 | 装 yotta-prompt yotta-skills;元引澄清→串联→元阁按组合装 |
|
|
51
|
+
|
|
52
|
+
> 组合不是死板套餐:命中「入口+安装」或「输出呈现标准」这类**默认契约**时,AI 应自动应用,不需用户逐次说;命中安全/发版这类**高风险动作**时,AI 应装技能并给出执行方案,由用户确认后执行。
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 四、AI 自动安装与组合规则(金标准)
|
|
57
|
+
|
|
58
|
+
1. **查表**:接到需求,先在「场景→组合映射」里定位命中组合。
|
|
59
|
+
2. **查已装**:检查当前智能体的技能目录是否存在对应 `<slug>/SKILL.md`;存在即已装,缺失即待装。
|
|
60
|
+
3. **自动装**:缺失的技能用
|
|
61
|
+
`npx -y @yottameta/yotta-skills install <slug>... [--agent <name> | --dir <path>]`
|
|
62
|
+
一次性补齐(只装组合所需,不装全家,避免过度安装)。
|
|
63
|
+
4. **自动用(默认契约)**:命中的是「输出呈现标准」「长生命周期」这类**默认行为契约**时,装完即按组合契约自动调用(如:所有输出先过 yotta-present;开工先恢复上下文 + 读状态文件)。不需用户逐次提醒。
|
|
64
|
+
5. **用户触发(高风险)**:命中「安全 / 发版 / 造技能」这类**高风险或目的不明**时,AI 装技能 + 给出执行方案,**先征询用户确认**再执行;拿不准就当未装,给出安装命令。
|
|
65
|
+
6. **边界**:不 `-g` 全局安装;不向未指定位置写文件;拿不准某技能是否已装 → 视为未装并给提示;网络不可用 → 明确报错,不伪造结果。
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## 五、安装与入口
|
|
70
|
+
|
|
71
|
+
- 安装 CLI 用法见 `SKILL.md`「快速使用」;全家清单见 `skill-list.md`。
|
|
72
|
+
- 版本策略 / 元信装前摘要 / 支持的智能体 / 环境变量 同 SKILL.md。
|
package/references/skill-list.md
CHANGED
|
@@ -1,40 +1,40 @@
|
|
|
1
|
-
# 全家技能清单(22 个)
|
|
2
|
-
|
|
3
|
-
> 机器权威源:`skills.json`(随包分发);本文件为人工可读副本,新技能发布后须同步更新
|
|
4
|
-
> `skills.json`(登记表为内部台账,不随包分发)。清单更新日期:2026-08-29。
|
|
5
|
-
|
|
6
|
-
| slug | 中文名 | npm 包 | 清单版本 | 说明 |
|
|
7
|
-
|---|---|---|---|---|
|
|
8
|
-
| `yotta-anti-shallow` | 元谨 | `@yottameta/yotta-anti-shallow` | 1.3.4 | 防 AI 敷衍规则引擎(深入分析/根因追溯时激活) |
|
|
9
|
-
| `yotta-code-quality` | 元质 | `@yottameta/yotta-code-quality` | 0.3.4 | 结对式代码质量评审(十二类腐化风险 + 0-100 健康分) |
|
|
10
|
-
| `yotta-workflow` | 元序 | `@yottameta/yotta-workflow` | 0.2.6 |
|
|
11
|
-
| `yotta-memory` | 元忆 | `@yottameta/yotta-memory` | 0.8.4 | 有权限边界的文件式智能体记忆(FACT/PREF/BOUND/COMMIT) |
|
|
12
|
-
| `yotta-learn` | 元习 | `@yottameta/yotta-learn` | 0.1.4 |
|
|
13
|
-
| `yotta-security-audit` | 元安 | `@yottameta/yotta-security-audit` | 0.1.7 | 安全扫描引擎:13 类检测器 + 系统安全基线 |
|
|
14
|
-
| `yotta-vetter` | 元审 | `@yottameta/yotta-vetter` | 0.1.5 | 安全审查协议:四阶段 review + SAFE TO INSTALL 判定 |
|
|
15
|
-
| `yotta-recon` | 元析 | `@yottameta/yotta-recon` | 0.1.5 | 跨智能体网络侦察:零依赖端口/服务/版本指纹探测 |
|
|
16
|
-
| `yotta-guardian` | 元盾 | `@yottameta/yotta-guardian` | 0.1.2 | 跨智能体危险调用拦截护栏:确定性规则 + 可插拔意图验证 |
|
|
17
|
-
| `yotta-humanize` | 元真 | `@yottameta/yotta-humanize` | 0.1.2 | 去 AI 味中文写作编辑:检测器引擎 |
|
|
18
|
-
| `yotta-logs` | 元史 | `@yottameta/yotta-logs` | 0.2.2 | 跨智能体历史会话 / 记忆日志检索 |
|
|
19
|
-
| `yotta-security-testing` | 元测 | `@yottameta/yotta-security-testing` | 0.1.0 | 有纪律的 AI 安全测试方法论 + Scope Guard 五道防线 |
|
|
20
|
-
| `yotta-agent-hardening` | 元安全 | `@yottameta/yotta-agent-hardening` | 0.1.0 | 防御向 AI 智能体自身安全加固(配置面静态扫描三域) |
|
|
21
|
-
| `yotta-skill-creator` | 元造 | `@yottameta/yotta-skill-creator` | 0.1.0 | 工坊「造」:端到端造技能脚手架 |
|
|
22
|
-
| `yotta-publish-guard` | 元守 | `@yottameta/yotta-publish-guard` | 0.1.1 | 工坊「守」:发布前守门(版本四件对齐 + 三通道查重) |
|
|
23
|
-
| `yotta-logwatch` | 元察 | `@yottameta/yotta-logwatch` | 0.2.7 | 安全日志分析检测引擎(攻击链识别/告警聚合) |
|
|
24
|
-
| `yotta-intel` | 元情 | `@yottameta/yotta-intel` | 0.1.1 | 威胁情报 IOC 提取与规范化引擎(STIX-lite) |
|
|
25
|
-
| `yotta-secret` | 元钥 | `@yottameta/yotta-secret` | 0.1.2 | 密钥 / 凭据泄露源头扫描引擎 |
|
|
26
|
-
| `yotta-chain` | 元链 | `@yottameta/yotta-chain` | 0.1.2 | 供应链依赖校验引擎 |
|
|
27
|
-
| `yotta-triage` | 元鉴 | `@yottameta/yotta-triage` | 0.1.1 | 恶意样本静态初筛引擎(哈希/熵/字符串/PE-ELF) |
|
|
28
|
-
| `yotta-prompt` | 元引 | `@yottameta/yotta-prompt` | 0.1.1 | 意图澄清 + 生态入口(常驻注入,map 串联元阁全家) |
|
|
29
|
-
| `yotta-verify` | 元信 | `@yottameta/yotta-verify` | 0.1.1 | 装前安全扫描器 + audited 徽章(prompt injection + 危险模式) |
|
|
30
|
-
|
|
31
|
-
## 家族分布
|
|
32
|
-
|
|
33
|
-
- 安全与护栏(12):元安 / 元审 / 元析 / 元盾 / 元测 / 元安全 / 元察 / 元情 / 元钥 / 元链 / 元鉴 / 元信
|
|
34
|
-
- 质量与工程(4):元谨 / 元质 / 元造 / 元守
|
|
35
|
-
- 记忆与上下文(3):元忆 / 元史 / 元习
|
|
36
|
-
- 写作与表达(1):元真
|
|
37
|
-
- 工作流(1):元序
|
|
38
|
-
- 入口与引导(1):元引
|
|
39
|
-
|
|
40
|
-
合计 22 个已发布技能;本安装器自身(yotta-skills / 元阁)归「分发与安装」家族。
|
|
1
|
+
# 全家技能清单(22 个)
|
|
2
|
+
|
|
3
|
+
> 机器权威源:`skills.json`(随包分发);本文件为人工可读副本,新技能发布后须同步更新
|
|
4
|
+
> `skills.json`(登记表为内部台账,不随包分发)。清单更新日期:2026-08-29。
|
|
5
|
+
|
|
6
|
+
| slug | 中文名 | npm 包 | 清单版本 | 说明 |
|
|
7
|
+
|---|---|---|---|---|
|
|
8
|
+
| `yotta-anti-shallow` | 元谨 | `@yottameta/yotta-anti-shallow` | 1.3.4 | 防 AI 敷衍规则引擎(深入分析/根因追溯时激活) |
|
|
9
|
+
| `yotta-code-quality` | 元质 | `@yottameta/yotta-code-quality` | 0.3.4 | 结对式代码质量评审(十二类腐化风险 + 0-100 健康分) |
|
|
10
|
+
| `yotta-workflow` | 元序 | `@yottameta/yotta-workflow` | 0.2.6 | 跨会话/跨项目通用工作流协议(状态就近存) |
|
|
11
|
+
| `yotta-memory` | 元忆 | `@yottameta/yotta-memory` | 0.8.4 | 有权限边界的文件式智能体记忆(FACT/PREF/BOUND/COMMIT) |
|
|
12
|
+
| `yotta-learn` | 元习 | `@yottameta/yotta-learn` | 0.1.4 | 学习沉淀 CLI:错误/纠正/洞见沉淀为 .learnings/ 条目 |
|
|
13
|
+
| `yotta-security-audit` | 元安 | `@yottameta/yotta-security-audit` | 0.1.7 | 安全扫描引擎:13 类检测器 + 系统安全基线 |
|
|
14
|
+
| `yotta-vetter` | 元审 | `@yottameta/yotta-vetter` | 0.1.5 | 安全审查协议:四阶段 review + SAFE TO INSTALL 判定 |
|
|
15
|
+
| `yotta-recon` | 元析 | `@yottameta/yotta-recon` | 0.1.5 | 跨智能体网络侦察:零依赖端口/服务/版本指纹探测 |
|
|
16
|
+
| `yotta-guardian` | 元盾 | `@yottameta/yotta-guardian` | 0.1.2 | 跨智能体危险调用拦截护栏:确定性规则 + 可插拔意图验证 |
|
|
17
|
+
| `yotta-humanize` | 元真 | `@yottameta/yotta-humanize` | 0.1.2 | 去 AI 味中文写作编辑:检测器引擎 |
|
|
18
|
+
| `yotta-logs` | 元史 | `@yottameta/yotta-logs` | 0.2.2 | 跨智能体历史会话 / 记忆日志检索 |
|
|
19
|
+
| `yotta-security-testing` | 元测 | `@yottameta/yotta-security-testing` | 0.1.0 | 有纪律的 AI 安全测试方法论 + Scope Guard 五道防线 |
|
|
20
|
+
| `yotta-agent-hardening` | 元安全 | `@yottameta/yotta-agent-hardening` | 0.1.0 | 防御向 AI 智能体自身安全加固(配置面静态扫描三域) |
|
|
21
|
+
| `yotta-skill-creator` | 元造 | `@yottameta/yotta-skill-creator` | 0.1.0 | 工坊「造」:端到端造技能脚手架 |
|
|
22
|
+
| `yotta-publish-guard` | 元守 | `@yottameta/yotta-publish-guard` | 0.1.1 | 工坊「守」:发布前守门(版本四件对齐 + 三通道查重) |
|
|
23
|
+
| `yotta-logwatch` | 元察 | `@yottameta/yotta-logwatch` | 0.2.7 | 安全日志分析检测引擎(攻击链识别/告警聚合) |
|
|
24
|
+
| `yotta-intel` | 元情 | `@yottameta/yotta-intel` | 0.1.1 | 威胁情报 IOC 提取与规范化引擎(STIX-lite) |
|
|
25
|
+
| `yotta-secret` | 元钥 | `@yottameta/yotta-secret` | 0.1.2 | 密钥 / 凭据泄露源头扫描引擎 |
|
|
26
|
+
| `yotta-chain` | 元链 | `@yottameta/yotta-chain` | 0.1.2 | 供应链依赖校验引擎 |
|
|
27
|
+
| `yotta-triage` | 元鉴 | `@yottameta/yotta-triage` | 0.1.1 | 恶意样本静态初筛引擎(哈希/熵/字符串/PE-ELF) |
|
|
28
|
+
| `yotta-prompt` | 元引 | `@yottameta/yotta-prompt` | 0.1.1 | 意图澄清 + 生态入口(常驻注入,map 串联元阁全家) |
|
|
29
|
+
| `yotta-verify` | 元信 | `@yottameta/yotta-verify` | 0.1.1 | 装前安全扫描器 + audited 徽章(prompt injection + 危险模式) |
|
|
30
|
+
|
|
31
|
+
## 家族分布
|
|
32
|
+
|
|
33
|
+
- 安全与护栏(12):元安 / 元审 / 元析 / 元盾 / 元测 / 元安全 / 元察 / 元情 / 元钥 / 元链 / 元鉴 / 元信
|
|
34
|
+
- 质量与工程(4):元谨 / 元质 / 元造 / 元守
|
|
35
|
+
- 记忆与上下文(3):元忆 / 元史 / 元习
|
|
36
|
+
- 写作与表达(1):元真
|
|
37
|
+
- 工作流(1):元序
|
|
38
|
+
- 入口与引导(1):元引
|
|
39
|
+
|
|
40
|
+
合计 22 个已发布技能;本安装器自身(yotta-skills / 元阁)归「分发与安装」家族。
|