@skillfm/local 2.7.9 → 2.7.11

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 (172) hide show
  1. package/dist/_vendored-contracts/beacon-assets-v1.d.ts +160 -0
  2. package/dist/_vendored-contracts/beacon-assets-v1.d.ts.map +1 -0
  3. package/dist/_vendored-contracts/beacon-assets-v1.js +29 -0
  4. package/dist/_vendored-contracts/beacon-assets-v1.js.map +1 -0
  5. package/dist/_vendored-contracts/beacon-mcp-tools-v1.d.ts +373 -0
  6. package/dist/_vendored-contracts/beacon-mcp-tools-v1.d.ts.map +1 -0
  7. package/dist/_vendored-contracts/beacon-mcp-tools-v1.js +131 -0
  8. package/dist/_vendored-contracts/beacon-mcp-tools-v1.js.map +1 -0
  9. package/dist/_vendored-contracts/beacon-preferences-v1.d.ts +68 -0
  10. package/dist/_vendored-contracts/beacon-preferences-v1.d.ts.map +1 -0
  11. package/dist/_vendored-contracts/beacon-preferences-v1.js +26 -0
  12. package/dist/_vendored-contracts/beacon-preferences-v1.js.map +1 -0
  13. package/dist/_vendored-contracts/beacon-rule-protocol-v1.d.ts +208 -0
  14. package/dist/_vendored-contracts/beacon-rule-protocol-v1.d.ts.map +1 -0
  15. package/dist/_vendored-contracts/beacon-rule-protocol-v1.js +25 -0
  16. package/dist/_vendored-contracts/beacon-rule-protocol-v1.js.map +1 -0
  17. package/dist/_vendored-contracts/beacon-usage-v1.d.ts +88 -0
  18. package/dist/_vendored-contracts/beacon-usage-v1.d.ts.map +1 -0
  19. package/dist/_vendored-contracts/beacon-usage-v1.js +27 -0
  20. package/dist/_vendored-contracts/beacon-usage-v1.js.map +1 -0
  21. package/dist/_vendored-contracts/index.d.ts +29 -0
  22. package/dist/_vendored-contracts/index.d.ts.map +1 -1
  23. package/dist/_vendored-contracts/index.js.map +1 -1
  24. package/dist/_vendored-contracts/safe-skill-observation-v1.d.ts +149 -0
  25. package/dist/_vendored-contracts/safe-skill-observation-v1.d.ts.map +1 -0
  26. package/dist/_vendored-contracts/safe-skill-observation-v1.js +23 -0
  27. package/dist/_vendored-contracts/safe-skill-observation-v1.js.map +1 -0
  28. package/dist/_vendored-contracts/skill-distribution.d.ts +16 -0
  29. package/dist/_vendored-contracts/skill-distribution.d.ts.map +1 -1
  30. package/dist/_vendored-contracts/skill-distribution.js.map +1 -1
  31. package/dist/agent-forcing/claude-code-skill-v2.d.ts +4 -1
  32. package/dist/agent-forcing/claude-code-skill-v2.d.ts.map +1 -1
  33. package/dist/agent-forcing/claude-code-skill-v2.js +5 -6
  34. package/dist/agent-forcing/claude-code-skill-v2.js.map +1 -1
  35. package/dist/agent-forcing/forcing-rules.d.ts +0 -9
  36. package/dist/agent-forcing/forcing-rules.d.ts.map +1 -1
  37. package/dist/agent-forcing/forcing-rules.js +61 -9
  38. package/dist/agent-forcing/forcing-rules.js.map +1 -1
  39. package/dist/agent-forcing/injectors.d.ts.map +1 -1
  40. package/dist/agent-forcing/injectors.js +11 -0
  41. package/dist/agent-forcing/injectors.js.map +1 -1
  42. package/dist/agent-forcing/slash-commands.d.ts +49 -0
  43. package/dist/agent-forcing/slash-commands.d.ts.map +1 -0
  44. package/dist/agent-forcing/slash-commands.js +166 -0
  45. package/dist/agent-forcing/slash-commands.js.map +1 -0
  46. package/dist/beacon/apprentice-capabilities.d.ts +10 -0
  47. package/dist/beacon/apprentice-capabilities.d.ts.map +1 -0
  48. package/dist/beacon/apprentice-capabilities.js +34 -0
  49. package/dist/beacon/apprentice-capabilities.js.map +1 -0
  50. package/dist/checkup/dimension-1-usage.d.ts +8 -1
  51. package/dist/checkup/dimension-1-usage.d.ts.map +1 -1
  52. package/dist/checkup/dimension-1-usage.js +3 -2
  53. package/dist/checkup/dimension-1-usage.js.map +1 -1
  54. package/dist/checkup/dimension-2-context.d.ts +12 -0
  55. package/dist/checkup/dimension-2-context.d.ts.map +1 -0
  56. package/dist/checkup/dimension-2-context.js +56 -0
  57. package/dist/checkup/dimension-2-context.js.map +1 -0
  58. package/dist/checkup/dimension-5-behavior.d.ts +12 -0
  59. package/dist/checkup/dimension-5-behavior.d.ts.map +1 -0
  60. package/dist/checkup/dimension-5-behavior.js +40 -0
  61. package/dist/checkup/dimension-5-behavior.js.map +1 -0
  62. package/dist/checkup/dimension-6-injection.d.ts +41 -0
  63. package/dist/checkup/dimension-6-injection.d.ts.map +1 -0
  64. package/dist/checkup/dimension-6-injection.js +74 -0
  65. package/dist/checkup/dimension-6-injection.js.map +1 -0
  66. package/dist/checkup/index.d.ts +3 -0
  67. package/dist/checkup/index.d.ts.map +1 -1
  68. package/dist/checkup/index.js +3 -0
  69. package/dist/checkup/index.js.map +1 -1
  70. package/dist/checkup/last-report.d.ts +32 -0
  71. package/dist/checkup/last-report.d.ts.map +1 -0
  72. package/dist/checkup/last-report.js +91 -0
  73. package/dist/checkup/last-report.js.map +1 -0
  74. package/dist/checkup/report.d.ts +13 -1
  75. package/dist/checkup/report.d.ts.map +1 -1
  76. package/dist/checkup/report.js +5 -3
  77. package/dist/checkup/report.js.map +1 -1
  78. package/dist/forcing-cli.d.ts +1 -1
  79. package/dist/forcing-cli.d.ts.map +1 -1
  80. package/dist/forcing-cli.js +1 -52
  81. package/dist/forcing-cli.js.map +1 -1
  82. package/dist/guard/bin.js +0 -0
  83. package/dist/guard/prompt-context.d.ts +2 -2
  84. package/dist/guard/prompt-context.d.ts.map +1 -1
  85. package/dist/guard/prompt-context.js +16 -21
  86. package/dist/guard/prompt-context.js.map +1 -1
  87. package/dist/index.js +15 -8
  88. package/dist/index.js.map +1 -1
  89. package/dist/mcp/brain-client.d.ts.map +1 -1
  90. package/dist/mcp/brain-client.js +3 -0
  91. package/dist/mcp/brain-client.js.map +1 -1
  92. package/dist/mcp/index.d.ts +1 -0
  93. package/dist/mcp/index.d.ts.map +1 -1
  94. package/dist/mcp/index.js +5 -0
  95. package/dist/mcp/index.js.map +1 -1
  96. package/dist/mcp/tools/checkup.d.ts +17 -2
  97. package/dist/mcp/tools/checkup.d.ts.map +1 -1
  98. package/dist/mcp/tools/checkup.js +41 -3
  99. package/dist/mcp/tools/checkup.js.map +1 -1
  100. package/dist/mcp/tools/index.d.ts.map +1 -1
  101. package/dist/mcp/tools/index.js +42 -4
  102. package/dist/mcp/tools/index.js.map +1 -1
  103. package/dist/mcp/tools/install-module.d.ts +25 -0
  104. package/dist/mcp/tools/install-module.d.ts.map +1 -0
  105. package/dist/mcp/tools/install-module.js +87 -0
  106. package/dist/mcp/tools/install-module.js.map +1 -0
  107. package/dist/mcp/tools/send-daily-report.d.ts +29 -0
  108. package/dist/mcp/tools/send-daily-report.d.ts.map +1 -0
  109. package/dist/mcp/tools/send-daily-report.js +61 -0
  110. package/dist/mcp/tools/send-daily-report.js.map +1 -0
  111. package/dist/mcp/tools/setup-gateway.d.ts +2 -1
  112. package/dist/mcp/tools/setup-gateway.d.ts.map +1 -1
  113. package/dist/mcp/tools/setup-gateway.js +24 -6
  114. package/dist/mcp/tools/setup-gateway.js.map +1 -1
  115. package/dist/mcp/tools/setup-safe.d.ts +2 -0
  116. package/dist/mcp/tools/setup-safe.d.ts.map +1 -0
  117. package/dist/mcp/tools/setup-safe.js +2 -0
  118. package/dist/mcp/tools/setup-safe.js.map +1 -0
  119. package/dist/mcp-stdio/bin.js +0 -0
  120. package/dist/mcp-stdio/server.d.ts.map +1 -1
  121. package/dist/mcp-stdio/server.js +89 -1
  122. package/dist/mcp-stdio/server.js.map +1 -1
  123. package/dist/safe/index.d.ts +5 -0
  124. package/dist/safe/index.d.ts.map +1 -0
  125. package/dist/safe/index.js +9 -0
  126. package/dist/safe/index.js.map +1 -0
  127. package/dist/safe-cli.d.ts +8 -0
  128. package/dist/safe-cli.d.ts.map +1 -0
  129. package/dist/safe-cli.js +61 -0
  130. package/dist/safe-cli.js.map +1 -0
  131. package/dist/safe-observation/collector.d.ts +21 -0
  132. package/dist/safe-observation/collector.d.ts.map +1 -0
  133. package/dist/safe-observation/collector.js +101 -0
  134. package/dist/safe-observation/collector.js.map +1 -0
  135. package/dist/safe-observation/store.d.ts +34 -0
  136. package/dist/safe-observation/store.d.ts.map +1 -0
  137. package/dist/safe-observation/store.js +80 -0
  138. package/dist/safe-observation/store.js.map +1 -0
  139. package/dist/save-token/gateway-setup.d.ts +33 -3
  140. package/dist/save-token/gateway-setup.d.ts.map +1 -1
  141. package/dist/save-token/gateway-setup.js +165 -18
  142. package/dist/save-token/gateway-setup.js.map +1 -1
  143. package/dist/scheduler/brain-push-client.d.ts.map +1 -1
  144. package/dist/scheduler/brain-push-client.js +53 -3
  145. package/dist/scheduler/brain-push-client.js.map +1 -1
  146. package/dist/scheduler/types.d.ts +5 -0
  147. package/dist/scheduler/types.d.ts.map +1 -1
  148. package/dist/scheduler/types.js +3 -1
  149. package/dist/scheduler/types.js.map +1 -1
  150. package/dist/setup-safe.d.ts +20 -0
  151. package/dist/setup-safe.d.ts.map +1 -0
  152. package/dist/setup-safe.js +93 -0
  153. package/dist/setup-safe.js.map +1 -0
  154. package/dist/skill-installer/index.d.ts +9 -0
  155. package/dist/skill-installer/index.d.ts.map +1 -1
  156. package/dist/skill-installer/index.js +20 -1
  157. package/dist/skill-installer/index.js.map +1 -1
  158. package/dist/skill-runner/discovery.d.ts.map +1 -1
  159. package/dist/skill-runner/discovery.js +8 -5
  160. package/dist/skill-runner/discovery.js.map +1 -1
  161. package/dist/skill-tunnel/cli.d.ts.map +1 -1
  162. package/dist/skill-tunnel/cli.js +22 -0
  163. package/dist/skill-tunnel/cli.js.map +1 -1
  164. package/dist/skill-tunnel/client.d.ts +5 -0
  165. package/dist/skill-tunnel/client.d.ts.map +1 -1
  166. package/dist/skill-tunnel/client.js +2 -0
  167. package/dist/skill-tunnel/client.js.map +1 -1
  168. package/dist/skill-tunnel/local-bridge.d.ts +9 -0
  169. package/dist/skill-tunnel/local-bridge.d.ts.map +1 -1
  170. package/dist/skill-tunnel/local-bridge.js +24 -1
  171. package/dist/skill-tunnel/local-bridge.js.map +1 -1
  172. package/package.json +3 -3
