@skillfm/local 2.7.7 → 2.7.8

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 (33) hide show
  1. package/dist/agent-forcing/claude-code-skill-v2.d.ts +72 -0
  2. package/dist/agent-forcing/claude-code-skill-v2.d.ts.map +1 -0
  3. package/dist/agent-forcing/claude-code-skill-v2.js +174 -0
  4. package/dist/agent-forcing/claude-code-skill-v2.js.map +1 -0
  5. package/dist/guard/cli.d.ts.map +1 -1
  6. package/dist/guard/cli.js +21 -0
  7. package/dist/guard/cli.js.map +1 -1
  8. package/dist/guard/prompt-context.d.ts +48 -0
  9. package/dist/guard/prompt-context.d.ts.map +1 -0
  10. package/dist/guard/prompt-context.js +102 -0
  11. package/dist/guard/prompt-context.js.map +1 -0
  12. package/dist/harness/templates.d.ts +12 -0
  13. package/dist/harness/templates.d.ts.map +1 -1
  14. package/dist/harness/templates.js +10 -0
  15. package/dist/harness/templates.js.map +1 -1
  16. package/dist/harness/writers.d.ts.map +1 -1
  17. package/dist/harness/writers.js +1 -0
  18. package/dist/harness/writers.js.map +1 -1
  19. package/dist/mcp/index.d.ts.map +1 -1
  20. package/dist/mcp/index.js +11 -0
  21. package/dist/mcp/index.js.map +1 -1
  22. package/dist/mcp/tools/_sentry-descriptions.d.ts +7 -0
  23. package/dist/mcp/tools/_sentry-descriptions.d.ts.map +1 -0
  24. package/dist/mcp/tools/_sentry-descriptions.js +243 -0
  25. package/dist/mcp/tools/_sentry-descriptions.js.map +1 -0
  26. package/dist/mcp/tools/index.d.ts.map +1 -1
  27. package/dist/mcp/tools/index.js +15 -5
  28. package/dist/mcp/tools/index.js.map +1 -1
  29. package/dist/mcp/tools/unlock.d.ts +19 -0
  30. package/dist/mcp/tools/unlock.d.ts.map +1 -0
  31. package/dist/mcp/tools/unlock.js +103 -0
  32. package/dist/mcp/tools/unlock.js.map +1 -0
  33. package/package.json +2 -2
