@dommaker/harness 1.1.1 → 1.2.1

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 (373) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +2 -4
  3. package/bin/harness.js +12 -37
  4. package/dist/cli/commands/check.d.ts +2 -2
  5. package/dist/cli/commands/check.d.ts.map +1 -1
  6. package/dist/cli/commands/check.js +8 -33
  7. package/dist/cli/commands/check.js.map +1 -1
  8. package/dist/cli/commands/constraints-report.js +1 -1
  9. package/dist/cli/commands/constraints-report.js.map +1 -1
  10. package/dist/cli/commands/constraints-retire.d.ts +6 -3
  11. package/dist/cli/commands/constraints-retire.d.ts.map +1 -1
  12. package/dist/cli/commands/constraints-retire.js +34 -25
  13. package/dist/cli/commands/constraints-retire.js.map +1 -1
  14. package/dist/cli/commands/definitions.d.ts +2 -0
  15. package/dist/cli/commands/definitions.d.ts.map +1 -1
  16. package/dist/cli/commands/definitions.js.map +1 -1
  17. package/dist/cli/commands/init.d.ts +21 -1
  18. package/dist/cli/commands/init.d.ts.map +1 -1
  19. package/dist/cli/commands/init.js +118 -40
  20. package/dist/cli/commands/init.js.map +1 -1
  21. package/dist/cli/commands/knowledge.d.ts.map +1 -1
  22. package/dist/cli/commands/knowledge.js +1 -12
  23. package/dist/cli/commands/knowledge.js.map +1 -1
  24. package/dist/cli/commands/report.d.ts.map +1 -1
  25. package/dist/cli/commands/report.js +0 -2
  26. package/dist/cli/commands/report.js.map +1 -1
  27. package/dist/cli/commands/status.js +2 -2
  28. package/dist/cli/commands/status.js.map +1 -1
  29. package/dist/context/index.d.ts +9 -6
  30. package/dist/context/index.d.ts.map +1 -1
  31. package/dist/context/index.js +18 -20
  32. package/dist/context/index.js.map +1 -1
  33. package/dist/core/constraints/capabilities-parser.d.ts +3 -2
  34. package/dist/core/constraints/capabilities-parser.d.ts.map +1 -1
  35. package/dist/core/constraints/capabilities-parser.js +25 -47
  36. package/dist/core/constraints/capabilities-parser.js.map +1 -1
  37. package/dist/core/constraints/checker.d.ts +29 -32
  38. package/dist/core/constraints/checker.d.ts.map +1 -1
  39. package/dist/core/constraints/checker.js +34 -126
  40. package/dist/core/constraints/checker.js.map +1 -1
  41. package/dist/core/constraints/checkers/governance-presence.d.ts +20 -0
  42. package/dist/core/constraints/checkers/governance-presence.d.ts.map +1 -0
  43. package/dist/core/constraints/checkers/governance-presence.js +76 -0
  44. package/dist/core/constraints/checkers/governance-presence.js.map +1 -0
  45. package/dist/core/constraints/checkers/index.d.ts +2 -1
  46. package/dist/core/constraints/checkers/index.d.ts.map +1 -1
  47. package/dist/core/constraints/checkers/index.js +5 -0
  48. package/dist/core/constraints/checkers/index.js.map +1 -1
  49. package/dist/core/constraints/checkers/types.d.ts +25 -0
  50. package/dist/core/constraints/checkers/types.d.ts.map +1 -1
  51. package/dist/core/constraints/checkers/types.js +24 -0
  52. package/dist/core/constraints/checkers/types.js.map +1 -1
  53. package/dist/core/constraints/definitions/guidelines.d.ts.map +1 -1
  54. package/dist/core/constraints/definitions/guidelines.js +21 -2
  55. package/dist/core/constraints/definitions/guidelines.js.map +1 -1
  56. package/dist/core/constraints/definitions/prompts.d.ts.map +1 -1
  57. package/dist/core/constraints/definitions/prompts.js +0 -5
  58. package/dist/core/constraints/definitions/prompts.js.map +1 -1
  59. package/dist/core/constraints/index.d.ts +1 -2
  60. package/dist/core/constraints/index.d.ts.map +1 -1
  61. package/dist/core/constraints/index.js +1 -7
  62. package/dist/core/constraints/index.js.map +1 -1
  63. package/dist/core/constraints/injection-drift.d.ts +29 -4
  64. package/dist/core/constraints/injection-drift.d.ts.map +1 -1
  65. package/dist/core/constraints/injection-drift.js +52 -20
  66. package/dist/core/constraints/injection-drift.js.map +1 -1
  67. package/dist/core/constraints/usage-report.d.ts +1 -2
  68. package/dist/core/constraints/usage-report.d.ts.map +1 -1
  69. package/dist/core/constraints/usage-report.js +2 -5
  70. package/dist/core/constraints/usage-report.js.map +1 -1
  71. package/dist/core/effective-constraints.d.ts +24 -4
  72. package/dist/core/effective-constraints.d.ts.map +1 -1
  73. package/dist/core/effective-constraints.js +28 -7
  74. package/dist/core/effective-constraints.js.map +1 -1
  75. package/dist/core/effective-set.d.ts +30 -0
  76. package/dist/core/effective-set.d.ts.map +1 -0
  77. package/dist/core/effective-set.js +35 -0
  78. package/dist/core/effective-set.js.map +1 -0
  79. package/dist/core/index.d.ts +13 -6
  80. package/dist/core/index.d.ts.map +1 -1
  81. package/dist/core/index.js +44 -21
  82. package/dist/core/index.js.map +1 -1
  83. package/dist/core/project-config-loader.d.ts +3 -6
  84. package/dist/core/project-config-loader.d.ts.map +1 -1
  85. package/dist/core/project-config-loader.js +47 -61
  86. package/dist/core/project-config-loader.js.map +1 -1
  87. package/dist/failure/constraint-handler.d.ts +1 -1
  88. package/dist/failure/constraint-handler.js +1 -1
  89. package/dist/gates/checker-gate.d.ts +1 -4
  90. package/dist/gates/checker-gate.d.ts.map +1 -1
  91. package/dist/gates/checker-gate.js +3 -11
  92. package/dist/gates/checker-gate.js.map +1 -1
  93. package/dist/gates/definitions.d.ts +9 -38
  94. package/dist/gates/definitions.d.ts.map +1 -1
  95. package/dist/gates/definitions.js +24 -13
  96. package/dist/gates/definitions.js.map +1 -1
  97. package/dist/gates/effective-gates.d.ts.map +1 -1
  98. package/dist/gates/effective-gates.js +14 -18
  99. package/dist/gates/effective-gates.js.map +1 -1
  100. package/dist/gates/index.d.ts +1 -1
  101. package/dist/gates/index.d.ts.map +1 -1
  102. package/dist/gates/index.js.map +1 -1
  103. package/dist/hooks/bootstrap.d.ts.map +1 -1
  104. package/dist/hooks/bootstrap.js +0 -3
  105. package/dist/hooks/bootstrap.js.map +1 -1
  106. package/dist/index.d.ts +43 -60
  107. package/dist/index.d.ts.map +1 -1
  108. package/dist/index.js +180 -143
  109. package/dist/index.js.map +1 -1
  110. package/dist/knowledge/query.d.ts +15 -0
  111. package/dist/knowledge/query.d.ts.map +1 -1
  112. package/dist/knowledge/query.js +23 -0
  113. package/dist/knowledge/query.js.map +1 -1
  114. package/dist/monitoring/analyzer-base.d.ts +0 -4
  115. package/dist/monitoring/analyzer-base.d.ts.map +1 -1
  116. package/dist/monitoring/analyzer-base.js +0 -21
  117. package/dist/monitoring/analyzer-base.js.map +1 -1
  118. package/dist/monitoring/index.d.ts +6 -12
  119. package/dist/monitoring/index.d.ts.map +1 -1
  120. package/dist/monitoring/index.js +13 -29
  121. package/dist/monitoring/index.js.map +1 -1
  122. package/dist/monitoring/trace-analyzer.d.ts.map +1 -1
  123. package/dist/monitoring/trace-analyzer.js +2 -68
  124. package/dist/monitoring/trace-analyzer.js.map +1 -1
  125. package/dist/monitoring/traces.d.ts +0 -4
  126. package/dist/monitoring/traces.d.ts.map +1 -1
  127. package/dist/monitoring/traces.js +0 -14
  128. package/dist/monitoring/traces.js.map +1 -1
  129. package/dist/presets/index.d.ts +2 -2
  130. package/dist/presets/index.d.ts.map +1 -1
  131. package/dist/presets/index.js +3 -4
  132. package/dist/presets/index.js.map +1 -1
  133. package/dist/presets/standard.d.ts +10 -22
  134. package/dist/presets/standard.d.ts.map +1 -1
  135. package/dist/presets/standard.js +15 -75
  136. package/dist/presets/standard.js.map +1 -1
  137. package/dist/types/constraint.d.ts +1 -29
  138. package/dist/types/constraint.d.ts.map +1 -1
  139. package/dist/types/constraint.js +1 -1
  140. package/dist/types/constraint.js.map +1 -1
  141. package/dist/types/index.d.ts +0 -3
  142. package/dist/types/index.d.ts.map +1 -1
  143. package/dist/types/index.js +0 -4
  144. package/dist/types/index.js.map +1 -1
  145. package/dist/types/project-config.d.ts +4 -8
  146. package/dist/types/project-config.d.ts.map +1 -1
  147. package/dist/types/trace.d.ts +5 -18
  148. package/dist/types/trace.d.ts.map +1 -1
  149. package/package.json +2 -2
  150. package/src/CONTEXT.md +4 -5
  151. package/src/__tests__/checker-extra.test.ts +33 -139
  152. package/src/__tests__/checker.test.ts +0 -376
  153. package/src/__tests__/governance-presence.test.ts +129 -0
  154. package/src/__tests__/iron-laws.test.ts +7 -7
  155. package/src/__tests__/project-config-loader-extra.test.ts +42 -29
  156. package/src/__tests__/public-exports.test.ts +138 -0
  157. package/src/__tests__/trace-analyzer-extra.test.ts +6 -86
  158. package/src/__tests__/trace-analyzer.test.ts +4 -5
  159. package/src/__tests__/trace-collector.test.ts +0 -11
  160. package/src/__tests__/traces.test.ts +3 -22
  161. package/src/cli/commands/CONTEXT.md +6 -3
  162. package/src/cli/commands/__tests__/check-skip-output.test.ts +10 -7
  163. package/src/cli/commands/__tests__/check.test.ts +29 -69
  164. package/src/cli/commands/__tests__/constraints-report.test.ts +3 -3
  165. package/src/cli/commands/__tests__/constraints-retire.test.ts +45 -4
  166. package/src/cli/commands/__tests__/init-injection.test.ts +202 -0
  167. package/src/cli/commands/__tests__/knowledge.test.ts +90 -1
  168. package/src/cli/commands/__tests__/registry.test.ts +8 -6
  169. package/src/cli/commands/__tests__/status-extra.test.ts +6 -6
  170. package/src/cli/commands/__tests__/status.test.ts +6 -6
  171. package/src/cli/commands/__tests__/sync-docs-agents.test.ts +28 -0
  172. package/src/cli/commands/check.ts +9 -35
  173. package/src/cli/commands/constraints-report.ts +1 -1
  174. package/src/cli/commands/constraints-retire.ts +38 -27
  175. package/src/cli/commands/definitions.ts +2 -0
  176. package/src/cli/commands/init.ts +129 -40
  177. package/src/cli/commands/knowledge.ts +1 -16
  178. package/src/cli/commands/report.ts +0 -2
  179. package/src/cli/commands/status.ts +2 -2
  180. package/src/context/index.ts +29 -6
  181. package/src/core/CONTEXT.md +4 -3
  182. package/src/core/__tests__/effective-set.test.ts +80 -0
  183. package/src/core/constraints/__tests__/injection-drift.test.ts +90 -0
  184. package/src/core/constraints/capabilities-parser.ts +43 -49
  185. package/src/core/constraints/checker.ts +51 -145
  186. package/src/core/constraints/checkers/governance-presence.ts +74 -0
  187. package/src/core/constraints/checkers/index.ts +4 -1
  188. package/src/core/constraints/checkers/types.ts +42 -0
  189. package/src/core/constraints/definitions/guidelines.ts +22 -2
  190. package/src/core/constraints/definitions/prompts.ts +0 -5
  191. package/src/core/constraints/index.ts +2 -17
  192. package/src/core/constraints/injection-drift.ts +60 -21
  193. package/src/core/constraints/usage-report.ts +5 -8
  194. package/src/core/effective-constraints.ts +35 -7
  195. package/src/core/effective-set.ts +56 -0
  196. package/src/core/index.ts +80 -6
  197. package/src/core/project-config-loader.ts +53 -68
  198. package/src/failure/CONTEXT.md +1 -1
  199. package/src/failure/constraint-handler.ts +1 -1
  200. package/src/gates/CONTEXT.md +3 -3
  201. package/src/gates/checker-gate.ts +4 -12
  202. package/src/gates/definitions.ts +27 -50
  203. package/src/gates/effective-gates.ts +14 -21
  204. package/src/gates/index.ts +1 -1
  205. package/src/hooks/bootstrap.ts +0 -3
  206. package/src/index.ts +384 -148
  207. package/src/knowledge/CONTEXT.md +2 -2
  208. package/src/knowledge/__tests__/query.test.ts +64 -0
  209. package/src/knowledge/query.ts +28 -0
  210. package/src/monitoring/CONTEXT.md +7 -13
  211. package/src/monitoring/__tests__/traces.test.ts +0 -10
  212. package/src/monitoring/analyzer-base.ts +0 -22
  213. package/src/monitoring/index.ts +6 -12
  214. package/src/monitoring/trace-analyzer.ts +2 -73
  215. package/src/monitoring/traces.ts +0 -20
  216. package/src/presets/__tests__/standard.test.ts +48 -69
  217. package/src/presets/index.ts +3 -5
  218. package/src/presets/standard.ts +14 -79
  219. package/src/spec/CONTEXT.md +5 -13
  220. package/src/types/constraint.ts +1 -51
  221. package/src/types/index.ts +0 -12
  222. package/src/types/project-config.ts +4 -10
  223. package/src/types/trace.ts +5 -30
  224. package/dist/core/constraints/interceptor.d.ts +0 -39
  225. package/dist/core/constraints/interceptor.d.ts.map +0 -1
  226. package/dist/core/constraints/interceptor.js +0 -166
  227. package/dist/core/constraints/interceptor.js.map +0 -1
  228. package/dist/dashboard/data.d.ts +0 -31
  229. package/dist/dashboard/data.d.ts.map +0 -1
  230. package/dist/dashboard/data.js +0 -81
  231. package/dist/dashboard/data.js.map +0 -1
  232. package/dist/dashboard/index.d.ts +0 -4
  233. package/dist/dashboard/index.d.ts.map +0 -1
  234. package/dist/dashboard/index.js +0 -20
  235. package/dist/dashboard/index.js.map +0 -1
  236. package/dist/dashboard/stats.d.ts +0 -20
  237. package/dist/dashboard/stats.d.ts.map +0 -1
  238. package/dist/dashboard/stats.js +0 -115
  239. package/dist/dashboard/stats.js.map +0 -1
  240. package/dist/dashboard/types.d.ts +0 -110
  241. package/dist/dashboard/types.d.ts.map +0 -1
  242. package/dist/dashboard/types.js +0 -8
  243. package/dist/dashboard/types.js.map +0 -1
  244. package/dist/monitoring/constraint-doctor.d.ts +0 -76
  245. package/dist/monitoring/constraint-doctor.d.ts.map +0 -1
  246. package/dist/monitoring/constraint-doctor.js +0 -189
  247. package/dist/monitoring/constraint-doctor.js.map +0 -1
  248. package/dist/monitoring/diagnosis-rules.d.ts +0 -18
  249. package/dist/monitoring/diagnosis-rules.d.ts.map +0 -1
  250. package/dist/monitoring/diagnosis-rules.js +0 -119
  251. package/dist/monitoring/diagnosis-rules.js.map +0 -1
  252. package/dist/monitoring/knowledge-doctor.d.ts +0 -78
  253. package/dist/monitoring/knowledge-doctor.d.ts.map +0 -1
  254. package/dist/monitoring/knowledge-doctor.js +0 -266
  255. package/dist/monitoring/knowledge-doctor.js.map +0 -1
  256. package/dist/monitoring/knowledge-evolver.d.ts +0 -72
  257. package/dist/monitoring/knowledge-evolver.d.ts.map +0 -1
  258. package/dist/monitoring/knowledge-evolver.js +0 -205
  259. package/dist/monitoring/knowledge-evolver.js.map +0 -1
  260. package/dist/monitoring/performance-analyzer.d.ts +0 -92
  261. package/dist/monitoring/performance-analyzer.d.ts.map +0 -1
  262. package/dist/monitoring/performance-analyzer.js +0 -343
  263. package/dist/monitoring/performance-analyzer.js.map +0 -1
  264. package/dist/monitoring/performance-collector.d.ts +0 -103
  265. package/dist/monitoring/performance-collector.d.ts.map +0 -1
  266. package/dist/monitoring/performance-collector.js +0 -298
  267. package/dist/monitoring/performance-collector.js.map +0 -1
  268. package/dist/safety/index.d.ts +0 -6
  269. package/dist/safety/index.d.ts.map +0 -1
  270. package/dist/safety/index.js +0 -22
  271. package/dist/safety/index.js.map +0 -1
  272. package/dist/safety/input-guardrail.d.ts +0 -36
  273. package/dist/safety/input-guardrail.d.ts.map +0 -1
  274. package/dist/safety/input-guardrail.js +0 -118
  275. package/dist/safety/input-guardrail.js.map +0 -1
  276. package/dist/safety/output-guardrail.d.ts +0 -39
  277. package/dist/safety/output-guardrail.d.ts.map +0 -1
  278. package/dist/safety/output-guardrail.js +0 -147
  279. package/dist/safety/output-guardrail.js.map +0 -1
  280. package/dist/safety/sandbox.d.ts +0 -45
  281. package/dist/safety/sandbox.d.ts.map +0 -1
  282. package/dist/safety/sandbox.js +0 -134
  283. package/dist/safety/sandbox.js.map +0 -1
  284. package/dist/safety/tool-guardrail.d.ts +0 -51
  285. package/dist/safety/tool-guardrail.d.ts.map +0 -1
  286. package/dist/safety/tool-guardrail.js +0 -147
  287. package/dist/safety/tool-guardrail.js.map +0 -1
  288. package/dist/safety/types.d.ts +0 -104
  289. package/dist/safety/types.d.ts.map +0 -1
  290. package/dist/safety/types.js +0 -6
  291. package/dist/safety/types.js.map +0 -1
  292. package/dist/spec/annotation-checker.d.ts +0 -47
  293. package/dist/spec/annotation-checker.d.ts.map +0 -1
  294. package/dist/spec/annotation-checker.js +0 -279
  295. package/dist/spec/annotation-checker.js.map +0 -1
  296. package/dist/types/enforcement.d.ts +0 -42
  297. package/dist/types/enforcement.d.ts.map +0 -1
  298. package/dist/types/enforcement.js +0 -6
  299. package/dist/types/enforcement.js.map +0 -1
  300. package/dist/types/monitoring-types.d.ts +0 -53
  301. package/dist/types/monitoring-types.d.ts.map +0 -1
  302. package/dist/types/monitoring-types.js +0 -10
  303. package/dist/types/monitoring-types.js.map +0 -1
  304. package/dist/types/performance.d.ts +0 -204
  305. package/dist/types/performance.d.ts.map +0 -1
  306. package/dist/types/performance.js +0 -12
  307. package/dist/types/performance.js.map +0 -1
  308. package/dist/verification/index.d.ts +0 -4
  309. package/dist/verification/index.d.ts.map +0 -1
  310. package/dist/verification/index.js +0 -20
  311. package/dist/verification/index.js.map +0 -1
  312. package/dist/verification/loop.d.ts +0 -30
  313. package/dist/verification/loop.d.ts.map +0 -1
  314. package/dist/verification/loop.js +0 -114
  315. package/dist/verification/loop.js.map +0 -1
  316. package/dist/verification/rules-based.d.ts +0 -40
  317. package/dist/verification/rules-based.d.ts.map +0 -1
  318. package/dist/verification/rules-based.js +0 -130
  319. package/dist/verification/rules-based.js.map +0 -1
  320. package/dist/verification/types.d.ts +0 -69
  321. package/dist/verification/types.d.ts.map +0 -1
  322. package/dist/verification/types.js +0 -6
  323. package/dist/verification/types.js.map +0 -1
  324. package/src/__tests__/annotation-checker.test.ts +0 -183
  325. package/src/__tests__/constraint-doctor.test.ts +0 -271
  326. package/src/__tests__/doctor-extra.test.ts +0 -155
  327. package/src/__tests__/extend-exceptions.test.ts +0 -149
  328. package/src/__tests__/interceptor.test.ts +0 -89
  329. package/src/__tests__/performance-analyzer.test.ts +0 -499
  330. package/src/__tests__/performance-collector.test.ts +0 -276
  331. package/src/__tests__/presets.test.ts +0 -65
  332. package/src/core/constraints/__tests__/interceptor.test.ts +0 -267
  333. package/src/core/constraints/interceptor.ts +0 -217
  334. package/src/dashboard/CONTEXT.md +0 -21
  335. package/src/dashboard/__tests__/data.test.ts +0 -111
  336. package/src/dashboard/__tests__/stats.test.ts +0 -159
  337. package/src/dashboard/data.ts +0 -103
  338. package/src/dashboard/index.ts +0 -3
  339. package/src/dashboard/stats.ts +0 -127
  340. package/src/dashboard/types.ts +0 -130
  341. package/src/monitoring/__tests__/knowledge-doctor.test.ts +0 -278
  342. package/src/monitoring/__tests__/knowledge-evolver.test.ts +0 -368
  343. package/src/monitoring/__tests__/performance-analyzer.test.ts +0 -137
  344. package/src/monitoring/__tests__/performance-collector.test.ts +0 -331
  345. package/src/monitoring/constraint-doctor.ts +0 -228
  346. package/src/monitoring/diagnosis-rules.ts +0 -132
  347. package/src/monitoring/knowledge-doctor.ts +0 -322
  348. package/src/monitoring/knowledge-evolver.ts +0 -289
  349. package/src/monitoring/performance-analyzer.ts +0 -400
  350. package/src/monitoring/performance-collector.ts +0 -326
  351. package/src/safety/CONTEXT.md +0 -23
  352. package/src/safety/__tests__/input-guardrail.test.ts +0 -105
  353. package/src/safety/__tests__/output-guardrail.test.ts +0 -108
  354. package/src/safety/__tests__/sandbox.test.ts +0 -158
  355. package/src/safety/__tests__/tool-guardrail.test.ts +0 -127
  356. package/src/safety/index.ts +0 -5
  357. package/src/safety/input-guardrail.ts +0 -133
  358. package/src/safety/output-guardrail.ts +0 -170
  359. package/src/safety/sandbox.ts +0 -148
  360. package/src/safety/tool-guardrail.ts +0 -176
  361. package/src/safety/types.ts +0 -124
  362. package/src/spec/__tests__/annotation-checker.test.ts +0 -294
  363. package/src/spec/annotation-checker.ts +0 -320
  364. package/src/types/enforcement.ts +0 -48
  365. package/src/types/monitoring-types.ts +0 -68
  366. package/src/types/performance.ts +0 -295
  367. package/src/verification/CONTEXT.md +0 -23
  368. package/src/verification/__tests__/loop.test.ts +0 -303
  369. package/src/verification/__tests__/rules-based.test.ts +0 -240
  370. package/src/verification/index.ts +0 -3
  371. package/src/verification/loop.ts +0 -137
  372. package/src/verification/rules-based.ts +0 -152
  373. package/src/verification/types.ts +0 -81
