oh-my-knowledge 0.29.0 → 0.30.0

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 (253) hide show
  1. package/README.md +12 -5
  2. package/README.zh.md +12 -5
  3. package/dist/src/analysis/report-diagnostics.js +2 -0
  4. package/dist/src/analysis/report-diagnostics.js.map +1 -1
  5. package/dist/src/authoring/evolver.d.ts +7 -1
  6. package/dist/src/authoring/evolver.d.ts.map +1 -1
  7. package/dist/src/authoring/evolver.js +8 -5
  8. package/dist/src/authoring/evolver.js.map +1 -1
  9. package/dist/src/authoring/generator.d.ts +21 -23
  10. package/dist/src/authoring/generator.d.ts.map +1 -1
  11. package/dist/src/authoring/generator.js +621 -40
  12. package/dist/src/authoring/generator.js.map +1 -1
  13. package/dist/src/authoring/sample-fixer.d.ts +45 -0
  14. package/dist/src/authoring/sample-fixer.d.ts.map +1 -0
  15. package/dist/src/authoring/sample-fixer.js +186 -0
  16. package/dist/src/authoring/sample-fixer.js.map +1 -0
  17. package/dist/src/cli/commands/evolve.d.ts.map +1 -1
  18. package/dist/src/cli/commands/evolve.js +17 -0
  19. package/dist/src/cli/commands/evolve.js.map +1 -1
  20. package/dist/src/cli/commands/observe.js +2 -1
  21. package/dist/src/cli/commands/observe.js.map +1 -1
  22. package/dist/src/cli/commands/sample.d.ts +13 -0
  23. package/dist/src/cli/commands/sample.d.ts.map +1 -1
  24. package/dist/src/cli/commands/sample.js +307 -13
  25. package/dist/src/cli/commands/sample.js.map +1 -1
  26. package/dist/src/cli/i18n-dict.d.ts +1 -1
  27. package/dist/src/cli/i18n-dict.d.ts.map +1 -1
  28. package/dist/src/cli/i18n-dict.js +64 -6
  29. package/dist/src/cli/i18n-dict.js.map +1 -1
  30. package/dist/src/cli/parse-run-config.d.ts +14 -2
  31. package/dist/src/cli/parse-run-config.d.ts.map +1 -1
  32. package/dist/src/cli/parse-run-config.js +62 -10
  33. package/dist/src/cli/parse-run-config.js.map +1 -1
  34. package/dist/src/doctor/health/builtin-dimensions.d.ts.map +1 -1
  35. package/dist/src/doctor/health/builtin-dimensions.js +20 -23
  36. package/dist/src/doctor/health/builtin-dimensions.js.map +1 -1
  37. package/dist/src/doctor/health/composer.d.ts.map +1 -1
  38. package/dist/src/doctor/health/composer.js +7 -3
  39. package/dist/src/doctor/health/composer.js.map +1 -1
  40. package/dist/src/doctor/health/dimension-spec.d.ts +1 -0
  41. package/dist/src/doctor/health/dimension-spec.d.ts.map +1 -1
  42. package/dist/src/doctor/health/parser.d.ts.map +1 -1
  43. package/dist/src/doctor/health/parser.js +1 -0
  44. package/dist/src/doctor/health/parser.js.map +1 -1
  45. package/dist/src/doctor/health/prompt-builder.js +25 -17
  46. package/dist/src/doctor/health/prompt-builder.js.map +1 -1
  47. package/dist/src/doctor/html-renderer.d.ts.map +1 -1
  48. package/dist/src/doctor/html-renderer.js +76 -66
  49. package/dist/src/doctor/html-renderer.js.map +1 -1
  50. package/dist/src/doctor/rules.d.ts.map +1 -1
  51. package/dist/src/doctor/rules.js +32 -0
  52. package/dist/src/doctor/rules.js.map +1 -1
  53. package/dist/src/eval-core/cache.d.ts +16 -2
  54. package/dist/src/eval-core/cache.d.ts.map +1 -1
  55. package/dist/src/eval-core/cache.js +86 -15
  56. package/dist/src/eval-core/cache.js.map +1 -1
  57. package/dist/src/eval-core/evaluation-execution.d.ts +11 -1
  58. package/dist/src/eval-core/evaluation-execution.d.ts.map +1 -1
  59. package/dist/src/eval-core/evaluation-execution.js +78 -6
  60. package/dist/src/eval-core/evaluation-execution.js.map +1 -1
  61. package/dist/src/eval-core/evaluation-job.d.ts +2 -1
  62. package/dist/src/eval-core/evaluation-job.d.ts.map +1 -1
  63. package/dist/src/eval-core/evaluation-job.js +2 -1
  64. package/dist/src/eval-core/evaluation-job.js.map +1 -1
  65. package/dist/src/eval-core/evaluation-reporting.d.ts +7 -0
  66. package/dist/src/eval-core/evaluation-reporting.d.ts.map +1 -1
  67. package/dist/src/eval-core/evaluation-reporting.js +19 -2
  68. package/dist/src/eval-core/evaluation-reporting.js.map +1 -1
  69. package/dist/src/eval-core/execution-strategy.d.ts +1 -1
  70. package/dist/src/eval-core/execution-strategy.d.ts.map +1 -1
  71. package/dist/src/eval-core/execution-strategy.js +12 -1
  72. package/dist/src/eval-core/execution-strategy.js.map +1 -1
  73. package/dist/src/eval-core/mock-hook.cjs +203 -0
  74. package/dist/src/eval-core/mocks-runtime.d.ts +96 -0
  75. package/dist/src/eval-core/mocks-runtime.d.ts.map +1 -0
  76. package/dist/src/eval-core/mocks-runtime.js +323 -0
  77. package/dist/src/eval-core/mocks-runtime.js.map +1 -0
  78. package/dist/src/eval-core/schema.d.ts.map +1 -1
  79. package/dist/src/eval-core/schema.js +18 -5
  80. package/dist/src/eval-core/schema.js.map +1 -1
  81. package/dist/src/eval-core/task-planner.d.ts +9 -1
  82. package/dist/src/eval-core/task-planner.d.ts.map +1 -1
  83. package/dist/src/eval-core/task-planner.js +40 -1
  84. package/dist/src/eval-core/task-planner.js.map +1 -1
  85. package/dist/src/eval-workflows/batch-evaluation-workflow.d.ts +5 -1
  86. package/dist/src/eval-workflows/batch-evaluation-workflow.d.ts.map +1 -1
  87. package/dist/src/eval-workflows/batch-evaluation-workflow.js +2 -1
  88. package/dist/src/eval-workflows/batch-evaluation-workflow.js.map +1 -1
  89. package/dist/src/eval-workflows/evaluation-pipeline.d.ts +22 -1
  90. package/dist/src/eval-workflows/evaluation-pipeline.d.ts.map +1 -1
  91. package/dist/src/eval-workflows/evaluation-pipeline.js +39 -12
  92. package/dist/src/eval-workflows/evaluation-pipeline.js.map +1 -1
  93. package/dist/src/eval-workflows/evaluation-preparation.d.ts +5 -0
  94. package/dist/src/eval-workflows/evaluation-preparation.d.ts.map +1 -1
  95. package/dist/src/eval-workflows/evaluation-preparation.js +3 -1
  96. package/dist/src/eval-workflows/evaluation-preparation.js.map +1 -1
  97. package/dist/src/eval-workflows/run-evaluation.d.ts +12 -2
  98. package/dist/src/eval-workflows/run-evaluation.d.ts.map +1 -1
  99. package/dist/src/eval-workflows/run-evaluation.js +17 -5
  100. package/dist/src/eval-workflows/run-evaluation.js.map +1 -1
  101. package/dist/src/executors/claude-cli.d.ts +1 -1
  102. package/dist/src/executors/claude-cli.d.ts.map +1 -1
  103. package/dist/src/executors/claude-cli.js +57 -6
  104. package/dist/src/executors/claude-cli.js.map +1 -1
  105. package/dist/src/executors/claude-sdk-trace.d.ts.map +1 -1
  106. package/dist/src/executors/claude-sdk-trace.js +10 -4
  107. package/dist/src/executors/claude-sdk-trace.js.map +1 -1
  108. package/dist/src/executors/claude-sdk.d.ts +1 -1
  109. package/dist/src/executors/claude-sdk.d.ts.map +1 -1
  110. package/dist/src/executors/claude-sdk.js +25 -2
  111. package/dist/src/executors/claude-sdk.js.map +1 -1
  112. package/dist/src/executors/shared.d.ts +1 -1
  113. package/dist/src/executors/shared.d.ts.map +1 -1
  114. package/dist/src/executors/shared.js +6 -1
  115. package/dist/src/executors/shared.js.map +1 -1
  116. package/dist/src/grading/assertions.d.ts +5 -0
  117. package/dist/src/grading/assertions.d.ts.map +1 -1
  118. package/dist/src/grading/assertions.js +27 -1
  119. package/dist/src/grading/assertions.js.map +1 -1
  120. package/dist/src/grading/diagnostic.d.ts +40 -0
  121. package/dist/src/grading/diagnostic.d.ts.map +1 -0
  122. package/dist/src/grading/diagnostic.js +450 -0
  123. package/dist/src/grading/diagnostic.js.map +1 -0
  124. package/dist/src/grading/index.d.ts +5 -0
  125. package/dist/src/grading/index.d.ts.map +1 -1
  126. package/dist/src/grading/judge.d.ts.map +1 -1
  127. package/dist/src/grading/judge.js +54 -2
  128. package/dist/src/grading/judge.js.map +1 -1
  129. package/dist/src/grading/layered-scores.d.ts.map +1 -1
  130. package/dist/src/grading/layered-scores.js +1 -0
  131. package/dist/src/grading/layered-scores.js.map +1 -1
  132. package/dist/src/inputs/eval-config.js +19 -0
  133. package/dist/src/inputs/eval-config.js.map +1 -1
  134. package/dist/src/inputs/load-samples.d.ts +22 -2
  135. package/dist/src/inputs/load-samples.d.ts.map +1 -1
  136. package/dist/src/inputs/load-samples.js +193 -22
  137. package/dist/src/inputs/load-samples.js.map +1 -1
  138. package/dist/src/inputs/skill-loader.d.ts.map +1 -1
  139. package/dist/src/inputs/skill-loader.js +11 -3
  140. package/dist/src/inputs/skill-loader.js.map +1 -1
  141. package/dist/src/observability/experience.d.ts +260 -0
  142. package/dist/src/observability/experience.d.ts.map +1 -0
  143. package/dist/src/observability/experience.js +1233 -0
  144. package/dist/src/observability/experience.js.map +1 -0
  145. package/dist/src/observability/inbox-view-model.d.ts +11 -1
  146. package/dist/src/observability/inbox-view-model.d.ts.map +1 -1
  147. package/dist/src/observability/inbox-view-model.js +76 -3
  148. package/dist/src/observability/inbox-view-model.js.map +1 -1
  149. package/dist/src/observability/inbox.d.ts +27 -2
  150. package/dist/src/observability/inbox.d.ts.map +1 -1
  151. package/dist/src/observability/inbox.js +46 -8
  152. package/dist/src/observability/inbox.js.map +1 -1
  153. package/dist/src/observability/problem-patterns.d.ts +51 -0
  154. package/dist/src/observability/problem-patterns.d.ts.map +1 -0
  155. package/dist/src/observability/problem-patterns.js +205 -0
  156. package/dist/src/observability/problem-patterns.js.map +1 -0
  157. package/dist/src/observability/review-state.d.ts +54 -0
  158. package/dist/src/observability/review-state.d.ts.map +1 -0
  159. package/dist/src/observability/review-state.js +131 -0
  160. package/dist/src/observability/review-state.js.map +1 -0
  161. package/dist/src/observability/skill-chain-advisories.d.ts +25 -0
  162. package/dist/src/observability/skill-chain-advisories.d.ts.map +1 -0
  163. package/dist/src/observability/skill-chain-advisories.js +69 -0
  164. package/dist/src/observability/skill-chain-advisories.js.map +1 -0
  165. package/dist/src/observability/skill-chain.d.ts +61 -0
  166. package/dist/src/observability/skill-chain.d.ts.map +1 -0
  167. package/dist/src/observability/skill-chain.js +233 -0
  168. package/dist/src/observability/skill-chain.js.map +1 -0
  169. package/dist/src/observability/text-signals.d.ts +7 -0
  170. package/dist/src/observability/text-signals.d.ts.map +1 -0
  171. package/dist/src/observability/text-signals.js +22 -0
  172. package/dist/src/observability/text-signals.js.map +1 -0
  173. package/dist/src/observability/trace-adapter.d.ts +1 -1
  174. package/dist/src/observability/trace-adapter.d.ts.map +1 -1
  175. package/dist/src/observability/trace-adapter.js +1 -1
  176. package/dist/src/observability/trace-adapter.js.map +1 -1
  177. package/dist/src/observability/trace-attribution.d.ts +29 -1
  178. package/dist/src/observability/trace-attribution.d.ts.map +1 -1
  179. package/dist/src/observability/trace-attribution.js +106 -10
  180. package/dist/src/observability/trace-attribution.js.map +1 -1
  181. package/dist/src/observability/trace-segmenter.d.ts +11 -1
  182. package/dist/src/observability/trace-segmenter.d.ts.map +1 -1
  183. package/dist/src/observability/trace-segmenter.js +117 -28
  184. package/dist/src/observability/trace-segmenter.js.map +1 -1
  185. package/dist/src/observability/trace-source.d.ts +28 -1
  186. package/dist/src/observability/trace-source.d.ts.map +1 -1
  187. package/dist/src/observability/trace-source.js +356 -6
  188. package/dist/src/observability/trace-source.js.map +1 -1
  189. package/dist/src/renderer/html-renderer.d.ts.map +1 -1
  190. package/dist/src/renderer/html-renderer.js +229 -171
  191. package/dist/src/renderer/html-renderer.js.map +1 -1
  192. package/dist/src/renderer/layout.d.ts.map +1 -1
  193. package/dist/src/renderer/layout.js +108 -61
  194. package/dist/src/renderer/layout.js.map +1 -1
  195. package/dist/src/renderer/observation-inbox-renderer.d.ts.map +1 -1
  196. package/dist/src/renderer/observation-inbox-renderer.js +4567 -91
  197. package/dist/src/renderer/observation-inbox-renderer.js.map +1 -1
  198. package/dist/src/renderer/skill-detail-renderer.d.ts +15 -0
  199. package/dist/src/renderer/skill-detail-renderer.d.ts.map +1 -0
  200. package/dist/src/renderer/skill-detail-renderer.js +1234 -0
  201. package/dist/src/renderer/skill-detail-renderer.js.map +1 -0
  202. package/dist/src/renderer/skill-list-renderer.d.ts +4 -0
  203. package/dist/src/renderer/skill-list-renderer.d.ts.map +1 -0
  204. package/dist/src/renderer/skill-list-renderer.js +327 -0
  205. package/dist/src/renderer/skill-list-renderer.js.map +1 -0
  206. package/dist/src/renderer/summary.d.ts.map +1 -1
  207. package/dist/src/renderer/summary.js +78 -50
  208. package/dist/src/renderer/summary.js.map +1 -1
  209. package/dist/src/renderer/table.d.ts.map +1 -1
  210. package/dist/src/renderer/table.js +213 -167
  211. package/dist/src/renderer/table.js.map +1 -1
  212. package/dist/src/renderer/test-view.d.ts +66 -0
  213. package/dist/src/renderer/test-view.d.ts.map +1 -0
  214. package/dist/src/renderer/test-view.js +905 -0
  215. package/dist/src/renderer/test-view.js.map +1 -0
  216. package/dist/src/server/report-server.d.ts +4 -1
  217. package/dist/src/server/report-server.d.ts.map +1 -1
  218. package/dist/src/server/report-server.js +149 -4
  219. package/dist/src/server/report-server.js.map +1 -1
  220. package/dist/src/server/report-store.d.ts.map +1 -1
  221. package/dist/src/server/report-store.js +33 -1
  222. package/dist/src/server/report-store.js.map +1 -1
  223. package/dist/src/server/skill-index.d.ts +77 -0
  224. package/dist/src/server/skill-index.d.ts.map +1 -0
  225. package/dist/src/server/skill-index.js +331 -0
  226. package/dist/src/server/skill-index.js.map +1 -0
  227. package/dist/src/server/skill-insights.d.ts +92 -0
  228. package/dist/src/server/skill-insights.d.ts.map +1 -0
  229. package/dist/src/server/skill-insights.js +676 -0
  230. package/dist/src/server/skill-insights.js.map +1 -0
  231. package/dist/src/shared/hard-rules.d.ts +40 -0
  232. package/dist/src/shared/hard-rules.d.ts.map +1 -0
  233. package/dist/src/shared/hard-rules.js +200 -0
  234. package/dist/src/shared/hard-rules.js.map +1 -0
  235. package/dist/src/shared/time.d.ts +2 -0
  236. package/dist/src/shared/time.d.ts.map +1 -0
  237. package/dist/src/shared/time.js +10 -0
  238. package/dist/src/shared/time.js.map +1 -0
  239. package/dist/src/types/eval.d.ts +83 -0
  240. package/dist/src/types/eval.d.ts.map +1 -1
  241. package/dist/src/types/executor.d.ts +43 -0
  242. package/dist/src/types/executor.d.ts.map +1 -1
  243. package/dist/src/types/judge.d.ts +76 -0
  244. package/dist/src/types/judge.d.ts.map +1 -1
  245. package/dist/src/types/judge.js +3 -1
  246. package/dist/src/types/judge.js.map +1 -1
  247. package/dist/src/types/report.d.ts +63 -3
  248. package/dist/src/types/report.d.ts.map +1 -1
  249. package/dist/src/util/safe-slice.d.ts +23 -0
  250. package/dist/src/util/safe-slice.d.ts.map +1 -0
  251. package/dist/src/util/safe-slice.js +33 -0
  252. package/dist/src/util/safe-slice.js.map +1 -0
  253. package/package.json +5 -4