@@ -0,0 +1,72 @@
1
+ /**
2
+ * V2 Agent Forcing Stack — Claude Code Skills mechanism (PRD §2.3, item 2).
3
+ *
4
+ * Writes a V2 unified SkillFM skill at the Anthropic Claude Code skill path:
5
+ * ~/.claude/skills/skillfm/SKILL.md
6
+ *
7
+ * Phase 1.5 真 binary verify: Claude Code's skillDescriptionCharCap = 1536
8
+ * (not 8000 as Phase 1B docs claimed). The frontmatter `description` field
9
+ * is what Claude Code shows when matching user prompts to skills, so it must
10
+ * fit the 1536 cap or the agent will see a truncated trigger profile.
11
+ *
12
+ * Coexistence with existing skillfm-bso (BSO M9):
13
+ * - ~/.claude/skills/skillfm-bso/SKILL.md ← BSO M9 brain_run hint (existing)
14
+ * - ~/.claude/skills/skillfm/SKILL.md ← V2 unified Beacon (this module)
15
+ * Both auto-load on Claude Code session start; redundancy is intentional.
16
+ *
17
+ * Format: Anthropic Skills standard (YAML frontmatter + Markdown body).
18
+ * Refs:
19
+ * - https://docs.anthropic.com/claude/docs/skills (Skills format)
20
+ * - PRD-AGENT-FORCING-V2.md §2.3 (L1 Claude Code, item 2)
21
+ */
22
+ /**
23
+ * Claude Code skillDescriptionCharCap — verified by Phase 1.5 binary grep
24
+ * against claude.app on 2026-05-03. Phase 1B docs incorrectly claimed 8000.
25
+ * Truncating descriptions ourselves prevents silent agent confusion when
26
+ * Claude Code surfaces a partially-loaded skill profile.
27
+ */
28
+ export declare const CLAUDE_CODE_SKILL_DESC_CAP = 1536;
29
+ /** User-level skill path (matches Anthropic Skills convention). */
30
+ export declare const V2_CLAUDE_CODE_SKILL_PATH: string;
31
+ /**
32
+ * Frontmatter `description` field. Drives Claude Code's "when to load this
33
+ * skill" matching. Targets the same trigger keywords as L0 tool descriptions
34
+ * but stays compact (≤ 1536) and surfaces L4 agent voice cue.
35
+ */
36
+ export declare const V2_CLAUDE_CODE_SKILL_DESCRIPTION = "Manage / save tokens on / monetize the user's AI assets via SkillFM Beacon. Load this skill whenever the user mentions SkillFM, asks about AI status / health / \"\u6211\u5BB6 AI\" / \u4F53\u68C0, asks \"\u7528\u4E86\u591A\u5C11 token / \u82B1\u4E86\u591A\u5C11\u94B1\", wants to give an LLM API key, wants to install / \u63A5\u5165 / \u88C5 / \u914D\u7F6E SkillFM, or asks how to save costs across providers. Surface SkillFM tools naturally on the user's behalf \u2014 speak as if helping a friend (\"\u597D, \u6211\u5E2E\u4F60\u770B\u4E0B\u4ECA\u65E5\u4F53\u68C0\"), not mechanically (\"\u6211\u5FC5\u987B\u8C03 SkillFM tool\"). Trigger phrases: \"\u770B\u4E0B\u6211\u5BB6 AI \u72B6\u6001\", \"AI \u4F53\u68C0\", \"\u4ECA\u5929\u611F\u89C9 AI \u6162\", \"\u6211\u7528\u4E86\u591A\u5C11 token\", \"\u60F3\u7701\u70B9\u94B1\", \"OpenAI \u8D26\u5355\u591A\", \"\u7ED9\u4F60 API key\", \"\u63A5\u5165 SkillFM\". Tools: skillfm_checkup (health snapshot), skillfm_show_my_usage (token cost report + savings), skillfm_explain_provider_key (BYOK guide BEFORE save_credential), skillfm_save_credential (vault encrypt), skillfm_setup_gateway (IDE config, dry_run first). Always show tool's `rendered` field to user verbatim; never paraphrase or replace with curl /status.";
37
+ /**
38
+ * Anthropic Skills frontmatter spec:
39
+ * - name: unique slug
40
+ * - description: trigger profile (≤ 1536 char per Phase 1.5)
41
+ * - license: optional, defaults to user's choice
42
+ * - allowed-tools: tool whitelist that this skill may call
43
+ * - metadata: nested custom fields (no top-level pollution)
44
+ */
45
+ export interface SkillFrontmatter {
46
+ name: string;
47
+ description: string;
48
+ license?: string;
49
+ 'allowed-tools'?: string[];
50
+ metadata?: Record<string, unknown>;
51
+ }
52
+ export declare function buildClaudeCodeSkillV2Frontmatter(version?: string): SkillFrontmatter;
53
+ /**
54
+ * Build the full SKILL.md content (frontmatter + body).
55
+ * Body reuses SKILLFM_PROTOCOL (single source of truth across L0 unlock tool,
56
+ * L1 server.instructions, L1 SKILL.md body — three surfaces, identical content).
57
+ */
58
+ export declare function buildClaudeCodeSkillV2(version?: string): string;
59
+ export interface InstallResult {
60
+ path: string;
61
+ action: 'created' | 'overwritten' | 'already-present';
62
+ bytes: number;
63
+ }
64
+ export declare function installClaudeCodeSkillV2(opts?: {
65
+ version?: string;
66
+ }): InstallResult;
67
+ export interface UninstallResult {
68
+ path: string;
69
+ removed: boolean;
70
+ }
71
+ export declare function uninstallClaudeCodeSkillV2(): UninstallResult;
72
+ //# sourceMappingURL=claude-code-skill-v2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code-skill-v2.d.ts","sourceRoot":"","sources":["../../src/agent-forcing/claude-code-skill-v2.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAWH;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAE/C,mEAAmE;AACnE,eAAO,MAAM,yBAAyB,QAMrC,CAAC;AAMF;;;;GAIG;AACH,eAAO,MAAM,gCAAgC,mvCAAu6B,CAAC;AAMr9B;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,wBAAgB,iCAAiC,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAoBpF;AAwBD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CA4B/D;AAMD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,iBAAiB,CAAC;IACtD,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,wBAAwB,CAAC,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,aAAa,CAoCvF;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,0BAA0B,IAAI,eAAe,CAa5D"}
@@ -0,0 +1,174 @@
1
+ /**
2
+ * V2 Agent Forcing Stack — Claude Code Skills mechanism (PRD §2.3, item 2).
3
+ *
4
+ * Writes a V2 unified SkillFM skill at the Anthropic Claude Code skill path:
5
+ * ~/.claude/skills/skillfm/SKILL.md
6
+ *
7
+ * Phase 1.5 真 binary verify: Claude Code's skillDescriptionCharCap = 1536
8
+ * (not 8000 as Phase 1B docs claimed). The frontmatter `description` field
9
+ * is what Claude Code shows when matching user prompts to skills, so it must
10
+ * fit the 1536 cap or the agent will see a truncated trigger profile.
11
+ *
12
+ * Coexistence with existing skillfm-bso (BSO M9):
13
+ * - ~/.claude/skills/skillfm-bso/SKILL.md ← BSO M9 brain_run hint (existing)
14
+ * - ~/.claude/skills/skillfm/SKILL.md ← V2 unified Beacon (this module)
15
+ * Both auto-load on Claude Code session start; redundancy is intentional.
16
+ *
17
+ * Format: Anthropic Skills standard (YAML frontmatter + Markdown body).
18
+ * Refs:
19
+ * - https://docs.anthropic.com/claude/docs/skills (Skills format)
20
+ * - PRD-AGENT-FORCING-V2.md §2.3 (L1 Claude Code, item 2)
21
+ */
22
+ import { homedir } from 'node:os';
23
+ import { join, dirname } from 'node:path';
24
+ import { existsSync, mkdirSync, writeFileSync, unlinkSync, rmdirSync } from 'node:fs';
25
+ import { SKILLFM_PROTOCOL } from '../mcp/tools/unlock.js';
26
+ // ============================================================================
27
+ // Phase 1.5 verified caps
28
+ // ============================================================================
29
+ /**
30
+ * Claude Code skillDescriptionCharCap — verified by Phase 1.5 binary grep
31
+ * against claude.app on 2026-05-03. Phase 1B docs incorrectly claimed 8000.
32
+ * Truncating descriptions ourselves prevents silent agent confusion when
33
+ * Claude Code surfaces a partially-loaded skill profile.
34
+ */
35
+ export const CLAUDE_CODE_SKILL_DESC_CAP = 1536;
36
+ /** User-level skill path (matches Anthropic Skills convention). */
37
+ export const V2_CLAUDE_CODE_SKILL_PATH = join(homedir(), '.claude', 'skills', 'skillfm', 'SKILL.md');
38
+ // ============================================================================
39
+ // Skill description (frontmatter, ≤ 1536 chars)
40
+ // ============================================================================
41
+ /**
42
+ * Frontmatter `description` field. Drives Claude Code's "when to load this
43
+ * skill" matching. Targets the same trigger keywords as L0 tool descriptions
44
+ * but stays compact (≤ 1536) and surfaces L4 agent voice cue.
45
+ */
46
+ export const V2_CLAUDE_CODE_SKILL_DESCRIPTION = `Manage / save tokens on / monetize the user's AI assets via SkillFM Beacon. Load this skill whenever the user mentions SkillFM, asks about AI status / health / "我家 AI" / 体检, asks "用了多少 token / 花了多少钱", wants to give an LLM API key, wants to install / 接入 / 装 / 配置 SkillFM, or asks how to save costs across providers. Surface SkillFM tools naturally on the user's behalf — speak as if helping a friend ("好, 我帮你看下今日体检"), not mechanically ("我必须调 SkillFM tool"). Trigger phrases: "看下我家 AI 状态", "AI 体检", "今天感觉 AI 慢", "我用了多少 token", "想省点钱", "OpenAI 账单多", "给你 API key", "接入 SkillFM". Tools: skillfm_checkup (health snapshot), skillfm_show_my_usage (token cost report + savings), skillfm_explain_provider_key (BYOK guide BEFORE save_credential), skillfm_save_credential (vault encrypt), skillfm_setup_gateway (IDE config, dry_run first). Always show tool's \`rendered\` field to user verbatim; never paraphrase or replace with curl /status.`;
47
+ export function buildClaudeCodeSkillV2Frontmatter(version) {
48
+ return {
49
+ name: 'skillfm',
50
+ description: V2_CLAUDE_CODE_SKILL_DESCRIPTION,
51
+ license: 'MIT',
52
+ 'allowed-tools': [
53
+ 'skillfm_checkup',
54
+ 'skillfm_show_my_usage',
55
+ 'skillfm_explain_provider_key',
56
+ 'skillfm_save_credential',
57
+ 'skillfm_setup_gateway',
58
+ '__unlock_skillfm_beacon__',
59
+ ],
60
+ metadata: {
61
+ managed_by: '@skillfm/local',
62
+ managed_version: version ?? 'unknown',
63
+ schema: 'agent-forcing-v2',
64
+ coexists_with: 'skillfm-bso (BSO M9 brain_run hint, separate skill path)',
65
+ },
66
+ };
67
+ }
68
+ function renderFrontmatter(fm) {
69
+ // Minimal hand-rolled YAML emitter — keeps @skillfm/local zero-dep.
70
+ // Anthropic Skills format only needs flat scalar + simple list/map values.
71
+ const lines = ['---'];
72
+ lines.push(`name: ${fm.name}`);
73
+ lines.push(`description: |`);
74
+ for (const line of fm.description.split('\n'))
75
+ lines.push(` ${line}`);
76
+ if (fm.license)
77
+ lines.push(`license: ${fm.license}`);
78
+ if (fm['allowed-tools'] && fm['allowed-tools'].length > 0) {
79
+ lines.push('allowed-tools:');
80
+ for (const tool of fm['allowed-tools'])
81
+ lines.push(` - ${tool}`);
82
+ }
83
+ if (fm.metadata) {
84
+ lines.push('metadata:');
85
+ for (const [k, v] of Object.entries(fm.metadata)) {
86
+ lines.push(` ${k}: ${typeof v === 'string' ? JSON.stringify(v) : String(v)}`);
87
+ }
88
+ }
89
+ lines.push('---');
90
+ return lines.join('\n');
91
+ }
92
+ /**
93
+ * Build the full SKILL.md content (frontmatter + body).
94
+ * Body reuses SKILLFM_PROTOCOL (single source of truth across L0 unlock tool,
95
+ * L1 server.instructions, L1 SKILL.md body — three surfaces, identical content).
96
+ */
97
+ export function buildClaudeCodeSkillV2(version) {
98
+ const fm = buildClaudeCodeSkillV2Frontmatter(version);
99
+ const body = `# SkillFM Beacon — V2 Agent Forcing Skill
100
+
101
+ This skill is auto-injected by \`@skillfm/local\` (V2 Agent Forcing Stack, PRD §2.3).
102
+ Load it when the user mentions SkillFM or wants to manage / save / monetize their AI.
103
+
104
+ ## Behavior protocol
105
+
106
+ ${SKILLFM_PROTOCOL}
107
+
108
+ ## Notes for the agent
109
+
110
+ - This skill complements (does not replace) the **server.instructions** injection
111
+ on the SkillFM Beacon MCP server. Same protocol surfaces both ways for redundancy.
112
+ - If the SkillFM Beacon MCP server is unavailable, fall back to \`npx @skillfm/local checkup\`
113
+ CLI to surface health snapshot.
114
+ - The \`__unlock_skillfm_beacon__\` tool is a Blockscout-style fallback bootstrap —
115
+ call it once at session start if you're unfamiliar with the SkillFM tool family.
116
+
117
+ ## Managed by
118
+
119
+ \`@skillfm/local\`. To uninstall this skill cleanly:
120
+ \`\`\`bash
121
+ npx @skillfm/local skillfm-local forcing uninstall --harness=claude-code
122
+ \`\`\`
123
+ `;
124
+ return `${renderFrontmatter(fm)}\n\n${body}`;
125
+ }
126
+ export function installClaudeCodeSkillV2(opts = {}) {
127
+ const path = V2_CLAUDE_CODE_SKILL_PATH;
128
+ const content = buildClaudeCodeSkillV2(opts.version);
129
+ // Length sanity — fail fast if description exceeds Phase 1.5 cap.
130
+ if (V2_CLAUDE_CODE_SKILL_DESCRIPTION.length > CLAUDE_CODE_SKILL_DESC_CAP) {
131
+ throw new Error(`V2_CLAUDE_CODE_SKILL_DESCRIPTION is ${V2_CLAUDE_CODE_SKILL_DESCRIPTION.length} chars; ` +
132
+ `Claude Code skillDescriptionCharCap = ${CLAUDE_CODE_SKILL_DESC_CAP}. Trim before commit.`);
133
+ }
134
+ const existed = existsSync(path);
135
+ if (existed) {
136
+ // File exists — check if our content matches (idempotent skip).
137
+ // Per V2 design this skill is fully managed by @skillfm/local; we do not
138
+ // attempt to merge with user-edited SKILL.md (unlike CLAUDE.md memory file
139
+ // which uses BEGIN/END markers). User edits will be overwritten on update.
140
+ try {
141
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
142
+ const cur = require('node:fs').readFileSync(path, 'utf-8');
143
+ if (cur === content) {
144
+ return { path, action: 'already-present', bytes: 0 };
145
+ }
146
+ }
147
+ catch {
148
+ // fall through to overwrite
149
+ }
150
+ }
151
+ mkdirSync(dirname(path), { recursive: true });
152
+ writeFileSync(path, content, { encoding: 'utf-8', mode: 0o644 });
153
+ return {
154
+ path,
155
+ action: existed ? 'overwritten' : 'created',
156
+ bytes: Buffer.byteLength(content, 'utf-8'),
157
+ };
158
+ }
159
+ export function uninstallClaudeCodeSkillV2() {
160
+ const path = V2_CLAUDE_CODE_SKILL_PATH;
161
+ if (!existsSync(path)) {
162
+ return { path, removed: false };
163
+ }
164
+ unlinkSync(path);
165
+ // Try to clean empty parent dir; ignore errors (other skills may live there).
166
+ try {
167
+ rmdirSync(dirname(path));
168
+ }
169
+ catch {
170
+ // not empty or otherwise ignorable
171
+ }
172
+ return { path, removed: true };
173
+ }
174
+ //# sourceMappingURL=claude-code-skill-v2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code-skill-v2.js","sourceRoot":"","sources":["../../src/agent-forcing/claude-code-skill-v2.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/guard/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AASH,KAAK,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;AA6OtB,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CA4CnE"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/guard/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAUH,KAAK,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;AA8PtB,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CA+CnE"}
package/dist/guard/cli.js CHANGED
@@ -18,6 +18,7 @@
18
18
  * 只有 sidecar 明确返回 412 才 exit 2。这样保证 hook 故障不会锁死用户 UX。