package/src/index.ts CHANGED
@@ -1,12 +1,12 @@
1
1
  /**
2
2
  * @dommaker/harness - 主入口
3
- *
3
+ *
4
4
  * 通用工程约束框架
5
- *
5
+ *
6
6
  * 约束体系(ADR-0001 kind 二元):
7
7
  * - check:可执行检查(Iron Laws 阻断 / Guidelines 告警)
8
8
  * - prompt:纯文本注入,不参与检查
9
- *
9
+ *
10
10
  * 门禁系统:
11
11
  * - PassesGate:测试门控
12
12
  * - ReviewGate:审查门禁
@@ -14,187 +14,423 @@
14
14
  * - PerformanceGate:性能门禁
15
15
  * - ContractGate:契约门禁
16
16
  * - CheckpointValidator:检查点验证
17
+ *
18
+ * 公共导出(ADR-0003):显式清单,禁 export *。
19
+ * 收录标准:属 harness 定位(约束数据 / 执行引擎 / 注入工具 / 知识基建)、
20
+ * 实现真实可用、无同名冲突。内部 seam
21
+ * (ConstraintChecker / constraintChecker / ProjectConfigLoader)不进公共清单。
17
22
  */
18
23
 
19
24
  // ========================================
20
- // 类型导出
21
- // ========================================
22
- export * from './types';
25
+ // 约束类型(三层体系 + kind 二元)
26
+ // ========================================
27
+ export {
28
+ ConstraintViolationError,
29
+ } from './types/constraint';
30
+ export type {
31
+ Constraint,
32
+ ConstraintId,
33
+ ConstraintKind,
34
+ ConstraintLevel,
35
+ ConstraintTrigger,
36
+ ConstraintContext,
37
+ ConstraintResult,
38
+ ConstraintCheckResult,
39
+ IronLawContext,
40
+ } from './types/constraint';
23
41
 