@@ -0,0 +1,74 @@
1
+ // sdk/skillfm-local/src/checkup/dimension-6-injection.ts
2
+ //
3
+ // 维度 6F: token spike / skill behavior / tool description injection defense.
4
+ export const TOOL_DESC_BLACKLIST = [
5
+ { label: 'ignore previous instructions', pattern: /ignore\s+previous\s+instructions?/i, weight: 0.35 },
6
+ { label: 'system override', pattern: /system\s+override/i, weight: 0.32 },
7
+ { label: 'reveal system prompt', pattern: /reveal\s+.*system\s+prompt/i, weight: 0.33 },
8
+ { label: 'prompt injection', pattern: /prompt\s+injection/i, weight: 0.22 },
9
+ { label: 'bypass policy', pattern: /bypass\s+policy/i, weight: 0.28 },
10
+ { label: 'developer message leak', pattern: /developer\s+message/i, weight: 0.26 },
11
+ ];
12
+ export function detectTokenSpike(baseline, current, threshold = 0.5) {
13
+ if (baseline <= 0)
14
+ return null;
15
+ const spike = (current - baseline) / baseline;
16
+ if (spike < threshold)
17
+ return null;
18
+ return {
19
+ signal_type: 'token_spike',
20
+ severity: spike >= 1 ? 'critical' : 'warning',
21
+ confidence: Math.min(0.99, Math.round((0.65 + spike / 2) * 100) / 100),
22
+ summary: `token spike ${Math.round(spike * 100)}% (${baseline} → ${current})`,
23
+ recommendation: '暂停可疑 prompt source, 优先做 24h rollback',
24
+ matches: [`spike=${Math.round(spike * 100)}%`],
25
+ };
26
+ }
27
+ export function detectSkillBehaviorShift(baseline, current, threshold = 5) {
28
+ if (baseline <= 0)
29
+ return null;
30
+ const ratio = current / baseline;
31
+ if (ratio < threshold)
32
+ return null;
33
+ return {
34
+ signal_type: 'skill_behavior',
35
+ severity: ratio >= threshold * 2 ? 'critical' : 'warning',
36
+ confidence: Math.min(0.99, Math.round((0.55 + ratio / (threshold * 4)) * 100) / 100),
37
+ summary: `skill behavior ${ratio.toFixed(1)}x baseline (${baseline} → ${current})`,
38
+ recommendation: '暂停 outlier skill 并检查最近 invocation history',
39
+ matches: [`ratio=${ratio.toFixed(1)}x`],
40
+ };
41
+ }
42
+ export function detectToolDescriptionInjection(description) {
43
+ const matches = TOOL_DESC_BLACKLIST.filter((entry) => entry.pattern.test(description)).map((entry) => entry.label);
44
+ if (matches.length === 0)
45
+ return null;
46
+ const score = Math.min(1, matches.reduce((sum, match) => {
47
+ const entry = TOOL_DESC_BLACKLIST.find((item) => item.label === match);
48
+ return sum + (entry?.weight ?? 0);
49
+ }, 0));
50
+ return {
51
+ signal_type: 'tool_description',
52
+ severity: matches.length > 1 ? 'critical' : 'warning',
53
+ confidence: Math.round((0.6 + score) * 100) / 100,
54
+ summary: `${matches.length} tool description match${matches.length > 1 ? 'es' : ''}`,
55
+ recommendation: 'Quarantine the tool and review the prompt surface',
56
+ matches,
57
+ };
58
+ }
59
+ export function pickInjectionSignal(signals) {
60
+ const cleaned = signals.filter((signal) => Boolean(signal));
61
+ if (cleaned.length === 0)
62
+ return null;
63
+ return cleaned.sort((a, b) => {
64
+ if (a.severity !== b.severity)
65
+ return a.severity === 'critical' ? -1 : 1;
66
+ return b.confidence - a.confidence;
67
+ })[0] ?? null;
68
+ }
69
+ export function renderInjectionDefenseLine(signal) {
70
+ if (!signal)
71
+ return '6F 守: ✅ 暂无异常';
72
+ return `6F 守: ${signal.severity === 'critical' ? '🔴' : '🟠'} ${signal.summary} → ${signal.recommendation}`;
73
+ }
74
+ //# sourceMappingURL=dimension-6-injection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dimension-6-injection.js","sourceRoot":"","sources":["../../src/checkup/dimension-6-injection.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,9 @@ export { checkDimensionUsage, buildUsageSurfaceLines } from './dimension-1-usage
6
6
  export type { UsageDimDeps } from './dimension-1-usage.js';
