@skillfm/local 2.0.4 → 2.0.5
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/harness/kernels/deny-pipeline.d.ts +21 -0
- package/dist/harness/kernels/deny-pipeline.d.ts.map +1 -0
- package/dist/harness/kernels/deny-pipeline.js +225 -0
- package/dist/harness/kernels/deny-pipeline.js.map +1 -0
- package/dist/harness/kernels/hook-file.d.ts +16 -0
- package/dist/harness/kernels/hook-file.d.ts.map +1 -0
- package/dist/harness/kernels/hook-file.js +229 -0
- package/dist/harness/kernels/hook-file.js.map +1 -0
- package/dist/harness/kernels/json-merge.d.ts +45 -0
- package/dist/harness/kernels/json-merge.d.ts.map +1 -0
- package/dist/harness/kernels/json-merge.js +123 -0
- package/dist/harness/kernels/json-merge.js.map +1 -0
- package/dist/harness/kernels/mcp-only.d.ts +23 -0
- package/dist/harness/kernels/mcp-only.d.ts.map +1 -0
- package/dist/harness/kernels/mcp-only.js +215 -0
- package/dist/harness/kernels/mcp-only.js.map +1 -0
- package/dist/harness/kernels/protocol-reject.d.ts +18 -0
- package/dist/harness/kernels/protocol-reject.d.ts.map +1 -0
- package/dist/harness/kernels/protocol-reject.js +117 -0
- package/dist/harness/kernels/protocol-reject.js.map +1 -0
- package/dist/harness/kernels/registry.d.ts +56 -0
- package/dist/harness/kernels/registry.d.ts.map +1 -0
- package/dist/harness/kernels/registry.js +139 -0
- package/dist/harness/kernels/registry.js.map +1 -0
- package/dist/harness/kernels/types.d.ts +86 -0
- package/dist/harness/kernels/types.d.ts.map +1 -0
- package/dist/harness/kernels/types.js +21 -0
- package/dist/harness/kernels/types.js.map +1 -0
- package/dist/mcp-output/builder.d.ts +24 -0
- package/dist/mcp-output/builder.d.ts.map +1 -0
- package/dist/mcp-output/builder.js +99 -0
- package/dist/mcp-output/builder.js.map +1 -0
- package/dist/mcp-output/deny-review.d.ts +64 -0
- package/dist/mcp-output/deny-review.d.ts.map +1 -0
- package/dist/mcp-output/deny-review.js +212 -0
- package/dist/mcp-output/deny-review.js.map +1 -0
- package/dist/mcp-output/types.d.ts +64 -0
- package/dist/mcp-output/types.d.ts.map +1 -0
- package/dist/mcp-output/types.js +21 -0
- package/dist/mcp-output/types.js.map +1 -0
- package/dist/skill-md/template.d.ts +30 -0
- package/dist/skill-md/template.d.ts.map +1 -0
- package/dist/skill-md/template.js +194 -0
- package/dist/skill-md/template.js.map +1 -0
- package/dist/skill-md/writer.d.ts +30 -0
- package/dist/skill-md/writer.d.ts.map +1 -0
- package/dist/skill-md/writer.js +129 -0
- package/dist/skill-md/writer.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BSO M9 v0.3 — Layer 1: SKILL.md 写入器
|
|
3
|
+
*
|
|
4
|
+
* Refs:
|
|
5
|
+
* - docs/prd/PRD-BSO-M9-HARNESS-HOOKS.md §3.2.2
|
|
6
|
+
*
|
|
7
|
+
* 写入策略:
|
|
8
|
+
* - 项目级 ./SKILL.md:必写(所有 host 都拿到 priming)
|
|
9
|
+
* - Anthropic Claude Code 用户级 ~/.claude/skills/skillfm-bso/SKILL.md:可选
|
|
10
|
+
* (由 init flag --copy-to-user 触发,本里程碑只提供 hint)
|
|
11
|
+
*
|
|
12
|
+
* 已存在 ./SKILL.md:
|
|
13
|
+
* - 内含 SKILLFM-SKILL-BEGIN/END → upgrade-safe replace
|
|
14
|
+
* - 不含我们的标记 → backup 后 append(不覆盖用户已有 skill)
|
|
15
|
+
*/
|
|
16
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, } from 'node:fs';
|
|
17
|
+
import { dirname, join } from 'node:path';
|
|
18
|
+
import { homedir } from 'node:os';
|
|
19
|
+
import { backupFileBeforeWrite } from '../soul-security.js';
|
|
20
|
+
import { buildSkillMd, SKILL_MD_BEGIN, SKILL_MD_END, } from './template.js';
|
|
21
|
+
export function writeProjectSkillMd(opts) {
|
|
22
|
+
const filePath = join(opts.cwd, 'SKILL.md');
|
|
23
|
+
const existed = existsSync(filePath);
|
|
24
|
+
const original = existed ? readFileSync(filePath, 'utf-8') : '';
|
|
25
|
+
const wrapped = buildSkillMd({ lang: opts.lang, withBoundaryMarkers: true });
|
|
26
|
+
// upgrade-safe 检查
|
|
27
|
+
const hasOurBlock = original.includes(SKILL_MD_BEGIN);
|
|
28
|
+
if (hasOurBlock && original.includes(wrapped.trimEnd())) {
|
|
29
|
+
return {
|
|
30
|
+
path: filePath,
|
|
31
|
+
action: 'already-present',
|
|
32
|
+
bytesWritten: 0,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
// 文件不存在 → 直接写(无边界,因为整文件就是我们的)
|
|
36
|
+
if (!existed) {
|
|
37
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
38
|
+
const standalone = buildSkillMd({ lang: opts.lang, withBoundaryMarkers: false });
|
|
39
|
+
writeFileSync(filePath, standalone, { encoding: 'utf-8', mode: 0o644 });
|
|
40
|
+
return {
|
|
41
|
+
path: filePath,
|
|
42
|
+
action: 'created',
|
|
43
|
+
bytesWritten: Buffer.byteLength(standalone, 'utf-8'),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
// backup
|
|
47
|
+
let backupPath;
|
|
48
|
+
try {
|
|
49
|
+
const r = backupFileBeforeWrite(filePath, original);
|
|
50
|
+
backupPath = r.backup_path;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// not critical
|
|
54
|
+
}
|
|
55
|
+
let next;
|
|
56
|
+
let action;
|
|
57
|
+
if (hasOurBlock) {
|
|
58
|
+
// replace 旧 block
|
|
59
|
+
const startIdx = original.indexOf(SKILL_MD_BEGIN);
|
|
60
|
+
const endIdx = original.indexOf(SKILL_MD_END);
|
|
61
|
+
if (startIdx === -1 || endIdx === -1 || endIdx < startIdx) {
|
|
62
|
+
// 标记残缺 — 保守 append
|
|
63
|
+
next = `${original}${original.endsWith('\n') ? '' : '\n'}\n${wrapped}`;
|
|
64
|
+
action = 'appended';
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
const before = original.slice(0, startIdx).replace(/\n+$/, '\n');
|
|
68
|
+
const after = original.slice(endIdx + SKILL_MD_END.length).replace(/^\n+/, '');
|
|
69
|
+
next = `${before}\n${wrapped}${after}`.replace(/\n{3,}/g, '\n\n');
|
|
70
|
+
action = 'replaced';
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
// 用户已有 SKILL.md(自定义 skill)→ append 我们的 block 在尾部
|
|
75
|
+
next = `${original}${original.endsWith('\n') ? '' : '\n'}\n${wrapped}`;
|
|
76
|
+
action = 'appended';
|
|
77
|
+
}
|
|
78
|
+
writeFileSync(filePath, next, { encoding: 'utf-8', mode: 0o644 });
|
|
79
|
+
return {
|
|
80
|
+
path: filePath,
|
|
81
|
+
action,
|
|
82
|
+
bytesWritten: Buffer.byteLength(next, 'utf-8'),
|
|
83
|
+
backupPath,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
// ============================================================================
|
|
87
|
+
// 用户级 hint(不实际写,只返回路径让 init 决定是否问用户)
|
|
88
|
+
// ============================================================================
|
|
89
|
+
export function userScopeSkillMdPath() {
|
|
90
|
+
return join(homedir(), '.claude', 'skills', 'skillfm-bso', 'SKILL.md');
|
|
91
|
+
}
|
|
92
|
+
export function writeUserScopeSkillMd(lang) {
|
|
93
|
+
const filePath = userScopeSkillMdPath();
|
|
94
|
+
const standalone = buildSkillMd({ lang, withBoundaryMarkers: false });
|
|
95
|
+
const existed = existsSync(filePath);
|
|
96
|
+
if (existed) {
|
|
97
|
+
const original = readFileSync(filePath, 'utf-8');
|
|
98
|
+
if (original.trim() === standalone.trim()) {
|
|
99
|
+
return {
|
|
100
|
+
path: filePath,
|
|
101
|
+
action: 'already-present',
|
|
102
|
+
bytesWritten: 0,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
let backupPath;
|
|
106
|
+
try {
|
|
107
|
+
const r = backupFileBeforeWrite(filePath, original);
|
|
108
|
+
backupPath = r.backup_path;
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// ignore
|
|
112
|
+
}
|
|
113
|
+
writeFileSync(filePath, standalone, { encoding: 'utf-8', mode: 0o644 });
|
|
114
|
+
return {
|
|
115
|
+
path: filePath,
|
|
116
|
+
action: 'replaced',
|
|
117
|
+
bytesWritten: Buffer.byteLength(standalone, 'utf-8'),
|
|
118
|
+
backupPath,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
122
|
+
writeFileSync(filePath, standalone, { encoding: 'utf-8', mode: 0o644 });
|
|
123
|
+
return {
|
|
124
|
+
path: filePath,
|
|
125
|
+
action: 'created',
|
|
126
|
+
bytesWritten: Buffer.byteLength(standalone, 'utf-8'),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../../src/skill-md/writer.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@skillfm/local",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.5",
|
|
4
4
|
"description": "SkillFM local sidecar — a tiny localhost HTTP proxy that lets any AI agent activate and run SkillFM skills in the current conversation without restarting its MCP runtime. Writes ~/.skillfm/local.json for service discovery.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|