24
42
  // ========================================
25
- // 核心功能导出
26
- // ========================================
27
- export * from './core';
43
+ // 约束数据(内置定义 + 生效集)
44
+ // ========================================
45
+ export {
46
+ IRON_LAWS,
47
+ GUIDELINES,
48
+ PROMPTS,
49
+ getAllConstraints,
50
+ getConstraint,
51
+ findConstraintsByTrigger,
52
+ } from './core/constraints/definitions';
53
+ export {
54
+ getEffectiveConstraints,
55
+ lintEffectiveConfig,
56
+ } from './core/effective-constraints';
57
+ export type { EffectiveConfigLint } from './core/effective-constraints';
28
58
 
29
59
  // ========================================
30
- // 门禁系统导出
60
+ // 约束检查引擎(便捷 API;options 统一签名,ADR-0003)
31
61
  // ========================================
32
- export * from './gates';
62
+ export {
63
+ checkConstraint,
64
+ checkConstraints,
65
+ checkBeforeExecution,
66
+ } from './core/constraints/checker';
67
+ export type { CheckConstraintsOptions } from './core/constraints/checker';
33
68
 
34
69
  // ========================================
35
- // 监控导出
70
+ // 约束缓存与注入渲染
36
71
  // ========================================
37
- export * from './monitoring';
38
-
39
- // ========================================
40
- // 失败处理导出
41
- // ========================================
42
- export * from './failure';
72
+ export { CheckCache } from './core/constraints/check-cache';
73
+ export type { CheckCacheConfig, CheckSamplingConfig } from './core/constraints/check-cache';
74
+ export { renderConstraintsByTrigger } from './core/constraints/agent-prompt-renderer';
75
+ export type { RenderConstraintsByTriggerOptions } from './core/constraints/agent-prompt-renderer';
76
+ export {
77
+ CONSTRAINTS_START_MARKER,
78
+ CONSTRAINTS_END_MARKER,
79
+ renderConstraintsSection,
80
+ } from './core/constraints/injection-renderer';
43
81
 