@@ -0,0 +1,203 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * omk-mock PreToolUse hook (CLI fallback path).
4
+ *
5
+ * 由 src/eval-core/mocks-runtime.ts:materializeForCliConfigDir 写到临时
6
+ * CLAUDE_CONFIG_DIR/mock-hook.cjs。Claude Code 子进程会以 hook 形式调它,
7
+ * stdin 收 PreToolUseHookInput,stdout 出 PreToolUseHookOutput JSON。
8
+ *
9
+ * 该脚本是无状态的 — 所有规则从 OMK_MOCKS_FILE 文件读。命中状态(状态机用)
10
+ * 通过同目录下的 hits.json 持久化(同一 spawn 内多次 hook 调用共享)。
11
+ */
12
+ const fs = require('fs');
13
+ const path = require('path');
14
+ const os = require('os');
15
+
16
+ function expandHome(p) {
17
+ if (p.startsWith('~/')) return path.join(os.homedir(), p.slice(2));
18
+ if (p === '~') return os.homedir();
19
+ return p;
20
+ }
21
+
22
+ /** 与 mocks-runtime.ts 的 matchesFilePathSuffix 对齐 — 完全相等或路径分隔符后缀。 */
23
+ function matchesFilePathSuffix(actualRaw, suffixRaw) {
24
+ const actual = expandHome(actualRaw);
25
+ const suffix = expandHome(suffixRaw);
26
+ if (actual === suffix) return true;
27
+ if (!actual.endsWith(suffix)) return false;
28
+ const sep = actual.charAt(actual.length - suffix.length - 1);
29
+ return sep === '/' || sep === '\\';
30
+ }
31
+
32
+ function globMatch(pattern, value) {
33
+ // 与 SDK 路径(mocks-runtime.ts)对齐:dotAll 让 `*` 跨换行匹配多行 bash。
34
+ const escaped = pattern.replace(/[.+?^${}()|[\]\\]/g, '\\$&');
35
+ return new RegExp('^' + escaped.replace(/\*/g, '.*') + '$', 's').test(value);
36
+ }
37
+
38
+ function arraysDeepEqual(a, b) {
39
+ if (a.length !== b.length) return false;
40
+ for (let i = 0; i < a.length; i++) if (!deepEqual(a[i], b[i])) return false;
41
+ return true;
42
+ }
43
+ function deepEqual(a, b) {
44
+ if (a === b) return true;
45
+ if (Array.isArray(a) && Array.isArray(b)) return arraysDeepEqual(a, b);
46
+ if (typeof a === 'object' && a !== null && typeof b === 'object' && b !== null
47
+ && !Array.isArray(a) && !Array.isArray(b)) {
48
+ const ak = Object.keys(a), bk = Object.keys(b);
49
+ if (ak.length !== bk.length) return false;
50
+ for (const k of ak) if (!deepEqual(a[k], b[k])) return false;
51
+ return true;
52
+ }
53
+ return false;
54
+ }
55
+ function matchesInputSubset(expected, actual) {
56
+ if (typeof actual !== 'object' || actual === null) return false;
57
+ for (const k of Object.keys(expected)) {
58
+ const v = expected[k];
59
+ if (Array.isArray(v)) {
60
+ if (!Array.isArray(actual[k]) || !arraysDeepEqual(v, actual[k])) return false;
61
+ } else if (typeof v === 'object' && v !== null) {
62
+ if (!matchesInputSubset(v, actual[k])) return false;
63
+ } else if (actual[k] !== v) {
64
+ return false;
65
+ }
66
+ }
67
+ return true;
68
+ }
69
+
70
+ function isMockHit(mock, toolName, toolInput) {
71
+ if (mock.tool !== toolName) return false;
72
+ const m = mock.match;
73
+ if (!m) return true;
74
+ const ti = toolInput || {};
75
+ if (m.file_path !== undefined) {
76
+ if (typeof ti.file_path !== 'string') return false;
77
+ if (expandHome(ti.file_path) !== expandHome(m.file_path)) return false;
78
+ }
79
+ if (m.file_path_endswith !== undefined) {
80
+ if (typeof ti.file_path !== 'string') return false;
81
+ if (!matchesFilePathSuffix(ti.file_path, m.file_path_endswith)) return false;
82
+ }
83
+ if (m.url !== undefined && ti.url !== m.url) return false;
84
+ if (m.url_glob !== undefined) {
85
+ if (typeof ti.url !== 'string' || !globMatch(m.url_glob, ti.url)) return false;
86
+ }
87
+ if (m.command_glob !== undefined) {
88
+ if (typeof ti.command !== 'string' || !globMatch(m.command_glob, ti.command)) return false;
89
+ }
90
+ if (m.input !== undefined && !matchesInputSubset(m.input, toolInput)) return false;
91
+ return true;
92
+ }
93
+
94
+ function stringifyReturn(r) {
95
+ if (typeof r === 'string') return r;
96
+ return JSON.stringify(r);
97
+ }
98
+
99
+ function resolveMockReturn(mock, hitCount, baseDir) {
100
+ if (mock.return_seq && hitCount < mock.return_seq.length) {
101
+ return stringifyReturn(mock.return_seq[hitCount]);
102
+ }
103
+ if (mock.return !== undefined) return stringifyReturn(mock.return);
104
+ if (mock.return_file) {
105
+ const fpath = path.isAbsolute(mock.return_file)
106
+ ? mock.return_file
107
+ : path.resolve(baseDir || process.cwd(), mock.return_file);
108
+ if (!fs.existsSync(fpath)) return `[omk-mock-error] return_file not found: ${fpath}`;
109
+ return fs.readFileSync(fpath, 'utf8');
110
+ }
111
+ return '';
112
+ }
113
+
114
+ // ─── main ────────────────────────────────────────────────────────────────────
115
+
116
+ let stdin = '';
117
+ process.stdin.on('data', (chunk) => { stdin += chunk; });
118
+ process.stdin.on('end', () => {
119
+ let input;
120
+ try {
121
+ input = JSON.parse(stdin);
122
+ } catch (e) {
123
+ process.stdout.write(JSON.stringify({ continue: true })); // hook 协议错误时放行
124
+ process.exit(0);
125
+ }
126
+
127
+ const mocksFile = process.env.OMK_MOCKS_FILE;
128
+ if (!mocksFile || !fs.existsSync(mocksFile)) {
129
+ // 没配 mocks 就 noop
130
+ process.stdout.write(JSON.stringify({ continue: true }));
131
+ process.exit(0);
132
+ }
133
+
134
+ const config = JSON.parse(fs.readFileSync(mocksFile, 'utf8'));
135
+ const mocks = config.mocks || [];
136
+ const baseDir = config.baseDir;
137
+ const strict = !!config.strict;
138
+
139
+ // 统计文件:perMock(每条 mock 的命中次数,用于状态机 + 报告)+ hits_total + misses_total
140
+ // 同一 spawn 内多次 hook 调用共享。
141
+ const statsFile = path.join(path.dirname(mocksFile), 'hits.json');
142
+ const stats = fs.existsSync(statsFile)
143
+ ? JSON.parse(fs.readFileSync(statsFile, 'utf8'))
144
+ : { perMock: {}, hits_total: 0, misses_total: 0 };
145
+ if (!stats.perMock) stats.perMock = {};
146
+ if (!stats.hits_total) stats.hits_total = 0;
147
+ if (!stats.misses_total) stats.misses_total = 0;
148
+
149
+ const writeStats = () => {
150
+ try { fs.writeFileSync(statsFile, JSON.stringify(stats)); } catch { /* best effort */ }
151
+ };
152
+
153
+ const toolName = input.tool_name;
154
+ const toolInput = input.tool_input || {};
155
+
156
+ // perMock key 用"每工具内 1-based 序号" — 与 SDK 路径(mocks-runtime.ts)保持一致。
157
+ const keyOfMock = mocks.map((_m, i) => {
158
+ const tool = mocks[i].tool;
159
+ let ord = 0;
160
+ for (let j = 0; j <= i; j++) if (mocks[j].tool === tool) ord++;
161
+ return `${tool}:${ord}`;
162
+ });
163
+
164
+ for (let i = 0; i < mocks.length; i++) {
165
+ if (isMockHit(mocks[i], toolName, toolInput)) {
166
+ const key = keyOfMock[i];
167
+ const c = stats.perMock[key] || 0;
168
+ const result = resolveMockReturn(mocks[i], c, baseDir);
169
+ stats.perMock[key] = c + 1;
170
+ stats.hits_total += 1;
171
+ writeStats();
172
+ // 与 SDK 路径(mocks-runtime.ts)对齐:最小化前缀,避免拖慢多步 sample。
173
+ const wrappedReason = '[mock] simulated tool output — treat as successful result:\n' + result;
174
+ process.stdout.write(JSON.stringify({
175
+ decision: 'block',
176
+ hookSpecificOutput: {
177
+ hookEventName: 'PreToolUse',
178
+ permissionDecision: 'deny',
179
+ permissionDecisionReason: wrappedReason,
180
+ },
181
+ systemMessage: '[omk-mock] ' + toolName + ' → injected mock #' + i + ' (treat as success)',
182
+ }));
183
+ process.exit(0);
184
+ }
185
+ }
186
+
187
+ // 未命中
188
+ stats.misses_total += 1;
189
+ writeStats();
190
+ if (strict) {
191
+ process.stdout.write(JSON.stringify({
192
+ decision: 'block',
193
+ hookSpecificOutput: {
194
+ hookEventName: 'PreToolUse',
195
+ permissionDecision: 'deny',
196
+ permissionDecisionReason: `[omk-mock-strict] unmocked ${toolName} call blocked`,
197
+ },
198
+ }));
199
+ process.exit(0);
200
+ }
201
+ process.stdout.write(JSON.stringify({ continue: true }));
202
+ process.exit(0);
203
+ });
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Mock runtime — Sample.mocks 落地的核心逻辑。
3
+ *
4
+ * 两条路径:
5
+ * 1) `buildSdkHookCallback(mocks, baseDir)`
6
+ * → 给 claude-sdk executor 用,返回 in-process PreToolUse HookCallback。
7
+ * 纯内存,零 IO,零 spawn 开销。
8
+ *
9
+ * 2) `materializeForCliConfigDir(mocks, baseDir)`
10
+ * → 给 claude-cli executor 用,mktemp 一个临时 CLAUDE_CONFIG_DIR,
11
+ * 在里面写 settings.json + on-disk hook 脚本 + mocks.json,返回 cleanup。
12
+ * claude 子进程退出后(成功/失败/超时/SIGINT),cleanup 必删整个临时目录。
13
+ *
14
+ * 共用核心:`matchMock(mocks, toolName, toolInput, callCounter)` 命中规则评估。
15
+ */
16
+ import type { Mock } from '../types/eval.js';
17
+ /** 单条 mock 是否命中给定 tool 调用。 */
18
+ export declare function isMockHit(mock: Mock, toolName: string, toolInput: unknown): boolean;
19
+ /** 把 mock 的 return / return_file / return_seq 解析成可序列化字符串(LLM 看到的 tool_result)。 */
20
+ export declare function resolveMockReturn(mock: Mock, hitCount: number, baseDir?: string): string;
21
+ /** SDK PreToolUse hook input(精简版,只用我们关心的字段)。 */
22
+ interface SdkHookInput {
23
+ hook_event_name: 'PreToolUse';
24
+ tool_name: string;
25
+ tool_input: unknown;
26
+ }
27
+ /** SDK PreToolUse hook output:`block` 决策 + permissionDecisionReason 当 mock content。 */
28
+ interface SdkHookOutput {
29
+ continue?: boolean;
30
+ decision?: 'block' | 'approve';
31
+ hookSpecificOutput?: {
32
+ hookEventName: 'PreToolUse';
33
+ permissionDecision?: 'deny' | 'allow' | 'ask';
34
+ permissionDecisionReason?: string;
35
+ };
36
+ systemMessage?: string;
37
+ }
38
+ export interface SdkHookHandle {
39
+ /** 给 SDK options.hooks.PreToolUse 用的 callback。 */
40
+ callback: (input: SdkHookInput) => Promise<SdkHookOutput>;
41
+ /** 拦截命中统计(诊断用)。 */
42
+ stats: {
43
+ hits: number;
44
+ misses: number;
45
+ perMock: Record<string, number>;
46
+ };
47
+ }
48
+ /**
49
+ * 把 mocks 转成 SDK in-process PreToolUse hook callback。
50
+ *
51
+ * 命中策略:strict 模式下不命中的工具调用直接 deny(防意外真调)。
52
+ * 默认非 strict:不命中放行(原生工具继续真跑)— 适合"部分 mock,部分真跑"场景。
53
+ *
54
+ * @param mocks Sample.mocks 数组
55
+ * @param baseDir 解析 mock.return_file 的相对路径锚点
56
+ * @param strict true → 不命中 deny;false → 不命中放行(default)
57
+ */
58
+ export declare function buildSdkHookCallback(mocks: Mock[] | undefined, baseDir?: string, strict?: boolean): SdkHookHandle;
59
+ export interface CliMockHandle {
60
+ /** 临时 settings 文件路径,作为 `claude --settings <path>` 参数传入。
61
+ * Claude Code 会**追加**这个 settings 到 ~/.claude/settings.json,**不替换** —
62
+ * 这样 OAuth 登录态 / 用户主配置都不动。 */
63
+ settingsFile: string;
64
+ /** 子进程要看到的额外 env(目前只 OMK_MOCKS_FILE)。 */
65
+ env: Record<string, string>;
66
+ /** 读 hook 在临时目录写的命中统计(给 ExecResult.mockStats 用)。
67
+ * 必须在 cleanup 之前调,cleanup 后文件就没了。 */
68
+ readStats: () => {
69
+ hits: number;
70
+ misses: number;
71
+ perMock: Record<string, number>;
72
+ };
73
+ /** 必须在 spawn 完成后(无论 success/error/timeout)调用。 */
74
+ cleanup: () => void;
75
+ }
76
+ /**
77
+ * 物化 mocks 到临时 settings 文件 + on-disk hook 脚本。
78
+ *
79
+ * **关键**:用 Claude Code 的 `--settings <file>` flag 而非 `CLAUDE_CONFIG_DIR`。
80
+ * `--settings` 是**追加**模式,主 `~/.claude/` 包含的 OAuth 登录态 / 用户配置全部保留;
81
+ * 而 CLAUDE_CONFIG_DIR 是**替换**模式,设它会丢 OAuth → "Not logged in"。
82
+ *
83
+ * 临时目录结构:
84
+ * $tmpdir/omk-mocks-XXXXXX/
85
+ * ├── settings.json (PreToolUse hook 注册,作为 --settings 参数)
86
+ * ├── mock-hook.cjs (hook 实现:读 OMK_MOCKS_FILE → 匹配 → 输出 JSON 决策)
87
+ * └── mocks.json (mocks 序列化 + baseDir + strict)
88
+ *
89
+ * cleanup 必删整个目录。executor 用 try / finally 保证执行。
90
+ */
91
+ export declare function materializeForCliConfigDir(mocks: Mock[] | undefined, baseDir?: string, strict?: boolean): CliMockHandle | null;
92
+ declare function readMockHookTemplate(): string;
93
+ export declare const _readMockHookTemplateForTest: typeof readMockHookTemplate;
94
+ export declare function _testMakeTempConfigDir(): string;
95
+ export {};
96
+ //# sourceMappingURL=mocks-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mocks-runtime.d.ts","sourceRoot":"","sources":["../../../src/eval-core/mocks-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,kBAAkB,CAAC;AA6EzD,8BAA8B;AAC9B,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO,CA2BnF;AAID,kFAAkF;AAClF,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAkBR;AAWD,gDAAgD;AAChD,UAAU,YAAY;IACpB,eAAe,EAAE,YAAY,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,uFAAuF;AACvF,UAAU,aAAa;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B,kBAAkB,CAAC,EAAE;QACnB,aAAa,EAAE,YAAY,CAAC;QAC5B,kBAAkB,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;QAC9C,wBAAwB,CAAC,EAAE,MAAM,CAAC;KACnC,CAAC;IACF,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,kDAAkD;IAClD,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;IAC1D,mBAAmB;IACnB,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;CAC1E;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,IAAI,EAAE,GAAG,SAAS,EACzB,OAAO,CAAC,EAAE,MAAM,EAChB,MAAM,UAAQ,GACb,aAAa,CAqDf;AAID,MAAM,WAAW,aAAa;IAC5B;;mCAE+B;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B;0CACsC;IACtC,SAAS,EAAE,MAAM;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;IACnF,iDAAiD;IACjD,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,IAAI,EAAE,GAAG,SAAS,EACzB,OAAO,CAAC,EAAE,MAAM,EAChB,MAAM,UAAQ,GACb,aAAa,GAAG,IAAI,CAwDtB;AAGD,iBAAS,oBAAoB,IAAI,MAAM,CAatC;AAGD,eAAO,MAAM,4BAA4B,6BAAuB,CAAC;AAIjE,wBAAgB,sBAAsB,IAAI,MAAM,CAI/C"}
@@ -0,0 +1,323 @@
1
+ /**
2
+ * Mock runtime — Sample.mocks 落地的核心逻辑。
3
+ *
4
+ * 两条路径:
5
+ * 1) `buildSdkHookCallback(mocks, baseDir)`
6
+ * → 给 claude-sdk executor 用,返回 in-process PreToolUse HookCallback。
7
+ * 纯内存,零 IO,零 spawn 开销。
8
+ *
9
+ * 2) `materializeForCliConfigDir(mocks, baseDir)`
10
+ * → 给 claude-cli executor 用,mktemp 一个临时 CLAUDE_CONFIG_DIR,
11
+ * 在里面写 settings.json + on-disk hook 脚本 + mocks.json,返回 cleanup。
12
+ * claude 子进程退出后(成功/失败/超时/SIGINT),cleanup 必删整个临时目录。
13
+ *
14
+ * 共用核心:`matchMock(mocks, toolName, toolInput, callCounter)` 命中规则评估。
15
+ */
16
+ import { mkdtempSync, rmSync, writeFileSync, mkdirSync, readFileSync, existsSync } from 'node:fs';
17
+ import { homedir, tmpdir } from 'node:os';
18
+ import { dirname, isAbsolute, join, resolve } from 'node:path';
19
+ import { fileURLToPath } from 'node:url';
20
+ // ─── Match logic ────────────────────────────────────────────────────────────
21
+ function expandHome(p) {
22
+ if (p.startsWith('~/'))
23
+ return join(homedir(), p.slice(2));
24
+ if (p === '~')
25
+ return homedir();
26
+ return p;
27
+ }
28
+ /** file_path 后缀匹配:actual 完全等于 suffix,或 actual 在 path-separator 后以 suffix 结尾。
29
+ * 避免 'state.json' 误匹配 'bad-state.json'。两端都先 expandHome。
30
+ * 例:suffix='tasks/foo/state.json' 命中 'tasks/foo/state.json' / '/abs/x/tasks/foo/state.json' /
31
+ * 'C:\\proj\\tasks\\foo\\state.json' (Windows backslash 也接受)。 */
32
+ function matchesFilePathSuffix(actualRaw, suffixRaw) {
33
+ const actual = expandHome(actualRaw);
34
+ const suffix = expandHome(suffixRaw);
35
+ if (actual === suffix)
36
+ return true;
37
+ if (!actual.endsWith(suffix))
38
+ return false;
39
+ const boundaryIdx = actual.length - suffix.length - 1;
40
+ const sep = actual.charAt(boundaryIdx);
41
+ return sep === '/' || sep === '\\';
42
+ }
43
+ /** glob 匹配(只支持 `*` 通配,不支持 `**` / `?` / `[...]`,够用且无依赖)。
44
+ * 使用 dotAll 标志(`s`),让 `*` 也能跨换行匹配 — LLM 经常用反斜杠续行写多行 bash,
45
+ * 不带 `s` 时单行 glob 会全部漏掉(integration-tool-deploy eval 上首次发现这个坑)。 */
46
+ function globMatch(pattern, value) {
47
+ const escaped = pattern.replace(/[.+?^${}()|[\]\\]/g, '\\$&');
48
+ const re = new RegExp('^' + escaped.replace(/\*/g, '.*') + '$', 's');
49
+ return re.test(value);
50
+ }
51
+ /** deep equal 子集匹配:expected 的每个 key/value 在 actual 中存在且相等(actual 可有更多字段)。 */
52
+ /** 数组 deep-equal:长度相等 + 每个元素递归比较(支持嵌套数组 / object)。 */
53
+ function arraysDeepEqual(a, b) {
54
+ if (a.length !== b.length)
55
+ return false;
56
+ for (let i = 0; i < a.length; i++) {
57
+ if (!deepEqual(a[i], b[i]))
58
+ return false;
59
+ }
60
+ return true;
61
+ }
62
+ function deepEqual(a, b) {
63
+ if (a === b)
64
+ return true;
65
+ if (Array.isArray(a) && Array.isArray(b))
66
+ return arraysDeepEqual(a, b);
67
+ if (typeof a === 'object' && a !== null && typeof b === 'object' && b !== null
68
+ && !Array.isArray(a) && !Array.isArray(b)) {
69
+ const ao = a;
70
+ const bo = b;
71
+ const ak = Object.keys(ao);
72
+ const bk = Object.keys(bo);
73
+ if (ak.length !== bk.length)
74
+ return false;
75
+ for (const k of ak) {
76
+ if (!deepEqual(ao[k], bo[k]))
77
+ return false;
78
+ }
79
+ return true;
80
+ }
81
+ return false;
82
+ }
83
+ function matchesInputSubset(expected, actual) {
84
+ if (typeof actual !== 'object' || actual === null)
85
+ return false;
86
+ const a = actual;
87
+ for (const [k, v] of Object.entries(expected)) {
88
+ if (Array.isArray(v)) {
89
+ // 数组 deep-equal,不要靠 === 引用比较 — 不同 sample 实例的同样数组永远不会等
90
+ if (!Array.isArray(a[k]) || !arraysDeepEqual(v, a[k]))
91
+ return false;
92
+ }
93
+ else if (typeof v === 'object' && v !== null) {
94
+ if (!matchesInputSubset(v, a[k]))
95
+ return false;
96
+ }
97
+ else if (a[k] !== v) {
98
+ return false;
99
+ }
100
+ }
101
+ return true;
102
+ }
103
+ /** 单条 mock 是否命中给定 tool 调用。 */
104
+ export function isMockHit(mock, toolName, toolInput) {
105
+ if (mock.tool !== toolName)
106
+ return false;
107
+ const m = mock.match;
108
+ if (!m)
109
+ return true;
110
+ const ti = (toolInput || {});
111
+ if (m.file_path !== undefined) {
112
+ if (typeof ti.file_path !== 'string')
113
+ return false;
114
+ if (expandHome(ti.file_path) !== expandHome(m.file_path))
115
+ return false;
116
+ }
117
+ if (m.file_path_endswith !== undefined) {
118
+ if (typeof ti.file_path !== 'string')
119
+ return false;
120
+ if (!matchesFilePathSuffix(ti.file_path, m.file_path_endswith))
121
+ return false;
122
+ }
123
+ if (m.url !== undefined) {
124
+ if (ti.url !== m.url)
125
+ return false;
126
+ }
127
+ if (m.url_glob !== undefined) {
128
+ if (typeof ti.url !== 'string' || !globMatch(m.url_glob, ti.url))
129
+ return false;
130
+ }
131
+ if (m.command_glob !== undefined) {
132
+ if (typeof ti.command !== 'string' || !globMatch(m.command_glob, ti.command))
133
+ return false;
134
+ }
135
+ if (m.input !== undefined) {
136
+ if (!matchesInputSubset(m.input, toolInput))
137
+ return false;
138
+ }
139
+ return true;
140
+ }
141
+ // ─── Return resolution ──────────────────────────────────────────────────────
142
+ /** 把 mock 的 return / return_file / return_seq 解析成可序列化字符串(LLM 看到的 tool_result)。 */
143
+ export function resolveMockReturn(mock, hitCount, baseDir) {
144
+ // return_seq 优先,按 hit 序号取(超出长度 fallback 到 return / return_file)
145
+ if (mock.return_seq && hitCount < mock.return_seq.length) {
146
+ return stringifyReturn(mock.return_seq[hitCount]);
147
+ }
148
+ if (mock.return !== undefined) {
149
+ return stringifyReturn(mock.return);
150
+ }
151
+ if (mock.return_file) {
152
+ const fpath = isAbsolute(mock.return_file)
153
+ ? mock.return_file
154
+ : resolve(baseDir || process.cwd(), mock.return_file);
155
+ if (!existsSync(fpath)) {
156
+ return `[omk-mock-error] return_file not found: ${fpath}`;
157
+ }
158
+ return readFileSync(fpath, 'utf8');
159
+ }
160
+ return ''; // 没配 return,给空串(LLM 收到空 tool_result)
161
+ }
162
+ function stringifyReturn(r) {
163
+ if (typeof r === 'string')
164
+ return r;
165
+ // Bash 风格对象:exit !=0 时格式化成 LLM 能理解的"失败"输出
166
+ // 这里统一序列化成 JSON,LLM 能从结构化字段读到 stdout/stderr/exit
167
+ return JSON.stringify(r);
168
+ }
169
+ /**
170
+ * 把 mocks 转成 SDK in-process PreToolUse hook callback。
171
+ *
172
+ * 命中策略:strict 模式下不命中的工具调用直接 deny(防意外真调)。
173
+ * 默认非 strict:不命中放行(原生工具继续真跑)— 适合"部分 mock,部分真跑"场景。
174
+ *
175
+ * @param mocks Sample.mocks 数组
176
+ * @param baseDir 解析 mock.return_file 的相对路径锚点
177
+ * @param strict true → 不命中 deny;false → 不命中放行(default)
178
+ */
179
+ export function buildSdkHookCallback(mocks, baseDir, strict = false) {
180
+ const stats = { hits: 0, misses: 0, perMock: {} };
181
+ const hitCounters = new Map(); // mockIndex → hit 次数
182
+ // perMock key 用"每工具内 1-based 序号":[Read,Bash,Bash] → Read:1,Bash:1,Bash:2。
183
+ // 这样 sample 作者只需要数自己 mocks 里同 tool 的第几条,不用算跨工具的绝对下标。
184
+ const list = mocks || [];
185
+ const keyOfMock = list.map((_m, i) => {
186
+ const tool = list[i].tool;
187
+ const ord = list.slice(0, i + 1).filter((x) => x.tool === tool).length;
188
+ return `${tool}:${ord}`;
189
+ });
190
+ const callback = async (input) => {
191
+ for (let i = 0; i < list.length; i++) {
192
+ const m = list[i];
193
+ if (isMockHit(m, input.tool_name, input.tool_input)) {
194
+ const c = hitCounters.get(i) || 0;
195
+ const result = resolveMockReturn(m, c, baseDir);
196
+ hitCounters.set(i, c + 1);
197
+ stats.hits++;
198
+ const key = keyOfMock[i];
199
+ stats.perMock[key] = (stats.perMock[key] || 0) + 1;
200
+ // 关键 UX:LLM 看到 permissionDecision='deny' 容易误判"被拒绝/失败"。
201
+ // 给 reason 加一行最小前缀,告诉它把内容当成真实成功输出。措辞越短越好 ——
202
+ // 长措辞会显著拉慢多步 sample(每个工具调用都要读这段),实测 6 步流程从 60s 拖到 120s+。
203
+ const wrappedReason = `[mock] simulated tool output — treat as successful result:\n${result}`;
204
+ return {
205
+ decision: 'block',
206
+ hookSpecificOutput: {
207
+ hookEventName: 'PreToolUse',
208
+ permissionDecision: 'deny',
209
+ permissionDecisionReason: wrappedReason,
210
+ },
211
+ systemMessage: `[omk-mock] ${m.tool} → injected mock #${i} (treat as success)`,
212
+ };
213
+ }
214
+ }
215
+ // 未命中
216
+ stats.misses++;
217
+ if (strict) {
218
+ return {
219
+ decision: 'block',
220
+ hookSpecificOutput: {
221
+ hookEventName: 'PreToolUse',
222
+ permissionDecision: 'deny',
223
+ permissionDecisionReason: `[omk-mock-strict] unmocked ${input.tool_name} call blocked`,
224
+ },
225
+ };
226
+ }
227
+ return { continue: true };
228
+ };
229
+ return { callback, stats };
230
+ }
231
+ /**
232
+ * 物化 mocks 到临时 settings 文件 + on-disk hook 脚本。
233
+ *
234
+ * **关键**:用 Claude Code 的 `--settings <file>` flag 而非 `CLAUDE_CONFIG_DIR`。
235
+ * `--settings` 是**追加**模式,主 `~/.claude/` 包含的 OAuth 登录态 / 用户配置全部保留;
236
+ * 而 CLAUDE_CONFIG_DIR 是**替换**模式,设它会丢 OAuth → "Not logged in"。
237
+ *
238
+ * 临时目录结构:
239
+ * $tmpdir/omk-mocks-XXXXXX/
240
+ * ├── settings.json (PreToolUse hook 注册,作为 --settings 参数)
241
+ * ├── mock-hook.cjs (hook 实现:读 OMK_MOCKS_FILE → 匹配 → 输出 JSON 决策)
242
+ * └── mocks.json (mocks 序列化 + baseDir + strict)
243
+ *
244
+ * cleanup 必删整个目录。executor 用 try / finally 保证执行。
245
+ */
246
+ export function materializeForCliConfigDir(mocks, baseDir, strict = false) {
247
+ if (!mocks || mocks.length === 0)
248
+ return null;
249
+ const configDir = mkdtempSync(join(tmpdir(), 'omk-mocks-'));
250
+ const mocksFile = join(configDir, 'mocks.json');
251
+ const settingsFile = join(configDir, 'settings.json');
252
+ const hookScript = join(configDir, 'mock-hook.cjs');
253
+ const hookSource = readMockHookTemplate();
254
+ writeFileSync(hookScript, hookSource, 'utf8');
255
+ writeFileSync(mocksFile, JSON.stringify({ mocks, baseDir, strict }, null, 2));
256
+ const settings = {
257
+ hooks: {
258
+ PreToolUse: [
259
+ {
260
+ matcher: '.*',
261
+ hooks: [
262
+ { type: 'command', command: `node ${hookScript}` },
263
+ ],
264
+ },
265
+ ],
266
+ },
267
+ };
268
+ writeFileSync(settingsFile, JSON.stringify(settings, null, 2));
269
+ const statsFile = join(configDir, 'hits.json');
270
+ const readStats = () => {
271
+ if (!existsSync(statsFile)) {
272
+ return { hits: 0, misses: 0, perMock: {} };
273
+ }
274
+ try {
275
+ const raw = JSON.parse(readFileSync(statsFile, 'utf8'));
276
+ return {
277
+ hits: raw.hits_total || 0,
278
+ misses: raw.misses_total || 0,
279
+ perMock: raw.perMock || {},
280
+ };
281
+ }
282
+ catch {
283
+ return { hits: 0, misses: 0, perMock: {} };
284
+ }
285
+ };
286
+ const cleanup = () => {
287
+ try {
288
+ rmSync(configDir, { recursive: true, force: true });
289
+ }
290
+ catch { /* swallow — best effort */ }
291
+ };
292
+ return {
293
+ settingsFile,
294
+ env: { OMK_MOCKS_FILE: mocksFile },
295
+ readStats,
296
+ cleanup,
297
+ };
298
+ }
299
+ let _hookTemplate = null;
300
+ function readMockHookTemplate() {
301
+ if (_hookTemplate)
302
+ return _hookTemplate;
303
+ // hook 跟本文件共置在 src/eval-core/(开发模式)或 dist/src/eval-core/(npm 安装模式),
304
+ // build script 把 mock-hook.cjs 复制到 dist/。读 sibling 路径就行,不再依赖外层 assets/。
305
+ const here = dirname(fileURLToPath(import.meta.url));
306
+ const hookPath = resolve(here, 'mock-hook.cjs');
307
+ if (!existsSync(hookPath)) {
308
+ throw new Error(`omk-mock: mock-hook.cjs not found at ${hookPath}. ` +
309
+ `如果是从源码运行,确认 src/eval-core/mock-hook.cjs 存在;如果是 npm 安装,` +
310
+ `package 漏发了 hook,提 issue 并附 omk 版本。`);
311
+ }
312
+ _hookTemplate = readFileSync(hookPath, 'utf8');
313
+ return _hookTemplate;
314
+ }
315
+ // 测试用 export:供 packaging smoke test 验证 hook 能被解析
316
+ export const _readMockHookTemplateForTest = readMockHookTemplate;
317
+ // ─── 工具:在不影响主目录的前提下创建临时 dir(测试也要)─────────────
318
+ export function _testMakeTempConfigDir() {
319
+ const dir = mkdtempSync(join(tmpdir(), 'omk-mocks-test-'));
320
+ mkdirSync(dir, { recursive: true });
321
+ return dir;
322
+ }
323
+ //# sourceMappingURL=mocks-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mocks-runtime.js","sourceRoot":"","sources":["../../../src/eval-core/mocks-runtime.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/eval-core/schema.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAe,aAAa,EAAE,cAAc,EAA0B,MAAM,mBAAmB,CAAC;AA2BrI;;GAEG;AACH,UAAU,mBAAmB;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,OAAO,CAAC;YAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;CACvK;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,aAAa,CAyFxI;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,cAAc,CA+G5E"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/eval-core/schema.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAe,aAAa,EAAE,cAAc,EAA0B,MAAM,mBAAmB,CAAC;AA4BrI;;GAEG;AACH,UAAU,mBAAmB;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,OAAO,CAAC;YAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;CACvK;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,aAAa,CA8FxI;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,cAAc,CAsH5E"}