7
7
  export { checkDimensionFiles, executeFileCleanup } from './dimension-3-files.js';
8
8
  export { checkDimensionContext } from './dimension-4-context.js';
9
+ export { buildContextCleanupPlan } from './dimension-2-context.js';
10
+ export { buildBehaviorResetPlan } from './dimension-5-behavior.js';
11
+ export { detectTokenSpike, detectSkillBehaviorShift, detectToolDescriptionInjection, pickInjectionSignal, renderInjectionDefenseLine, } from './dimension-6-injection.js';
9
12
  export { renderDailyPush, renderAnomalyPush, shouldPushRealtimeAnomaly, pushTimeToCron, DEFAULT_PUSH_CONFIG, } from './daily-push.js';
10
13
  export type { DailyPushConfig, PushTime } from './daily-push.js';
11
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/checkup/index.ts"],"names":[],"mappings":"AAIA,YAAY,EACV,WAAW,EACX,QAAQ,EACR,OAAO,EACP,eAAe,EACf,aAAa,EACb,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC1D,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrF,YAAY,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,yBAAyB,EACzB,cAAc,EACd,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/checkup/index.ts"],"names":[],"mappings":"AAIA,YAAY,EACV,WAAW,EACX,QAAQ,EACR,OAAO,EACP,eAAe,EACf,aAAa,EACb,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC1D,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrF,YAAY,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,8BAA8B,EAC9B,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,yBAAyB,EACzB,cAAc,EACd,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC"}
@@ -6,5 +6,8 @@ export { computeHealthScore, selectTopFocus, computeTrend, loadHealthHistory, ap
6
6
  export { checkDimensionUsage, buildUsageSurfaceLines } from './dimension-1-usage.js';
7
7
  export { checkDimensionFiles, executeFileCleanup } from './dimension-3-files.js';
8
8
  export { checkDimensionContext } from './dimension-4-context.js';
9
+ export { buildContextCleanupPlan } from './dimension-2-context.js';
10
+ export { buildBehaviorResetPlan } from './dimension-5-behavior.js';
11
+ export { detectTokenSpike, detectSkillBehaviorShift, detectToolDescriptionInjection, pickInjectionSignal, renderInjectionDefenseLine, } from './dimension-6-injection.js';
9
12
  export { renderDailyPush, renderAnomalyPush, shouldPushRealtimeAnomaly, pushTimeToCron, DEFAULT_PUSH_CONFIG, } from './daily-push.js';
10
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/checkup/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,EAAE;AACF,sBAAsB;AAUtB,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE1D,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAErF,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,yBAAyB,EACzB,cAAc,EACd,mBAAmB,GACpB,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/checkup/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,EAAE;AACF,sBAAsB;AAUtB,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE1D,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAErF,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,8BAA8B,EAC9B,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,yBAAyB,EACzB,cAAc,EACd,mBAAmB,GACpB,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,32 @@
1
+ export interface LastReportRecord {
2
+ /** ISO timestamp of the most recent report (manual /skillfm OR daily cron). */
3
+ last_report_at: string;
4
+ /** What triggered the last report — useful for telemetry / debugging. */
5
+ trigger: 'manual_slash_command' | 'daily_cron' | 'unknown';
6
+ /** Schema version, for future migrations. */
7
+ schema_version: 1;
8
+ }
9
+ export declare function lastReportFilePath(): string;
10
+ /**
11
+ * Read the last-report record. Returns null if not present (caller should
12
+ * fall back to a sensible default like 24h ago).
13
+ */
14
+ export declare function readLastReport(): Promise<LastReportRecord | null>;
15
+ /**
16
+ * Write the last-report record. Caller usually does this right after
17
+ * surfacing the report rendered text.
18
+ */
19
+ export declare function writeLastReport(record: Omit<LastReportRecord, 'schema_version'>): Promise<void>;
20
+ /**
21
+ * Resolve the "since" cutoff for the manual scan: prior last_report_at if
22
+ * present, otherwise (now - DEFAULT_FALLBACK_HOURS).
23
+ */
24
+ export declare function resolveSinceCutoff(now?: Date): Promise<Date>;
25
+ /** Compute hours-since-last-report (rounded up to integer for sinceHours arg). */
26
+ export declare function hoursSince(since: Date, now?: Date): number;
27
+ /**
28
+ * Render a short human-readable scan-window line for the report header,
29
+ * e.g. "扫描期间: 2026-05-09 04:30 ~ 2026-05-09 09:15 UTC (4h45m)".
30
+ */
31
+ export declare function renderScanWindowLine(since: Date, now?: Date): string;
32
+ //# sourceMappingURL=last-report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"last-report.d.ts","sourceRoot":"","sources":["../../src/checkup/last-report.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,gBAAgB;IAC/B,+EAA+E;IAC/E,cAAc,EAAE,MAAM,CAAC;IACvB,yEAAyE;IACzE,OAAO,EAAE,sBAAsB,GAAG,YAAY,GAAG,SAAS,CAAC;IAC3D,6CAA6C;IAC7C,cAAc,EAAE,CAAC,CAAC;CACnB;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAgBvE;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAMrG;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,GAAE,IAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAO9E;AAED,kFAAkF;AAClF,wBAAgB,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,GAAE,IAAiB,GAAG,MAAM,CAKtE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,GAAE,IAAiB,GAAG,MAAM,CAQhF"}
@@ -0,0 +1,91 @@
1
+ // sdk/skillfm-local/src/checkup/last-report.ts
2
+ //
3
+ // Sidecar-local persistence for "last Beacon report" timestamp. Used by
4
+ // `/skillfm` slash command flow and the `since_last_report` checkup option:
5
+ // the manual scan covers the period since the previous report.
6
+ //
7
+ // Stored as `~/.skillfm/last-report.json`. BYOK-safe: stays on the user's
8
+ // node, never travels to the server.
9
+ import { promises as fs, existsSync } from 'node:fs';
10
+ import path from 'node:path';
11
+ import { homedir } from 'node:os';
12
+ // Resolve paths lazily so test harnesses can rebase $HOME between cases.
13
+ function skillfmDir() {
14
+ return path.join(homedir(), '.skillfm');
15
+ }
16
+ function lastReportFile() {
17
+ return path.join(skillfmDir(), 'last-report.json');
18
+ }
19
+ /** Default fallback window when no prior report exists: 24h ago. */
20
+ const DEFAULT_FALLBACK_HOURS = 24;
21
+ export function lastReportFilePath() {
22
+ return lastReportFile();
23
+ }
24
+ /**
25
+ * Read the last-report record. Returns null if not present (caller should
26
+ * fall back to a sensible default like 24h ago).
27
+ */
28
+ export async function readLastReport() {
29
+ if (!existsSync(lastReportFile()))
30
+ return null;
31
+ try {
32
+ const raw = await fs.readFile(lastReportFile(), 'utf-8');
33
+ const parsed = JSON.parse(raw);
34
+ if (typeof parsed.last_report_at !== 'string' || !parsed.last_report_at) {
35
+ return null;
36
+ }
37
+ return {
38
+ last_report_at: parsed.last_report_at,
39
+ trigger: parsed.trigger ?? 'unknown',
40
+ schema_version: 1,
41
+ };
42
+ }
43
+ catch {
44
+ return null;
45
+ }
46
+ }
47
+ /**
48
+ * Write the last-report record. Caller usually does this right after
49
+ * surfacing the report rendered text.
50
+ */
51
+ export async function writeLastReport(record) {
52
+ if (!existsSync(skillfmDir())) {
53
+ await fs.mkdir(skillfmDir(), { recursive: true, mode: 0o700 });
54
+ }
55
+ const body = { ...record, schema_version: 1 };
56
+ await fs.writeFile(lastReportFile(), JSON.stringify(body, null, 2), { encoding: 'utf-8', mode: 0o600 });
57
+ }
58
+ /**
59
+ * Resolve the "since" cutoff for the manual scan: prior last_report_at if
60
+ * present, otherwise (now - DEFAULT_FALLBACK_HOURS).
61
+ */
62
+ export async function resolveSinceCutoff(now = new Date()) {
63
+ const prior = await readLastReport();
64
+ if (prior) {
65
+ const t = Date.parse(prior.last_report_at);
66
+ if (Number.isFinite(t))
67
+ return new Date(t);
68
+ }
69
+ return new Date(now.getTime() - DEFAULT_FALLBACK_HOURS * 60 * 60 * 1000);
70
+ }
71
+ /** Compute hours-since-last-report (rounded up to integer for sinceHours arg). */
72
+ export function hoursSince(since, now = new Date()) {
73
+ const ms = Math.max(0, now.getTime() - since.getTime());
74
+ const h = ms / (60 * 60 * 1000);
75
+ // Round up so we err on the side of including the entire period.
76
+ return Math.max(1, Math.ceil(h));
77
+ }
78
+ /**
79
+ * Render a short human-readable scan-window line for the report header,
80
+ * e.g. "扫描期间: 2026-05-09 04:30 ~ 2026-05-09 09:15 UTC (4h45m)".
81
+ */
82
+ export function renderScanWindowLine(since, now = new Date()) {
83
+ const fmt = (d) => d.toISOString().replace('T', ' ').replace(/:\d\d\.\d{3}Z$/, ' UTC');
84
+ const ms = Math.max(0, now.getTime() - since.getTime());
85
+ const totalMin = Math.floor(ms / 60000);
86
+ const h = Math.floor(totalMin / 60);
87
+ const m = totalMin % 60;
88
+ const span = h > 0 ? `${h}h${m}m` : `${m}m`;
89
+ return `扫描期间: ${fmt(since)} ~ ${fmt(now)} (${span})`;
90
+ }
91
+ //# sourceMappingURL=last-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"last-report.js","sourceRoot":"","sources":["../../src/checkup/last-report.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,8 @@
1
- import type { LocalUsageStore } from '../usage-local/store.js';
1
+ import type { LocalUsageStore, UsageQuery } from '../usage-local/store.js';
2
2
  import type { ReconciliationEngine } from '../reconciliation/index.js';
3
3
  import type { CheckupReport } from './types.js';
4
+ import { checkDimensionFiles } from './dimension-3-files.js';
5
+ import { checkDimensionContext } from './dimension-4-context.js';
4
6
  export interface CheckupDeps {
5
7
  store: LocalUsageStore;
6
8
  reconciliationEngine: ReconciliationEngine;
@@ -8,6 +10,16 @@ export interface CheckupDeps {
8
10
  is_pro: boolean;
9
11
  /** 跳过 history 写入 (测试用) */
10
12
  skip_persist?: boolean;
13
+ /** 测试/调用方可覆盖文件维度实现,避免扫真实 HOME。 */
14
+ checkDimensionFiles?: typeof checkDimensionFiles;
15
+ /** 测试/调用方可覆盖上下文维度实现,避免扫真实 HOME。 */
16
+ checkDimensionContext?: typeof checkDimensionContext;
17
+ /**
18
+ * Override the usage-aggregation window for dimension 1. Used by the
19
+ * `/skillfm` flow (since_last_report) to make the manual scan reflect the
20
+ * period since the previous report. Default: `timeWindow('today')`.
21
+ */
22
+ usageWindow?: UsageQuery;
11
23
  }
12
24
  /**
13
25
  * 主入口 — 跑一次全 5 维度体检 → CheckupReport
@@ -1 +1 @@
1
- {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/checkup/report.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAEvE,OAAO,KAAK,EAAE,aAAa,EAAmB,MAAM,YAAY,CAAC;AAWjE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,eAAe,CAAC;IACvB,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,wBAAwB;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,0BAA0B;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAgE1E;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CA0D7D"}
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/checkup/report.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAEvE,OAAO,KAAK,EAAE,aAAa,EAAmB,MAAM,YAAY,CAAC;AAEjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAQjE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,eAAe,CAAC;IACvB,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,wBAAwB;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,0BAA0B;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,kCAAkC;IAClC,mBAAmB,CAAC,EAAE,OAAO,mBAAmB,CAAC;IACjD,mCAAmC;IACnC,qBAAqB,CAAC,EAAE,OAAO,qBAAqB,CAAC;IACrD;;;;OAIG;IACH,WAAW,CAAC,EAAE,UAAU,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAkE1E;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CA0D7D"}
@@ -11,16 +11,18 @@ import { computeHealthScore, selectTopFocus, computeTrend, appendHealthSnapshot,
11
11
  */
12
12
  export async function runCheckup(deps) {
13
13
  const generated_at = new Date().toISOString();
14
- // 维度 1: 用量 (含 reconciliation)
14
+ // 维度 1: 用量 (含 reconciliation). Pass through usageWindow when caller
15
+ // wants the manual /skillfm time-window (since_last_report) to apply.
15
16
  const reconciliations = await deps.reconciliationEngine.reconcileAll();
16
17
  const usage = checkDimensionUsage({
17
18
  store: deps.store,
18
19
  reconciliations,
20
+ usageWindow: deps.usageWindow,
19
21
  });
20
22
  // 维度 3: 文件 (并行扫)
21
- const files = await checkDimensionFiles();
23
+ const files = await (deps.checkDimensionFiles ?? checkDimensionFiles)();
22
24
  // 维度 4: 上下文
23
- const context = await checkDimensionContext();
25
+ const context = await (deps.checkDimensionContext ?? checkDimensionContext)();
24
26
  // 维度 2: 技术债 (Pro 锁, MVP 不做)
25
27
  const tech_debt = {
26
28
  dimension: 'tech_debt',
@@ -1 +1 @@
1
- {"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/checkup/report.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/checkup/report.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export declare function cmdForcing(): Promise<void>;
1
+ export { cmdSafe as cmdForcing } from './safe-cli.js';
2
2
  //# sourceMappingURL=forcing-cli.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"forcing-cli.d.ts","sourceRoot":"","sources":["../src/forcing-cli.ts"],"names":[],"mappings":"AAeA,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAsChD"}
1
+ {"version":3,"file":"forcing-cli.d.ts","sourceRoot":"","sources":["../src/forcing-cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,eAAe,CAAC"}
@@ -1,53 +1,2 @@
1
- // sdk/skillfm-local/src/forcing-cli.ts
2
- //
3
- // CLI: npx @skillfm/local forcing <subcommand>
4
- // detect — 仅检测各 harness, 不真改
5
- // inject — 真注入 SKILLFM-AGENT-GUIDE block 到检测到的 harness
6
- // uninstall — 移除已注入的 block
7
- //
8
- // 这是用户手动控制 agent forcing 的 CLI fallback (sidecar 启动时也会自动跑 inject).
9
- import { detectAllHarnesses, injectAllDetected, removeAllInjections, } from './agent-forcing/index.js';
10
- export async function cmdForcing() {
11
- const sub = process.argv[3] ?? 'detect';
12
- if (sub === 'detect') {
13
- const detections = await detectAllHarnesses();
14
- console.log('🤖 SkillFM Agent Forcing — Detection');
15
- console.log('━━━━━━━━━━━━━━━━━━━━━━━━');
16
- for (const d of detections) {
17
- const status = !d.detected ? '❌ 未装'
18
- : d.already_injected ? '✅ 已注入'
19
- : '⚠️ 未注入';
20
- console.log(` ${d.harness}: ${status}${d.inject_path ? ` (${d.inject_path})` : ''}`);
21
- }
22
- }
23
- else if (sub === 'inject') {
24
- const results = await injectAllDetected({});
25
- console.log('🤖 SkillFM Agent Forcing — Inject');
26
- console.log('━━━━━━━━━━━━━━━━━━━━━━━━');
27
- for (const r of results) {
28
- if (r.applied) {
29
- console.log(` ✅ ${r.harness}: 注入 ${r.bytes_injected} 字节 → ${r.inject_path}`);
30
- if (r.revert_command)
31
- console.log(` 回滚: ${r.revert_command}`);
32
- }
33
- else {
34
- console.log(` ⚠️ ${r.harness}: ${r.error ?? 'skip'}`);
35
- }
36
- }
37
- }
38
- else if (sub === 'uninstall') {
39
- const results = await removeAllInjections();
40
- console.log('🗑 SkillFM Agent Forcing — Uninstall');
41
- console.log('━━━━━━━━━━━━━━━━━━━━━━━━');
42
- for (const r of results) {
43
- console.log(r.applied ? ` ✅ ${r.harness}: 移除完成` : ` ⚠️ ${r.harness}: ${r.error ?? 'no block'}`);
44
- }
45
- }
46
- else {
47
- console.error(`Unknown forcing subcommand: ${sub}`);
48
- console.error('Usage: skillfm-local forcing <detect|inject|uninstall>');
49
- process.exit(1);
50
- }
51
- process.exit(0);
52
- }
1
+ export { cmdSafe as cmdForcing } from './safe-cli.js';
53
2
  //# sourceMappingURL=forcing-cli.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"forcing-cli.js","sourceRoot":"","sources":["../src/forcing-cli.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,EAAE;AACF,+CAA+C;AAC/C,qCAAqC;AACrC,+DAA+D;AAC/D,gCAAgC;AAChC,EAAE;AACF,mEAAmE;AAEnE,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAElC,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC;IAExC,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrB,MAAM,UAAU,GAAG,MAAM,kBAAkB,EAAE,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM;gBACjC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO;oBAC9B,CAAC,CAAC,QAAQ,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,KAAK,MAAM,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;SAAM,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,OAAO,QAAQ,CAAC,CAAC,cAAc,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC9E,IAAI,CAAC,CAAC,cAAc;oBAAE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;YACpE,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,KAAK,IAAI,MAAM,EAAE,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;IACH,CAAC;SAAM,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,MAAM,mBAAmB,EAAE,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,KAAK,IAAI,UAAU,EAAE,CAAC,CAAC;QACpG,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,+BAA+B,GAAG,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"forcing-cli.js","sourceRoot":"","sources":["../src/forcing-cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,eAAe,CAAC"}
package/dist/guard/bin.js CHANGED
File without changes
@@ -15,11 +15,11 @@
15
15
  */
16
16
  export interface MatchedIntent {
17
17
  /** Which SkillFM tool the agent should reach for first. */
18
- primary_tool: 'skillfm_checkup' | 'skillfm_show_my_usage' | 'skillfm_explain_provider_key' | 'skillfm_setup_gateway';
18
+ primary_tool: 'skillfm_checkup' | 'skillfm_show_my_usage' | 'skillfm_show_save_recommendations' | 'skillfm_show_apprentice_skill' | 'skillfm_diagnose_slow';
19
19
  /** The keyword phrase that matched (for explanation in the hint). */
20
20
  matched_phrase: string;
21
21
  /** Rough categorization for analytics; not surfaced in hint. */
22
- category: 'health' | 'usage' | 'byok' | 'install';
22
+ category: 'health' | 'usage' | 'savings' | 'side_hustle' | 'performance';
23
23
  }
24
24
  /**
25
25
  * Scan a user prompt for the highest-priority SkillFM trigger.
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-context.d.ts","sourceRoot":"","sources":["../../src/guard/prompt-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,MAAM,WAAW,aAAa;IAC5B,2DAA2D;IAC3D,YAAY,EACR,iBAAiB,GACjB,uBAAuB,GACvB,8BAA8B,GAC9B,uBAAuB,CAAC;IAC5B,qEAAqE;IACrE,cAAc,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,QAAQ,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;CACnD;AAqCD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAajE;AAiBD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAQxD;AAMD,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI,CAQ1E"}
1
+ {"version":3,"file":"prompt-context.d.ts","sourceRoot":"","sources":["../../src/guard/prompt-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,MAAM,WAAW,aAAa;IAC5B,2DAA2D;IAC3D,YAAY,EACR,iBAAiB,GACjB,uBAAuB,GACvB,mCAAmC,GACnC,+BAA+B,GAC/B,uBAAuB,CAAC;IAC5B,qEAAqE;IACrE,cAAc,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,QAAQ,EAAE,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,aAAa,GAAG,aAAa,CAAC;CAC1E;AA+BD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAajE;AAmBD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAQxD;AAMD,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI,CAQ1E"}
@@ -18,28 +18,22 @@ const TRIGGER_RULES = [
18
18
  { pattern: /体检|健康度|我家\s*AI|AI\s*状态|checkup|health\s*check|dashboard\b|my\s*AI/i,
19
19
  primary_tool: 'skillfm_checkup',
20
20
  category: 'health' },
21
- { pattern: /AI\s*(感觉|有点|这两天)\s*慢|怎么\s*(感觉|这么|这种)\s*慢|AI\s*怎么了/i,
22
- primary_tool: 'skillfm_checkup',
23
- category: 'health' },
24
21
  // usage / cost
25
- { pattern: /用了\s*多少\s*token|花了\s*多少|多少\s*钱|哪\s*能\s*省|想\s*省|怎么\s*省|账单.{0,8}(多|高|贵)|usage|billing|how\s*much/i,
26
- primary_tool: 'skillfm_show_my_usage',
27
- category: 'usage' },
28
- { pattern: /换\s*便宜|cascading|router\b|路由/i,
22
+ { pattern: /用了\s*多少\s*token|花了\s*多少|多少\s*钱|账单.{0,8}(多|高|贵)|usage|billing|how\s*much/i,
29
23
  primary_tool: 'skillfm_show_my_usage',
30
24
  category: 'usage' },
31
- // BYOK
32
- { pattern: /API\s*key|api[\s-]?key|OpenAI\s*key|Anthropic\s*key|DeepSeek\s*key|给\s*你\s*key|存\s*key|sk-(?:admin-|ant-)?[a-z0-9]/i,
33
- primary_tool: 'skillfm_explain_provider_key',
34
- category: 'byok' },
35
- // install / setup
36
- { pattern: /(接入|装|配置)\s*SkillFM|setup\s*SkillFM|install\s*SkillFM|怎么\s*接\s*SkillFM/i,
37
- primary_tool: 'skillfm_setup_gateway',
38
- category: 'install' },
39
- // bare SkillFM mention — fall back to checkup as the safest entry
40
- { pattern: /SkillFM/i,
41
- primary_tool: 'skillfm_checkup',
42
- category: 'health' },
25
+ // savings / optimize cost
26
+ { pattern: /省\s*token|怎么\s*便宜|便宜|哪儿?\s*能\s*省|太贵了|烧太多|save\s*token/i,
27
+ primary_tool: 'skillfm_show_save_recommendations',
28
+ category: 'savings' },
29
+ // side hustle / Apprentice
30
+ { pattern: /副业|兼职|freelance|我想做点啥|赚钱|变现/i,
31
+ primary_tool: 'skillfm_show_apprentice_skill',
32
+ category: 'side_hustle' },
33
+ // performance / slow
34
+ { pattern: /慢|卡|反应慢|跑得慢|lag|越来越慢/i,
35
+ primary_tool: 'skillfm_diagnose_slow',
36
+ category: 'performance' },
43
37
  ];
44
38
  /**
45
39
  * Scan a user prompt for the highest-priority SkillFM trigger.
@@ -66,8 +60,9 @@ export function detectIntent(prompt) {
66
60
  const TOOL_HINTS = {
67
61
  skillfm_checkup: 'Call `skillfm_checkup` for the snapshot — show its `rendered` field directly. Do NOT replace with `curl /status` or generic exec.',
68
62
  skillfm_show_my_usage: 'Call `skillfm_show_my_usage` with the matching window (today/week/month). Show the `rendered` field directly with all the ¥ numbers; do not paraphrase.',
69
- skillfm_explain_provider_key: 'Call `skillfm_explain_provider_key` BEFORE accepting any API key from the user show them risk level, scope, and revoke URL first. Then `skillfm_save_credential`.',
70
- skillfm_setup_gateway: 'Call `skillfm_setup_gateway` with `{dry_run: true}` first to surface the planned IDE config changes; only call `{dry_run: false}` after the user confirms.',
63
+ skillfm_show_save_recommendations: 'Call `skillfm_show_save_recommendations` first; show the top savings and the smallest safe move, not a generic pep talk.',
64
+ skillfm_show_apprentice_skill: 'Call `skillfm_show_apprentice_skill` and keep the prompt short so the user sees concrete skill directions quickly.',
65
+ skillfm_diagnose_slow: 'Call `skillfm_diagnose_slow` and route into checkup data; do not guess at the reason from memory.',
71
66
  };
72
67
  /**
73
68
  * Render the system-context hint that Claude Code will prepend to the user
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-context.js","sourceRoot":"","sources":["../../src/guard/prompt-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAyBH,MAAM,aAAa,GAAkB;IACnC,mBAAmB;IACnB,EAAE,OAAO,EAAE,oEAAoE;QAC7E,YAAY,EAAE,iBAAiB;QAC/B,QAAQ,EAAE,QAAQ,EAAE;IACtB,EAAE,OAAO,EAAE,oDAAoD;QAC7D,YAAY,EAAE,iBAAiB;QAC/B,QAAQ,EAAE,QAAQ,EAAE;IACtB,eAAe;IACf,EAAE,OAAO,EAAE,iGAAiG;QAC1G,YAAY,EAAE,uBAAuB;QACrC,QAAQ,EAAE,OAAO,EAAE;IACrB,EAAE,OAAO,EAAE,+BAA+B;QACxC,YAAY,EAAE,uBAAuB;QACrC,QAAQ,EAAE,OAAO,EAAE;IACrB,OAAO;IACP,EAAE,OAAO,EAAE,qHAAqH;QAC9H,YAAY,EAAE,8BAA8B;QAC5C,QAAQ,EAAE,MAAM,EAAE;IACpB,kBAAkB;IAClB,EAAE,OAAO,EAAE,yEAAyE;QAClF,YAAY,EAAE,uBAAuB;QACrC,QAAQ,EAAE,SAAS,EAAE;IACvB,kEAAkE;IAClE,EAAE,OAAO,EAAE,UAAU;QACnB,YAAY,EAAE,iBAAiB;QAC/B,QAAQ,EAAE,QAAQ,EAAE;CACvB,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACvD,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,EAAE,CAAC;YACN,OAAO;gBACL,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC;gBACpB,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACxB,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E,MAAM,UAAU,GAAkD;IAChE,eAAe,EACb,mIAAmI;IACrI,qBAAqB,EACnB,yJAAyJ;IAC3J,4BAA4B,EAC1B,qKAAqK;IACvK,qBAAqB,EACnB,4JAA4J;CAC/J,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,MAAqB;IAC9C,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC/C,OAAO;QACL,wCAAwC,MAAM,CAAC,cAAc,MAAM;QACnE,GAAG,MAAM,GAAG;QACZ,0EAA0E;QAC1E,2BAA2B;KAC5B,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACb,CAAC;AAYD;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,OAA2B;IACzD,MAAM,MAAM,GACV,CAAC,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;QACtD,CAAC,OAAO,OAAO,CAAC,WAAW,KAAK,QAAQ,IAAI,OAAO,CAAC,WAAW,CAAC;QAChE,EAAE,CAAC;IACL,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC"}
1
+ {"version":3,"file":"prompt-context.js","sourceRoot":"","sources":["../../src/guard/prompt-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AA0BH,MAAM,aAAa,GAAkB;IACnC,mBAAmB;IACnB,EAAE,OAAO,EAAE,oEAAoE;QAC7E,YAAY,EAAE,iBAAiB;QAC/B,QAAQ,EAAE,QAAQ,EAAE;IACtB,eAAe;IACf,EAAE,OAAO,EAAE,0EAA0E;QACnF,YAAY,EAAE,uBAAuB;QACrC,QAAQ,EAAE,OAAO,EAAE;IACrB,0BAA0B;IAC1B,EAAE,OAAO,EAAE,wDAAwD;QACjE,YAAY,EAAE,mCAAmC;QACjD,QAAQ,EAAE,SAAS,EAAE;IACvB,2BAA2B;IAC3B,EAAE,OAAO,EAAE,8BAA8B;QACvC,YAAY,EAAE,+BAA+B;QAC7C,QAAQ,EAAE,aAAa,EAAE;IAC3B,qBAAqB;IACrB,EAAE,OAAO,EAAE,uBAAuB;QAChC,YAAY,EAAE,uBAAuB;QACrC,QAAQ,EAAE,aAAa,EAAE;CAC5B,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACvD,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,EAAE,CAAC;YACN,OAAO;gBACL,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC;gBACpB,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACxB,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E,MAAM,UAAU,GAAkD;IAChE,eAAe,EACb,mIAAmI;IACrI,qBAAqB,EACnB,yJAAyJ;IAC3J,iCAAiC,EAC/B,0HAA0H;IAC5H,6BAA6B,EAC3B,oHAAoH;IACtH,qBAAqB,EACnB,mGAAmG;CACtG,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,MAAqB;IAC9C,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC/C,OAAO;QACL,wCAAwC,MAAM,CAAC,cAAc,MAAM;QACnE,GAAG,MAAM,GAAG;QACZ,0EAA0E;QAC1E,2BAA2B;KAC5B,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACb,CAAC;AAYD;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,OAA2B;IACzD,MAAM,MAAM,GACV,CAAC,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;QACtD,CAAC,OAAO,OAAO,CAAC,WAAW,KAAK,QAAQ,IAAI,OAAO,CAAC,WAAW,CAAC;QAChE,EAAE,CAAC;IACL,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC"}
package/dist/index.js CHANGED
@@ -1371,14 +1371,14 @@ async function cmdStart() {
1371
1371
  }));
1372
1372
  });
1373
1373
  }
1374
- // V1.4 — Agent Forcing auto-inject (Eric 反馈: install 时就该写 forcing block)
1374
+ // V1.4 — SAFE auto-inject (Eric 反馈: install 时就该写 context block)
1375
1375
  // 解决 agent (尤其 MiniMax 类弱 instruction following) 不调 SkillFM MCP tool 的核心问题
1376
1376
  // 检测各 harness workspace files + 写 SKILLFM-AGENT-GUIDE marker block
1377
1377
  // 已注入的会 detect + skip / 升级时 replace block
1378
1378
  // fire-and-forget; 失败不阻塞 sidecar
1379
1379
  void (async () => {
1380
1380
  try {
1381
- const { injectAllDetected } = await import('./agent-forcing/index.js');
1381
+ const { injectAllDetected } = await import('./safe/index.js');
1382
1382
  const results = await injectAllDetected({
1383
1383
  sidecar_url: url,
1384
1384
  version: PKG_VERSION,
@@ -1387,14 +1387,14 @@ async function cmdStart() {
1387
1387
  if (applied.length > 0) {
1388
1388
  console.error(JSON.stringify({
1389
1389
  ok: true,
1390
- agent_forcing_injected: applied.map((r) => ({ harness: r.harness, path: r.inject_path })),
1390
+ safe_context_injected: applied.map((r) => ({ harness: r.harness, path: r.inject_path })),
1391
1391
  }));
1392
1392
  }
1393
1393
  }
1394
1394
  catch (err) {
1395
1395
  console.error(JSON.stringify({
1396
1396
  ok: false,
1397
- agent_forcing_failed: err.message,
1397
+ safe_context_failed: err.message,
1398
1398
  }));
1399
1399
  }
1400
1400
  })();
@@ -1550,11 +1550,18 @@ const main = async () => {
1550
1550
  await cmdCheckup();
1551
1551
  break;
1552
1552
  }
1553
+ case 'safe':
1553
1554
  case 'forcing': {
1554
- // V1.4 — Agent forcing 一键配 (CLI fallback)
1555
- // 用户可手动 `npx skillfm-local forcing inject` / `forcing detect` / `forcing uninstall`
1556
- const { cmdForcing } = await import('./forcing-cli.js');
1557
- await cmdForcing();
1555
+ // V1.4 — SAFE 一键配 (CLI fallback)
1556
+ // 用户可手动 `npx skillfm-local safe inject` / `safe detect` / `safe uninstall`
1557
+ // `forcing` 仍保留为兼容别名。
1558
+ const { cmdSafe, cmdForcing } = await import('./safe-cli.js');
1559
+ if (sub === 'forcing') {
1560
+ await cmdForcing();
1561
+ }
1562
+ else {
1563
+ await cmdSafe();
1564
+ }
1558
1565
  break;
1559
1566
  }
1560
1567
  case 'skill': {