44
82
  // ========================================
45
- // Spec 检查导出
46
- // ========================================
47
- export * from './spec/annotation-checker';
83
+ // 检查点与验证器
84
+ // ========================================
85
+ export type {
86
+ Checkpoint,
87
+ CheckpointCheck,
88
+ CheckpointContext,
89
+ CheckpointResult,
90
+ CheckConfig,
91
+ CheckResult,
92
+ CheckType,
93
+ } from './types/checkpoint';
94
+ export {
95
+ CheckpointValidator,
96
+ PassesGate,
97
+ createPassesGate,
98
+ CSOValidator,
99
+ } from './core/validators';
100
+ export type { CSOIssue, CSOValidationResult } from './core/validators';
101
+ export type {
102
+ PassesGateConfig,
103
+ PassesGateResult,
104
+ PassesGateCheckResult,
105
+ PassesGateViolation,
106
+ PassesGateExtension,
107
+ TestResult,
108
+ DynamicTask,
109
+ TaskTestResult,
110
+ ExtensionTestResult,
111
+ } from './types/passes-gate';
112
+ export type {
113
+ StepMeta,
114
+ ToolMeta,
115
+ WorkflowMeta,
116
+ } from './types/cso';
48
117
 
49
118
  // ========================================
50
- // 上下文管理导出
51
- // ========================================
52
- export * from './context';
119
+ // 会话启动 / 净室状态
120
+ // ========================================
121
+ export {
122
+ SessionStartup,
123
+ createSessionStartup,
124
+ DEFAULT_CODE_CHECKPOINTS,
125
+ MINIMAL_CHECKPOINTS,
126
+ CleanStateManager,
127
+ createCleanStateManager,
128
+ } from './core/session';
129
+ export type {
130
+ StartupCheckpoints,
131
+ StartupCheckpointType,
132
+ StartupCheckpointResult,
133
+ CleanStateConfig,
134
+ CleanStateResult,
135
+ DetectedBug,
136
+ TaskListJson,
137
+ TaskStepStatus,
138
+ SessionInfo,
139
+ } from './types/session';
140
+ // 与 passes-gate 同名类型的 session 版(沿用既有别名)
141
+ export { DynamicTask as ExtendedDynamicTask, TaskTestResult as ExtendedTaskTestResult } from './types/session';
53
142
 
