@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.
- package/dist/_vendored-contracts/beacon-assets-v1.d.ts +160 -0
- package/dist/_vendored-contracts/beacon-assets-v1.d.ts.map +1 -0
- package/dist/_vendored-contracts/beacon-assets-v1.js +29 -0
- package/dist/_vendored-contracts/beacon-assets-v1.js.map +1 -0
- package/dist/_vendored-contracts/beacon-mcp-tools-v1.d.ts +373 -0
- package/dist/_vendored-contracts/beacon-mcp-tools-v1.d.ts.map +1 -0
- package/dist/_vendored-contracts/beacon-mcp-tools-v1.js +131 -0
- package/dist/_vendored-contracts/beacon-mcp-tools-v1.js.map +1 -0
- package/dist/_vendored-contracts/beacon-preferences-v1.d.ts +68 -0
- package/dist/_vendored-contracts/beacon-preferences-v1.d.ts.map +1 -0
- package/dist/_vendored-contracts/beacon-preferences-v1.js +26 -0
- package/dist/_vendored-contracts/beacon-preferences-v1.js.map +1 -0
- package/dist/_vendored-contracts/beacon-rule-protocol-v1.d.ts +208 -0
- package/dist/_vendored-contracts/beacon-rule-protocol-v1.d.ts.map +1 -0
- package/dist/_vendored-contracts/beacon-rule-protocol-v1.js +25 -0
- package/dist/_vendored-contracts/beacon-rule-protocol-v1.js.map +1 -0
- package/dist/_vendored-contracts/beacon-usage-v1.d.ts +88 -0
- package/dist/_vendored-contracts/beacon-usage-v1.d.ts.map +1 -0
- package/dist/_vendored-contracts/beacon-usage-v1.js +27 -0
- package/dist/_vendored-contracts/beacon-usage-v1.js.map +1 -0
- package/dist/_vendored-contracts/index.d.ts +29 -0
- package/dist/_vendored-contracts/index.d.ts.map +1 -1
- package/dist/_vendored-contracts/index.js.map +1 -1
- package/dist/_vendored-contracts/safe-skill-observation-v1.d.ts +149 -0
- package/dist/_vendored-contracts/safe-skill-observation-v1.d.ts.map +1 -0
- package/dist/_vendored-contracts/safe-skill-observation-v1.js +23 -0
- package/dist/_vendored-contracts/safe-skill-observation-v1.js.map +1 -0
- package/dist/_vendored-contracts/skill-distribution.d.ts +16 -0
- package/dist/_vendored-contracts/skill-distribution.d.ts.map +1 -1
- package/dist/_vendored-contracts/skill-distribution.js.map +1 -1
- package/dist/agent-forcing/claude-code-skill-v2.d.ts +4 -1
- package/dist/agent-forcing/claude-code-skill-v2.d.ts.map +1 -1
- package/dist/agent-forcing/claude-code-skill-v2.js +5 -6
- package/dist/agent-forcing/claude-code-skill-v2.js.map +1 -1
- package/dist/agent-forcing/forcing-rules.d.ts +0 -9
- package/dist/agent-forcing/forcing-rules.d.ts.map +1 -1
- package/dist/agent-forcing/forcing-rules.js +61 -9
- package/dist/agent-forcing/forcing-rules.js.map +1 -1
- package/dist/agent-forcing/injectors.d.ts.map +1 -1
- package/dist/agent-forcing/injectors.js +11 -0
- package/dist/agent-forcing/injectors.js.map +1 -1
- package/dist/agent-forcing/slash-commands.d.ts +49 -0
- package/dist/agent-forcing/slash-commands.d.ts.map +1 -0
- package/dist/agent-forcing/slash-commands.js +166 -0
- package/dist/agent-forcing/slash-commands.js.map +1 -0
- package/dist/beacon/apprentice-capabilities.d.ts +10 -0
- package/dist/beacon/apprentice-capabilities.d.ts.map +1 -0
- package/dist/beacon/apprentice-capabilities.js +34 -0
- package/dist/beacon/apprentice-capabilities.js.map +1 -0
- package/dist/checkup/dimension-1-usage.d.ts +8 -1
- package/dist/checkup/dimension-1-usage.d.ts.map +1 -1
- package/dist/checkup/dimension-1-usage.js +3 -2
- package/dist/checkup/dimension-1-usage.js.map +1 -1
- package/dist/checkup/dimension-2-context.d.ts +12 -0
- package/dist/checkup/dimension-2-context.d.ts.map +1 -0
- package/dist/checkup/dimension-2-context.js +56 -0
- package/dist/checkup/dimension-2-context.js.map +1 -0
- package/dist/checkup/dimension-5-behavior.d.ts +12 -0
- package/dist/checkup/dimension-5-behavior.d.ts.map +1 -0
- package/dist/checkup/dimension-5-behavior.js +40 -0
- package/dist/checkup/dimension-5-behavior.js.map +1 -0
- package/dist/checkup/dimension-6-injection.d.ts +41 -0
- package/dist/checkup/dimension-6-injection.d.ts.map +1 -0
- package/dist/checkup/dimension-6-injection.js +74 -0
- package/dist/checkup/dimension-6-injection.js.map +1 -0
- package/dist/checkup/index.d.ts +3 -0
- package/dist/checkup/index.d.ts.map +1 -1
- package/dist/checkup/index.js +3 -0
- package/dist/checkup/index.js.map +1 -1
- package/dist/checkup/last-report.d.ts +32 -0
- package/dist/checkup/last-report.d.ts.map +1 -0
- package/dist/checkup/last-report.js +91 -0
- package/dist/checkup/last-report.js.map +1 -0
- package/dist/checkup/report.d.ts +13 -1
- package/dist/checkup/report.d.ts.map +1 -1
- package/dist/checkup/report.js +5 -3
- package/dist/checkup/report.js.map +1 -1
- package/dist/forcing-cli.d.ts +1 -1
- package/dist/forcing-cli.d.ts.map +1 -1
- package/dist/forcing-cli.js +1 -52
- package/dist/forcing-cli.js.map +1 -1
- package/dist/guard/bin.js +0 -0
- package/dist/guard/prompt-context.d.ts +2 -2
- package/dist/guard/prompt-context.d.ts.map +1 -1
- package/dist/guard/prompt-context.js +16 -21
- package/dist/guard/prompt-context.js.map +1 -1
- package/dist/index.js +15 -8
- package/dist/index.js.map +1 -1
- package/dist/mcp/brain-client.d.ts.map +1 -1
- package/dist/mcp/brain-client.js +3 -0
- package/dist/mcp/brain-client.js.map +1 -1
- package/dist/mcp/index.d.ts +1 -0
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +5 -0
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/tools/checkup.d.ts +17 -2
- package/dist/mcp/tools/checkup.d.ts.map +1 -1
- package/dist/mcp/tools/checkup.js +41 -3
- package/dist/mcp/tools/checkup.js.map +1 -1
- package/dist/mcp/tools/index.d.ts.map +1 -1
- package/dist/mcp/tools/index.js +42 -4
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/install-module.d.ts +25 -0
- package/dist/mcp/tools/install-module.d.ts.map +1 -0
- package/dist/mcp/tools/install-module.js +87 -0
- package/dist/mcp/tools/install-module.js.map +1 -0
- package/dist/mcp/tools/send-daily-report.d.ts +29 -0
- package/dist/mcp/tools/send-daily-report.d.ts.map +1 -0
- package/dist/mcp/tools/send-daily-report.js +61 -0
- package/dist/mcp/tools/send-daily-report.js.map +1 -0
- package/dist/mcp/tools/setup-gateway.d.ts +2 -1
- package/dist/mcp/tools/setup-gateway.d.ts.map +1 -1
- package/dist/mcp/tools/setup-gateway.js +24 -6
- package/dist/mcp/tools/setup-gateway.js.map +1 -1
- package/dist/mcp/tools/setup-safe.d.ts +2 -0
- package/dist/mcp/tools/setup-safe.d.ts.map +1 -0
- package/dist/mcp/tools/setup-safe.js +2 -0
- package/dist/mcp/tools/setup-safe.js.map +1 -0
- package/dist/mcp-stdio/bin.js +0 -0
- package/dist/mcp-stdio/server.d.ts.map +1 -1
- package/dist/mcp-stdio/server.js +89 -1
- package/dist/mcp-stdio/server.js.map +1 -1
- package/dist/safe/index.d.ts +5 -0
- package/dist/safe/index.d.ts.map +1 -0
- package/dist/safe/index.js +9 -0
- package/dist/safe/index.js.map +1 -0
- package/dist/safe-cli.d.ts +8 -0
- package/dist/safe-cli.d.ts.map +1 -0
- package/dist/safe-cli.js +61 -0
- package/dist/safe-cli.js.map +1 -0
- package/dist/safe-observation/collector.d.ts +21 -0
- package/dist/safe-observation/collector.d.ts.map +1 -0
- package/dist/safe-observation/collector.js +101 -0
- package/dist/safe-observation/collector.js.map +1 -0
- package/dist/safe-observation/store.d.ts +34 -0
- package/dist/safe-observation/store.d.ts.map +1 -0
- package/dist/safe-observation/store.js +80 -0
- package/dist/safe-observation/store.js.map +1 -0
- package/dist/save-token/gateway-setup.d.ts +33 -3
- package/dist/save-token/gateway-setup.d.ts.map +1 -1
- package/dist/save-token/gateway-setup.js +165 -18
- package/dist/save-token/gateway-setup.js.map +1 -1
- package/dist/scheduler/brain-push-client.d.ts.map +1 -1
- package/dist/scheduler/brain-push-client.js +53 -3
- package/dist/scheduler/brain-push-client.js.map +1 -1
- package/dist/scheduler/types.d.ts +5 -0
- package/dist/scheduler/types.d.ts.map +1 -1
- package/dist/scheduler/types.js +3 -1
- package/dist/scheduler/types.js.map +1 -1
- package/dist/setup-safe.d.ts +20 -0
- package/dist/setup-safe.d.ts.map +1 -0
- package/dist/setup-safe.js +93 -0
- package/dist/setup-safe.js.map +1 -0
- package/dist/skill-installer/index.d.ts +9 -0
- package/dist/skill-installer/index.d.ts.map +1 -1
- package/dist/skill-installer/index.js +20 -1
- package/dist/skill-installer/index.js.map +1 -1
- package/dist/skill-runner/discovery.d.ts.map +1 -1
- package/dist/skill-runner/discovery.js +8 -5
- package/dist/skill-runner/discovery.js.map +1 -1
- package/dist/skill-tunnel/cli.d.ts.map +1 -1
- package/dist/skill-tunnel/cli.js +22 -0
- package/dist/skill-tunnel/cli.js.map +1 -1
- package/dist/skill-tunnel/client.d.ts +5 -0
- package/dist/skill-tunnel/client.d.ts.map +1 -1
- package/dist/skill-tunnel/client.js +2 -0
- package/dist/skill-tunnel/client.js.map +1 -1
- package/dist/skill-tunnel/local-bridge.d.ts +9 -0
- package/dist/skill-tunnel/local-bridge.d.ts.map +1 -1
- package/dist/skill-tunnel/local-bridge.js +24 -1
- package/dist/skill-tunnel/local-bridge.js.map +1 -1
- 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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"}
|
package/dist/checkup/index.d.ts
CHANGED
|
@@ -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"}
|
package/dist/checkup/index.js
CHANGED
|
@@ -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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"}
|
package/dist/checkup/report.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/checkup/report.js
CHANGED
|
@@ -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":"AAAA,0CAA0C;AAC1C,EAAE;AACF,6BAA6B;AAC7B,+DAA+D;AAM/D,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,oBAAoB,GACrB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/checkup/report.ts"],"names":[],"mappings":"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"}
|
package/dist/forcing-cli.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export
|
|
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":"
|
|
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"}
|
package/dist/forcing-cli.js
CHANGED
|
@@ -1,53 +1,2 @@
|
|
|
1
|
-
|
|
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
|
package/dist/forcing-cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forcing-cli.js","sourceRoot":"","sources":["../src/forcing-cli.ts"],"names":[],"mappings":"AAAA,
|
|
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' | '
|
|
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' | '
|
|
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,
|
|
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
|
|
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
|
-
//
|
|
32
|
-
{ pattern:
|
|
33
|
-
primary_tool: '
|
|
34
|
-
category: '
|
|
35
|
-
//
|
|
36
|
-
{ pattern:
|
|
37
|
-
primary_tool: '
|
|
38
|
-
category: '
|
|
39
|
-
//
|
|
40
|
-
{ pattern:
|
|
41
|
-
primary_tool: '
|
|
42
|
-
category: '
|
|
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
|
-
|
|
70
|
-
|
|
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;
|
|
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 —
|
|
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('./
|
|
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
|
-
|
|
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
|
-
|
|
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 —
|
|
1555
|
-
// 用户可手动 `npx skillfm-local
|
|
1556
|
-
|
|
1557
|
-
await
|
|
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': {
|