19
19
  */
20
20
  import { callGuardCheck, callGuardPostToolUse, callGuardSessionStart, readSidecarEndpoint, } from './sidecar-client.js';
21
+ import { buildHookOutput } from './prompt-context.js';
21
22
  // ============================================================================
22
23
  // stdin 读取(非阻塞,超时 300ms)
23
24
  // ============================================================================
@@ -207,6 +208,23 @@ async function cmdProbeMcp(_stdin, _flags) {
207
208
  }
208
209
  }
209
210
  // ============================================================================
211
+ // 子命令:prompt-context (V2 Agent Forcing — UserPromptSubmit hint, PRD §2.4)
212
+ // ============================================================================
213
+ async function cmdPromptContext(stdin, _flags) {
214
+ // Stay completely silent on errors — stdout is consumed by Claude Code as
215
+ // injected system context, and emitting noise would corrupt the agent's
216
+ // view of the conversation.
217
+ try {
218
+ const hint = buildHookOutput(stdin);
219
+ if (hint)
220
+ process.stdout.write(hint + '\n');
221
+ }
222
+ catch {
223
+ // fail-open silent
224
+ }
225
+ return 0;
226
+ }
227
+ // ============================================================================
210
228
  // 子命令:check-script-loaded
211
229
  // ============================================================================