54
143
  // ========================================
55
- // 知识引擎导出
56
- // ========================================
57
- export * from './knowledge';
144
+ // Spec 验证(已接线的 spec 故事:validator + SpecAcceptanceGate)
145
+ // ========================================
146
+ export { SpecValidator, validateSpec, validateAllSpecs } from './core/spec/validator';
147
+ export type {
148
+ SpecValidatorConfig,
149
+ SpecValidationResult,
150
+ BatchSpecValidationResult,
151
+ SpecSchemaDefinition,
152
+ SpecType,
153
+ SpecValidationError,
154
+ SchemaLoader,
155
+ } from './types/spec';
58
156
 
59
157
  // ========================================
60
- // 安全护栏导出
61
- // ========================================
62
- export * from './safety';
158
+ // 门禁系统(公共面 = ./gates 子路径出口)
159
+ // ========================================
160
+ export {
161
+ ReviewGate,
162
+ SecurityGate,
163
+ PerformanceGate,
164
+ ContractGate,
165
+ SpecAcceptanceGate,
166
+ CommandGate,
167
+ createCommandGate,
168
+ getCommandGate,
169
+ isCommandAllowed,
170
+ getCommandRiskLevel,
171
+ DEFAULT_COMMAND_BLACKLIST,
172
+ createReviewGate,
173
+ createSecurityGate,
174
+ createPerformanceGate,
175
+ createContractGate,
176
+ createSpecAcceptanceGate,
177
+ decisionFromResult,
178
+ GATE_DEFINITIONS,
179
+ getGate,
180
+ listRegisteredGates,
181
+ registeredGateCount,
182
+ assertGateRegistryClosed,
183
+ runGates,
184
+ getEffectiveGates,
185
+ createCheckerGate,
186
+ } from './gates';
187
+ export type {
188
+ GateResult,
189
+ GateContext,
190
+ Gate,
191
+ GateDecision,
192
+ GateDecisionStatus,
193
+ GateDefinition,
194
+ GateRunResult,
195
+ GatesConfig,
196
+ PerformanceThresholds,
197
+ ReviewGateConfig,
198
+ SecurityGateConfig,
199
+ PerformanceGateConfig,
200
+ ContractGateConfig,
201
+ SpecAcceptanceGateConfig,
202
+ AcceptanceGateContext,
203
+ AcceptanceCriteria,
204
+ CommandBlacklistRule,
205
+ CommandGateConfig,
206
+ } from './gates';
63
207
 
