@skillfm/local 2.0.3 → 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.
Files changed (50) hide show
  1. package/README.md +7 -2
  2. package/dist/harness/kernels/deny-pipeline.d.ts +21 -0
  3. package/dist/harness/kernels/deny-pipeline.d.ts.map +1 -0
  4. package/dist/harness/kernels/deny-pipeline.js +225 -0
  5. package/dist/harness/kernels/deny-pipeline.js.map +1 -0
  6. package/dist/harness/kernels/hook-file.d.ts +16 -0
  7. package/dist/harness/kernels/hook-file.d.ts.map +1 -0
  8. package/dist/harness/kernels/hook-file.js +229 -0
  9. package/dist/harness/kernels/hook-file.js.map +1 -0
  10. package/dist/harness/kernels/json-merge.d.ts +45 -0
  11. package/dist/harness/kernels/json-merge.d.ts.map +1 -0
  12. package/dist/harness/kernels/json-merge.js +123 -0
  13. package/dist/harness/kernels/json-merge.js.map +1 -0
  14. package/dist/harness/kernels/mcp-only.d.ts +23 -0
  15. package/dist/harness/kernels/mcp-only.d.ts.map +1 -0
  16. package/dist/harness/kernels/mcp-only.js +215 -0
  17. package/dist/harness/kernels/mcp-only.js.map +1 -0
  18. package/dist/harness/kernels/protocol-reject.d.ts +18 -0
  19. package/dist/harness/kernels/protocol-reject.d.ts.map +1 -0
  20. package/dist/harness/kernels/protocol-reject.js +117 -0
  21. package/dist/harness/kernels/protocol-reject.js.map +1 -0
  22. package/dist/harness/kernels/registry.d.ts +56 -0
  23. package/dist/harness/kernels/registry.d.ts.map +1 -0
  24. package/dist/harness/kernels/registry.js +139 -0
  25. package/dist/harness/kernels/registry.js.map +1 -0
  26. package/dist/harness/kernels/types.d.ts +86 -0
  27. package/dist/harness/kernels/types.d.ts.map +1 -0
  28. package/dist/harness/kernels/types.js +21 -0
  29. package/dist/harness/kernels/types.js.map +1 -0
  30. package/dist/mcp-output/builder.d.ts +24 -0
  31. package/dist/mcp-output/builder.d.ts.map +1 -0
  32. package/dist/mcp-output/builder.js +99 -0
  33. package/dist/mcp-output/builder.js.map +1 -0
  34. package/dist/mcp-output/deny-review.d.ts +64 -0
  35. package/dist/mcp-output/deny-review.d.ts.map +1 -0
  36. package/dist/mcp-output/deny-review.js +212 -0
  37. package/dist/mcp-output/deny-review.js.map +1 -0
  38. package/dist/mcp-output/types.d.ts +64 -0
  39. package/dist/mcp-output/types.d.ts.map +1 -0
  40. package/dist/mcp-output/types.js +21 -0
  41. package/dist/mcp-output/types.js.map +1 -0
  42. package/dist/skill-md/template.d.ts +30 -0
  43. package/dist/skill-md/template.d.ts.map +1 -0
  44. package/dist/skill-md/template.js +194 -0
  45. package/dist/skill-md/template.js.map +1 -0
  46. package/dist/skill-md/writer.d.ts +30 -0
  47. package/dist/skill-md/writer.d.ts.map +1 -0
  48. package/dist/skill-md/writer.js +129 -0
  49. package/dist/skill-md/writer.js.map +1 -0
  50. package/package.json +1 -2
@@ -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",
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",
@@ -10,7 +10,6 @@
10
10
  "README.md"
11
11
  ],
12
12
  "bin": {
13
- "local": "dist/index.js",
14
13
  "skillfm-local": "dist/index.js",
15
14
  "skillfm-guard": "dist/guard/bin.js"
16
15
  },