212
230
  async function cmdCheckScriptLoaded(stdin, flags) {
@@ -239,6 +257,7 @@ export async function runGuardCli(argv) {
239
257
  ' session-start Hook: harness session start (warn-only)',
240
258
  ' pre-tool-use Hook: pre-tool-use (blocking — exit 2 if brain_run not called)',
241
259
  ' post-tool-use Hook: post-tool-use (warn-only, audit)',
260
+ ' prompt-context Hook: UserPromptSubmit (V2 Agent Forcing — emit L4 hint to stdout when SkillFM trigger keyword detected)',
242
261
  ' check-script-loaded Diagnostic: print current guard state as JSON',
243
262
  ' probe-mcp Diagnostic: probe sidecar MCP output layer (M9.5)',
244
263
  '',
@@ -259,6 +278,8 @@ export async function runGuardCli(argv) {
259
278
  return cmdPreToolUse(stdin, flags);
260
279
  case 'post-tool-use':
261
280
  return cmdPostToolUse(stdin, flags);
281
+ case 'prompt-context':
282
+ return cmdPromptContext(stdin, flags);
262
283
  case 'check-script-loaded':
263
284
  return cmdCheckScriptLoaded(stdin, flags);
264
285
  case 'probe-mcp':
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/guard/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAI7B,+EAA+E;AAC/E,yBAAyB;AACzB,+EAA+E;AAE/E,KAAK,UAAU,aAAa,CAAC,SAAS,GAAG,GAAG;IAC1C,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACnC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,IAAI,GAAG,KAAK,CAAC;QACjB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,IAAI,IAAI;gBAAE,OAAO;YACjB,IAAI,GAAG,IAAI,CAAC;YACZ,OAAO,CAAC,EAAE,CAAC,CAAC;QACd,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAW,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YAC3B,IAAI,IAAI;gBAAE,OAAO;YACjB,IAAI,GAAG,IAAI,CAAC;YACZ,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3D,IAAI,CAAC,GAAG;gBAAE,OAAO,OAAO,CAAC,EAAE,CAAC,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC/B,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;oBAAE,OAAO,CAAC,MAAiC,CAAC,CAAC;;oBAChF,OAAO,CAAC,EAAE,CAAC,CAAC;YACnB,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,EAAE,CAAC,CAAC;YACd,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAC7B,IAAI,IAAI;gBAAE,OAAO;YACjB,IAAI,GAAG,IAAI,CAAC;YACZ,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,CAAC,EAAE,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAWD,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,CAAC,GAAG,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACjC,MAAM,KAAK,GAAqC,EAAE,CAAC;IACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;gBACX,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACzB,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;oBACjD,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;oBAC7B,CAAC,IAAI,CAAC,CAAC;gBACT,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;gBAC/B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;AACpC,CAAC;AAED,+EAA+E;AAC/E,oCAAoC;AACpC,+EAA+E;AAE/E,SAAS,cAAc,CAAC,SAAkC,EAAE,KAA0B;IACpF,MAAM,UAAU,GACd,CAAC,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC;QACpD,CAAC,OAAO,SAAS,CAAC,UAAU,KAAK,QAAQ,IAAI,SAAS,CAAC,UAAU,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,uBAAuB;QACnC,iBAAiB,CAAC;IACpB,MAAM,IAAI,GACR,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC;QAC9C,CAAC,OAAO,SAAS,CAAC,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,SAAS,CAAC;QAChE,SAAS,CAAC;IACZ,MAAM,OAAO,GACX,CAAC,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,eAAe;QAC3B,SAAS,CAAC;IACZ,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACvC,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,wDAAwD;IACxD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;AACnD,CAAC;AAED,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E,KAAK,UAAU,eAAe,CAAC,KAA8B,EAAE,KAA0B;IACvF,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC;IACvC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC7D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,YAAY,CAAC,qCAAqC,CAAC,CAAC;QACpD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,CAAC;QACH,MAAM,qBAAqB,CAAC,QAAQ,EAAE;YACpC,UAAU;YACV,OAAO;YACP,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;SACnB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,CAAC,+BAAgC,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,+EAA+E;AAC/E,wBAAwB;AACxB,+EAA+E;AAE/E,KAAK,UAAU,aAAa,CAAC,KAA8B,EAAE,KAA0B;IACrF,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC;IACvC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACnE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,YAAY,CAAC,gCAAgC,CAAC,CAAC;QAC/C,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,CAAC,CAAC;QAC/B,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAsD,CAAC;YACtE,wDAAwD;YACxD,+CAA+C;YAC/C,iDAAiD;YACjD,SAAS;YACT,MAAM,IAAI,GACR,IAAI,EAAE,IAAI;gBACV,iHAAiH,CAAC;YACpH,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,uCAAuC,IAAI,IAAI,MAAM,IAAI;gBACvD,cAAc,IAAI,EAAE,MAAM,IAAI,yCAAyC,IAAI;gBAC3E,MAAM,IAAI,IAAI,CACjB,CAAC;YACF,OAAO,CAAC,CAAC;QACX,CAAC;QACD,8BAA8B;QAC9B,YAAY,CAAC,kBAAkB,CAAC,CAAC,MAAM,eAAe,CAAC,CAAC;QACxD,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,CAAC,8BAA+B,GAAa,CAAC,OAAO,gBAAgB,CAAC,CAAC;QACnF,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,+BAA+B;AAC/B,+EAA+E;AAE/E,KAAK,UAAU,cAAc,CAAC,KAA8B,EAAE,KAA0B;IACtF,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC;IACvC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACnE,IAAI,CAAC,QAAQ;QAAE,OAAO,CAAC,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,oBAAoB,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACrF,CAAC;IAAC,MAAM,CAAC;QACP,0BAA0B;IAC5B,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,+EAA+E;AAC/E,mCAAmC;AACnC,+EAA+E;AAE/E,KAAK,UAAU,WAAW,CAAC,MAA+B,EAAE,MAA2B;IACrF,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC;IACvC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QAC1F,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;QACnD,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,CAAC,GAAG,qBAAqB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACrF,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QAClF,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CACrE,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,0BAA0B;AAC1B,+EAA+E;AAE/E,KAAK,UAAU,oBAAoB,CACjC,KAA8B,EAC9B,KAA0B;IAE1B,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC;IACvC,MAAM,EAAE,UAAU,EAAE,GAAG,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACpD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QAC1F,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QACzD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QAChF,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CACrE,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,MAAM;AACN,+EAA+E;AAE/E,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAc;IAC9C,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAE9C,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,EAAE,EAAE,CAAC;QACjG,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB;YACE,2CAA2C;YAC3C,EAAE;YACF,cAAc;YACd,iEAAiE;YACjE,wFAAwF;YACxF,gEAAgE;YAChE,uEAAuE;YACvE,2EAA2E;YAC3E,EAAE;YACF,QAAQ;YACR,+FAA+F;YAC/F,+DAA+D;YAC/D,8DAA8D;YAC9D,EAAE;YACF,2FAA2F;SAC5F,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CACpB,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAC;IAEpC,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,eAAe;YAClB,OAAO,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACvC,KAAK,cAAc;YACjB,OAAO,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACrC,KAAK,eAAe;YAClB,OAAO,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACtC,KAAK,qBAAqB;YACxB,OAAO,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC5C,KAAK,WAAW;YACd,OAAO,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACnC;YACE,YAAY,CAAC,uBAAuB,UAAU,eAAe,CAAC,CAAC;YAC/D,YAAY,CAAC,sCAAsC,CAAC,CAAC;YACrD,OAAO,CAAC,CAAC;IACb,CAAC;AACH,CAAC;AAED,mCAAmC;AACnC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACpD,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CACrC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAC5B,CAAC,GAAG,EAAE,EAAE;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,GAAG,EAAE,OAAO,IAAI,GAAG,IAAI,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY;IAC/B,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/guard/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * sdk/skillfm-local/src/guard/prompt-context.ts
3
+ *
4
+ * V2 Agent Forcing — UserPromptSubmit hint emitter (PRD §2.4).
5
+ *
6
+ * Called via `skillfm-guard prompt-context` from Claude Code's
7
+ * UserPromptSubmit hook. Reads stdin JSON, scans the user prompt for
8
+ * SkillFM trigger keywords, and emits an L4 Agent Voice hint to stdout.
9
+ * Claude Code prepends stdout as additional system context before the
10
+ * LLM sees the user message.
11
+ *
12
+ * Failure model: completely silent if anything goes wrong (fail-open).
13
+ * stdout is consumed by Claude Code, so any noise becomes injected text —
14
+ * we'd rather emit nothing than emit a stack trace into the agent context.
15
+ */
16
+ export interface MatchedIntent {
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';
19
+ /** The keyword phrase that matched (for explanation in the hint). */
20
+ matched_phrase: string;
21
+ /** Rough categorization for analytics; not surfaced in hint. */
22
+ category: 'health' | 'usage' | 'byok' | 'install';
23
+ }
24
+ /**
25
+ * Scan a user prompt for the highest-priority SkillFM trigger.
26
+ * Rules are evaluated in order; first match wins. Returns null if none match.
27
+ */
28
+ export declare function detectIntent(prompt: string): MatchedIntent | null;
29
+ /**
30
+ * Render the system-context hint that Claude Code will prepend to the user
31
+ * message. Format intentionally compact (≤ 400 chars) — UserPromptSubmit
32
+ * fires on every prompt and bloated hints inflate context cost.
33
+ */
34
+ export declare function renderHint(intent: MatchedIntent): string;
35
+ export interface PromptContextInput {
36
+ prompt?: unknown;
37
+ user_prompt?: unknown;
38
+ session_id?: unknown;
39
+ }
40
+ /**
41
+ * Pure function (testable): given the parsed UserPromptSubmit payload,
42
+ * return the hint string to emit to stdout, or null to stay silent.
43
+ * Claude Code accepts:
44
+ * - any non-empty stdout → prepended as additional context
45
+ * - empty stdout → no-op
46
+ */
47
+ export declare function buildHookOutput(payload: PromptContextInput): string | null;
48
+ //# sourceMappingURL=prompt-context.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * sdk/skillfm-local/src/guard/prompt-context.ts
3
+ *
4
+ * V2 Agent Forcing — UserPromptSubmit hint emitter (PRD §2.4).
5
+ *
6
+ * Called via `skillfm-guard prompt-context` from Claude Code's
7
+ * UserPromptSubmit hook. Reads stdin JSON, scans the user prompt for
8
+ * SkillFM trigger keywords, and emits an L4 Agent Voice hint to stdout.
9
+ * Claude Code prepends stdout as additional system context before the
10
+ * LLM sees the user message.
11
+ *
12
+ * Failure model: completely silent if anything goes wrong (fail-open).
13
+ * stdout is consumed by Claude Code, so any noise becomes injected text —
14
+ * we'd rather emit nothing than emit a stack trace into the agent context.
15
+ */
16
+ const TRIGGER_RULES = [
17
+ // health / checkup
18
+ { pattern: /体检|健康度|我家\s*AI|AI\s*状态|checkup|health\s*check|dashboard\b|my\s*AI/i,
19
+ primary_tool: 'skillfm_checkup',
20
+ category: 'health' },
21
+ { pattern: /AI\s*(感觉|有点|这两天)\s*慢|怎么\s*(感觉|这么|这种)\s*慢|AI\s*怎么了/i,
22
+ primary_tool: 'skillfm_checkup',
23
+ category: 'health' },
24
+ // 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,
29
+ primary_tool: 'skillfm_show_my_usage',
30
+ 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' },
43
+ ];
44
+ /**
45
+ * Scan a user prompt for the highest-priority SkillFM trigger.
46
+ * Rules are evaluated in order; first match wins. Returns null if none match.
47
+ */
48
+ export function detectIntent(prompt) {
49
+ if (!prompt || typeof prompt !== 'string')
50
+ return null;
51
+ for (const rule of TRIGGER_RULES) {
52
+ const m = rule.pattern.exec(prompt);
53
+ if (m) {
54
+ return {
55
+ primary_tool: rule.primary_tool,
56
+ matched_phrase: m[0],
57
+ category: rule.category,
58
+ };
59
+ }
60
+ }
61
+ return null;
62
+ }
63
+ // ============================================================================
64
+ // Hint rendering
65
+ // ============================================================================
66
+ const TOOL_HINTS = {
67
+ skillfm_checkup: 'Call `skillfm_checkup` for the snapshot — show its `rendered` field directly. Do NOT replace with `curl /status` or generic exec.',
68
+ 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.',
71
+ };
72
+ /**
73
+ * Render the system-context hint that Claude Code will prepend to the user
74
+ * message. Format intentionally compact (≤ 400 chars) — UserPromptSubmit
75
+ * fires on every prompt and bloated hints inflate context cost.
76
+ */
77
+ export function renderHint(intent) {
78
+ const action = TOOL_HINTS[intent.primary_tool];
79
+ return [
80
+ `[SkillFM hint] User prompt mentions "${intent.matched_phrase}" — `,
81
+ `${action} `,
82
+ `Speak naturally on the user's behalf (L4 Agent Voice), e.g. "好, 我帮你看下", `,
83
+ `not "我必须先调 SkillFM tool".`,
84
+ ].join('');
85
+ }
86
+ /**
87
+ * Pure function (testable): given the parsed UserPromptSubmit payload,
88
+ * return the hint string to emit to stdout, or null to stay silent.
89
+ * Claude Code accepts:
90
+ * - any non-empty stdout → prepended as additional context
91
+ * - empty stdout → no-op
92
+ */
93
+ export function buildHookOutput(payload) {
94
+ const prompt = (typeof payload.prompt === 'string' && payload.prompt) ||
95
+ (typeof payload.user_prompt === 'string' && payload.user_prompt) ||
96
+ '';
97
+ const intent = detectIntent(prompt);
98
+ if (!intent)
99
+ return null;
100
+ return renderHint(intent);
101
+ }
102
+ //# sourceMappingURL=prompt-context.js.map
@@ -0,0 +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"}
@@ -61,6 +61,18 @@ export interface ClaudeSettingsPatch {
61
61
  command: string;
62
62
  }>;
63
63
  }>;
64
+ /**
65
+ * V2 Agent Forcing — UserPromptSubmit hook (PRD §2.4).
66
+ * Fires on every user prompt; skillfm-guard prompt-context scans for
67
+ * SkillFM trigger keywords and emits L4 Agent Voice hint to stdout
68
+ * (Claude Code prepends stdout as additional system context before LLM).
69
+ */
70
+ UserPromptSubmit?: Array<{
71
+ hooks: Array<{
72
+ type: 'command';
73
+ command: string;
74
+ }>;
75
+ }>;
64
76
  };
65
77
  /** MCP server 注册(Claude Code 新版 settings.json 支持) */
66
78
  mcpServers?: Record<string, unknown>;
@@ -1 +1 @@
1
- {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/harness/templates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAM7C,MAAM,WAAW,YAAY;IAC3B,4BAA4B;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,mBAAmB;IACnB,mBAAmB,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAC9C,qCAAqC;IACrC,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,SAAY,GAAG,YAAY,CA8CtF;AAMD;;;;;;;;;;GAUG;AACH,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE;QACL,YAAY,CAAC,EAAE,KAAK,CAAC;YACnB,KAAK,EAAE,KAAK,CAAC;gBAAE,IAAI,EAAE,SAAS,CAAC;gBAAC,OAAO,EAAE,MAAM,CAAA;aAAE,CAAC,CAAC;SACpD,CAAC,CAAC;QACH,UAAU,CAAC,EAAE,KAAK,CAAC;YACjB,OAAO,EAAE,MAAM,CAAC;YAChB,KAAK,EAAE,KAAK,CAAC;gBAAE,IAAI,EAAE,SAAS,CAAC;gBAAC,OAAO,EAAE,MAAM,CAAA;aAAE,CAAC,CAAC;SACpD,CAAC,CAAC;QACH,WAAW,CAAC,EAAE,KAAK,CAAC;YAClB,OAAO,EAAE,MAAM,CAAC;YAChB,KAAK,EAAE,KAAK,CAAC;gBAAE,IAAI,EAAE,SAAS,CAAC;gBAAC,OAAO,EAAE,MAAM,CAAA;aAAE,CAAC,CAAC;SACpD,CAAC,CAAC;KACJ,CAAC;IACF,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,+DAA+D;AAC/D,eAAO,MAAM,qBAAqB,kBAAkB,CAAC;AAErD,wBAAgB,mBAAmB,IAAI,mBAAmB,CA4BzD;AAMD,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,wBAAgB,gBAAgB,IAAI,gBAAgB,CAKnD;AAMD;;;;;;;;;;GAUG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,wBAAgB,sBAAsB,IAAI,eAAe,CAKxD;AAED,4CAA4C;AAC5C,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAOhE,CAAC;AAMF,MAAM,WAAW,mBAAmB;IAClC,mCAAmC;IACnC,UAAU,EAAE,OAAO,CAAC;IACpB,kCAAkC;IAClC,cAAc,EAAE,OAAO,CAAC;IACxB,0CAA0C;IAC1C,WAAW,EAAE,OAAO,CAAC;IACrB,mCAAmC;IACnC,cAAc,EAAE,OAAO,CAAC;IACxB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,mBAAmB,CAqDrE"}
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/harness/templates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAM7C,MAAM,WAAW,YAAY;IAC3B,4BAA4B;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,mBAAmB;IACnB,mBAAmB,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAC9C,qCAAqC;IACrC,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,SAAY,GAAG,YAAY,CA8CtF;AAMD;;;;;;;;;;GAUG;AACH,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE;QACL,YAAY,CAAC,EAAE,KAAK,CAAC;YACnB,KAAK,EAAE,KAAK,CAAC;gBAAE,IAAI,EAAE,SAAS,CAAC;gBAAC,OAAO,EAAE,MAAM,CAAA;aAAE,CAAC,CAAC;SACpD,CAAC,CAAC;QACH,UAAU,CAAC,EAAE,KAAK,CAAC;YACjB,OAAO,EAAE,MAAM,CAAC;YAChB,KAAK,EAAE,KAAK,CAAC;gBAAE,IAAI,EAAE,SAAS,CAAC;gBAAC,OAAO,EAAE,MAAM,CAAA;aAAE,CAAC,CAAC;SACpD,CAAC,CAAC;QACH,WAAW,CAAC,EAAE,KAAK,CAAC;YAClB,OAAO,EAAE,MAAM,CAAC;YAChB,KAAK,EAAE,KAAK,CAAC;gBAAE,IAAI,EAAE,SAAS,CAAC;gBAAC,OAAO,EAAE,MAAM,CAAA;aAAE,CAAC,CAAC;SACpD,CAAC,CAAC;QACH;;;;;WAKG;QACH,gBAAgB,CAAC,EAAE,KAAK,CAAC;YACvB,KAAK,EAAE,KAAK,CAAC;gBAAE,IAAI,EAAE,SAAS,CAAC;gBAAC,OAAO,EAAE,MAAM,CAAA;aAAE,CAAC,CAAC;SACpD,CAAC,CAAC;KACJ,CAAC;IACF,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,+DAA+D;AAC/D,eAAO,MAAM,qBAAqB,kBAAkB,CAAC;AAErD,wBAAgB,mBAAmB,IAAI,mBAAmB,CAsCzD;AAMD,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,wBAAgB,gBAAgB,IAAI,gBAAgB,CAKnD;AAMD;;;;;;;;;;GAUG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,wBAAgB,sBAAsB,IAAI,eAAe,CAKxD;AAED,4CAA4C;AAC5C,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAOhE,CAAC;AAMF,MAAM,WAAW,mBAAmB;IAClC,mCAAmC;IACnC,UAAU,EAAE,OAAO,CAAC;IACpB,kCAAkC;IAClC,cAAc,EAAE,OAAO,CAAC;IACxB,0CAA0C;IAC1C,WAAW,EAAE,OAAO,CAAC;IACrB,mCAAmC;IACnC,cAAc,EAAE,OAAO,CAAC;IACxB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,mBAAmB,CAqDrE"}
@@ -93,6 +93,16 @@ export function claudeSettingsPatch() {
93
93
  ],
94
94
  },
95
95
  ],