64
208
  // ========================================
65
- // 验证循环导出
66
- // ========================================
67
- export * from './verification';
209
+ // 监控(Execution Trace 收集/分析 + 上下文追踪)
210
+ // ========================================
211
+ export {
212
+ DEFAULT_TRACE_FILE,
213
+ } from './types/trace';
214
+ export type {
215
+ ExecutionTrace,
216
+ TraceFilter,
217
+ TraceSummary,
218
+ TraceAnomaly,
219
+ TraceCollectorConfig,
220
+ TraceAnalyzerConfig,
221
+ } from './types/trace';
222
+ export {
223
+ TraceCollector,
224
+ getTraceCollector,
225
+ configureTraceCollector,
226
+ TraceAnalyzer,
227
+ createAnalyzer,
228
+ ContextTracker,
229
+ } from './monitoring';
230
+ export type { ContextAverages } from './monitoring';
68
231
 
69
232
  // ========================================
70
- // Completion Checkers 导出(T7-E1,studio#160)
71
- // WU 收尾软观测三纯判定函数:tdd-chain / phase-format / contract-presence。
72
- // 纯函数直接 export,不进 ConstraintCheck 闭环注册表。
73
- // ========================================
74
- export * from './completion-checkers';
233
+ // 失败处理(错误分类 + 记录 + 违规处理策略)
234
+ // ========================================
235
+ export {
236
+ ErrorType,
237
+ FailureLevel,
238
+ DEFAULT_CLASSIFICATION_RULES,
239
+ DEFAULT_LEVEL_MAPPING,
240
+ ErrorClassifier,
241
+ createErrorClassifier,
242
+ classifyError,
243
+ getFailureLevel,
244
+ FailureRecorder,
245
+ createFailureRecorder,
246
+ ConstraintViolationHandler,
247
+ executeWithBlock,
248
+ executeWithCollect,
249
+ executeWithSafeBoolean,
250
+ } from './failure';
251
+ export type {
252
+ FailureRecord,
253
+ ErrorClassificationRule,
254
+ ClassificationResult,
255
+ ErrorClassifierConfig,
256
+ FailureRecorderConfig,
257
+ ViolationStrategy,
258
+ ViolationHandlingResult,
259
+ } from './failure';
75
260
 
76
261
  // ========================================
77
- // Dashboard 数据导出
78
- // ========================================
79
- export * from './dashboard';
262
+ // 上下文管理(Token 预算 + 会话压缩 + 知识注入)
263
+ // ========================================
264
+ export {
265
+ AdaptiveTokenBudget,
266
+ TokenBudget,
267
+ TokenEstimator,
268
+ DEFAULT_COMPACTION_CONFIG,
269
+ SessionCompaction,
270
+ SessionManager,
271
+ KnowledgeInjector,
272
+ } from './context';
273
+ export type {
274
+ CompactionConfig,
275
+ CompactionLevel,
276
+ CompactionResult,
277
+ ContextSource,
278
+ ContextSourceType,
279
+ ContextUsageSnapshot,
280
+ InjectionConfig,
281
+ InjectionResult,
282
+ SessionCheckpoint,
283
+ SessionEvent,
284
+ SessionEventType,
285
+ SessionHandle,
286
+ SessionMessage,
287
+ } from './context';
80
288
 
81
289
  // ========================================
82
- // 工具路径导出
83
- // ========================================
84
- export * from './tools';
290
+ // 知识引擎(Knowledge 基建)
291
+ // ========================================
292
+ export {
293
+ FileKnowledgeStore,
294
+ KnowledgeQuery,
295
+ KnowledgeLifecycle,
296
+ KnowledgeIngest,
297
+ sanitizeExternalContent,
298
+ ReferenceTracker,
299
+ KnowledgeLinter,
300
+ ColdStartImporter,
301
+ KnowledgeHealthScorer,
302
+ KnowledgeLifecycleHooks,
303
+ KnowledgeAudit,
304
+ migrateKnowledgeEntries,
305
+ extractCodeStructure,
306
+ DEFAULT_DECAY_CONFIG,
307
+ } from './knowledge';
308
+ export type {
309
+ KnowledgeEntry,
310
+ KnowledgeStore,
311
+ KnowledgeSubsystem,
312
+ KnowledgeOrigin,
313
+ KnowledgeReference,
314
+ MaturityLevel,
315
+ MaturityChange,
316
+ DecayConfig,
317
+ SourceRef,
318
+ DecisionRecord,
319
+ QueryFilter,
320
+ QueryBudget,
321
+ QueryResult,
322
+ ExecutionResult,
323
+ IndexEntry,
324
+ StorageLayer,
325
+ ConsumptionEvent,
326
+ ConsumptionMode,
327
+ IngestOptions,
328
+ ReferenceRecord,
329
+ LintIssue,
330
+ LintIssueType,
331
+ AuditRuleName,
332
+ AuditAction,
333
+ AuditIssue,
334
+ AuditReport,
335
+ AuditOptions,
336
+ CodeStructure,
337
+ DeclarationInfo,
338
+ ImportInfo,
339
+ } from './knowledge';
85
340
 
86
341
  // ========================================
87
- // Hooks 管线导出(Phase 1
342
+ // Completion Checkers(T7-E1,studio#160
343
+ // WU 收尾软观测三纯判定函数:tdd-chain / phase-format / contract-presence。
344
+ // 纯函数直接 export,不进 ConstraintCheck 闭环注册表。
88
345
  // ========================================
89
- export * from './hooks';
346
+ export {
347
+ DEFAULT_TEST_GLOBS,
348
+ DEFAULT_NONCODE_GLOBS,
349
+ matchGlob,
350
+ matchAnyGlob,
351
+ classifyCommitFiles,
352
+ resolveGlobs,
353
+ verifyTddChain,
354
+ TESTED_BY_RE,
355
+ TESTS_NONE_RE,
356
+ verifyPhaseFormat,
357
+ PHASE_SUBJECT_RE,
358
+ verifyContractPresence,
359
+ } from './completion-checkers';
360
+ export type {
361
+ CheckerVerdict,
362
+ CommitVerdict,
363
+ CommitInput,
364
+ CommitFileClassification,
365
+ CompletionCheckersConfig,
366
+ ContractPresenceContext,
367
+ ContractPresenceResult,
368
+ PhaseFormatResult,
369
+ TddChainResult,
370
+ } from './completion-checkers';
90
371
 
91
372
  // ========================================
92
- // Agent 生命周期导出
373
+ // 工具路径
93
374
  // ========================================
94
- export * from './agents';
375
+ export { getRegistryPath, getToolsDir } from './tools';
95
376
 
96
377
  // ========================================
97
- // 预设导出
98
- // ========================================
99
- export * from './presets';
378
+ // Hooks 管线
379
+ // ========================================
380
+ export {
381
+ HookRegistry,
382
+ assertHookRegistryClosed,
383
+ HookPipeline,
384
+ toErrorStrategy,
385
+ bootstrapHarness,
386
+ bootstrapHarnessSync,
387
+ } from './hooks';
388
+ export type {
389
+ HookDefinition,
390
+ HookConfig,
391
+ HookErrorStrategy,
392
+ HookExecutionRecord,
393
+ HookPhase,
394
+ HookResult,
395
+ PipelineResult,
396
+ HarnessBootstrap,
397
+ } from './hooks';
100
398
 
101
399
  // ========================================
102
- // 约束缓存与渲染导出(H6/G5-G6,#31 收编)
103
- // ========================================
104
- export { CheckCache } from './core/constraints/check-cache';
105
- export type { CheckCacheConfig, CheckSamplingConfig } from './core/constraints/check-cache';
106
- export { renderConstraintsByTrigger } from './core/constraints/agent-prompt-renderer';
107
- export type { RenderConstraintsByTriggerOptions } from './core/constraints/agent-prompt-renderer';
400
+ // Agent 生命周期
401
+ // ========================================
402
+ export {
403
+ AgentLifecycle,
404
+ } from './agents';
405
+ export type {
406
+ AgentConfig,
407
+ AgentEvent,
408
+ AgentState,
409
+ AgentStatus,
410
+ EventHandler,
411
+ FallbackStrategy,
412
+ } from './agents';
108
413
 
109
414
  // ========================================
110
- // 便捷 API
111
- // ========================================
112
-
113
- import { constraintChecker } from './core/constraints/checker';
114
- import { getTraceCollector } from './monitoring/traces';
115
- import type { ConstraintContext, ConstraintCheckResult, ConstraintTrigger } from './types/constraint';
116
- import type { MergedConstraintsConfig } from './types/project-config';
117
- import { constraintInterceptor } from './core/constraints/interceptor';
118
- import type { EnforcementExecutor, EnforcementId, InterceptionResult } from './types/enforcement';
119
-
120
- // 工单 15:checker 的 trace 记录改为注入式,根入口在此接入真实收集器(保持既有行为)
121
- constraintChecker.setTraceRecorder(getTraceCollector());
122
-
123
- /** 约束拦截器单例,用于注册 enforcement executor 和拦截操作 */
124
- export const interceptor = constraintInterceptor;
125
-
126
- /**
127
- * 拦截操作 — 在操作执行前检查约束
128
- * @param trigger - 触发条件
129
- * @param context - 约束上下文
130
- * @param customConfig - 可选,per-request 自定义约束配置;不传则用内置约束集
131
- * @returns 拦截结果(是否通过、违规列表)
132
- */
133
- export async function interceptOperation(
134
- trigger: ConstraintTrigger,
135
- context: ConstraintContext,
136
- customConfig?: MergedConstraintsConfig | null
137
- ): Promise<InterceptionResult> {
138
- return constraintInterceptor.intercept(trigger, context, customConfig);
139
- }
140
-
141
- /**
142
- * 声明操作意图 — 声明即将执行的操作,但不执行检查
143
- * @param trigger - 触发条件
144
- * @param context - 约束上下文
145
- */
146
- export async function claimOperation(
147
- trigger: ConstraintTrigger,
148
- context: ConstraintContext
149
- ): Promise<void> {
150
- return constraintInterceptor.claim(trigger, context);
151
- }
152
-
153
- /**
154
- * 注册 enforcement executor — 将 enforcement ID 连接到实际检查逻辑
155
- * @param enforcementId - enforcement ID(对应约束定义中的 enforcement 字段)
156
- * @param executor - 执行器实现
157
- * @param source - 注册来源(如 'builtin', 'plugin')
158
- */
159
- export function registerExecutor(
160
- enforcementId: EnforcementId,
161
- executor: EnforcementExecutor,
162
- source?: string
163
- ): void {
164
- constraintInterceptor.register(enforcementId, executor, source);
165
- }
166
-
167
- /**
168
- * 检查约束(check 层)
169
- *
170
- * @param context - 约束上下文
171
- * @param options.onTrace - 每条约束检查后的回调(用于记录 trace 到外部存储)
172
- * @param options.customConfig - 可选,per-request 自定义约束配置;不传则用内置约束集
173
- */
174
- export async function checkConstraints(
175
- context: ConstraintContext,
176
- options?: {
177
- onTrace?: (result: import('./types/constraint').ConstraintResult) => void;
178
- customConfig?: MergedConstraintsConfig | null;
179
- }
180
- ): Promise<ConstraintCheckResult> {
181
- const result = await constraintChecker.checkConstraints(context, options?.customConfig ?? null);
182
- if (options?.onTrace) {
183
- for (const r of result.ironLaws) options.onTrace(r);
184
- for (const r of result.guidelines) options.onTrace(r);
185
- }
186
- return result;
187
- }
188
-
189
- /**
190
- * 执行前检查(仅 Iron Laws)
191
- *
192
- * @param context - 约束上下文
193
- * @param customConfig - 可选,per-request 自定义约束配置;不传则用内置约束集
194
- */
195
- export async function checkBeforeExecution(
196
- context: ConstraintContext,
197
- customConfig?: MergedConstraintsConfig | null
198
- ): Promise<void> {
199
- return constraintChecker.beforeExecution(context, customConfig);
200
- }
415
+ // 项目配置类型(config.yml 形状;Loader 属内部 seam 不公开)
416
+ // ========================================
417
+ export type {
418
+ ProjectConfig,
419
+ MergedConstraintsConfig,
420
+ CustomConstraintDefinition,
421
+ GovernanceConfig,
422
+ CapabilitiesConfig,
423
+ ChangelogConfig,
424
+ ChangelogVersionCheck,
425
+ TestingGovernanceConfig,
426
+ ContextFilesConfig,
427
+ ContextDocsCheck,
428
+ DocsSyncConfig,
429
+ DocFreshnessConfig,
430
+ DocFreshnessCheck,
431
+ DocDirCheck,
432
+ DocRegexCountCheck,
433
+ ConstCountActual,
434
+ DirCountActual,
435
+ GrepCountActual,
436
+ } from './types/project-config';
@@ -18,7 +18,7 @@
18
18
 