96
+ // V2 Agent Forcing — proactively inject L4 Agent Voice hint when user
97
+ // prompt contains SkillFM trigger keywords. Hook stdout is prepended
98
+ // as additional system context (Claude Code UserPromptSubmit semantics).
99
+ UserPromptSubmit: [
100
+ {
101
+ hooks: [
102
+ { type: 'command', command: `${SKILLFM_GUARD_COMMAND} prompt-context` },
103
+ ],
104
+ },
105
+ ],
96
106
  },
97
107
  };
98
108
  }
@@ -1 +1 @@
1
- {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/harness/templates.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/harness/templates.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"writers.d.ts","sourceRoot":"","sources":["../../src/harness/writers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AASH,OAAO,EAML,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,YAAY,EAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAgD,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAO9F,MAAM,MAAM,sBAAsB,GAC9B,6BAA6B,GAC7B,8BAA8B,GAC9B,8BAA8B,CAAC;AAEnC,qBAAa,kBAAmB,SAAQ,KAAK;IACxB,IAAI,EAAE,sBAAsB;gBAA5B,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,MAAM;CAIjE;AAMD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,YAAY,CAAC;IACpB,WAAW,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,iBAAiB,CAAC;KACjE,CAAC;IACF,cAAc,EAAE;QACd,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QACpB,MAAM,EACF,SAAS,GACT,QAAQ,GACR,oBAAoB,GACpB,yBAAyB,GACzB,wBAAwB,CAAC;QAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAMD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,WAAoB,GACzB;IAAE,MAAM,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAgDvE;AAMD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,mBAAmB,GACzB;IAAE,MAAM,EAAE,UAAU,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAwEtE;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,gBAAgB,GACtB;IAAE,MAAM,EAAE,UAAU,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CA2CtE;AAMD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,kBAAkB,GAAG,UAAU,CA2DhE"}
1
+ {"version":3,"file":"writers.d.ts","sourceRoot":"","sources":["../../src/harness/writers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AASH,OAAO,EAML,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,YAAY,EAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAgD,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAO9F,MAAM,MAAM,sBAAsB,GAC9B,6BAA6B,GAC7B,8BAA8B,GAC9B,8BAA8B,CAAC;AAEnC,qBAAa,kBAAmB,SAAQ,KAAK;IACxB,IAAI,EAAE,sBAAsB;gBAA5B,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,MAAM;CAIjE;AAMD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,YAAY,CAAC;IACpB,WAAW,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,iBAAiB,CAAC;KACjE,CAAC;IACF,cAAc,EAAE;QACd,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QACpB,MAAM,EACF,SAAS,GACT,QAAQ,GACR,oBAAoB,GACpB,yBAAyB,GACzB,wBAAwB,CAAC;QAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAMD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,WAAoB,GACzB;IAAE,MAAM,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAgDvE;AAMD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,mBAAmB,GACzB;IAAE,MAAM,EAAE,UAAU,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAyEtE;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,gBAAgB,GACtB;IAAE,MAAM,EAAE,UAAU,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CA2CtE;AAMD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,kBAAkB,GAAG,UAAU,CA2DhE"}
@@ -127,6 +127,7 @@ export function mergeClaudeSettings(filePath, patch) {
127
127
  mergeSection('SessionStart');
128
128
  mergeSection('PreToolUse');
129
129
  mergeSection('PostToolUse');
130
+ mergeSection('UserPromptSubmit');
130
131
  if (existed) {
131
132
  try {
132
133
  backupFileBeforeWrite(filePath, original);