19
19
  ## 核心导出
20
20
  - `KnowledgeStore` — 知识条目 CRUD + 结构化存储
21
- - `KnowledgeQuery` — 语义搜索 + 类型/标签过滤 + `queryByMode()` + `consume(taskContext)`
21
+ - `KnowledgeQuery` — 语义搜索 + 类型/标签过滤 + `queryByMode()` + `consume(taskContext)`;`query()` 是 budget 截断管线(仅用于 prompt 注入),`search()` 是全语料文本搜索(先匹配→排序→limit,交互搜索专用,勿用 query() 代替)
22
22
  - `KnowledgeLifecycle` — per-mode 生命周期管理
23
23
  - `KnowledgeIngest` — 知识摄取引擎(含 ingest gate 质量门)+ `ingestExternal()` 外部内容摄入
24
24
  - `sanitizeExternalContent` — 外部内容安全清洗(过滤注入模式 + 长度限制)
@@ -32,7 +32,7 @@
32
32
 
33
33
  ## 依赖关系
34
34
  - 依赖 `src/types/` 知识相关类型
35
- - 依赖 `src/monitoring/` KnowledgeDoctor / KnowledgeEvolver
35
+ - 依赖 `src/context/types`(ContextUsageSnapshot 等类型;不依赖 monitoring——知识健康评分由本目录 doctor.ts KnowledgeHealthScorer 承载)
36
36
  - 被 `src/cli/commands/knowledge.ts` CLI 消费(含 `migrate` 子命令)
37
37
 
38
38
  ## 约定
@@ -268,4 +268,68 @@ describe('KnowledgeQuery', () => {
268
268
  expect(result).toBe('Internal: Details');
269
269
  });
270
270
  });
271
+
272
+ describe('search', () => {
273
+ it('should match against title, content and tags (case-insensitive)', () => {
274
+ store.save(makeEntry({ id: 'DEC-001', title: 'Autolink Design' }));
275
+ store.save(makeEntry({ id: 'DEC-002', title: 'Other', content: 'mentions AUTOLINK here' }));
276
+ store.save(makeEntry({ id: 'DEC-003', title: 'Tagged', tags: ['autolink'] }));
277
+ store.save(makeEntry({ id: 'DEC-004', title: 'Unrelated', content: 'nothing' }));
278
+
279
+ const result = query.search('autolink');
280
+ expect(result.map(e => e.id).sort()).toEqual(['DEC-001', 'DEC-002', 'DEC-003']);
281
+ });
282
+
283
+ it('should match on the full corpus regardless of token volume (harness#63)', () => {
284
+ // 语料总 token 远超任何 prompt budget;排序队尾的 draft 新条目必须可搜到
285
+ for (let i = 0; i < 25; i++) {
286
+ store.save(makeEntry({
287
+ id: `FILL-${String(i).padStart(3, '0')}`,
288
+ title: `填充 ${i}`,
289
+ content: '填'.repeat(399),
290
+ maturity: 'proven',
291
+ lastReferenced: '2026-08-01T00:00:00.000Z',
292
+ }));
293
+ }
294
+ store.save(makeEntry({ id: 'PIT-020', title: '新条目', content: 'autolink 要点' }));
295
+
296
+ const result = query.search('autolink', { limit: 200 });
297
+ expect(result).toHaveLength(1);
298
+ expect(result[0].id).toBe('PIT-020');
299
+ });
300
+
301
+ it('should apply limit after matching, not before', () => {
302
+ for (let i = 0; i < 10; i++) {
303
+ store.save(makeEntry({ id: `DEC-${String(i).padStart(3, '0')}`, title: `共同词 ${i}` }));
304
+ }
305
+
306
+ expect(query.search('共同词', { limit: 3 })).toHaveLength(3);
307
+ expect(query.search('共同词', { limit: 50 })).toHaveLength(10);
308
+ });
309
+
310
+ it('should sort matches by maturity desc then lastReferenced desc', () => {
311
+ store.save(makeEntry({ id: 'DEC-001', title: 'kw a', maturity: 'draft' }));
312
+ store.save(makeEntry({ id: 'DEC-002', title: 'kw b', maturity: 'proven', lastReferenced: '2026-01-01' }));
313
+ store.save(makeEntry({ id: 'DEC-003', title: 'kw c', maturity: 'proven', lastReferenced: '2026-08-01' }));
314
+
315
+ const result = query.search('kw');
316
+ expect(result.map(e => e.id)).toEqual(['DEC-003', 'DEC-002', 'DEC-001']);
317
+ });
318
+
319
+ it('should exclude archived entries by default and respect filter overrides', () => {
320
+ store.save(makeEntry({ id: 'DEC-001', title: 'kw active' }));
321
+ store.save(makeEntry({ id: 'DEC-002', title: 'kw archived', maturity: 'archived' }));
322
+
323
+ expect(query.search('kw').map(e => e.id)).toEqual(['DEC-001']);
324
+ expect(query.search('kw', { filter: { excludeArchived: false } })).toHaveLength(2);
325
+ });
326
+
327
+ it('should respect filter.types', () => {
328
+ store.save(makeEntry({ id: 'DEC-001', type: 'decision', title: 'kw' }));
329
+ store.save(makeEntry({ id: 'PIT-001', type: 'pitfall', title: 'kw' }));
330
+
331
+ const result = query.search('kw', { filter: { types: ['pitfall'] } });
332
+ expect(result.map(e => e.id)).toEqual(['PIT-001']);
333
+ });
334
+ });
271
335
  });